├── examples
├── Server.php
├── Revisions.php
├── Extensions.php
├── Assets.php
├── Utilities.php
├── Mail.php
├── Roles.php
├── Folders.php
├── Files.php
├── Custom.php
├── Settings.php
├── Activities.php
├── Relations.php
├── CollectionPresets.php
├── Projects.php
├── Fields.php
├── Permissions.php
├── Items.php
├── Collections.php
├── Users.php
└── SCIM.php
├── .vscode
├── tasks.json
└── launch.json
├── tests
└── ProjectsTest.php
├── composer.json
├── CHANGES.md
├── src
├── API
│ ├── Errors.php
│ └── Helpers.php
├── Request.php
└── API.php
├── .gitignore
├── README.md
├── LICENSE.md
└── composer.lock
/examples/Server.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // Retrieve Server Info
15 | $info = $api->info('super_admin_token')->get();
16 |
17 | // Ping the server
18 | $pong = $api->ping()->get();
--------------------------------------------------------------------------------
/examples/Revisions.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Revisions
15 | $revisions = $api->revisions()->get();
16 |
17 | // Retrieve a Revision
18 | $revision = $api->revision(1)->get();
--------------------------------------------------------------------------------
/examples/Extensions.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List Interfaces
15 | $interfaces = $api->interfaces()->get();
16 |
17 | // List Layouts
18 | $layouts = $api->layouts()->get();
19 |
20 | // List Modules
21 | $modules = $api->modules()->get();
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | // See https://go.microsoft. m/fwlink/?LinkId=733558
3 | // for the documentation about the tasks.json format
4 | "version": "2.0.0",
5 | "tasks": [
6 | {
7 | "label": "PHP CLI",
8 | "type": "shell",
9 | "command": "php ${file}",
10 | "problemMatcher": []
11 | },
12 | {
13 | "label": "PHPUnit",
14 | "type": "shell",
15 | "command": "vendor\\bin\\phpunit --testdox tests",
16 | "problemMatcher": []
17 | }
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/examples/Assets.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // Get an asset
15 | $asset = $api->asset($private_hash)->get();
16 |
17 | // or using key, w, h, f, q
18 | $asset = $api->asset($private_hash)->queries([
19 | 'key' => $key,
20 | 'w' => 100,
21 | 'h' => 100,
22 | 'f' => 'crop',
23 | 'q' => 80
24 | ])->get();
--------------------------------------------------------------------------------
/examples/Utilities.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // Create a Hash
15 | $hash = $api->hash('Directus')->create();
16 |
17 | // Verify a Hashed String
18 | $valid = $api->hashMatch('Directus', $hash)->create();
19 |
20 | // Generate a Random String
21 | $string = $api->randomString(32)->create();
22 |
23 | // Generate a 2FA Secret
24 | $secret = $api->secret()->get();
--------------------------------------------------------------------------------
/examples/Mail.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | $api->mail()->create([
15 | 'to' => [
16 | 'user@example.com',
17 | 'admin@example.com'
18 | ],
19 | 'subject' => 'New Password',
20 | 'body' => 'Hello {{name}}, this is your new password: {{password}}.',
21 | 'type' => 'html',
22 | 'data' => [
23 | 'name' => 'John Doe',
24 | 'password' => 'secret'
25 | ]
26 | ]);
--------------------------------------------------------------------------------
/examples/Roles.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Roles
15 | $roles = $api->roles()->get();
16 |
17 | // Retrieve a Role
18 | $role = $api->role(1)->get();
19 |
20 | // Create a Role
21 | $api->roles()->create([
22 | 'name' => 'Interns'
23 | ]);
24 |
25 | // Update a Role
26 | $api->role(1)->update([
27 | 'description' => 'Limited access only.'
28 | ]);
29 |
30 | // Delete a Role
31 | $api->role(1)->delete();
--------------------------------------------------------------------------------
/examples/Folders.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Folders
15 | $folders = $api->folders()->get();
16 |
17 | // Retrieve a Folder
18 | $folder = $api->folder(1)->get();
19 |
20 | // Create a Folder
21 | $api->folders()->create([
22 | 'name' => 'Amsterdam'
23 | ]);
24 |
25 | // Update a Folder
26 | $api->folder(1)->update([
27 | 'parent_folder' => 3
28 | ]);
29 |
30 | // Delete a Folder
31 | $api->folder(1)->delete();
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Listen for XDebug",
9 | "type": "php",
10 | "request": "launch",
11 | "port": 9000
12 | },
13 | {
14 | "name": "Launch currently open script",
15 | "type": "php",
16 | "request": "launch",
17 | "program": "${file}",
18 | "cwd": "${fileDirname}",
19 | "port": 9000
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/examples/Files.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the files.
15 | $files = $api->files()->get();
16 |
17 | // Retrieve a File
18 | $file = $api->file(1)->get();
19 |
20 | // Create a File
21 | $api->files()->create([
22 | 'data' => base64_encode(file_get_contents('./file.pdf'))
23 | ]);
24 |
25 | // Update a File
26 | $api->file(1)->update([
27 | 'data' => base64_encode(file_get_contents('./file.pdf'))
28 | ]);
29 |
30 | // Delete a File
31 | $api->file(1)->delete();
--------------------------------------------------------------------------------
/examples/Custom.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // Custom GET-Requests
15 | $response = $api->custom('example')->get();
16 |
17 | // Custom POST-Requests
18 | $response = $api->custom('example')->post(); // or ->create()
19 |
20 | // Custom PATCH-Requests
21 | $response = $api->custom('example')->patch(); // or ->update()
22 |
23 | // Custom DELETE-Requests
24 | $response = $api->custom('example')->delete();
25 |
26 | // Request with parameters
27 | $response = $api->custom('example/:id', ['id' => 1])->get();
--------------------------------------------------------------------------------
/examples/Settings.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Settings
15 | $settings = $api->settings()->get();
16 |
17 | // Retrieve a Setting
18 | $setting = $api->setting('my_custom_setting')->get();
19 |
20 | // Create a Setting
21 | $api->settings()->create([
22 | 'key' => 'my_custom_setting',
23 | // 'value' => 12
24 | ]);
25 |
26 | // Update a Setting
27 | $api->setting('my_custom_setting')->update([
28 | 'value' => 15
29 | ]);
30 |
31 | // Delete a Setting
32 | $api->setting('my_custom_setting')->delete();
--------------------------------------------------------------------------------
/examples/Activities.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List Activity Actions
15 | $activities = $api->activities()->get();
16 |
17 | // Retrieve an Activity Action
18 | $activity = $api->activity(1)->get();
19 |
20 | // Create a Comment
21 | $api->comments()->create([
22 | 'collection' => 'my_collection',
23 | 'id' => 1,
24 | 'comment' => 'The body of the comment.'
25 | ]);
26 |
27 | // Update a Comment
28 | $api->comment(1)->update([
29 | 'comment' => 'The new body of the comment.'
30 | ]);
31 |
32 | // Delete a Comment
33 | $api->comment(1)->delete();
--------------------------------------------------------------------------------
/tests/ProjectsTest.php:
--------------------------------------------------------------------------------
1 | api = new API('http://api.example.com/', 'v1');
18 | }
19 |
20 | public function testProjectInformation(): void
21 | {
22 | $response = $this->api->project('v1')->test();
23 |
24 | $this->assertEquals('v1/?', $response->url);
25 | }
26 |
27 | public function testAllProjects(): void
28 | {
29 | $response = $this->api->projects()->test();
30 |
31 | $this->assertEquals('server/projects?', $response->url);
32 | }
33 | }
--------------------------------------------------------------------------------
/examples/Relations.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Relations
15 | $relations = $api->relations()->get();
16 |
17 | // Retrieve a Relation
18 | $relation = $api->relation(1)->get();
19 |
20 | // Create a Relation
21 | $api->relations()->create([
22 | 'collection_many' => 'articles',
23 | 'field_many' => 'author',
24 | 'collection_one' => 'authors',
25 | 'field_one' => 'books'
26 | ]);
27 |
28 | // Update a Relation
29 | $api->relation(1)->update([
30 | 'field_one' => 'books'
31 | ]);
32 |
33 | // Delete a Relation
34 | $api->relation(1)->delete();
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "c14r/directus-api",
3 | "type": "library",
4 | "description": "A Wrapper for the Directus REST-API",
5 | "keywords": [
6 | "http",
7 | "rest",
8 | "client",
9 | "HTTP client",
10 | "directus",
11 | "wrapper"
12 | ],
13 | "homepage": "http://www.christian-pfeifer.de/",
14 | "license": "GPL-3.0-only",
15 | "authors": [
16 | {
17 | "name": "Christian Pfeifer",
18 | "email": "mail@christian-pfeifer.de",
19 | "homepage": "http://www.christian-pfeifer.de/"
20 | }
21 | ],
22 | "require": {
23 | "php": "^7.4|^8.0",
24 | "ext-json": "*",
25 | "guzzlehttp/guzzle": "^7.2.0"
26 | },
27 | "require-dev": {
28 | "phpunit/phpunit": "^9.2"
29 | },
30 | "autoload": {
31 | "psr-4": {
32 | "C14r\\Directus\\": "src/"
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/examples/CollectionPresets.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Collection Presets
15 | $presets = $api->presets()->get();
16 |
17 | // Retrieve a Collection Preset
18 | $preset = $api->preset(1)->get();
19 |
20 | // Create a Collection Preset
21 | $api->presets()->create([
22 | 'collection' => 'my_collection',
23 | 'title' => 'Title'
24 | // ...
25 | ]);
26 |
27 | // Update a Collection Preset
28 | $api->preset(1)->update([
29 | 'collection' => 'my_collection',
30 | 'title' => 'New Title'
31 | ]);
32 |
33 | // Delete a Collection Preset
34 | $api->preset(1)->delete();
--------------------------------------------------------------------------------
/examples/Projects.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List Available Projects
15 | $projects = $api->projects()->get();
16 |
17 | // Retrieve Project Info
18 | $project = $api->project('thumper')->get();
19 |
20 | // Create a Project
21 | $api->projects()->create([
22 | 'project' => 'thumper',
23 | 'super_admin_token' => 'very_secret_token',
24 | 'db_name' => 'db',
25 | 'db_user' => 'root',
26 | 'db_password' => 'root',
27 | 'user_email' => 'admin@example.com',
28 | 'user_password' => 'password'
29 | ]);
30 |
31 | // Delete a Project
32 | $api->projects('thumper')->delete(); // <-- nasty :-(
--------------------------------------------------------------------------------
/CHANGES.md:
--------------------------------------------------------------------------------
1 | 1.0.5 / 2020-10-21
2 | ==================
3 |
4 | * [fixed] Request->setArray now can be used with objects
5 |
6 | 1.0.4 / 2020-10-19
7 | ==================
8 |
9 | * [added] Alias for _limit(-1) ... all()
10 | * [changed] Guzzle from 7.0 to 7.0.1
11 |
12 |
13 | 1.0.2 / 2020-08-28
14 | ==================
15 |
16 | * [added] Examples
17 | * [added] Examles in README.md
18 | * [added] First UnitTest
19 | * [added] Added parameter last_page to trackingPage()
20 | * [fixed] SCIM User id is called external_id
21 | * [changed] settings() id from int to string
22 | * [changed] invite() parameters from mail to email
23 | * [removed] allFields() and replaces with fields(null)
24 | * [removed] projectDelete() and replaces with projects('project')
25 |
26 | 1.0.1 / 2020-08-22
27 | ==================
28 |
29 | * [added] Added query functions (_meta, _fields, ...)
30 |
31 | 1.0.0 / 2020-08-21
32 | ==================
33 |
34 | * [added] Initial release 🎉
--------------------------------------------------------------------------------
/examples/Fields.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List Fields
15 | $fields = $api->fields()->get();
16 |
17 | // List Fields in Collection
18 | $fields = $api->fields('my_collection')->get();
19 |
20 | // Retrieve a Field
21 | $field = $api->field('my_collection', 'my_field')->get();
22 |
23 | // Create a Field
24 | $api->fields('my_collection')->create([
25 | 'field' => 'test',
26 | 'type' => 'string',
27 | 'datatype' => 'VARCHAR',
28 | 'length' => 255,
29 | 'interface' => 'text-input'
30 | ]);
31 |
32 | // Update a Field
33 | $api->field('my_collection', 'my_field')->update([
34 | 'note' => 'Enter the title here.'
35 | ]);
36 |
37 | // Delete a Field
38 | $api->field('my_collection', 'my_field')->delete();
--------------------------------------------------------------------------------
/examples/Permissions.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Permissions
15 | $permissions = $api->permissions()->get();
16 |
17 | // Retrieve a Permission
18 | $permission = $api->permission(1)->get();
19 |
20 | // List the Current User's Permissions
21 | $permissions = $api->myPermissions()->get();
22 |
23 | // List the Current User's Permissions for Given Collection
24 | $permission = $api->myPermission('my_collection')->get();
25 |
26 | // Create a Permission
27 | $api->permissions()->create([
28 | 'collection' => 'my_collection',
29 | 'role' => 3,
30 | 'read' => 'mine',
31 | 'read_field_blacklist' => ['featured_image']
32 | ]);
33 |
34 | // Update a Permission
35 | $api->permission(1)->update([
36 | 'read' => 'full'
37 | ]);
38 |
39 | // Delete a Permission
40 | $api->permission(1)->delete();
--------------------------------------------------------------------------------
/examples/Items.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the Items
15 | $items = $api->items('my_collection')->get();
16 |
17 | // Retrieve an Item
18 | $item = $api->item('my_collection', 1)->get();
19 |
20 | // Create an Item
21 | $api->items('my_collection')->create([
22 | 'title' => 'The Title!',
23 | 'status' => 'draft'
24 | ]);
25 |
26 | // Update an Item
27 | $api->item('my_collection', 1)->update([
28 | 'title' => 'The new Title!'
29 | ]);
30 |
31 | // Delete an Item
32 | $api->item('my_collection', 1)->delete();
33 |
34 | // List Item Revisions
35 | $revisions = $api->itemRevisions('my_collection', 1)->get();
36 |
37 | // Retrieve an Item Revision
38 | $revision = $api->itemRevision('my_collection', 1, $offset)->get();
39 |
40 | // Revert to a Given Revision
41 | $api->itemRevert('my_collection', 1, 5)->update();
--------------------------------------------------------------------------------
/examples/Collections.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List Collections
15 | $collections = $api->collections()->get();
16 |
17 | // Retrieve a Collection
18 | $collection = $api->collection('my_collection')->get();
19 |
20 | // Create a Collection
21 | $api->collections()->create([
22 | 'collection' => 'my_collection',
23 | 'fields' => [
24 | [
25 | 'field' => 'id',
26 | 'type' => 'integer',
27 | 'datatype' => 'int',
28 | 'length' => 11,
29 | 'interface' => 'numeric',
30 | 'primary_key' => true
31 | ]
32 | ]
33 | ]);
34 |
35 | // Update a Collection
36 | $collection = $api->collection('my_collection')->update([
37 | 'note' => 'This is my first collection'
38 | ]);
39 |
40 | // Delete a Collection
41 | $collection = $api->collection('my_collection')->delete();
--------------------------------------------------------------------------------
/examples/Users.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List the users
15 | $users = $api->users()->get();
16 |
17 | // Retrieve a User
18 | $user = $api->user(1)->get();
19 |
20 | // Retrieve the Current User
21 | $me = $api->me()->get();
22 |
23 | // Create a User
24 | $api->users()->create([
25 | 'first_name' => 'Ben',
26 | 'last_name' => 'Haynes',
27 | 'email' => 'demo@example.com',
28 | 'password' => 'd1r3ctu5',
29 | 'role' => 3,
30 | 'status' => 'active'
31 | ]);
32 |
33 | // Update a User
34 | $api->user(1)->update([
35 | 'status' => 'suspended'
36 | ]);
37 |
38 | // Delete a User
39 | $api->user(1)->delete();
40 |
41 | // Invite a New User
42 | $api->invite('demo@example.com')->create();
43 |
44 | // Accept User Invite
45 | $api->acceptUser($token)->post();
46 |
47 | // Track the Last Used Page
48 | $api->trackingPage(1, '/thumper/settings/')->update();
49 |
50 | // List User Revisions
51 | $revisions = $api->userRevisions(1)->get();
52 |
53 | // Retrieve a User Revision
54 | $revision = $api->userRevision(1, 5)->get();
--------------------------------------------------------------------------------
/examples/SCIM.php:
--------------------------------------------------------------------------------
1 | authenticate('admin@example.com', 'password');
12 | $api->token('ThIs_Is_ThE_tOkEn');
13 |
14 | // List SCIM Users
15 | $users = $api->scimUsers()->get();
16 |
17 | // Retrieve a SCIM User
18 | $user = $api->scimUser($external_id)->get();
19 |
20 | // Create a SCIM User
21 | $api->scimUsers()->create([
22 | 'schemas' => [
23 | 'urn:ietf:params:scim:schemas:core:2.0:User'
24 | ],
25 | 'userName' => 'johndoe@example.com',
26 | 'externalId' => 'johndoe-id',
27 | 'name' => [
28 | 'familyName' => 'Doe',
29 | 'givenName' => 'John'
30 | ]
31 | ]);
32 |
33 | // Update a SCIM User
34 | $api->scimUser($external_id)->update([
35 | 'schemas' => [
36 | 'urn:ietf:params:scim:schemas:core:2.0:User'
37 | ],
38 | 'name' => [
39 | 'familyName' => 'Doe',
40 | 'givenName' => 'Johnathan'
41 | ]
42 | ]);
43 |
44 | // Delete a SCIM User
45 | $api->scimUser($external_id)->delete();
46 |
47 | // List the SCIM Groups
48 | $groups = $api->scimGroups()->get();
49 |
50 | // Retrieve a SCIM Group
51 | $group = $api->scimGroup(1)->get();
52 |
53 | // Create a SCIM Group
54 | $api->scimGroups()->create([
55 | 'schemas' => [
56 | 'urn:ietf:params:scim:schemas:core:2.0:Group'
57 | ],
58 | 'displayName' => 'Editors',
59 | 'externalId' => 'editors-id'
60 | ]);
61 |
62 | // Update a SCIM Group
63 | $api->scimGroup(1)->update([
64 | 'schemas' => [
65 | 'urn:ietf:params:scim:schemas:core:2.0:Group'
66 | ],
67 | 'displayName' => 'Writers'
68 | ]);
69 |
70 | // Delete a SCIM Group
71 | $api->scimGroup(1)->delete();
--------------------------------------------------------------------------------
/src/API/Errors.php:
--------------------------------------------------------------------------------
1 | ][]=.
189 | * The field-name supports dot-notation to filter on nested relational fields.
190 | *
191 | * @see https://docs.directus.io/api/query/filter.html
192 | * @param array $filter Select items in collection by given conditions.
193 | * @return void
194 | */
195 | public static function filter(array $filter)
196 | {
197 | return $filter;
198 | }
199 |
200 | /**
201 | * Casts the mixed value to an int.
202 | *
203 | * @param mixed $value
204 | * @return integer
205 | */
206 | private static function _int($value): int
207 | {
208 | return (int) $value;
209 | }
210 |
211 | /**
212 | * Combines the given array to a comma-separated-list.
213 | *
214 | * @param string|array $value
215 | * @return string
216 | */
217 | private static function _join($value): string
218 | {
219 | return is_array($value) ? implode(',', $value) : $value;
220 | }
221 | }
222 |
--------------------------------------------------------------------------------
/src/Request.php:
--------------------------------------------------------------------------------
1 | client = new Client([
29 | 'base_uri' => $baseUrl,
30 | ]);
31 | }
32 |
33 | /**
34 | * Sets the new endpoint.
35 | *
36 | * @param string $endpoint
37 | * @return self
38 | */
39 | public function endpoint(string $endpoint): self
40 | {
41 | $this->endpoint = $endpoint;
42 |
43 | return $this;
44 | }
45 |
46 | /**
47 | * Sets a parameter for the request.
48 | *
49 | * @param string $key The parameter
50 | * @param mixed $value Value of the parameter
51 | * @return self
52 | */
53 | public function parameter(string $key, $value): self
54 | {
55 | return $this->set('parameters', $key, $value);
56 | }
57 |
58 | /**
59 | * Sets multiple parameters for the request.
60 | *
61 | * @param array|object $values A set of key-value-pairs.
62 | * @return self
63 | */
64 | public function parameters($values): self
65 | {
66 | return $this->setArray('parameters', $values);
67 | }
68 |
69 | /**
70 | * Sets a attribute for the request.
71 | *
72 | * @param string $key The attribute
73 | * @param mixed $value Value of the attribute
74 | * @return self
75 | */
76 | public function attribute(string $key, $value): self
77 | {
78 | return $this->set('attributes', $key, $value);
79 | }
80 |
81 | /**
82 | * Sets multiple attributes for the request.
83 | *
84 | * @param array|object $values A set of key-value-pairs.
85 | * @return self
86 | */
87 | public function attributes($values): self
88 | {
89 | return $this->setArray('attributes', $values);
90 | }
91 |
92 | /**
93 | * Sets a query-parameter for the request.
94 | *
95 | * @param string $key The query-parameter
96 | * @param mixed $value Value of the query-parameter
97 | * @return self
98 | */
99 | public function query(string $key, $value): self
100 | {
101 | return $this->set('query', $key, $value);
102 | }
103 |
104 | /**
105 | * Sets multiple query-parameters for the request.
106 | *
107 | * @param array|object $values A set of key-value-pairs.
108 | * @return self
109 | */
110 | public function queries($values): self
111 | {
112 | return $this->setArray('query', $values);
113 | }
114 |
115 | /**
116 | * Sets a header for the request.
117 | *
118 | * @param string $key The header
119 | * @param mixed $value Value of the header
120 | * @return self
121 | */
122 | public function header(string $key, $value): self
123 | {
124 | return $this->set('headers', $key, $value);
125 | }
126 |
127 | /**
128 | * Sets multiple headers for the request.
129 | *
130 | * @param array|object $values A set of key-value-pairs.
131 | * @return self
132 | */
133 | public function headers($values): self
134 | {
135 | return $this->setArray('headers', $values);
136 | }
137 |
138 | /**
139 | * Performs a POST-request (alias).
140 | *
141 | * @param array|object $data
142 | * @return object
143 | */
144 | public function create($data = []): object
145 | {
146 | return $this->attributes($data)->post();
147 | }
148 |
149 | /**
150 | * Performs a PATCH-request (alias).
151 | *
152 | * @param array|object $data
153 | * @return object
154 | */
155 | public function update($data = []): object
156 | {
157 | return $this->attributes($data)->patch();
158 | }
159 |
160 | /**
161 | * Performs a GET-request.
162 | *
163 | * @return object
164 | */
165 | public function get(): object
166 | {
167 | return $this->request('GET');
168 | }
169 |
170 | /**
171 | * Performs a POST-request.
172 | *
173 | * @return object
174 | */
175 | public function post(): object
176 | {
177 | return $this->request('POST');
178 | }
179 |
180 | /**
181 | * Performs a PATCH-request.
182 | *
183 | * @return object
184 | */
185 | public function patch(): object
186 | {
187 | return $this->request('PATCH');
188 | }
189 |
190 | /**
191 | * Performs a DELETE-request.
192 | *
193 | * @return object
194 | */
195 | public function delete(): object
196 | {
197 | return $this->request('DELETE');
198 | }
199 |
200 | /**
201 | * Performs the actual HTTP-request.
202 | *
203 | * @param string $method HTTP-Method (GET, POST, PATCH, DELETE)
204 | * @param string $url URL
205 | * @param array $options Headers and data
206 | * @return ResponseInterface
207 | */
208 | protected function performRequest(string $method, string $url, array $options): ResponseInterface
209 | {
210 | try {
211 | return $this->client->request($method, $url, $options);
212 | } catch (ClientException $e) {
213 | return $e->getResponse();
214 | }
215 | }
216 |
217 | public function test(): object
218 | {
219 | return (object)[
220 | 'url' => $this->buildUrl(),
221 | 'options' => $this->buildOptions()
222 | ];
223 | }
224 |
225 | protected function request(string $method): object
226 | {
227 | $response = $this->performRequest($method, $this->buildUrl(), $this->buildOptions());
228 | $contents = $response->getBody()->getContents();
229 | $json = json_decode($contents);
230 |
231 | $this->clear();
232 |
233 | return is_null($json) ? (object)['data' => $contents] : $json;
234 | }
235 |
236 | /**
237 | * Builds the URL for the current request.
238 | *
239 | * @return string
240 | */
241 | protected function buildUrl(): string
242 | {
243 | return $this->replaceParameters($this->endpoint) . '?' . http_build_query($this->query);
244 | }
245 |
246 | /**
247 | * Prepares the request parameters
248 | *
249 | * @return array
250 | */
251 | protected function buildOptions(): array
252 | {
253 | return [
254 | 'headers' => $this->headers,
255 | 'query' => $this->query,
256 | 'json' => !empty($this->attributes) ? $this->attributes : null
257 | ];
258 | }
259 |
260 | /**
261 | * Replace variables in the endpoint.
262 | *
263 | * @param string $endpoint
264 | * @return string
265 | */
266 | private function replaceParameters(string $endpoint): string
267 | {
268 | $url = $endpoint;
269 |
270 | foreach ($this->parameters as $key => $value) {
271 | $url = str_replace(':' . $key, strval($value), $url);
272 | }
273 |
274 | return $url;
275 | }
276 |
277 | /**
278 | * Sets a variable for the request.
279 | *
280 | * @param string $variable Can be attributes, parameters, query, headers
281 | * @param string $key
282 | * @param mixed $value
283 | * @return self
284 | */
285 | private function set(string $variable, string $key, $value): self
286 | {
287 | if (!is_null($value)) {
288 | $this->{$variable}[$key] = $value;
289 | } elseif (isset($this->{$variable}[$key])) {
290 | unset($this->{$variable}[$key]);
291 | }
292 |
293 | return $this;
294 | }
295 |
296 | /**
297 | * Sets multiple variables for the request.
298 | *
299 | * @param string $variable Can be attributes, parameters, query, headers
300 | * @param array|object $array
301 | * @return self
302 | */
303 | private function setArray(string $variable, $array): self
304 | {
305 | foreach ($array as $key => $value) {
306 | $this->set($variable, $key, $value);
307 | }
308 |
309 | return $this;
310 | }
311 |
312 | /**
313 | * Clears all variables beloning to the last request.
314 | *
315 | * @return self
316 | */
317 | public function clear(): self
318 | {
319 | $this->endpoint = '';
320 |
321 | $this->parameters = [];
322 | $this->attributes = [];
323 | $this->query = [];
324 | $this->headers = [];
325 |
326 | return $this;
327 | }
328 | }
329 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ##### Windows
2 | # Windows thumbnail cache files
3 | Thumbs.db
4 | Thumbs.db:encryptable
5 | ehthumbs.db
6 | ehthumbs_vista.db
7 |
8 | # Dump file
9 | *.stackdump
10 |
11 | # Folder config file
12 | [Dd]esktop.ini
13 |
14 | # Recycle Bin used on file shares
15 | $RECYCLE.BIN/
16 |
17 | # Windows Installer files
18 | *.cab
19 | *.msi
20 | *.msix
21 | *.msm
22 | *.msp
23 |
24 | # Windows shortcuts
25 | *.lnk
26 |
27 | ##### Linux
28 | *~
29 |
30 | # temporary files which can be created if a process still has a handle open of a deleted file
31 | .fuse_hidden*
32 |
33 | # KDE directory preferences
34 | .directory
35 |
36 | # Linux trash folder which might appear on any partition or disk
37 | .Trash-*
38 |
39 | # .nfs files are created when an open file is removed but is still being accessed
40 | .nfs*
41 |
42 | ##### MacOS
43 | # General
44 | .DS_Store
45 | .AppleDouble
46 | .LSOverride
47 |
48 | # Icon must end with two \r
49 | Icon
50 |
51 | # Thumbnails
52 | ._*
53 |
54 | # Files that might appear in the root of a volume
55 | .DocumentRevisions-V100
56 | .fseventsd
57 | .Spotlight-V100
58 | .TemporaryItems
59 | .Trashes
60 | .VolumeIcon.icns
61 | .com.apple.timemachine.donotpresent
62 |
63 | # Directories potentially created on remote AFP share
64 | .AppleDB
65 | .AppleDesktop
66 | Network Trash Folder
67 | Temporary Items
68 | .apdisk
69 |
70 | ##### Backup
71 | *.bak
72 | *.gho
73 | *.ori
74 | *.orig
75 | *.tmp
76 |
77 | ##### GPG
78 | secring.*
79 |
80 | ##### Dropbox
81 | # Dropbox settings and caches
82 | .dropbox
83 | .dropbox.attr
84 | .dropbox.cache
85 |
86 | ##### SynopsysVCS
87 | # Waveform formats
88 | *.vcd
89 | *.vpd
90 | *.evcd
91 | *.fsdb
92 |
93 | # Default name of the simulation executable. A different name can be
94 | # specified with this switch (the associated daidir database name is
95 | # also taken from here): -o /
96 | simv
97 |
98 | # Generated for Verilog and VHDL top configs
99 | simv.daidir/
100 | simv.db.dir/
101 |
102 | # Infrastructure necessary to co-simulate SystemC models with
103 | # Verilog/VHDL models. An alternate directory may be specified with this
104 | # switch: -Mdir=
105 | csrc/
106 |
107 | # Log file - the following switch allows to specify the file that will be
108 | # used to write all messages from simulation: -l
109 | *.log
110 |
111 | # Coverage results (generated with urg) and database location. The
112 | # following switch can also be used: urg -dir .vdb
113 | simv.vdb/
114 | urgReport/
115 |
116 | # DVE and UCLI related files.
117 | DVEfiles/
118 | ucli.key
119 |
120 | # When the design is elaborated for DirectC, the following file is created
121 | # with declarations for C/C++ functions.
122 | vc_hdrs.h
123 |
124 | ##### SVN
125 | .svn/
126 |
127 | ##### Mercurial
128 | .hg/
129 | .hgignore
130 | .hgsigs
131 | .hgsub
132 | .hgsubstate
133 | .hgtags
134 |
135 | ##### Bazaar
136 | .bzr/
137 | .bzrignore
138 |
139 | ##### CVS
140 | /CVS/*
141 | **/CVS/*
142 | .cvsignore
143 | */.cvsignore
144 |
145 | ##### TortoiseGit
146 | # Project-level settings
147 | /.tgitconfig
148 |
149 | ##### PuTTY
150 | # Private key
151 | *.ppk
152 |
153 | ##### Vim
154 | # Swap
155 | [._]*.s[a-v][a-z]
156 | !*.svg # comment out if you don't need vector files
157 | [._]*.sw[a-p]
158 | [._]s[a-rt-v][a-z]
159 | [._]ss[a-gi-z]
160 | [._]sw[a-p]
161 |
162 | # Session
163 | Session.vim
164 | Sessionx.vim
165 |
166 | # Temporary
167 | .netrwhist
168 | *~
169 | # Auto-generated tag files
170 | tags
171 | # Persistent undo
172 | [._]*.un~
173 |
174 | ##### Emacs
175 | # -*- mode: gitignore; -*-
176 | *~
177 | \#*\#
178 | /.emacs.desktop
179 | /.emacs.desktop.lock
180 | *.elc
181 | auto-save-list
182 | tramp
183 | .\#*
184 |
185 | # Org-mode
186 | .org-id-locations
187 | *_archive
188 |
189 | # flymake-mode
190 | *_flymake.*
191 |
192 | # eshell files
193 | /eshell/history
194 | /eshell/lastdir
195 |
196 | # elpa packages
197 | /elpa/
198 |
199 | # reftex files
200 | *.rel
201 |
202 | # AUCTeX auto folder
203 | /auto/
204 |
205 | # cask packages
206 | .cask/
207 | dist/
208 |
209 | # Flycheck
210 | flycheck_*.el
211 |
212 | # server auth directory
213 | /server/
214 |
215 | # projectiles files
216 | .projectile
217 |
218 | # directory configuration
219 | .dir-locals.el
220 |
221 | # network security
222 | /network-security.data
223 |
224 | ##### SublimeText
225 | # Cache files for Sublime Text
226 | *.tmlanguage.cache
227 | *.tmPreferences.cache
228 | *.stTheme.cache
229 |
230 | # Workspace files are user-specific
231 | *.sublime-workspace
232 |
233 | # Project files should be checked into the repository, unless a significant
234 | # proportion of contributors will probably not be using Sublime Text
235 | # *.sublime-project
236 |
237 | # SFTP configuration file
238 | sftp-config.json
239 | sftp-config-alt*.json
240 |
241 | # Package control specific files
242 | Package Control.last-run
243 | Package Control.ca-list
244 | Package Control.ca-bundle
245 | Package Control.system-ca-bundle
246 | Package Control.cache/
247 | Package Control.ca-certs/
248 | Package Control.merged-ca-bundle
249 | Package Control.user-ca-bundle
250 | oscrypto-ca-bundle.crt
251 | bh_unicode_properties.cache
252 |
253 | # Sublime-github package stores a github token in this file
254 | # https://packagecontrol.io/packages/sublime-github
255 | GitHub.sublime-settings
256 |
257 | ##### Notepad++
258 | # Notepad++ backups #
259 | *.bak
260 |
261 | ##### TextMate
262 | *.tmproj
263 | *.tmproject
264 | tmtags
265 |
266 | ##### VisualStudioCode
267 | .vscode/*
268 | !.vscode/settings.json
269 | !.vscode/tasks.json
270 | !.vscode/launch.json
271 | !.vscode/extensions.json
272 | *.code-workspace
273 |
274 | # Local History for Visual Studio Code
275 | .history/
276 |
277 | ##### NetBeans
278 | **/nbproject/private/
279 | **/nbproject/Makefile-*.mk
280 | **/nbproject/Package-*.bash
281 | build/
282 | nbbuild/
283 | dist/
284 | nbdist/
285 | .nb-gradle/
286 |
287 | ##### JetBrains
288 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
289 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
290 |
291 | # User-specific stuff
292 | .idea/**/workspace.xml
293 | .idea/**/tasks.xml
294 | .idea/**/usage.statistics.xml
295 | .idea/**/dictionaries
296 | .idea/**/shelf
297 |
298 | # Generated files
299 | .idea/**/contentModel.xml
300 |
301 | # Sensitive or high-churn files
302 | .idea/**/dataSources/
303 | .idea/**/dataSources.ids
304 | .idea/**/dataSources.local.xml
305 | .idea/**/sqlDataSources.xml
306 | .idea/**/dynamic.xml
307 | .idea/**/uiDesigner.xml
308 | .idea/**/dbnavigator.xml
309 |
310 | # Gradle
311 | .idea/**/gradle.xml
312 | .idea/**/libraries
313 |
314 | # Gradle and Maven with auto-import
315 | # When using Gradle or Maven with auto-import, you should exclude module files,
316 | # since they will be recreated, and may cause churn. Uncomment if using
317 | # auto-import.
318 | # .idea/artifacts
319 | # .idea/compiler.xml
320 | # .idea/jarRepositories.xml
321 | # .idea/modules.xml
322 | # .idea/*.iml
323 | # .idea/modules
324 | # *.iml
325 | # *.ipr
326 |
327 | # CMake
328 | cmake-build-*/
329 |
330 | # Mongo Explorer plugin
331 | .idea/**/mongoSettings.xml
332 |
333 | # File-based project format
334 | *.iws
335 |
336 | # IntelliJ
337 | out/
338 |
339 | # mpeltonen/sbt-idea plugin
340 | .idea_modules/
341 |
342 | # JIRA plugin
343 | atlassian-ide-plugin.xml
344 |
345 | # Cursive Clojure plugin
346 | .idea/replstate.xml
347 |
348 | # Crashlytics plugin (for Android Studio and IntelliJ)
349 | com_crashlytics_export_strings.xml
350 | crashlytics.properties
351 | crashlytics-build.properties
352 | fabric.properties
353 |
354 | # Editor-based Rest Client
355 | .idea/httpRequests
356 |
357 | # Android studio 3.1+ serialized cache file
358 | .idea/caches/build_file_checksums.ser
359 |
360 | ##### Eclipse
361 | .metadata
362 | bin/
363 | tmp/
364 | *.tmp
365 | *.bak
366 | *.swp
367 | *~.nib
368 | local.properties
369 | .settings/
370 | .loadpath
371 | .recommenders
372 |
373 | # External tool builders
374 | .externalToolBuilders/
375 |
376 | # Locally stored "Eclipse launch configurations"
377 | *.launch
378 |
379 | # PyDev specific (Python IDE for Eclipse)
380 | *.pydevproject
381 |
382 | # CDT-specific (C/C++ Development Tooling)
383 | .cproject
384 |
385 | # CDT- autotools
386 | .autotools
387 |
388 | # Java annotation processor (APT)
389 | .factorypath
390 |
391 | # PDT-specific (PHP Development Tools)
392 | .buildpath
393 |
394 | # sbteclipse plugin
395 | .target
396 |
397 | # Tern plugin
398 | .tern-project
399 |
400 | # TeXlipse plugin
401 | .texlipse
402 |
403 | # STS (Spring Tool Suite)
404 | .springBeans
405 |
406 | # Code Recommenders
407 | .recommenders/
408 |
409 | # Annotation Processing
410 | .apt_generated/
411 | .apt_generated_test/
412 |
413 | # Scala IDE specific (Scala & Java development for Eclipse)
414 | .cache-main
415 | .scala_dependencies
416 | .worksheet
417 |
418 | # Uncomment this line if you wish to ignore the project description file.
419 | # Typically, this file would be tracked if it contains build/dependency configurations:
420 | #.project
421 |
422 | ##### Dreamweaver
423 | # DW Dreamweaver added files
424 | _notes
425 | _compareTemp
426 | configs/
427 | dwsync.xml
428 | dw_php_codehinting.config
429 | *.mno
430 |
431 | ##### CodeKit
432 | # General CodeKit files to ignore
433 | config.codekit
434 | config.codekit3
435 | /min
436 |
437 | ##### Gradle
438 | .gradle
439 | **/build/
440 | !src/**/build/
441 |
442 | # Ignore Gradle GUI config
443 | gradle-app.setting
444 |
445 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
446 | !gradle-wrapper.jar
447 |
448 | # Cache of project
449 | .gradletasknamecache
450 |
451 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
452 | # gradle/wrapper/gradle-wrapper.properties
453 |
454 | ##### Composer
455 | composer.phar
456 | /vendor/
457 |
458 | # Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
459 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
460 | #composer.lock
461 |
462 | ##### PHP CodeSniffer
463 | # gitignore for the PHP Codesniffer framework
464 | # website: https://github.com/squizlabs/PHP_CodeSniffer
465 | #
466 | # Recommended template: PHP.gitignore
467 |
468 | /wpcs/*
469 |
470 | ##### SASS
471 | .sass-cache/
472 | *.css.map
473 | *.sass.map
474 | *.scss.map
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Directus API Wrapper for PHP
2 |
3 | 
4 | 
5 |
6 | This package allows users to easily consume the REST API provided by the Directus Headless CMS system in any PHP app.
7 |
8 | ## Installing
9 |
10 | The recommended way to install Directus-API is through
11 | [Composer](https://getcomposer.org/).
12 |
13 | ```bash
14 | composer require c14r/directus-api
15 | ```
16 |
17 | ## Table of Content
18 |
19 | - [Directus API Wrapper for PHP](#directus-api-wrapper-for-php)
20 | - [Installing](#installing)
21 | - [Table of Content](#table-of-content)
22 | - [Usage](#usage)
23 | - [Creating an API-instance](#creating-an-api-instance)
24 | - [Authentification](#authentification)
25 | - [Error handling](#error-handling)
26 | - [Items](#items)
27 | - [Files](#files)
28 | - [Assets (Thumbnails)](#assets-thumbnails)
29 | - [Activities](#activities)
30 | - [Collections](#collections)
31 | - [Collection Presets](#collection-presets)
32 | - [Extensions](#extensions)
33 | - [Fields](#fields)
34 | - [Folders](#folders)
35 | - [Mail](#mail)
36 | - [Permissions](#permissions)
37 | - [Projects](#projects)
38 | - [Relations](#relations)
39 | - [Revisions](#revisions)
40 | - [Roles](#roles)
41 | - [SCIM](#scim)
42 | - [Server](#server)
43 | - [Settings](#settings)
44 | - [Users](#users)
45 | - [Utilities](#utilities)
46 | - [Custom](#custom)
47 |
48 | # Usage
49 |
50 | ## Creating an API-instance
51 |
52 | ```php
53 | use C14r\Directus\API;
54 |
55 | $api = new API('http://example.com/api/', 'v1'); // base Url and project
56 | ```
57 |
58 | ## Authentification
59 |
60 | ```php
61 | // Retrieve a Temporary Access Token
62 | $api->authenticate('username', '********');
63 |
64 | // Using Static token
65 | $api->token('ThIs_Is_ThE_tOkEn');
66 | ```
67 |
68 | ## Error handling
69 |
70 | ```php
71 | $items = $api->items($collection)->get();
72 |
73 | if($api->isError($items)) {
74 | // The request failed.
75 | }
76 | ```
77 |
78 | ## Items
79 |
80 | ```php
81 | // List the Items
82 | $items = $api->items($collection)->get();
83 |
84 | // Retrieve an Item
85 | $item = $api->item($collection, $id)->get();
86 |
87 | // Create an Item
88 | $api->items($collection)->create([
89 | 'title' => 'The Title!',
90 | 'status' => 'draft'
91 | ]);
92 |
93 | // Update an Item
94 | $api->item($collection, $id)->update([
95 | 'title' => 'The new Title!'
96 | ]);
97 |
98 | // Delete an Item
99 | $api->item($collection, $id)->delete();
100 |
101 | // List Item Revisions
102 | $revisions = $api->itemRevisions($collection, $id)->get();
103 |
104 | // Retrieve an Item Revision
105 | $revision = $api->itemRevision($collection, $id, $offset)->get();
106 |
107 | // Revert to a Given Revision
108 | $api->itemRevert($collection, $id, $revision)->update();
109 | ```
110 |
111 | ## Files
112 |
113 | ```php
114 |
115 | // List the files.
116 | $files = $api->files()->get();
117 |
118 | // Retrieve a File
119 | $file = $api->file($id)->get();
120 |
121 | // Create a File
122 | $api->files()->create([
123 | 'data' => base64_encode(file_get_contents('./file.pdf'))
124 | ]);
125 |
126 | // Update a File
127 | $api->file(1)->update([
128 | 'data' => base64_encode(file_get_contents('./file.pdf'))
129 | ]);
130 |
131 | // Delete a File
132 | $api->file(1)->delete();
133 |
134 | ```
135 |
136 | ## Assets (Thumbnails)
137 |
138 | ```php
139 |
140 | // Get an asset
141 | $asset = $api->asset($private_hash)->get();
142 |
143 | // or using key, w, h, f, q
144 | $asset = $api->asset($private_hash)->queries([
145 | 'key' => $key,
146 | 'w' => 100,
147 | 'h' => 100,
148 | 'f' => 'crop',
149 | 'q' => 80
150 | ])->get();
151 |
152 | ```
153 |
154 | ## Activities
155 |
156 | ```php
157 | // List Activity Actions
158 | $activities = $api->activities()->get();
159 |
160 | // Retrieve an Activity Action
161 | $activity = $api->activity($id)->get();
162 |
163 | // Create a Comment
164 | $api->comments()->create([
165 | 'collection' => $collection,
166 | 'id' => $id,
167 | 'comment' => 'The body of the comment.'
168 | ]);
169 |
170 | // Update a Comment
171 | $api->comment($id)->update([
172 | 'comment' => 'The new body of the comment.'
173 | ]);
174 |
175 | // Delete a Comment
176 | $api->comment($id)->delete();
177 | ```
178 |
179 | ## Collections
180 |
181 | ```php
182 | // List Collections
183 | $collections = $api->collections()->get();
184 |
185 | // Retrieve a Collection
186 | $collection = $api->collection($collection)->get();
187 |
188 | // Create a Collection
189 | $api->collections()->create([
190 | 'collection' => 'my_collection',
191 | 'fields' => [
192 | [
193 | 'field' => 'id',
194 | 'type' => 'integer',
195 | 'datatype' => 'int',
196 | 'length' => 11,
197 | 'interface' => 'numeric',
198 | 'primary_key' => true
199 | ]
200 | ]
201 | ]);
202 |
203 | // Update a Collection
204 | $collection = $api->collection($collection)->update([
205 | 'note' => 'This is my first collection'
206 | ]);
207 |
208 | // Delete a Collection
209 | $collection = $api->collection($collection)->delete();
210 | ```
211 |
212 | ## Collection Presets
213 |
214 | ```php
215 | // List the Collection Presets
216 | $presets = $api->presets()->get();
217 |
218 | // Retrieve a Collection Preset
219 | $preset = $api->preset($id)->get();
220 |
221 | // Create a Collection Preset
222 | $api->presets()->create([
223 | 'collection' => $collection,
224 | 'title' => 'Title'
225 | // ...
226 | ]);
227 |
228 | // Update a Collection Preset
229 | $api->preset($id)->update([
230 | 'collection' => $collection,
231 | 'title' => 'New Title'
232 | ]);
233 |
234 | // Delete a Collection Preset
235 | $api->preset($id)->delete();
236 | ```
237 |
238 | ## Extensions
239 |
240 | ```php
241 | // List Interfaces
242 | $interfaces = $api->interfaces()->get();
243 |
244 | // List Layouts
245 | $layouts = $api->layouts()->get();
246 |
247 | // List Modules
248 | $modules = $api->modules()->get();
249 | ```
250 |
251 | ## Fields
252 |
253 | ```php
254 | // List Fields
255 | $fields = $api->fields()->get();
256 |
257 | // List Fields in Collection
258 | $fields = $api->fields($collection)->get();
259 |
260 | // Retrieve a Field
261 | $field = $api->field($collection, $field)->get();
262 |
263 | // Create a Field
264 | $api->fields($collection)->create([
265 | 'field' => 'test',
266 | 'type' => 'string',
267 | 'datatype' => 'VARCHAR',
268 | 'length' => 255,
269 | 'interface' => 'text-input'
270 | ]);
271 |
272 | // Update a Field
273 | $api->field($collection, $field)->update([
274 | 'note' => 'Enter the title here.'
275 | ]);
276 |
277 | // Delete a Field
278 | $api->field($collection, $field)->delete();
279 | ```
280 |
281 | ## Folders
282 |
283 | ```php
284 | // List the Folders
285 | $folders = $api->folders()->get();
286 |
287 | // Retrieve a Folder
288 | $folder = $api->folder($id)->get();
289 |
290 | // Create a Folder
291 | $api->folders()->create([
292 | 'name' => 'Amsterdam'
293 | ]);
294 |
295 | // Update a Folder
296 | $api->folder($id)->update([
297 | 'parent_folder' => 3
298 | ]);
299 |
300 | // Delete a Folder
301 | $api->folder($id)->delete();
302 | ```
303 |
304 | ## Mail
305 |
306 | ```php
307 | // Send an Email
308 | $api->mail()->create([
309 | 'to' => [
310 | 'user@example.com',
311 | 'admin@example.com'
312 | ],
313 | 'subject' => 'New Password',
314 | 'body' => 'Hello {{name}}, this is your new password: {{password}}.',
315 | 'type' => 'html',
316 | 'data' => [
317 | 'name' => 'John Doe',
318 | 'password' => 'secret'
319 | ]
320 | ]);
321 | ```
322 |
323 | ## Permissions
324 |
325 | ```php
326 | // List the Permissions
327 | $permissions = $api->permissions()->get();
328 |
329 | // Retrieve a Permission
330 | $permission = $api->permission($id)->get();
331 |
332 | // List the Current User's Permissions
333 | $permissions = $api->myPermissions()->get();
334 |
335 | // List the Current User's Permissions for Given Collection
336 | $permission = $api->myPermission($collection)->get();
337 |
338 | // Create a Permission
339 | $api->permissions()->create([
340 | 'collection' => 'customers',
341 | 'role' => 3,
342 | 'read' => 'mine',
343 | 'read_field_blacklist' => ['featured_image']
344 | ]);
345 |
346 | // Update a Permission
347 | $api->permission($id)->update([
348 | 'read' => 'full'
349 | ]);
350 |
351 | // Delete a Permission
352 | $api->permission($id)->delete();
353 | ```
354 |
355 | ## Projects
356 |
357 | ```php
358 | // List Available Projects
359 | $projects = $api->projects()->get();
360 |
361 | // Retrieve Project Info
362 | $project = $api->project($project)->get();
363 |
364 | // Create a Project
365 | $api->projects()->create([
366 | 'project' => 'thumper',
367 | 'super_admin_token' => 'very_secret_token',
368 | 'db_name' => 'db',
369 | 'db_user' => 'root',
370 | 'db_password' => 'root',
371 | 'user_email' => 'admin@example.com',
372 | 'user_password' => 'password'
373 | ]);
374 |
375 | // Delete a Project
376 | $api->projects($project)->delete(); // There should be no s in 'projects', but unfortunately it has to be there because of the different endpoints :(
377 | ```
378 |
379 | ## Relations
380 |
381 | ```php
382 | // List the Relations
383 | $relations = $api->relations()->get();
384 |
385 | // Retrieve a Relation
386 | $relation = $api->relation($id)->get();
387 |
388 | // Create a Relation
389 | $api->relations()->create([
390 | 'collection_many' => 'articles',
391 | 'field_many' => 'author',
392 | 'collection_one' => 'authors',
393 | 'field_one' => 'books'
394 | ]);
395 |
396 | // Update a Relation
397 | $api->relation($id)->update([
398 | 'field_one' => 'books'
399 | ]);
400 |
401 | // Delete a Relation
402 | $api->relation($id)->delete();
403 | ```
404 |
405 | ## Revisions
406 |
407 | ```php
408 | // List the Revisions
409 | $revisions = $api->revisions()->get();
410 |
411 | // Retrieve a Revision
412 | $revision = $api->revision($id)->get();
413 | ```
414 |
415 | ## Roles
416 |
417 | ```php
418 | // List the Roles
419 | $roles = $api->roles()->get();
420 |
421 | // Retrieve a Role
422 | $role = $api->role($id)->get();
423 |
424 | // Create a Role
425 | $api->roles()->create([
426 | 'name' => 'Interns'
427 | ]);
428 |
429 | // Update a Role
430 | $api->role($id)->update([
431 | 'description' => 'Limited access only.'
432 | ]);
433 |
434 | // Delete a Role
435 | $api->role($id)->delete();
436 | ```
437 |
438 | ## SCIM
439 |
440 | ```php
441 | // List SCIM Users
442 | $users = $api->scimUsers()->get();
443 |
444 | // Retrieve a SCIM User
445 | $user = $api->scimUser($external_id)->get();
446 |
447 | // Create a SCIM User
448 | $api->scimUsers()->create([
449 | 'schemas' => [
450 | 'urn:ietf:params:scim:schemas:core:2.0:User'
451 | ],
452 | 'userName' => 'johndoe@example.com',
453 | 'externalId' => 'johndoe-id',
454 | 'name' => [
455 | 'familyName' => 'Doe',
456 | 'givenName' => 'John'
457 | ]
458 | ]);
459 |
460 | // Update a SCIM User
461 | $api->scimUser($external_id)->update([
462 | 'schemas' => [
463 | 'urn:ietf:params:scim:schemas:core:2.0:User'
464 | ],
465 | 'name' => [
466 | 'familyName' => 'Doe',
467 | 'givenName' => 'Johnathan'
468 | ]
469 | ]);
470 |
471 | // Delete a SCIM User
472 | $api->scimUser($external_id)->delete();
473 |
474 | // List the SCIM Groups
475 | $groups = $api->scimGroups()->get();
476 |
477 | // Retrieve a SCIM Group
478 | $group = $api->scimGroup($id)->get();
479 |
480 | // Create a SCIM Group
481 | $api->scimGroups()->create([
482 | 'schemas' => [
483 | 'urn:ietf:params:scim:schemas:core:2.0:Group'
484 | ],
485 | 'displayName' => 'Editors',
486 | 'externalId' => 'editors-id'
487 | ]);
488 |
489 | // Update a SCIM Group
490 | $api->scimGroup($id)->update([
491 | 'schemas' => [
492 | 'urn:ietf:params:scim:schemas:core:2.0:Group'
493 | ],
494 | 'displayName' => 'Writers'
495 | ]);
496 |
497 | // Delete a SCIM Group
498 | $api->scimGroup($id)->delete();
499 | ```
500 |
501 | ## Server
502 |
503 | ```php
504 | // Retrieve Server Info
505 | $info = $api->info($super_admin_token)->get();
506 |
507 | // Ping the server
508 | $pong = $api->ping()->get();
509 | ```
510 |
511 | ## Settings
512 |
513 | ```php
514 | // List the Settings
515 | $settings = $api->settings()->get();
516 |
517 | // Retrieve a Setting
518 | $setting = $api->setting($id)->get();
519 |
520 | // Create a Setting
521 | $api->settings()->create([
522 | 'key' => 'my_custom_setting',
523 | // 'value' => 12
524 | ]);
525 |
526 | // Update a Setting
527 | $api->setting($id)->update([
528 | 'value' => 15
529 | ]);
530 |
531 | // Delete a Setting
532 | $api->setting($id)->delete();
533 | ```
534 |
535 | ## Users
536 |
537 | ```php
538 | // List the users
539 | $users = $api->users()->get();
540 |
541 | // Retrieve a User
542 | $user = $api->user($id)->get();
543 |
544 | // Retrieve the Current User
545 | $me = $api->me()->get();
546 |
547 | // Create a User
548 | $api->users()->create([
549 | 'first_name' => 'Ben',
550 | 'last_name' => 'Haynes',
551 | 'email' => 'demo@example.com',
552 | 'password' => 'd1r3ctu5',
553 | 'role' => 3,
554 | 'status' => 'active'
555 | ]);
556 |
557 | // Update a User
558 | $api->user($id)->update([
559 | 'status' => 'suspended'
560 | ]);
561 |
562 | // Delete a User
563 | $api->user($id)->delete();
564 |
565 | // Invite a New User
566 | $api->invite('demo@example.com')->create();
567 |
568 | // Accept User Invite
569 | $api->acceptUser($token)->post();
570 |
571 | // Track the Last Used Page
572 | $api->trackingPage($id, '/thumper/settings/')->update();
573 |
574 | // List User Revisions
575 | $revisions = $api->userRevisions($id)->get();
576 |
577 | // Retrieve a User Revision
578 | $revision = $api->userRevision($id, $offset)->get();
579 | ```
580 |
581 | ## Utilities
582 |
583 | ```php
584 | // Create a Hash
585 | $hash = $api->hash('Directus')->create();
586 |
587 | // Verify a Hashed String
588 | $valid = $api->hashMatch('Directus', $hash)->create();
589 |
590 | // Generate a Random String
591 | $string = $api->randomString($length)->create();
592 |
593 | // Generate a 2FA Secret
594 | $secret = $api->secret()->get();
595 | ```
596 |
597 | ## Custom
598 |
599 | ```php
600 | // Custom GET-Requests
601 | $response = $api->custom('example')->get();
602 |
603 | // Custom POST-Requests
604 | $response = $api->custom('example')->post(); // or ->create()
605 |
606 | // Custom PATCH-Requests
607 | $response = $api->custom('example')->patch(); // or ->update()
608 |
609 | // Custom DELETE-Requests
610 | $response = $api->custom('example')->delete();
611 |
612 | // Request with parameters
613 | $response = $api->custom('example/:id', ['id' => $id])->get();
614 | ```
615 |
--------------------------------------------------------------------------------
/src/API.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | class API extends Request
16 | {
17 | /**
18 | * Directus project
19 | */
20 | protected ?string $project;
21 |
22 | /**
23 | * one-time API token
24 | */
25 | protected string $token;
26 |
27 | /**
28 | * Helper class for query manipulation
29 | */
30 | public Helpers $helpers;
31 |
32 | /**
33 | * @param string $baseUrl The base URL of your Directus installation.
34 | * @param string|null $project The project you're targeting.
35 | */
36 | public function __construct(string $baseUrl, ?string $project = null)
37 | {
38 | parent::__construct($baseUrl);
39 |
40 | $this->helpers = new Helpers();
41 | $this->project = $project;
42 | $this->parameter('project', $project);
43 | }
44 |
45 | /**
46 | * Set's the API token.
47 | *
48 | * @param string $token one-time-token
49 | * @return self
50 | */
51 | public function token(string $token): self
52 | {
53 | $this->token = $token;
54 |
55 | return $this->header('Authorization', 'Bearer ' . $token);
56 | }
57 |
58 | /**
59 | * Check if the giben json object contains an error.
60 | *
61 | * @param object $json
62 | * @return boolean
63 | */
64 | public function isError(object $json): bool
65 | {
66 | return isset($json->error);
67 | }
68 |
69 | /**
70 | * Clears the last request.
71 | *
72 | * @return self
73 | */
74 | public function clear(): self
75 | {
76 | parent::clear();
77 | $this->parameter('project', $this->project);
78 |
79 | if (isset($this->token)) {
80 | $this->token($this->token);
81 | }
82 |
83 | return $this;
84 | }
85 |
86 | /**
87 | * Retrieve a Temporary Access Token
88 | *
89 | * @param string $email Email address of the user you're retrieving the access token for.
90 | * @param string $password Password of the user.
91 | * @param string|null $mode Choose between retrieving the token as a string, or setting it as a cookie. One of jwt, cookie. Defaults to jwt.
92 | * @param string|null $otp If 2FA is enabled, you need to pass the one time password.
93 | * @return object Returns the token (if jwt mode is used) and the user record for the user you just authenticated as.
94 | */
95 | public function authenticate(string $email, string $password, string $mode = null, string $otp = null): object
96 | {
97 | $response = $this->endpoint(':project/auth/authenticate')->attributes(compact('email', 'password', 'mode', 'otp'))->post();
98 |
99 | if (!$this->isError($response)) {
100 | $this->token($response->data->token);
101 | }
102 |
103 | return $response;
104 | }
105 |
106 | /**
107 | * Refresh a Temporary Access Token
108 | *
109 | * @return object
110 | */
111 | public function tokenRefresh(): object
112 | {
113 | $response = $this->endpoint(':project/auth/refresh')->attribute('token', $this->token)->post();
114 |
115 | if (!$this->isError($response)) {
116 | $this->token($response->data->token);
117 | }
118 |
119 | return $response;
120 | }
121 |
122 | public function custom($endpoint, array $parameters = []): self
123 | {
124 | return $this->endpoint('custom/' . ltrim($endpoint, '/'))->parameters($parameters);
125 | }
126 |
127 | /**
128 | * Endpoint for all activities
129 | *
130 | * @return Request
131 | */
132 | public function activities(): Request
133 | {
134 | return $this->endpoint(':project/activity');
135 | }
136 |
137 | /**
138 | * Endpoint for one activity
139 | *
140 | * @param integer $id Unique identifier of the item.
141 | * @return self
142 | */
143 | public function activity(int $id): self
144 | {
145 | return $this->endpoint(':project/activity/:id')->parameters(compact('id'));
146 | }
147 |
148 | /**
149 | * Endpoint for all comments
150 | *
151 | * @return self
152 | */
153 | public function comments(): self
154 | {
155 | return $this->endpoint(':project/activity/comment');
156 | }
157 |
158 | /**
159 | * Endpoint for one comment
160 | *
161 | * @param integer $id Unique identifier of the comment (activity).
162 | * @return self
163 | */
164 | public function comment(int $id): self
165 | {
166 | return $this->endpoint(':project/activity/comment/:id')->parameters(compact('id'));
167 | }
168 |
169 | public function asset(string $key): self
170 | {
171 | return $this->endpoint(':project/assets/:key')->parameters(compact('key'));
172 | }
173 |
174 | public function collections(): self
175 | {
176 | return $this->endpoint(':project/collections');
177 | }
178 |
179 | public function collection(string $collection): self
180 | {
181 | return $this->endpoint(':project/collections/:collection')->parameters(compact('collection'));
182 | }
183 |
184 | public function interfaces(): self
185 | {
186 | return $this->endpoint('interfaces');
187 | }
188 |
189 | public function layouts(): self
190 | {
191 | return $this->endpoint('layouts');
192 | }
193 |
194 | public function modules(): self
195 | {
196 | return $this->endpoint('modules');
197 | }
198 |
199 | public function fields(?string $collection = null): self
200 | {
201 | if (is_null($collection)) {
202 | return $this->endpoint(':project/fields');
203 | }
204 |
205 | return $this->endpoint(':project/fields/:collection')->parameters(compact('collection'));
206 | }
207 |
208 | public function field(string $collection, string $field): self
209 | {
210 | return $this->endpoint(':project/fields/:collection/:field')->parameters(compact('collection', 'field'));
211 | }
212 |
213 | public function files(): self
214 | {
215 | return $this->endpoint(':project/files');
216 | }
217 |
218 | public function file(string $id): self
219 | {
220 | return $this->endpoint(':project/files/:id')->parameters(compact('id'));
221 | }
222 |
223 | public function fileRevisions(int $id): self
224 | {
225 | return $this->endpoint(':project/files/:id/revisions')->parameters(compact('id'));
226 | }
227 |
228 | public function fileRevision(int $id, int $offset): self
229 | {
230 | return $this->endpoint(':project/files/:id/revisions/:offset')->parameters(compact('id', 'offset'));
231 | }
232 |
233 | public function folders(): self
234 | {
235 | return $this->endpoint(':project/folders');
236 | }
237 |
238 | public function folder(int $id): self
239 | {
240 | return $this->endpoint(':project/folders/:id')->parameters(compact('id'));
241 | }
242 |
243 | public function item(string $collection, $id): self
244 | {
245 | return $this->endpoint(':project/items/:collection/:id')->parameters(compact('collection', 'id'));
246 | }
247 |
248 | public function items(string $collection): self
249 | {
250 | return $this->endpoint(':project/items/:collection')->parameters(compact('collection'));
251 | }
252 |
253 | public function itemRevisions(string $collection, $id): self
254 | {
255 | return $this->endpoint(':project/items/:collection/:id/revisions')->parameters(compact('collection', 'id'));
256 | }
257 |
258 | public function itemRevision(string $collection, $id, int $offset): self
259 | {
260 | return $this->endpoint(':project/items/:collection/:id/revisions/:offset')->parameters(compact('collection', 'id', 'offset'));
261 | }
262 |
263 | public function itemRevert(string $collection, $id, int $revision): self
264 | {
265 | return $this->endpoint(':project/items/:collection/:id/revert/:revision')->parameters(compact('collection', 'id', 'revision'));
266 | }
267 |
268 | public function mail(): self
269 | {
270 | return $this->endpoint(':project/mail');
271 | }
272 |
273 | public function presets(): self
274 | {
275 | return $this->endpoint(':project/collection_presets');
276 | }
277 |
278 | public function preset(int $id): self
279 | {
280 | return $this->endpoint(':project/collection_presets/:id')->parameters(compact('id'));
281 | }
282 |
283 | public function info(string $super_admin_token): self
284 | {
285 | return $this->endpoint('server/info')->queries(compact('super_admin_token'));
286 | }
287 |
288 | public function ping(): self
289 | {
290 | return $this->endpoint('server/ping');
291 | }
292 |
293 | public function hash(string $string): object
294 | {
295 | return $this->endpoint(':project/utils/hash')->attributes(compact('string'));
296 | }
297 |
298 | public function hashMatch(string $string, string $hash): object
299 | {
300 | return $this->endpoint(':project/utils/hash/match')->attributes(compact('string', 'hash'));
301 | }
302 |
303 | public function randomString(int $length = 32): object
304 | {
305 | return $this->endpoint(':project/utils/random/string')->attributes(compact('length'));
306 | }
307 |
308 | public function secret(): object
309 | {
310 | return $this->endpoint(':project/utils/2fa_secret');
311 | }
312 |
313 | public function permissions(): object
314 | {
315 | return $this->endpoint(':project/permissions');
316 | }
317 |
318 | public function permission(int $id): object
319 | {
320 | return $this->endpoint(':project/permissions/:id')->parameters(compact('id'));
321 | }
322 |
323 | public function myPermissions(): object
324 | {
325 | return $this->endpoint(':project/permissions/me');
326 | }
327 |
328 | public function myPermission(string $collection): object
329 | {
330 | return $this->endpoint(':project/permissions/me/:collection')->parameters(compact('collection'));
331 | }
332 |
333 | public function projects(?string $project = null): object
334 | {
335 | // This endpoint should use 'project' not 'projects', but unfortunately it has to be here because of the different endpoints :(
336 | if (!is_null($project)) {
337 | return $this->endpoint('server/projects/:project')->parameters(compact('project'));
338 | }
339 | return $this->endpoint('server/projects');
340 | }
341 |
342 | public function project(string $project): object
343 | {
344 | return $this->endpoint(':project/')->parameters(compact('project')); // should be server/projects/:project :-(
345 | }
346 |
347 | public function relations(): object
348 | {
349 | return $this->endpoint(':project/relations');
350 | }
351 |
352 | public function relation(int $id): object
353 | {
354 | return $this->endpoint(':project/relations/:id')->parameters(compact('id'));
355 | }
356 |
357 | public function revisions(): object
358 | {
359 | return $this->endpoint(':project/revisions');
360 | }
361 |
362 | public function revision(int $id): object
363 | {
364 | return $this->endpoint(':project/revisions/:id')->parameters(compact('id'));
365 | }
366 |
367 | public function roles(): object
368 | {
369 | return $this->endpoint(':project/roles');
370 | }
371 |
372 | public function role(int $id): object
373 | {
374 | return $this->endpoint(':project/roles/:id')->parameters(compact('id'));
375 | }
376 |
377 | public function scimUsers()
378 | {
379 | return $this->endpoint(':project/scim/v2/Users');
380 | }
381 |
382 | public function scimUser(int $external_id)
383 | {
384 | return $this->endpoint(':project/scim/v2/Users/:external_id')->parameters(compact('external_id'));
385 | }
386 |
387 | public function scimGroups()
388 | {
389 | return $this->endpoint(':project/scim/v2/Groups');
390 | }
391 |
392 | public function scimGroup(int $id)
393 | {
394 | return $this->endpoint(':project/scim/v2/Groups/:id')->parameters(compact('id'));
395 | }
396 |
397 | public function settings(): object
398 | {
399 | return $this->endpoint(':project/settings');
400 | }
401 |
402 | public function setting(string $id): object
403 | {
404 | return $this->endpoint(':project/settings/:id')->parameters(compact('id'));
405 | }
406 |
407 | public function users(): object
408 | {
409 | return $this->endpoint(':project/users');
410 | }
411 |
412 | public function user(int $id): object
413 | {
414 | return $this->endpoint(':project/users/:id')->parameters(compact('id'));
415 | }
416 |
417 | public function me(): object
418 | {
419 | return $this->endpoint(':project/users/me');
420 | }
421 |
422 | public function invite(string $email): object
423 | {
424 | return $this->endpoint(':project/users/invite')->attributes(compact('email'));
425 | }
426 |
427 | public function acceptUser(string $token): object
428 | {
429 | return $this->endpoint(':project/users/invite/:token')->parameters(compact('token'));
430 | }
431 |
432 | public function trackingPage(int $id, string $last_page): object
433 | {
434 | return $this->endpoint(':project/users/:id/tracking/page')->parameters(compact('id'))->attributes(compact('last_page'));
435 | }
436 |
437 | public function userRevisions(int $id): object
438 | {
439 | return $this->endpoint(':project/users/:id/revisions')->parameters(compact('id'));
440 | }
441 |
442 | public function userRevision(int $id, int $offset): object
443 | {
444 | return $this->endpoint(':project/users/:id/revisions/:offset')->parameters(compact('id', 'offset'));
445 | }
446 |
447 |
448 | public function _single($single = true): self
449 | {
450 | return $this->query('single', $this->helpers->single($single));
451 | }
452 |
453 | public function _limit($limit): self
454 | {
455 | return $this->query('limit', $this->helpers->limit($limit));
456 | }
457 |
458 | public function all(): self
459 | {
460 | return $this->_limit(-1);
461 | }
462 |
463 | public function _offset($offset): self
464 | {
465 | return $this->query('offset', $this->helpers->offset($offset));
466 | }
467 |
468 | public function _page($page): self
469 | {
470 | return $this->query('page', $this->helpers->page($page));
471 | }
472 |
473 | public function _meta($meta = '*'): self
474 | {
475 | return $this->query('meta', $this->helpers->meta($meta));
476 | }
477 |
478 | public function _status($status = '*'): self
479 | {
480 | return $this->query('status', $this->helpers->status($status));
481 | }
482 |
483 | public function _sort($sort): self
484 | {
485 | return $this->query('sort', $this->helpers->sort($sort));
486 | }
487 |
488 | public function _q($q): self
489 | {
490 | return $this->query('q', $this->helpers->q($q));
491 | }
492 |
493 | public function _filter($filter): self
494 | {
495 | return $this->query('filter', $this->helpers->filter($filter));
496 | }
497 |
498 | public function _fields($fields): self
499 | {
500 | return $this->query('fields', $this->helpers->fields($fields));
501 | }
502 | }
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/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": "8188e3efcd9b28a8f3b7b4b8c5bd2106",
8 | "packages": [
9 | {
10 | "name": "guzzlehttp/guzzle",
11 | "version": "7.4.5",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/guzzle/guzzle.git",
15 | "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
20 | "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "ext-json": "*",
25 | "guzzlehttp/promises": "^1.5",
26 | "guzzlehttp/psr7": "^1.9 || ^2.4",
27 | "php": "^7.2.5 || ^8.0",
28 | "psr/http-client": "^1.0",
29 | "symfony/deprecation-contracts": "^2.2 || ^3.0"
30 | },
31 | "provide": {
32 | "psr/http-client-implementation": "1.0"
33 | },
34 | "require-dev": {
35 | "bamarni/composer-bin-plugin": "^1.4.1",
36 | "ext-curl": "*",
37 | "php-http/client-integration-tests": "^3.0",
38 | "phpunit/phpunit": "^8.5.5 || ^9.3.5",
39 | "psr/log": "^1.1 || ^2.0 || ^3.0"
40 | },
41 | "suggest": {
42 | "ext-curl": "Required for CURL handler support",
43 | "ext-intl": "Required for Internationalized Domain Name (IDN) support",
44 | "psr/log": "Required for using the Log middleware"
45 | },
46 | "type": "library",
47 | "extra": {
48 | "branch-alias": {
49 | "dev-master": "7.4-dev"
50 | }
51 | },
52 | "autoload": {
53 | "files": [
54 | "src/functions_include.php"
55 | ],
56 | "psr-4": {
57 | "GuzzleHttp\\": "src/"
58 | }
59 | },
60 | "notification-url": "https://packagist.org/downloads/",
61 | "license": [
62 | "MIT"
63 | ],
64 | "authors": [
65 | {
66 | "name": "Graham Campbell",
67 | "email": "hello@gjcampbell.co.uk",
68 | "homepage": "https://github.com/GrahamCampbell"
69 | },
70 | {
71 | "name": "Michael Dowling",
72 | "email": "mtdowling@gmail.com",
73 | "homepage": "https://github.com/mtdowling"
74 | },
75 | {
76 | "name": "Jeremy Lindblom",
77 | "email": "jeremeamia@gmail.com",
78 | "homepage": "https://github.com/jeremeamia"
79 | },
80 | {
81 | "name": "George Mponos",
82 | "email": "gmponos@gmail.com",
83 | "homepage": "https://github.com/gmponos"
84 | },
85 | {
86 | "name": "Tobias Nyholm",
87 | "email": "tobias.nyholm@gmail.com",
88 | "homepage": "https://github.com/Nyholm"
89 | },
90 | {
91 | "name": "Márk Sági-Kazár",
92 | "email": "mark.sagikazar@gmail.com",
93 | "homepage": "https://github.com/sagikazarmark"
94 | },
95 | {
96 | "name": "Tobias Schultze",
97 | "email": "webmaster@tubo-world.de",
98 | "homepage": "https://github.com/Tobion"
99 | }
100 | ],
101 | "description": "Guzzle is a PHP HTTP client library",
102 | "keywords": [
103 | "client",
104 | "curl",
105 | "framework",
106 | "http",
107 | "http client",
108 | "psr-18",
109 | "psr-7",
110 | "rest",
111 | "web service"
112 | ],
113 | "funding": [
114 | {
115 | "url": "https://github.com/GrahamCampbell",
116 | "type": "github"
117 | },
118 | {
119 | "url": "https://github.com/Nyholm",
120 | "type": "github"
121 | },
122 | {
123 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
124 | "type": "tidelift"
125 | }
126 | ],
127 | "time": "2022-06-20T22:16:13+00:00"
128 | },
129 | {
130 | "name": "guzzlehttp/promises",
131 | "version": "1.5.1",
132 | "source": {
133 | "type": "git",
134 | "url": "https://github.com/guzzle/promises.git",
135 | "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
136 | },
137 | "dist": {
138 | "type": "zip",
139 | "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
140 | "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
141 | "shasum": ""
142 | },
143 | "require": {
144 | "php": ">=5.5"
145 | },
146 | "require-dev": {
147 | "symfony/phpunit-bridge": "^4.4 || ^5.1"
148 | },
149 | "type": "library",
150 | "extra": {
151 | "branch-alias": {
152 | "dev-master": "1.5-dev"
153 | }
154 | },
155 | "autoload": {
156 | "files": [
157 | "src/functions_include.php"
158 | ],
159 | "psr-4": {
160 | "GuzzleHttp\\Promise\\": "src/"
161 | }
162 | },
163 | "notification-url": "https://packagist.org/downloads/",
164 | "license": [
165 | "MIT"
166 | ],
167 | "authors": [
168 | {
169 | "name": "Graham Campbell",
170 | "email": "hello@gjcampbell.co.uk",
171 | "homepage": "https://github.com/GrahamCampbell"
172 | },
173 | {
174 | "name": "Michael Dowling",
175 | "email": "mtdowling@gmail.com",
176 | "homepage": "https://github.com/mtdowling"
177 | },
178 | {
179 | "name": "Tobias Nyholm",
180 | "email": "tobias.nyholm@gmail.com",
181 | "homepage": "https://github.com/Nyholm"
182 | },
183 | {
184 | "name": "Tobias Schultze",
185 | "email": "webmaster@tubo-world.de",
186 | "homepage": "https://github.com/Tobion"
187 | }
188 | ],
189 | "description": "Guzzle promises library",
190 | "keywords": [
191 | "promise"
192 | ],
193 | "funding": [
194 | {
195 | "url": "https://github.com/GrahamCampbell",
196 | "type": "github"
197 | },
198 | {
199 | "url": "https://github.com/Nyholm",
200 | "type": "github"
201 | },
202 | {
203 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
204 | "type": "tidelift"
205 | }
206 | ],
207 | "time": "2021-10-22T20:56:57+00:00"
208 | },
209 | {
210 | "name": "guzzlehttp/psr7",
211 | "version": "2.5.0",
212 | "source": {
213 | "type": "git",
214 | "url": "https://github.com/guzzle/psr7.git",
215 | "reference": "b635f279edd83fc275f822a1188157ffea568ff6"
216 | },
217 | "dist": {
218 | "type": "zip",
219 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
220 | "reference": "b635f279edd83fc275f822a1188157ffea568ff6",
221 | "shasum": ""
222 | },
223 | "require": {
224 | "php": "^7.2.5 || ^8.0",
225 | "psr/http-factory": "^1.0",
226 | "psr/http-message": "^1.1 || ^2.0",
227 | "ralouphie/getallheaders": "^3.0"
228 | },
229 | "provide": {
230 | "psr/http-factory-implementation": "1.0",
231 | "psr/http-message-implementation": "1.0"
232 | },
233 | "require-dev": {
234 | "bamarni/composer-bin-plugin": "^1.8.1",
235 | "http-interop/http-factory-tests": "^0.9",
236 | "phpunit/phpunit": "^8.5.29 || ^9.5.23"
237 | },
238 | "suggest": {
239 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
240 | },
241 | "type": "library",
242 | "extra": {
243 | "bamarni-bin": {
244 | "bin-links": true,
245 | "forward-command": false
246 | }
247 | },
248 | "autoload": {
249 | "psr-4": {
250 | "GuzzleHttp\\Psr7\\": "src/"
251 | }
252 | },
253 | "notification-url": "https://packagist.org/downloads/",
254 | "license": [
255 | "MIT"
256 | ],
257 | "authors": [
258 | {
259 | "name": "Graham Campbell",
260 | "email": "hello@gjcampbell.co.uk",
261 | "homepage": "https://github.com/GrahamCampbell"
262 | },
263 | {
264 | "name": "Michael Dowling",
265 | "email": "mtdowling@gmail.com",
266 | "homepage": "https://github.com/mtdowling"
267 | },
268 | {
269 | "name": "George Mponos",
270 | "email": "gmponos@gmail.com",
271 | "homepage": "https://github.com/gmponos"
272 | },
273 | {
274 | "name": "Tobias Nyholm",
275 | "email": "tobias.nyholm@gmail.com",
276 | "homepage": "https://github.com/Nyholm"
277 | },
278 | {
279 | "name": "Márk Sági-Kazár",
280 | "email": "mark.sagikazar@gmail.com",
281 | "homepage": "https://github.com/sagikazarmark"
282 | },
283 | {
284 | "name": "Tobias Schultze",
285 | "email": "webmaster@tubo-world.de",
286 | "homepage": "https://github.com/Tobion"
287 | },
288 | {
289 | "name": "Márk Sági-Kazár",
290 | "email": "mark.sagikazar@gmail.com",
291 | "homepage": "https://sagikazarmark.hu"
292 | }
293 | ],
294 | "description": "PSR-7 message implementation that also provides common utility methods",
295 | "keywords": [
296 | "http",
297 | "message",
298 | "psr-7",
299 | "request",
300 | "response",
301 | "stream",
302 | "uri",
303 | "url"
304 | ],
305 | "funding": [
306 | {
307 | "url": "https://github.com/GrahamCampbell",
308 | "type": "github"
309 | },
310 | {
311 | "url": "https://github.com/Nyholm",
312 | "type": "github"
313 | },
314 | {
315 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
316 | "type": "tidelift"
317 | }
318 | ],
319 | "time": "2023-04-17T16:11:26+00:00"
320 | },
321 | {
322 | "name": "psr/http-client",
323 | "version": "1.0.1",
324 | "source": {
325 | "type": "git",
326 | "url": "https://github.com/php-fig/http-client.git",
327 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
328 | },
329 | "dist": {
330 | "type": "zip",
331 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
332 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
333 | "shasum": ""
334 | },
335 | "require": {
336 | "php": "^7.0 || ^8.0",
337 | "psr/http-message": "^1.0"
338 | },
339 | "type": "library",
340 | "extra": {
341 | "branch-alias": {
342 | "dev-master": "1.0.x-dev"
343 | }
344 | },
345 | "autoload": {
346 | "psr-4": {
347 | "Psr\\Http\\Client\\": "src/"
348 | }
349 | },
350 | "notification-url": "https://packagist.org/downloads/",
351 | "license": [
352 | "MIT"
353 | ],
354 | "authors": [
355 | {
356 | "name": "PHP-FIG",
357 | "homepage": "http://www.php-fig.org/"
358 | }
359 | ],
360 | "description": "Common interface for HTTP clients",
361 | "homepage": "https://github.com/php-fig/http-client",
362 | "keywords": [
363 | "http",
364 | "http-client",
365 | "psr",
366 | "psr-18"
367 | ],
368 | "time": "2020-06-29T06:28:15+00:00"
369 | },
370 | {
371 | "name": "psr/http-factory",
372 | "version": "1.0.2",
373 | "source": {
374 | "type": "git",
375 | "url": "https://github.com/php-fig/http-factory.git",
376 | "reference": "e616d01114759c4c489f93b099585439f795fe35"
377 | },
378 | "dist": {
379 | "type": "zip",
380 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
381 | "reference": "e616d01114759c4c489f93b099585439f795fe35",
382 | "shasum": ""
383 | },
384 | "require": {
385 | "php": ">=7.0.0",
386 | "psr/http-message": "^1.0 || ^2.0"
387 | },
388 | "type": "library",
389 | "extra": {
390 | "branch-alias": {
391 | "dev-master": "1.0.x-dev"
392 | }
393 | },
394 | "autoload": {
395 | "psr-4": {
396 | "Psr\\Http\\Message\\": "src/"
397 | }
398 | },
399 | "notification-url": "https://packagist.org/downloads/",
400 | "license": [
401 | "MIT"
402 | ],
403 | "authors": [
404 | {
405 | "name": "PHP-FIG",
406 | "homepage": "https://www.php-fig.org/"
407 | }
408 | ],
409 | "description": "Common interfaces for PSR-7 HTTP message factories",
410 | "keywords": [
411 | "factory",
412 | "http",
413 | "message",
414 | "psr",
415 | "psr-17",
416 | "psr-7",
417 | "request",
418 | "response"
419 | ],
420 | "time": "2023-04-10T20:10:41+00:00"
421 | },
422 | {
423 | "name": "psr/http-message",
424 | "version": "1.1",
425 | "source": {
426 | "type": "git",
427 | "url": "https://github.com/php-fig/http-message.git",
428 | "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
429 | },
430 | "dist": {
431 | "type": "zip",
432 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
433 | "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
434 | "shasum": ""
435 | },
436 | "require": {
437 | "php": "^7.2 || ^8.0"
438 | },
439 | "type": "library",
440 | "extra": {
441 | "branch-alias": {
442 | "dev-master": "1.1.x-dev"
443 | }
444 | },
445 | "autoload": {
446 | "psr-4": {
447 | "Psr\\Http\\Message\\": "src/"
448 | }
449 | },
450 | "notification-url": "https://packagist.org/downloads/",
451 | "license": [
452 | "MIT"
453 | ],
454 | "authors": [
455 | {
456 | "name": "PHP-FIG",
457 | "homepage": "http://www.php-fig.org/"
458 | }
459 | ],
460 | "description": "Common interface for HTTP messages",
461 | "homepage": "https://github.com/php-fig/http-message",
462 | "keywords": [
463 | "http",
464 | "http-message",
465 | "psr",
466 | "psr-7",
467 | "request",
468 | "response"
469 | ],
470 | "time": "2023-04-04T09:50:52+00:00"
471 | },
472 | {
473 | "name": "ralouphie/getallheaders",
474 | "version": "3.0.3",
475 | "source": {
476 | "type": "git",
477 | "url": "https://github.com/ralouphie/getallheaders.git",
478 | "reference": "120b605dfeb996808c31b6477290a714d356e822"
479 | },
480 | "dist": {
481 | "type": "zip",
482 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
483 | "reference": "120b605dfeb996808c31b6477290a714d356e822",
484 | "shasum": ""
485 | },
486 | "require": {
487 | "php": ">=5.6"
488 | },
489 | "require-dev": {
490 | "php-coveralls/php-coveralls": "^2.1",
491 | "phpunit/phpunit": "^5 || ^6.5"
492 | },
493 | "type": "library",
494 | "autoload": {
495 | "files": [
496 | "src/getallheaders.php"
497 | ]
498 | },
499 | "notification-url": "https://packagist.org/downloads/",
500 | "license": [
501 | "MIT"
502 | ],
503 | "authors": [
504 | {
505 | "name": "Ralph Khattar",
506 | "email": "ralph.khattar@gmail.com"
507 | }
508 | ],
509 | "description": "A polyfill for getallheaders.",
510 | "time": "2019-03-08T08:55:37+00:00"
511 | },
512 | {
513 | "name": "symfony/deprecation-contracts",
514 | "version": "v2.5.2",
515 | "source": {
516 | "type": "git",
517 | "url": "https://github.com/symfony/deprecation-contracts.git",
518 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
519 | },
520 | "dist": {
521 | "type": "zip",
522 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
523 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
524 | "shasum": ""
525 | },
526 | "require": {
527 | "php": ">=7.1"
528 | },
529 | "type": "library",
530 | "extra": {
531 | "branch-alias": {
532 | "dev-main": "2.5-dev"
533 | },
534 | "thanks": {
535 | "name": "symfony/contracts",
536 | "url": "https://github.com/symfony/contracts"
537 | }
538 | },
539 | "autoload": {
540 | "files": [
541 | "function.php"
542 | ]
543 | },
544 | "notification-url": "https://packagist.org/downloads/",
545 | "license": [
546 | "MIT"
547 | ],
548 | "authors": [
549 | {
550 | "name": "Nicolas Grekas",
551 | "email": "p@tchwork.com"
552 | },
553 | {
554 | "name": "Symfony Community",
555 | "homepage": "https://symfony.com/contributors"
556 | }
557 | ],
558 | "description": "A generic function and convention to trigger deprecation notices",
559 | "homepage": "https://symfony.com",
560 | "funding": [
561 | {
562 | "url": "https://symfony.com/sponsor",
563 | "type": "custom"
564 | },
565 | {
566 | "url": "https://github.com/fabpot",
567 | "type": "github"
568 | },
569 | {
570 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
571 | "type": "tidelift"
572 | }
573 | ],
574 | "time": "2022-01-02T09:53:40+00:00"
575 | }
576 | ],
577 | "packages-dev": [
578 | {
579 | "name": "doctrine/instantiator",
580 | "version": "1.3.1",
581 | "source": {
582 | "type": "git",
583 | "url": "https://github.com/doctrine/instantiator.git",
584 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
585 | },
586 | "dist": {
587 | "type": "zip",
588 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
589 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
590 | "shasum": ""
591 | },
592 | "require": {
593 | "php": "^7.1 || ^8.0"
594 | },
595 | "require-dev": {
596 | "doctrine/coding-standard": "^6.0",
597 | "ext-pdo": "*",
598 | "ext-phar": "*",
599 | "phpbench/phpbench": "^0.13",
600 | "phpstan/phpstan-phpunit": "^0.11",
601 | "phpstan/phpstan-shim": "^0.11",
602 | "phpunit/phpunit": "^7.0"
603 | },
604 | "type": "library",
605 | "extra": {
606 | "branch-alias": {
607 | "dev-master": "1.2.x-dev"
608 | }
609 | },
610 | "autoload": {
611 | "psr-4": {
612 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
613 | }
614 | },
615 | "notification-url": "https://packagist.org/downloads/",
616 | "license": [
617 | "MIT"
618 | ],
619 | "authors": [
620 | {
621 | "name": "Marco Pivetta",
622 | "email": "ocramius@gmail.com",
623 | "homepage": "http://ocramius.github.com/"
624 | }
625 | ],
626 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
627 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
628 | "keywords": [
629 | "constructor",
630 | "instantiate"
631 | ],
632 | "funding": [
633 | {
634 | "url": "https://www.doctrine-project.org/sponsorship.html",
635 | "type": "custom"
636 | },
637 | {
638 | "url": "https://www.patreon.com/phpdoctrine",
639 | "type": "patreon"
640 | },
641 | {
642 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
643 | "type": "tidelift"
644 | }
645 | ],
646 | "time": "2020-05-29T17:27:14+00:00"
647 | },
648 | {
649 | "name": "myclabs/deep-copy",
650 | "version": "1.10.1",
651 | "source": {
652 | "type": "git",
653 | "url": "https://github.com/myclabs/DeepCopy.git",
654 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5"
655 | },
656 | "dist": {
657 | "type": "zip",
658 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
659 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
660 | "shasum": ""
661 | },
662 | "require": {
663 | "php": "^7.1 || ^8.0"
664 | },
665 | "replace": {
666 | "myclabs/deep-copy": "self.version"
667 | },
668 | "require-dev": {
669 | "doctrine/collections": "^1.0",
670 | "doctrine/common": "^2.6",
671 | "phpunit/phpunit": "^7.1"
672 | },
673 | "type": "library",
674 | "autoload": {
675 | "files": [
676 | "src/DeepCopy/deep_copy.php"
677 | ],
678 | "psr-4": {
679 | "DeepCopy\\": "src/DeepCopy/"
680 | }
681 | },
682 | "notification-url": "https://packagist.org/downloads/",
683 | "license": [
684 | "MIT"
685 | ],
686 | "description": "Create deep copies (clones) of your objects",
687 | "keywords": [
688 | "clone",
689 | "copy",
690 | "duplicate",
691 | "object",
692 | "object graph"
693 | ],
694 | "funding": [
695 | {
696 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
697 | "type": "tidelift"
698 | }
699 | ],
700 | "time": "2020-06-29T13:22:24+00:00"
701 | },
702 | {
703 | "name": "nikic/php-parser",
704 | "version": "v4.10.2",
705 | "source": {
706 | "type": "git",
707 | "url": "https://github.com/nikic/PHP-Parser.git",
708 | "reference": "658f1be311a230e0907f5dfe0213742aff0596de"
709 | },
710 | "dist": {
711 | "type": "zip",
712 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de",
713 | "reference": "658f1be311a230e0907f5dfe0213742aff0596de",
714 | "shasum": ""
715 | },
716 | "require": {
717 | "ext-tokenizer": "*",
718 | "php": ">=7.0"
719 | },
720 | "require-dev": {
721 | "ircmaxell/php-yacc": "^0.0.7",
722 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
723 | },
724 | "bin": [
725 | "bin/php-parse"
726 | ],
727 | "type": "library",
728 | "extra": {
729 | "branch-alias": {
730 | "dev-master": "4.9-dev"
731 | }
732 | },
733 | "autoload": {
734 | "psr-4": {
735 | "PhpParser\\": "lib/PhpParser"
736 | }
737 | },
738 | "notification-url": "https://packagist.org/downloads/",
739 | "license": [
740 | "BSD-3-Clause"
741 | ],
742 | "authors": [
743 | {
744 | "name": "Nikita Popov"
745 | }
746 | ],
747 | "description": "A PHP parser written in PHP",
748 | "keywords": [
749 | "parser",
750 | "php"
751 | ],
752 | "time": "2020-09-26T10:30:38+00:00"
753 | },
754 | {
755 | "name": "phar-io/manifest",
756 | "version": "2.0.1",
757 | "source": {
758 | "type": "git",
759 | "url": "https://github.com/phar-io/manifest.git",
760 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
761 | },
762 | "dist": {
763 | "type": "zip",
764 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
765 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
766 | "shasum": ""
767 | },
768 | "require": {
769 | "ext-dom": "*",
770 | "ext-phar": "*",
771 | "ext-xmlwriter": "*",
772 | "phar-io/version": "^3.0.1",
773 | "php": "^7.2 || ^8.0"
774 | },
775 | "type": "library",
776 | "extra": {
777 | "branch-alias": {
778 | "dev-master": "2.0.x-dev"
779 | }
780 | },
781 | "autoload": {
782 | "classmap": [
783 | "src/"
784 | ]
785 | },
786 | "notification-url": "https://packagist.org/downloads/",
787 | "license": [
788 | "BSD-3-Clause"
789 | ],
790 | "authors": [
791 | {
792 | "name": "Arne Blankerts",
793 | "email": "arne@blankerts.de",
794 | "role": "Developer"
795 | },
796 | {
797 | "name": "Sebastian Heuer",
798 | "email": "sebastian@phpeople.de",
799 | "role": "Developer"
800 | },
801 | {
802 | "name": "Sebastian Bergmann",
803 | "email": "sebastian@phpunit.de",
804 | "role": "Developer"
805 | }
806 | ],
807 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
808 | "time": "2020-06-27T14:33:11+00:00"
809 | },
810 | {
811 | "name": "phar-io/version",
812 | "version": "3.0.2",
813 | "source": {
814 | "type": "git",
815 | "url": "https://github.com/phar-io/version.git",
816 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0"
817 | },
818 | "dist": {
819 | "type": "zip",
820 | "url": "https://api.github.com/repos/phar-io/version/zipball/c6bb6825def89e0a32220f88337f8ceaf1975fa0",
821 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0",
822 | "shasum": ""
823 | },
824 | "require": {
825 | "php": "^7.2 || ^8.0"
826 | },
827 | "type": "library",
828 | "autoload": {
829 | "classmap": [
830 | "src/"
831 | ]
832 | },
833 | "notification-url": "https://packagist.org/downloads/",
834 | "license": [
835 | "BSD-3-Clause"
836 | ],
837 | "authors": [
838 | {
839 | "name": "Arne Blankerts",
840 | "email": "arne@blankerts.de",
841 | "role": "Developer"
842 | },
843 | {
844 | "name": "Sebastian Heuer",
845 | "email": "sebastian@phpeople.de",
846 | "role": "Developer"
847 | },
848 | {
849 | "name": "Sebastian Bergmann",
850 | "email": "sebastian@phpunit.de",
851 | "role": "Developer"
852 | }
853 | ],
854 | "description": "Library for handling version information and constraints",
855 | "time": "2020-06-27T14:39:04+00:00"
856 | },
857 | {
858 | "name": "phpdocumentor/reflection-common",
859 | "version": "2.2.0",
860 | "source": {
861 | "type": "git",
862 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
863 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
864 | },
865 | "dist": {
866 | "type": "zip",
867 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
868 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
869 | "shasum": ""
870 | },
871 | "require": {
872 | "php": "^7.2 || ^8.0"
873 | },
874 | "type": "library",
875 | "extra": {
876 | "branch-alias": {
877 | "dev-2.x": "2.x-dev"
878 | }
879 | },
880 | "autoload": {
881 | "psr-4": {
882 | "phpDocumentor\\Reflection\\": "src/"
883 | }
884 | },
885 | "notification-url": "https://packagist.org/downloads/",
886 | "license": [
887 | "MIT"
888 | ],
889 | "authors": [
890 | {
891 | "name": "Jaap van Otterdijk",
892 | "email": "opensource@ijaap.nl"
893 | }
894 | ],
895 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
896 | "homepage": "http://www.phpdoc.org",
897 | "keywords": [
898 | "FQSEN",
899 | "phpDocumentor",
900 | "phpdoc",
901 | "reflection",
902 | "static analysis"
903 | ],
904 | "time": "2020-06-27T09:03:43+00:00"
905 | },
906 | {
907 | "name": "phpdocumentor/reflection-docblock",
908 | "version": "5.2.2",
909 | "source": {
910 | "type": "git",
911 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
912 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
913 | },
914 | "dist": {
915 | "type": "zip",
916 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
917 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
918 | "shasum": ""
919 | },
920 | "require": {
921 | "ext-filter": "*",
922 | "php": "^7.2 || ^8.0",
923 | "phpdocumentor/reflection-common": "^2.2",
924 | "phpdocumentor/type-resolver": "^1.3",
925 | "webmozart/assert": "^1.9.1"
926 | },
927 | "require-dev": {
928 | "mockery/mockery": "~1.3.2"
929 | },
930 | "type": "library",
931 | "extra": {
932 | "branch-alias": {
933 | "dev-master": "5.x-dev"
934 | }
935 | },
936 | "autoload": {
937 | "psr-4": {
938 | "phpDocumentor\\Reflection\\": "src"
939 | }
940 | },
941 | "notification-url": "https://packagist.org/downloads/",
942 | "license": [
943 | "MIT"
944 | ],
945 | "authors": [
946 | {
947 | "name": "Mike van Riel",
948 | "email": "me@mikevanriel.com"
949 | },
950 | {
951 | "name": "Jaap van Otterdijk",
952 | "email": "account@ijaap.nl"
953 | }
954 | ],
955 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
956 | "time": "2020-09-03T19:13:55+00:00"
957 | },
958 | {
959 | "name": "phpdocumentor/type-resolver",
960 | "version": "1.4.0",
961 | "source": {
962 | "type": "git",
963 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
964 | "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
965 | },
966 | "dist": {
967 | "type": "zip",
968 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
969 | "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
970 | "shasum": ""
971 | },
972 | "require": {
973 | "php": "^7.2 || ^8.0",
974 | "phpdocumentor/reflection-common": "^2.0"
975 | },
976 | "require-dev": {
977 | "ext-tokenizer": "*"
978 | },
979 | "type": "library",
980 | "extra": {
981 | "branch-alias": {
982 | "dev-1.x": "1.x-dev"
983 | }
984 | },
985 | "autoload": {
986 | "psr-4": {
987 | "phpDocumentor\\Reflection\\": "src"
988 | }
989 | },
990 | "notification-url": "https://packagist.org/downloads/",
991 | "license": [
992 | "MIT"
993 | ],
994 | "authors": [
995 | {
996 | "name": "Mike van Riel",
997 | "email": "me@mikevanriel.com"
998 | }
999 | ],
1000 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
1001 | "time": "2020-09-17T18:55:26+00:00"
1002 | },
1003 | {
1004 | "name": "phpspec/prophecy",
1005 | "version": "1.12.1",
1006 | "source": {
1007 | "type": "git",
1008 | "url": "https://github.com/phpspec/prophecy.git",
1009 | "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d"
1010 | },
1011 | "dist": {
1012 | "type": "zip",
1013 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d",
1014 | "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d",
1015 | "shasum": ""
1016 | },
1017 | "require": {
1018 | "doctrine/instantiator": "^1.2",
1019 | "php": "^7.2 || ~8.0, <8.1",
1020 | "phpdocumentor/reflection-docblock": "^5.2",
1021 | "sebastian/comparator": "^3.0 || ^4.0",
1022 | "sebastian/recursion-context": "^3.0 || ^4.0"
1023 | },
1024 | "require-dev": {
1025 | "phpspec/phpspec": "^6.0",
1026 | "phpunit/phpunit": "^8.0 || ^9.0 <9.3"
1027 | },
1028 | "type": "library",
1029 | "extra": {
1030 | "branch-alias": {
1031 | "dev-master": "1.11.x-dev"
1032 | }
1033 | },
1034 | "autoload": {
1035 | "psr-4": {
1036 | "Prophecy\\": "src/Prophecy"
1037 | }
1038 | },
1039 | "notification-url": "https://packagist.org/downloads/",
1040 | "license": [
1041 | "MIT"
1042 | ],
1043 | "authors": [
1044 | {
1045 | "name": "Konstantin Kudryashov",
1046 | "email": "ever.zet@gmail.com",
1047 | "homepage": "http://everzet.com"
1048 | },
1049 | {
1050 | "name": "Marcello Duarte",
1051 | "email": "marcello.duarte@gmail.com"
1052 | }
1053 | ],
1054 | "description": "Highly opinionated mocking framework for PHP 5.3+",
1055 | "homepage": "https://github.com/phpspec/prophecy",
1056 | "keywords": [
1057 | "Double",
1058 | "Dummy",
1059 | "fake",
1060 | "mock",
1061 | "spy",
1062 | "stub"
1063 | ],
1064 | "time": "2020-09-29T09:10:42+00:00"
1065 | },
1066 | {
1067 | "name": "phpunit/php-code-coverage",
1068 | "version": "9.2.0",
1069 | "source": {
1070 | "type": "git",
1071 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1072 | "reference": "53a4b737e83be724efd2bc4e7b929b9a30c48972"
1073 | },
1074 | "dist": {
1075 | "type": "zip",
1076 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/53a4b737e83be724efd2bc4e7b929b9a30c48972",
1077 | "reference": "53a4b737e83be724efd2bc4e7b929b9a30c48972",
1078 | "shasum": ""
1079 | },
1080 | "require": {
1081 | "ext-dom": "*",
1082 | "ext-libxml": "*",
1083 | "ext-xmlwriter": "*",
1084 | "nikic/php-parser": "^4.8",
1085 | "php": ">=7.3",
1086 | "phpunit/php-file-iterator": "^3.0.3",
1087 | "phpunit/php-text-template": "^2.0.2",
1088 | "sebastian/code-unit-reverse-lookup": "^2.0.2",
1089 | "sebastian/complexity": "^2.0",
1090 | "sebastian/environment": "^5.1.2",
1091 | "sebastian/lines-of-code": "^1.0",
1092 | "sebastian/version": "^3.0.1",
1093 | "theseer/tokenizer": "^1.2.0"
1094 | },
1095 | "require-dev": {
1096 | "phpunit/phpunit": "^9.3"
1097 | },
1098 | "suggest": {
1099 | "ext-pcov": "*",
1100 | "ext-xdebug": "*"
1101 | },
1102 | "type": "library",
1103 | "extra": {
1104 | "branch-alias": {
1105 | "dev-master": "9.2-dev"
1106 | }
1107 | },
1108 | "autoload": {
1109 | "classmap": [
1110 | "src/"
1111 | ]
1112 | },
1113 | "notification-url": "https://packagist.org/downloads/",
1114 | "license": [
1115 | "BSD-3-Clause"
1116 | ],
1117 | "authors": [
1118 | {
1119 | "name": "Sebastian Bergmann",
1120 | "email": "sebastian@phpunit.de",
1121 | "role": "lead"
1122 | }
1123 | ],
1124 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
1125 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
1126 | "keywords": [
1127 | "coverage",
1128 | "testing",
1129 | "xunit"
1130 | ],
1131 | "funding": [
1132 | {
1133 | "url": "https://github.com/sebastianbergmann",
1134 | "type": "github"
1135 | }
1136 | ],
1137 | "time": "2020-10-02T03:37:32+00:00"
1138 | },
1139 | {
1140 | "name": "phpunit/php-file-iterator",
1141 | "version": "3.0.5",
1142 | "source": {
1143 | "type": "git",
1144 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
1145 | "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
1146 | },
1147 | "dist": {
1148 | "type": "zip",
1149 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
1150 | "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
1151 | "shasum": ""
1152 | },
1153 | "require": {
1154 | "php": ">=7.3"
1155 | },
1156 | "require-dev": {
1157 | "phpunit/phpunit": "^9.3"
1158 | },
1159 | "type": "library",
1160 | "extra": {
1161 | "branch-alias": {
1162 | "dev-master": "3.0-dev"
1163 | }
1164 | },
1165 | "autoload": {
1166 | "classmap": [
1167 | "src/"
1168 | ]
1169 | },
1170 | "notification-url": "https://packagist.org/downloads/",
1171 | "license": [
1172 | "BSD-3-Clause"
1173 | ],
1174 | "authors": [
1175 | {
1176 | "name": "Sebastian Bergmann",
1177 | "email": "sebastian@phpunit.de",
1178 | "role": "lead"
1179 | }
1180 | ],
1181 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
1182 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
1183 | "keywords": [
1184 | "filesystem",
1185 | "iterator"
1186 | ],
1187 | "funding": [
1188 | {
1189 | "url": "https://github.com/sebastianbergmann",
1190 | "type": "github"
1191 | }
1192 | ],
1193 | "time": "2020-09-28T05:57:25+00:00"
1194 | },
1195 | {
1196 | "name": "phpunit/php-invoker",
1197 | "version": "3.1.1",
1198 | "source": {
1199 | "type": "git",
1200 | "url": "https://github.com/sebastianbergmann/php-invoker.git",
1201 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
1202 | },
1203 | "dist": {
1204 | "type": "zip",
1205 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
1206 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
1207 | "shasum": ""
1208 | },
1209 | "require": {
1210 | "php": ">=7.3"
1211 | },
1212 | "require-dev": {
1213 | "ext-pcntl": "*",
1214 | "phpunit/phpunit": "^9.3"
1215 | },
1216 | "suggest": {
1217 | "ext-pcntl": "*"
1218 | },
1219 | "type": "library",
1220 | "extra": {
1221 | "branch-alias": {
1222 | "dev-master": "3.1-dev"
1223 | }
1224 | },
1225 | "autoload": {
1226 | "classmap": [
1227 | "src/"
1228 | ]
1229 | },
1230 | "notification-url": "https://packagist.org/downloads/",
1231 | "license": [
1232 | "BSD-3-Clause"
1233 | ],
1234 | "authors": [
1235 | {
1236 | "name": "Sebastian Bergmann",
1237 | "email": "sebastian@phpunit.de",
1238 | "role": "lead"
1239 | }
1240 | ],
1241 | "description": "Invoke callables with a timeout",
1242 | "homepage": "https://github.com/sebastianbergmann/php-invoker/",
1243 | "keywords": [
1244 | "process"
1245 | ],
1246 | "funding": [
1247 | {
1248 | "url": "https://github.com/sebastianbergmann",
1249 | "type": "github"
1250 | }
1251 | ],
1252 | "time": "2020-09-28T05:58:55+00:00"
1253 | },
1254 | {
1255 | "name": "phpunit/php-text-template",
1256 | "version": "2.0.3",
1257 | "source": {
1258 | "type": "git",
1259 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
1260 | "reference": "18c887016e60e52477e54534956d7b47bc52cd84"
1261 | },
1262 | "dist": {
1263 | "type": "zip",
1264 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/18c887016e60e52477e54534956d7b47bc52cd84",
1265 | "reference": "18c887016e60e52477e54534956d7b47bc52cd84",
1266 | "shasum": ""
1267 | },
1268 | "require": {
1269 | "php": ">=7.3"
1270 | },
1271 | "require-dev": {
1272 | "phpunit/phpunit": "^9.3"
1273 | },
1274 | "type": "library",
1275 | "extra": {
1276 | "branch-alias": {
1277 | "dev-master": "2.0-dev"
1278 | }
1279 | },
1280 | "autoload": {
1281 | "classmap": [
1282 | "src/"
1283 | ]
1284 | },
1285 | "notification-url": "https://packagist.org/downloads/",
1286 | "license": [
1287 | "BSD-3-Clause"
1288 | ],
1289 | "authors": [
1290 | {
1291 | "name": "Sebastian Bergmann",
1292 | "email": "sebastian@phpunit.de",
1293 | "role": "lead"
1294 | }
1295 | ],
1296 | "description": "Simple template engine.",
1297 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1298 | "keywords": [
1299 | "template"
1300 | ],
1301 | "funding": [
1302 | {
1303 | "url": "https://github.com/sebastianbergmann",
1304 | "type": "github"
1305 | }
1306 | ],
1307 | "time": "2020-09-28T06:03:05+00:00"
1308 | },
1309 | {
1310 | "name": "phpunit/php-timer",
1311 | "version": "5.0.2",
1312 | "source": {
1313 | "type": "git",
1314 | "url": "https://github.com/sebastianbergmann/php-timer.git",
1315 | "reference": "c9ff14f493699e2f6adee9fd06a0245b276643b7"
1316 | },
1317 | "dist": {
1318 | "type": "zip",
1319 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/c9ff14f493699e2f6adee9fd06a0245b276643b7",
1320 | "reference": "c9ff14f493699e2f6adee9fd06a0245b276643b7",
1321 | "shasum": ""
1322 | },
1323 | "require": {
1324 | "php": ">=7.3"
1325 | },
1326 | "require-dev": {
1327 | "phpunit/phpunit": "^9.3"
1328 | },
1329 | "type": "library",
1330 | "extra": {
1331 | "branch-alias": {
1332 | "dev-master": "5.0-dev"
1333 | }
1334 | },
1335 | "autoload": {
1336 | "classmap": [
1337 | "src/"
1338 | ]
1339 | },
1340 | "notification-url": "https://packagist.org/downloads/",
1341 | "license": [
1342 | "BSD-3-Clause"
1343 | ],
1344 | "authors": [
1345 | {
1346 | "name": "Sebastian Bergmann",
1347 | "email": "sebastian@phpunit.de",
1348 | "role": "lead"
1349 | }
1350 | ],
1351 | "description": "Utility class for timing",
1352 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
1353 | "keywords": [
1354 | "timer"
1355 | ],
1356 | "funding": [
1357 | {
1358 | "url": "https://github.com/sebastianbergmann",
1359 | "type": "github"
1360 | }
1361 | ],
1362 | "time": "2020-09-28T06:00:25+00:00"
1363 | },
1364 | {
1365 | "name": "phpunit/phpunit",
1366 | "version": "9.4.2",
1367 | "source": {
1368 | "type": "git",
1369 | "url": "https://github.com/sebastianbergmann/phpunit.git",
1370 | "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa"
1371 | },
1372 | "dist": {
1373 | "type": "zip",
1374 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa",
1375 | "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa",
1376 | "shasum": ""
1377 | },
1378 | "require": {
1379 | "doctrine/instantiator": "^1.3.1",
1380 | "ext-dom": "*",
1381 | "ext-json": "*",
1382 | "ext-libxml": "*",
1383 | "ext-mbstring": "*",
1384 | "ext-xml": "*",
1385 | "ext-xmlwriter": "*",
1386 | "myclabs/deep-copy": "^1.10.1",
1387 | "phar-io/manifest": "^2.0.1",
1388 | "phar-io/version": "^3.0.2",
1389 | "php": ">=7.3",
1390 | "phpspec/prophecy": "^1.12.1",
1391 | "phpunit/php-code-coverage": "^9.2",
1392 | "phpunit/php-file-iterator": "^3.0.5",
1393 | "phpunit/php-invoker": "^3.1.1",
1394 | "phpunit/php-text-template": "^2.0.3",
1395 | "phpunit/php-timer": "^5.0.2",
1396 | "sebastian/cli-parser": "^1.0.1",
1397 | "sebastian/code-unit": "^1.0.6",
1398 | "sebastian/comparator": "^4.0.5",
1399 | "sebastian/diff": "^4.0.3",
1400 | "sebastian/environment": "^5.1.3",
1401 | "sebastian/exporter": "^4.0.3",
1402 | "sebastian/global-state": "^5.0.1",
1403 | "sebastian/object-enumerator": "^4.0.3",
1404 | "sebastian/resource-operations": "^3.0.3",
1405 | "sebastian/type": "^2.3",
1406 | "sebastian/version": "^3.0.2"
1407 | },
1408 | "require-dev": {
1409 | "ext-pdo": "*",
1410 | "phpspec/prophecy-phpunit": "^2.0.1"
1411 | },
1412 | "suggest": {
1413 | "ext-soap": "*",
1414 | "ext-xdebug": "*"
1415 | },
1416 | "bin": [
1417 | "phpunit"
1418 | ],
1419 | "type": "library",
1420 | "extra": {
1421 | "branch-alias": {
1422 | "dev-master": "9.4-dev"
1423 | }
1424 | },
1425 | "autoload": {
1426 | "files": [
1427 | "src/Framework/Assert/Functions.php"
1428 | ],
1429 | "classmap": [
1430 | "src/"
1431 | ]
1432 | },
1433 | "notification-url": "https://packagist.org/downloads/",
1434 | "license": [
1435 | "BSD-3-Clause"
1436 | ],
1437 | "authors": [
1438 | {
1439 | "name": "Sebastian Bergmann",
1440 | "email": "sebastian@phpunit.de",
1441 | "role": "lead"
1442 | }
1443 | ],
1444 | "description": "The PHP Unit Testing framework.",
1445 | "homepage": "https://phpunit.de/",
1446 | "keywords": [
1447 | "phpunit",
1448 | "testing",
1449 | "xunit"
1450 | ],
1451 | "funding": [
1452 | {
1453 | "url": "https://phpunit.de/donate.html",
1454 | "type": "custom"
1455 | },
1456 | {
1457 | "url": "https://github.com/sebastianbergmann",
1458 | "type": "github"
1459 | }
1460 | ],
1461 | "time": "2020-10-19T09:23:29+00:00"
1462 | },
1463 | {
1464 | "name": "sebastian/cli-parser",
1465 | "version": "1.0.1",
1466 | "source": {
1467 | "type": "git",
1468 | "url": "https://github.com/sebastianbergmann/cli-parser.git",
1469 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
1470 | },
1471 | "dist": {
1472 | "type": "zip",
1473 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1474 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1475 | "shasum": ""
1476 | },
1477 | "require": {
1478 | "php": ">=7.3"
1479 | },
1480 | "require-dev": {
1481 | "phpunit/phpunit": "^9.3"
1482 | },
1483 | "type": "library",
1484 | "extra": {
1485 | "branch-alias": {
1486 | "dev-master": "1.0-dev"
1487 | }
1488 | },
1489 | "autoload": {
1490 | "classmap": [
1491 | "src/"
1492 | ]
1493 | },
1494 | "notification-url": "https://packagist.org/downloads/",
1495 | "license": [
1496 | "BSD-3-Clause"
1497 | ],
1498 | "authors": [
1499 | {
1500 | "name": "Sebastian Bergmann",
1501 | "email": "sebastian@phpunit.de",
1502 | "role": "lead"
1503 | }
1504 | ],
1505 | "description": "Library for parsing CLI options",
1506 | "homepage": "https://github.com/sebastianbergmann/cli-parser",
1507 | "funding": [
1508 | {
1509 | "url": "https://github.com/sebastianbergmann",
1510 | "type": "github"
1511 | }
1512 | ],
1513 | "time": "2020-09-28T06:08:49+00:00"
1514 | },
1515 | {
1516 | "name": "sebastian/code-unit",
1517 | "version": "1.0.7",
1518 | "source": {
1519 | "type": "git",
1520 | "url": "https://github.com/sebastianbergmann/code-unit.git",
1521 | "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab"
1522 | },
1523 | "dist": {
1524 | "type": "zip",
1525 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
1526 | "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
1527 | "shasum": ""
1528 | },
1529 | "require": {
1530 | "php": ">=7.3"
1531 | },
1532 | "require-dev": {
1533 | "phpunit/phpunit": "^9.3"
1534 | },
1535 | "type": "library",
1536 | "extra": {
1537 | "branch-alias": {
1538 | "dev-master": "1.0-dev"
1539 | }
1540 | },
1541 | "autoload": {
1542 | "classmap": [
1543 | "src/"
1544 | ]
1545 | },
1546 | "notification-url": "https://packagist.org/downloads/",
1547 | "license": [
1548 | "BSD-3-Clause"
1549 | ],
1550 | "authors": [
1551 | {
1552 | "name": "Sebastian Bergmann",
1553 | "email": "sebastian@phpunit.de",
1554 | "role": "lead"
1555 | }
1556 | ],
1557 | "description": "Collection of value objects that represent the PHP code units",
1558 | "homepage": "https://github.com/sebastianbergmann/code-unit",
1559 | "funding": [
1560 | {
1561 | "url": "https://github.com/sebastianbergmann",
1562 | "type": "github"
1563 | }
1564 | ],
1565 | "time": "2020-10-02T14:47:54+00:00"
1566 | },
1567 | {
1568 | "name": "sebastian/code-unit-reverse-lookup",
1569 | "version": "2.0.3",
1570 | "source": {
1571 | "type": "git",
1572 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1573 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
1574 | },
1575 | "dist": {
1576 | "type": "zip",
1577 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1578 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1579 | "shasum": ""
1580 | },
1581 | "require": {
1582 | "php": ">=7.3"
1583 | },
1584 | "require-dev": {
1585 | "phpunit/phpunit": "^9.3"
1586 | },
1587 | "type": "library",
1588 | "extra": {
1589 | "branch-alias": {
1590 | "dev-master": "2.0-dev"
1591 | }
1592 | },
1593 | "autoload": {
1594 | "classmap": [
1595 | "src/"
1596 | ]
1597 | },
1598 | "notification-url": "https://packagist.org/downloads/",
1599 | "license": [
1600 | "BSD-3-Clause"
1601 | ],
1602 | "authors": [
1603 | {
1604 | "name": "Sebastian Bergmann",
1605 | "email": "sebastian@phpunit.de"
1606 | }
1607 | ],
1608 | "description": "Looks up which function or method a line of code belongs to",
1609 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1610 | "funding": [
1611 | {
1612 | "url": "https://github.com/sebastianbergmann",
1613 | "type": "github"
1614 | }
1615 | ],
1616 | "time": "2020-09-28T05:30:19+00:00"
1617 | },
1618 | {
1619 | "name": "sebastian/comparator",
1620 | "version": "4.0.5",
1621 | "source": {
1622 | "type": "git",
1623 | "url": "https://github.com/sebastianbergmann/comparator.git",
1624 | "reference": "7a8ff306445707539c1a6397372a982a1ec55120"
1625 | },
1626 | "dist": {
1627 | "type": "zip",
1628 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7a8ff306445707539c1a6397372a982a1ec55120",
1629 | "reference": "7a8ff306445707539c1a6397372a982a1ec55120",
1630 | "shasum": ""
1631 | },
1632 | "require": {
1633 | "php": ">=7.3",
1634 | "sebastian/diff": "^4.0",
1635 | "sebastian/exporter": "^4.0"
1636 | },
1637 | "require-dev": {
1638 | "phpunit/phpunit": "^9.3"
1639 | },
1640 | "type": "library",
1641 | "extra": {
1642 | "branch-alias": {
1643 | "dev-master": "4.0-dev"
1644 | }
1645 | },
1646 | "autoload": {
1647 | "classmap": [
1648 | "src/"
1649 | ]
1650 | },
1651 | "notification-url": "https://packagist.org/downloads/",
1652 | "license": [
1653 | "BSD-3-Clause"
1654 | ],
1655 | "authors": [
1656 | {
1657 | "name": "Sebastian Bergmann",
1658 | "email": "sebastian@phpunit.de"
1659 | },
1660 | {
1661 | "name": "Jeff Welch",
1662 | "email": "whatthejeff@gmail.com"
1663 | },
1664 | {
1665 | "name": "Volker Dusch",
1666 | "email": "github@wallbash.com"
1667 | },
1668 | {
1669 | "name": "Bernhard Schussek",
1670 | "email": "bschussek@2bepublished.at"
1671 | }
1672 | ],
1673 | "description": "Provides the functionality to compare PHP values for equality",
1674 | "homepage": "https://github.com/sebastianbergmann/comparator",
1675 | "keywords": [
1676 | "comparator",
1677 | "compare",
1678 | "equality"
1679 | ],
1680 | "funding": [
1681 | {
1682 | "url": "https://github.com/sebastianbergmann",
1683 | "type": "github"
1684 | }
1685 | ],
1686 | "time": "2020-09-30T06:47:25+00:00"
1687 | },
1688 | {
1689 | "name": "sebastian/complexity",
1690 | "version": "2.0.1",
1691 | "source": {
1692 | "type": "git",
1693 | "url": "https://github.com/sebastianbergmann/complexity.git",
1694 | "reference": "ba8cc2da0c0bfbc813d03b56406734030c7f1eff"
1695 | },
1696 | "dist": {
1697 | "type": "zip",
1698 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ba8cc2da0c0bfbc813d03b56406734030c7f1eff",
1699 | "reference": "ba8cc2da0c0bfbc813d03b56406734030c7f1eff",
1700 | "shasum": ""
1701 | },
1702 | "require": {
1703 | "nikic/php-parser": "^4.7",
1704 | "php": ">=7.3"
1705 | },
1706 | "require-dev": {
1707 | "phpunit/phpunit": "^9.3"
1708 | },
1709 | "type": "library",
1710 | "extra": {
1711 | "branch-alias": {
1712 | "dev-master": "2.0-dev"
1713 | }
1714 | },
1715 | "autoload": {
1716 | "classmap": [
1717 | "src/"
1718 | ]
1719 | },
1720 | "notification-url": "https://packagist.org/downloads/",
1721 | "license": [
1722 | "BSD-3-Clause"
1723 | ],
1724 | "authors": [
1725 | {
1726 | "name": "Sebastian Bergmann",
1727 | "email": "sebastian@phpunit.de",
1728 | "role": "lead"
1729 | }
1730 | ],
1731 | "description": "Library for calculating the complexity of PHP code units",
1732 | "homepage": "https://github.com/sebastianbergmann/complexity",
1733 | "funding": [
1734 | {
1735 | "url": "https://github.com/sebastianbergmann",
1736 | "type": "github"
1737 | }
1738 | ],
1739 | "time": "2020-09-28T06:05:03+00:00"
1740 | },
1741 | {
1742 | "name": "sebastian/diff",
1743 | "version": "4.0.3",
1744 | "source": {
1745 | "type": "git",
1746 | "url": "https://github.com/sebastianbergmann/diff.git",
1747 | "reference": "ffc949a1a2aae270ea064453d7535b82e4c32092"
1748 | },
1749 | "dist": {
1750 | "type": "zip",
1751 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ffc949a1a2aae270ea064453d7535b82e4c32092",
1752 | "reference": "ffc949a1a2aae270ea064453d7535b82e4c32092",
1753 | "shasum": ""
1754 | },
1755 | "require": {
1756 | "php": ">=7.3"
1757 | },
1758 | "require-dev": {
1759 | "phpunit/phpunit": "^9.3",
1760 | "symfony/process": "^4.2 || ^5"
1761 | },
1762 | "type": "library",
1763 | "extra": {
1764 | "branch-alias": {
1765 | "dev-master": "4.0-dev"
1766 | }
1767 | },
1768 | "autoload": {
1769 | "classmap": [
1770 | "src/"
1771 | ]
1772 | },
1773 | "notification-url": "https://packagist.org/downloads/",
1774 | "license": [
1775 | "BSD-3-Clause"
1776 | ],
1777 | "authors": [
1778 | {
1779 | "name": "Sebastian Bergmann",
1780 | "email": "sebastian@phpunit.de"
1781 | },
1782 | {
1783 | "name": "Kore Nordmann",
1784 | "email": "mail@kore-nordmann.de"
1785 | }
1786 | ],
1787 | "description": "Diff implementation",
1788 | "homepage": "https://github.com/sebastianbergmann/diff",
1789 | "keywords": [
1790 | "diff",
1791 | "udiff",
1792 | "unidiff",
1793 | "unified diff"
1794 | ],
1795 | "funding": [
1796 | {
1797 | "url": "https://github.com/sebastianbergmann",
1798 | "type": "github"
1799 | }
1800 | ],
1801 | "time": "2020-09-28T05:32:55+00:00"
1802 | },
1803 | {
1804 | "name": "sebastian/environment",
1805 | "version": "5.1.3",
1806 | "source": {
1807 | "type": "git",
1808 | "url": "https://github.com/sebastianbergmann/environment.git",
1809 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
1810 | },
1811 | "dist": {
1812 | "type": "zip",
1813 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
1814 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
1815 | "shasum": ""
1816 | },
1817 | "require": {
1818 | "php": ">=7.3"
1819 | },
1820 | "require-dev": {
1821 | "phpunit/phpunit": "^9.3"
1822 | },
1823 | "suggest": {
1824 | "ext-posix": "*"
1825 | },
1826 | "type": "library",
1827 | "extra": {
1828 | "branch-alias": {
1829 | "dev-master": "5.1-dev"
1830 | }
1831 | },
1832 | "autoload": {
1833 | "classmap": [
1834 | "src/"
1835 | ]
1836 | },
1837 | "notification-url": "https://packagist.org/downloads/",
1838 | "license": [
1839 | "BSD-3-Clause"
1840 | ],
1841 | "authors": [
1842 | {
1843 | "name": "Sebastian Bergmann",
1844 | "email": "sebastian@phpunit.de"
1845 | }
1846 | ],
1847 | "description": "Provides functionality to handle HHVM/PHP environments",
1848 | "homepage": "http://www.github.com/sebastianbergmann/environment",
1849 | "keywords": [
1850 | "Xdebug",
1851 | "environment",
1852 | "hhvm"
1853 | ],
1854 | "funding": [
1855 | {
1856 | "url": "https://github.com/sebastianbergmann",
1857 | "type": "github"
1858 | }
1859 | ],
1860 | "time": "2020-09-28T05:52:38+00:00"
1861 | },
1862 | {
1863 | "name": "sebastian/exporter",
1864 | "version": "4.0.3",
1865 | "source": {
1866 | "type": "git",
1867 | "url": "https://github.com/sebastianbergmann/exporter.git",
1868 | "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
1869 | },
1870 | "dist": {
1871 | "type": "zip",
1872 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
1873 | "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
1874 | "shasum": ""
1875 | },
1876 | "require": {
1877 | "php": ">=7.3",
1878 | "sebastian/recursion-context": "^4.0"
1879 | },
1880 | "require-dev": {
1881 | "ext-mbstring": "*",
1882 | "phpunit/phpunit": "^9.3"
1883 | },
1884 | "type": "library",
1885 | "extra": {
1886 | "branch-alias": {
1887 | "dev-master": "4.0-dev"
1888 | }
1889 | },
1890 | "autoload": {
1891 | "classmap": [
1892 | "src/"
1893 | ]
1894 | },
1895 | "notification-url": "https://packagist.org/downloads/",
1896 | "license": [
1897 | "BSD-3-Clause"
1898 | ],
1899 | "authors": [
1900 | {
1901 | "name": "Sebastian Bergmann",
1902 | "email": "sebastian@phpunit.de"
1903 | },
1904 | {
1905 | "name": "Jeff Welch",
1906 | "email": "whatthejeff@gmail.com"
1907 | },
1908 | {
1909 | "name": "Volker Dusch",
1910 | "email": "github@wallbash.com"
1911 | },
1912 | {
1913 | "name": "Adam Harvey",
1914 | "email": "aharvey@php.net"
1915 | },
1916 | {
1917 | "name": "Bernhard Schussek",
1918 | "email": "bschussek@gmail.com"
1919 | }
1920 | ],
1921 | "description": "Provides the functionality to export PHP variables for visualization",
1922 | "homepage": "http://www.github.com/sebastianbergmann/exporter",
1923 | "keywords": [
1924 | "export",
1925 | "exporter"
1926 | ],
1927 | "funding": [
1928 | {
1929 | "url": "https://github.com/sebastianbergmann",
1930 | "type": "github"
1931 | }
1932 | ],
1933 | "time": "2020-09-28T05:24:23+00:00"
1934 | },
1935 | {
1936 | "name": "sebastian/global-state",
1937 | "version": "5.0.1",
1938 | "source": {
1939 | "type": "git",
1940 | "url": "https://github.com/sebastianbergmann/global-state.git",
1941 | "reference": "ea779cb749a478b22a2564ac41cd7bda79c78dc7"
1942 | },
1943 | "dist": {
1944 | "type": "zip",
1945 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ea779cb749a478b22a2564ac41cd7bda79c78dc7",
1946 | "reference": "ea779cb749a478b22a2564ac41cd7bda79c78dc7",
1947 | "shasum": ""
1948 | },
1949 | "require": {
1950 | "php": ">=7.3",
1951 | "sebastian/object-reflector": "^2.0",
1952 | "sebastian/recursion-context": "^4.0"
1953 | },
1954 | "require-dev": {
1955 | "ext-dom": "*",
1956 | "phpunit/phpunit": "^9.3"
1957 | },
1958 | "suggest": {
1959 | "ext-uopz": "*"
1960 | },
1961 | "type": "library",
1962 | "extra": {
1963 | "branch-alias": {
1964 | "dev-master": "5.0-dev"
1965 | }
1966 | },
1967 | "autoload": {
1968 | "classmap": [
1969 | "src/"
1970 | ]
1971 | },
1972 | "notification-url": "https://packagist.org/downloads/",
1973 | "license": [
1974 | "BSD-3-Clause"
1975 | ],
1976 | "authors": [
1977 | {
1978 | "name": "Sebastian Bergmann",
1979 | "email": "sebastian@phpunit.de"
1980 | }
1981 | ],
1982 | "description": "Snapshotting of global state",
1983 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
1984 | "keywords": [
1985 | "global state"
1986 | ],
1987 | "funding": [
1988 | {
1989 | "url": "https://github.com/sebastianbergmann",
1990 | "type": "github"
1991 | }
1992 | ],
1993 | "time": "2020-09-28T05:54:06+00:00"
1994 | },
1995 | {
1996 | "name": "sebastian/lines-of-code",
1997 | "version": "1.0.1",
1998 | "source": {
1999 | "type": "git",
2000 | "url": "https://github.com/sebastianbergmann/lines-of-code.git",
2001 | "reference": "6514b8f21906b8b46f520d1fbd17a4523fa59a54"
2002 | },
2003 | "dist": {
2004 | "type": "zip",
2005 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/6514b8f21906b8b46f520d1fbd17a4523fa59a54",
2006 | "reference": "6514b8f21906b8b46f520d1fbd17a4523fa59a54",
2007 | "shasum": ""
2008 | },
2009 | "require": {
2010 | "nikic/php-parser": "^4.6",
2011 | "php": ">=7.3"
2012 | },
2013 | "require-dev": {
2014 | "phpunit/phpunit": "^9.3"
2015 | },
2016 | "type": "library",
2017 | "extra": {
2018 | "branch-alias": {
2019 | "dev-master": "1.0-dev"
2020 | }
2021 | },
2022 | "autoload": {
2023 | "classmap": [
2024 | "src/"
2025 | ]
2026 | },
2027 | "notification-url": "https://packagist.org/downloads/",
2028 | "license": [
2029 | "BSD-3-Clause"
2030 | ],
2031 | "authors": [
2032 | {
2033 | "name": "Sebastian Bergmann",
2034 | "email": "sebastian@phpunit.de",
2035 | "role": "lead"
2036 | }
2037 | ],
2038 | "description": "Library for counting the lines of code in PHP source code",
2039 | "homepage": "https://github.com/sebastianbergmann/lines-of-code",
2040 | "funding": [
2041 | {
2042 | "url": "https://github.com/sebastianbergmann",
2043 | "type": "github"
2044 | }
2045 | ],
2046 | "time": "2020-09-28T06:07:27+00:00"
2047 | },
2048 | {
2049 | "name": "sebastian/object-enumerator",
2050 | "version": "4.0.3",
2051 | "source": {
2052 | "type": "git",
2053 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2054 | "reference": "f6f5957013d84725427d361507e13513702888a4"
2055 | },
2056 | "dist": {
2057 | "type": "zip",
2058 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f6f5957013d84725427d361507e13513702888a4",
2059 | "reference": "f6f5957013d84725427d361507e13513702888a4",
2060 | "shasum": ""
2061 | },
2062 | "require": {
2063 | "php": ">=7.3",
2064 | "sebastian/object-reflector": "^2.0",
2065 | "sebastian/recursion-context": "^4.0"
2066 | },
2067 | "require-dev": {
2068 | "phpunit/phpunit": "^9.3"
2069 | },
2070 | "type": "library",
2071 | "extra": {
2072 | "branch-alias": {
2073 | "dev-master": "4.0-dev"
2074 | }
2075 | },
2076 | "autoload": {
2077 | "classmap": [
2078 | "src/"
2079 | ]
2080 | },
2081 | "notification-url": "https://packagist.org/downloads/",
2082 | "license": [
2083 | "BSD-3-Clause"
2084 | ],
2085 | "authors": [
2086 | {
2087 | "name": "Sebastian Bergmann",
2088 | "email": "sebastian@phpunit.de"
2089 | }
2090 | ],
2091 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2092 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2093 | "funding": [
2094 | {
2095 | "url": "https://github.com/sebastianbergmann",
2096 | "type": "github"
2097 | }
2098 | ],
2099 | "time": "2020-09-28T05:55:06+00:00"
2100 | },
2101 | {
2102 | "name": "sebastian/object-reflector",
2103 | "version": "2.0.3",
2104 | "source": {
2105 | "type": "git",
2106 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
2107 | "reference": "d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5"
2108 | },
2109 | "dist": {
2110 | "type": "zip",
2111 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5",
2112 | "reference": "d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5",
2113 | "shasum": ""
2114 | },
2115 | "require": {
2116 | "php": ">=7.3"
2117 | },
2118 | "require-dev": {
2119 | "phpunit/phpunit": "^9.3"
2120 | },
2121 | "type": "library",
2122 | "extra": {
2123 | "branch-alias": {
2124 | "dev-master": "2.0-dev"
2125 | }
2126 | },
2127 | "autoload": {
2128 | "classmap": [
2129 | "src/"
2130 | ]
2131 | },
2132 | "notification-url": "https://packagist.org/downloads/",
2133 | "license": [
2134 | "BSD-3-Clause"
2135 | ],
2136 | "authors": [
2137 | {
2138 | "name": "Sebastian Bergmann",
2139 | "email": "sebastian@phpunit.de"
2140 | }
2141 | ],
2142 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
2143 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2144 | "funding": [
2145 | {
2146 | "url": "https://github.com/sebastianbergmann",
2147 | "type": "github"
2148 | }
2149 | ],
2150 | "time": "2020-09-28T05:56:16+00:00"
2151 | },
2152 | {
2153 | "name": "sebastian/recursion-context",
2154 | "version": "4.0.3",
2155 | "source": {
2156 | "type": "git",
2157 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
2158 | "reference": "ed8c9cd355089134bc9cba421b5cfdd58f0eaef7"
2159 | },
2160 | "dist": {
2161 | "type": "zip",
2162 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/ed8c9cd355089134bc9cba421b5cfdd58f0eaef7",
2163 | "reference": "ed8c9cd355089134bc9cba421b5cfdd58f0eaef7",
2164 | "shasum": ""
2165 | },
2166 | "require": {
2167 | "php": ">=7.3"
2168 | },
2169 | "require-dev": {
2170 | "phpunit/phpunit": "^9.3"
2171 | },
2172 | "type": "library",
2173 | "extra": {
2174 | "branch-alias": {
2175 | "dev-master": "4.0-dev"
2176 | }
2177 | },
2178 | "autoload": {
2179 | "classmap": [
2180 | "src/"
2181 | ]
2182 | },
2183 | "notification-url": "https://packagist.org/downloads/",
2184 | "license": [
2185 | "BSD-3-Clause"
2186 | ],
2187 | "authors": [
2188 | {
2189 | "name": "Sebastian Bergmann",
2190 | "email": "sebastian@phpunit.de"
2191 | },
2192 | {
2193 | "name": "Jeff Welch",
2194 | "email": "whatthejeff@gmail.com"
2195 | },
2196 | {
2197 | "name": "Adam Harvey",
2198 | "email": "aharvey@php.net"
2199 | }
2200 | ],
2201 | "description": "Provides functionality to recursively process PHP variables",
2202 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2203 | "funding": [
2204 | {
2205 | "url": "https://github.com/sebastianbergmann",
2206 | "type": "github"
2207 | }
2208 | ],
2209 | "time": "2020-09-28T05:17:32+00:00"
2210 | },
2211 | {
2212 | "name": "sebastian/resource-operations",
2213 | "version": "3.0.3",
2214 | "source": {
2215 | "type": "git",
2216 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
2217 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
2218 | },
2219 | "dist": {
2220 | "type": "zip",
2221 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2222 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2223 | "shasum": ""
2224 | },
2225 | "require": {
2226 | "php": ">=7.3"
2227 | },
2228 | "require-dev": {
2229 | "phpunit/phpunit": "^9.0"
2230 | },
2231 | "type": "library",
2232 | "extra": {
2233 | "branch-alias": {
2234 | "dev-master": "3.0-dev"
2235 | }
2236 | },
2237 | "autoload": {
2238 | "classmap": [
2239 | "src/"
2240 | ]
2241 | },
2242 | "notification-url": "https://packagist.org/downloads/",
2243 | "license": [
2244 | "BSD-3-Clause"
2245 | ],
2246 | "authors": [
2247 | {
2248 | "name": "Sebastian Bergmann",
2249 | "email": "sebastian@phpunit.de"
2250 | }
2251 | ],
2252 | "description": "Provides a list of PHP built-in functions that operate on resources",
2253 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2254 | "funding": [
2255 | {
2256 | "url": "https://github.com/sebastianbergmann",
2257 | "type": "github"
2258 | }
2259 | ],
2260 | "time": "2020-09-28T06:45:17+00:00"
2261 | },
2262 | {
2263 | "name": "sebastian/type",
2264 | "version": "2.3.0",
2265 | "source": {
2266 | "type": "git",
2267 | "url": "https://github.com/sebastianbergmann/type.git",
2268 | "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909"
2269 | },
2270 | "dist": {
2271 | "type": "zip",
2272 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fa592377f3923946cb90bf1f6a71ba2e5f229909",
2273 | "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909",
2274 | "shasum": ""
2275 | },
2276 | "require": {
2277 | "php": ">=7.3"
2278 | },
2279 | "require-dev": {
2280 | "phpunit/phpunit": "^9.3"
2281 | },
2282 | "type": "library",
2283 | "extra": {
2284 | "branch-alias": {
2285 | "dev-master": "2.3-dev"
2286 | }
2287 | },
2288 | "autoload": {
2289 | "classmap": [
2290 | "src/"
2291 | ]
2292 | },
2293 | "notification-url": "https://packagist.org/downloads/",
2294 | "license": [
2295 | "BSD-3-Clause"
2296 | ],
2297 | "authors": [
2298 | {
2299 | "name": "Sebastian Bergmann",
2300 | "email": "sebastian@phpunit.de",
2301 | "role": "lead"
2302 | }
2303 | ],
2304 | "description": "Collection of value objects that represent the types of the PHP type system",
2305 | "homepage": "https://github.com/sebastianbergmann/type",
2306 | "funding": [
2307 | {
2308 | "url": "https://github.com/sebastianbergmann",
2309 | "type": "github"
2310 | }
2311 | ],
2312 | "time": "2020-10-06T08:41:03+00:00"
2313 | },
2314 | {
2315 | "name": "sebastian/version",
2316 | "version": "3.0.2",
2317 | "source": {
2318 | "type": "git",
2319 | "url": "https://github.com/sebastianbergmann/version.git",
2320 | "reference": "c6c1022351a901512170118436c764e473f6de8c"
2321 | },
2322 | "dist": {
2323 | "type": "zip",
2324 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
2325 | "reference": "c6c1022351a901512170118436c764e473f6de8c",
2326 | "shasum": ""
2327 | },
2328 | "require": {
2329 | "php": ">=7.3"
2330 | },
2331 | "type": "library",
2332 | "extra": {
2333 | "branch-alias": {
2334 | "dev-master": "3.0-dev"
2335 | }
2336 | },
2337 | "autoload": {
2338 | "classmap": [
2339 | "src/"
2340 | ]
2341 | },
2342 | "notification-url": "https://packagist.org/downloads/",
2343 | "license": [
2344 | "BSD-3-Clause"
2345 | ],
2346 | "authors": [
2347 | {
2348 | "name": "Sebastian Bergmann",
2349 | "email": "sebastian@phpunit.de",
2350 | "role": "lead"
2351 | }
2352 | ],
2353 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2354 | "homepage": "https://github.com/sebastianbergmann/version",
2355 | "funding": [
2356 | {
2357 | "url": "https://github.com/sebastianbergmann",
2358 | "type": "github"
2359 | }
2360 | ],
2361 | "time": "2020-09-28T06:39:44+00:00"
2362 | },
2363 | {
2364 | "name": "symfony/polyfill-ctype",
2365 | "version": "v1.18.1",
2366 | "source": {
2367 | "type": "git",
2368 | "url": "https://github.com/symfony/polyfill-ctype.git",
2369 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
2370 | },
2371 | "dist": {
2372 | "type": "zip",
2373 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
2374 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
2375 | "shasum": ""
2376 | },
2377 | "require": {
2378 | "php": ">=5.3.3"
2379 | },
2380 | "suggest": {
2381 | "ext-ctype": "For best performance"
2382 | },
2383 | "type": "library",
2384 | "extra": {
2385 | "branch-alias": {
2386 | "dev-master": "1.18-dev"
2387 | },
2388 | "thanks": {
2389 | "name": "symfony/polyfill",
2390 | "url": "https://github.com/symfony/polyfill"
2391 | }
2392 | },
2393 | "autoload": {
2394 | "files": [
2395 | "bootstrap.php"
2396 | ],
2397 | "psr-4": {
2398 | "Symfony\\Polyfill\\Ctype\\": ""
2399 | }
2400 | },
2401 | "notification-url": "https://packagist.org/downloads/",
2402 | "license": [
2403 | "MIT"
2404 | ],
2405 | "authors": [
2406 | {
2407 | "name": "Gert de Pagter",
2408 | "email": "BackEndTea@gmail.com"
2409 | },
2410 | {
2411 | "name": "Symfony Community",
2412 | "homepage": "https://symfony.com/contributors"
2413 | }
2414 | ],
2415 | "description": "Symfony polyfill for ctype functions",
2416 | "homepage": "https://symfony.com",
2417 | "keywords": [
2418 | "compatibility",
2419 | "ctype",
2420 | "polyfill",
2421 | "portable"
2422 | ],
2423 | "funding": [
2424 | {
2425 | "url": "https://symfony.com/sponsor",
2426 | "type": "custom"
2427 | },
2428 | {
2429 | "url": "https://github.com/fabpot",
2430 | "type": "github"
2431 | },
2432 | {
2433 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2434 | "type": "tidelift"
2435 | }
2436 | ],
2437 | "time": "2020-07-14T12:35:20+00:00"
2438 | },
2439 | {
2440 | "name": "theseer/tokenizer",
2441 | "version": "1.2.0",
2442 | "source": {
2443 | "type": "git",
2444 | "url": "https://github.com/theseer/tokenizer.git",
2445 | "reference": "75a63c33a8577608444246075ea0af0d052e452a"
2446 | },
2447 | "dist": {
2448 | "type": "zip",
2449 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
2450 | "reference": "75a63c33a8577608444246075ea0af0d052e452a",
2451 | "shasum": ""
2452 | },
2453 | "require": {
2454 | "ext-dom": "*",
2455 | "ext-tokenizer": "*",
2456 | "ext-xmlwriter": "*",
2457 | "php": "^7.2 || ^8.0"
2458 | },
2459 | "type": "library",
2460 | "autoload": {
2461 | "classmap": [
2462 | "src/"
2463 | ]
2464 | },
2465 | "notification-url": "https://packagist.org/downloads/",
2466 | "license": [
2467 | "BSD-3-Clause"
2468 | ],
2469 | "authors": [
2470 | {
2471 | "name": "Arne Blankerts",
2472 | "email": "arne@blankerts.de",
2473 | "role": "Developer"
2474 | }
2475 | ],
2476 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2477 | "funding": [
2478 | {
2479 | "url": "https://github.com/theseer",
2480 | "type": "github"
2481 | }
2482 | ],
2483 | "time": "2020-07-12T23:59:07+00:00"
2484 | },
2485 | {
2486 | "name": "webmozart/assert",
2487 | "version": "1.9.1",
2488 | "source": {
2489 | "type": "git",
2490 | "url": "https://github.com/webmozarts/assert.git",
2491 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
2492 | },
2493 | "dist": {
2494 | "type": "zip",
2495 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
2496 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
2497 | "shasum": ""
2498 | },
2499 | "require": {
2500 | "php": "^5.3.3 || ^7.0 || ^8.0",
2501 | "symfony/polyfill-ctype": "^1.8"
2502 | },
2503 | "conflict": {
2504 | "phpstan/phpstan": "<0.12.20",
2505 | "vimeo/psalm": "<3.9.1"
2506 | },
2507 | "require-dev": {
2508 | "phpunit/phpunit": "^4.8.36 || ^7.5.13"
2509 | },
2510 | "type": "library",
2511 | "autoload": {
2512 | "psr-4": {
2513 | "Webmozart\\Assert\\": "src/"
2514 | }
2515 | },
2516 | "notification-url": "https://packagist.org/downloads/",
2517 | "license": [
2518 | "MIT"
2519 | ],
2520 | "authors": [
2521 | {
2522 | "name": "Bernhard Schussek",
2523 | "email": "bschussek@gmail.com"
2524 | }
2525 | ],
2526 | "description": "Assertions to validate method input/output with nice error messages.",
2527 | "keywords": [
2528 | "assert",
2529 | "check",
2530 | "validate"
2531 | ],
2532 | "time": "2020-07-08T17:02:28+00:00"
2533 | }
2534 | ],
2535 | "aliases": [],
2536 | "minimum-stability": "stable",
2537 | "stability-flags": [],
2538 | "prefer-stable": false,
2539 | "prefer-lowest": false,
2540 | "platform": {
2541 | "php": "^7.4|^8.0",
2542 | "ext-json": "*"
2543 | },
2544 | "platform-dev": [],
2545 | "plugin-api-version": "1.1.0"
2546 | }
2547 |
--------------------------------------------------------------------------------