From a050b7ebb83bca82888ca0fb51dd99a214ec0c16 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 22 Jun 2020 15:03:36 +0300 Subject: [PATCH 01/17] Added graphiql container --- docker-compose.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index ae7c46ed85..095c896739 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -197,6 +197,14 @@ services: - GH_CLIENT_SECRET=9e0081062367a2134e7f2ea95ba1a32d08b6c8ab - GH_ORGS=appwrite + graphiql: + container_name: graphiql + ports: + - '4000:4000' + environment: + - API_URL=http://192.168.1.102/v1/graphql + image: npalm/graphiql + networks: gateway: appwrite: From 77d0f2b37a5bcf3e65681004e6de3f304403842c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 22 Jun 2020 15:04:19 +0300 Subject: [PATCH 02/17] First GraphQL parser POC --- app/controllers/api/graphql.php | 111 ++++++++++++++++++++++++++++++-- composer.json | 1 + composer.lock | 68 +++++++++++++++++-- 3 files changed, 170 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index ce39d8e799..743a5f8d2a 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -1,6 +1,14 @@ post('/v1/graphql') ->desc('GraphQL Endpoint') ->label('scope', 'public') ->action( - function () { - throw new Exception('GraphQL support is coming soon!', 502); + function () use ($request, $response) { + $userType = new ObjectType([ + 'name' => 'User', + 'fields' => [ + 'name' => [ + 'type' => Type::string(), + ], + ], + ]); + + $queryType = new ObjectType([ + 'name' => 'Query', + 'fields' => [ + 'echo' => [ + 'type' => Type::string(), + 'args' => [ + 'message' => ['type' => Type::string()], + ], + 'resolve' => function ($rootValue, $args) { + return $rootValue['prefix'] . $args['message']; + } + ], + 'users' => [ + 'type' => Type::listOf($userType), + //'type' => $userType, + 'args' => [ + 'message' => ['type' => Type::string()], + ], + 'resolve' => function ($rootValue, $args) { + return ['name' => 'Eldad Fux']; + return [ + ['name' => 'Eldad Fux'], + ['name' => 'Sharon Kapon'], + ]; + } + ], + ], + ]); + + $mutationType = new ObjectType([ + 'name' => 'Mutation', + 'fields' => [ + 'sum' => [ + 'type' => Type::int(), + 'args' => [ + 'x' => ['type' => Type::int()], + 'y' => ['type' => Type::int()], + ], + 'resolve' => function ($calc, $args) { + return $args['x'] + $args['y']; + }, + ], + ], + ]); + + $schema = new Schema([ + 'query' => $queryType, + 'mutation' => $mutationType, + ]); + + $query = $request->getPayload('query', ''); + $variables = $request->getPayload('variables', null); + + try { + $rootValue = []; + $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); + $output = $result->toArray(); + } catch (\Exception $error) { + $output = [ + 'errors' => [ + [ + 'message' => $error->getMessage().'xxx', + 'code' => $error->getCode(), + 'file' => $error->getFile(), + 'line' => $error->getLine(), + 'trace' => $error->getTrace(), + ] + ] + ]; + } + + $response->json($output); + echo "\n"; //TODO REMOVE THIS } - ); + ); \ No newline at end of file diff --git a/composer.json b/composer.json index 8af76121cd..d8eeada93c 100644 --- a/composer.json +++ b/composer.json @@ -43,6 +43,7 @@ "utopia-php/domains": "0.2.*", "resque/php-resque": "1.3.6", + "webonyx/graphql-php": "14.0.0", "geoip2/geoip2": "2.9.0", "piwik/device-detector": "3.5.1", "dragonmantank/cron-expression": "2.2.0", diff --git a/composer.lock b/composer.lock index 459a9bd325..ac32f27b88 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9deec50e5a99197511b5efbcaa9593bd", + "content-hash": "b2678886d7c1aa5f4edfdd1ad1558f14", "packages": [ { "name": "appwrite/php-clamav", @@ -1546,16 +1546,16 @@ }, { "name": "utopia-php/domains", - "version": "0.2.0", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/utopia-php/domains.git", - "reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73" + "reference": "98e85296867a59c9d712d6ed768a5c5b2b297b43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/domains/zipball/1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73", - "reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73", + "url": "https://api.github.com/repos/utopia-php/domains/zipball/98e85296867a59c9d712d6ed768a5c5b2b297b43", + "reference": "98e85296867a59c9d712d6ed768a5c5b2b297b43", "shasum": "" }, "require": { @@ -1592,7 +1592,7 @@ "upf", "utopia" ], - "time": "2020-02-23T07:40:02+00:00" + "time": "2020-06-20T11:47:04+00:00" }, { "name": "utopia-php/framework", @@ -1730,6 +1730,62 @@ "utopia" ], "time": "2020-06-20T11:46:06+00:00" + }, + { + "name": "webonyx/graphql-php", + "version": "v14.0.0", + "source": { + "type": "git", + "url": "https://github.com/webonyx/graphql-php.git", + "reference": "45d84562433613c6ee41e2421c95409d2b2664d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/45d84562433613c6ee41e2421c95409d2b2664d6", + "reference": "45d84562433613c6ee41e2421c95409d2b2664d6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1||^8.0" + }, + "require-dev": { + "amphp/amp": "^2.3", + "doctrine/coding-standard": "^6.0", + "nyholm/psr7": "^1.2", + "phpbench/phpbench": "^0.14", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "0.12.18", + "phpstan/phpstan-phpunit": "0.12.6", + "phpstan/phpstan-strict-rules": "0.12.2", + "phpunit/phpunit": "^7.2|^8.5", + "psr/http-message": "^1.0", + "react/promise": "2.*", + "simpod/php-coveralls-mirror": "^3.0", + "squizlabs/php_codesniffer": "3.5.4" + }, + "suggest": { + "psr/http-message": "To use standard GraphQL server", + "react/promise": "To leverage async resolving on React PHP platform" + }, + "type": "library", + "autoload": { + "psr-4": { + "GraphQL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP port of GraphQL reference implementation", + "homepage": "https://github.com/webonyx/graphql-php", + "keywords": [ + "api", + "graphql" + ], + "time": "2020-06-21T12:53:32+00:00" } ], "packages-dev": [ From f07b8ca29623a5c94f4a977d045afaae718305af Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 24 Jun 2020 07:08:10 +0300 Subject: [PATCH 03/17] Updated comments --- app/controllers/api/graphql.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 743a5f8d2a..5b187318ab 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -29,8 +29,11 @@ global $utopia, $request, $response; * * Docs * - Overview - * - Query - * - Mutation + * - Clients + * + * - Queries + * - Mutations + * * - Objects */ From 63fa19b73ab02647951f5ac05b2af7888804389f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 24 Jun 2020 15:55:05 +0300 Subject: [PATCH 04/17] Tests --- app/controllers/api/graphql.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 5b187318ab..578c16fcd2 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -41,7 +41,16 @@ $utopia->post('/v1/graphql') ->desc('GraphQL Endpoint') ->label('scope', 'public') ->action( - function () use ($request, $response) { + function () use ($request, $response, $utopia) { + + foreach ($utopia->getRoutes() as $method => $routes) { + var_dump($method); + + foreach ($routes as $key => $route) { + var_dump($key); + } + } + $userType = new ObjectType([ 'name' => 'User', 'fields' => [ From 81e61c9cc944a1d794f3cf2d9738f0e229de5b09 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 25 Jun 2020 23:13:13 +0300 Subject: [PATCH 05/17] Updated deps --- composer.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index c2924069f4..18d1d8bfbb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7f6cbe77fe2e0f8bdff33c37a4d9ca11", + "content-hash": "dc7e0d19eb00b563d89000d520e652e7", "packages": [ { "name": "appwrite/php-clamav", @@ -3483,6 +3483,7 @@ "ext-imagick": "*", "ext-mbstring": "*", "ext-json": "*", + "ext-yaml": "*", "ext-dom": "*", "ext-redis": "*", "ext-pdo": "*", From e9529bb93a3212be38e8bb4b29bcd0cb8cc9bb14 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 11 Jan 2021 00:24:59 +0200 Subject: [PATCH 06/17] Updated GraphQL version --- composer.json | 2 +- composer.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index fdf2a0955a..4de5c7b931 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "utopia-php/domains": "0.2.*", "utopia-php/swoole": "0.2.*", - "webonyx/graphql-php": "14.0.0", + "webonyx/graphql-php": "14.4.0", "resque/php-resque": "1.3.6", "matomo/device-detector": "3.13.0", "dragonmantank/cron-expression": "3.0.1", diff --git a/composer.lock b/composer.lock index bdff910a66..e9356e8386 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "907913f259c61e0e7e2617df3e13b6d3", + "content-hash": "fa6cc030fa9dfe530d9109d1245bdf85", "packages": [ { "name": "appwrite/php-clamav", @@ -1692,16 +1692,16 @@ }, { "name": "webonyx/graphql-php", - "version": "v14.0.0", + "version": "v14.4.0", "source": { "type": "git", "url": "https://github.com/webonyx/graphql-php.git", - "reference": "45d84562433613c6ee41e2421c95409d2b2664d6" + "reference": "aab3d49181467db064b41429cde117a7589625fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/45d84562433613c6ee41e2421c95409d2b2664d6", - "reference": "45d84562433613c6ee41e2421c95409d2b2664d6", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/aab3d49181467db064b41429cde117a7589625fc", + "reference": "aab3d49181467db064b41429cde117a7589625fc", "shasum": "" }, "require": { @@ -1713,10 +1713,10 @@ "amphp/amp": "^2.3", "doctrine/coding-standard": "^6.0", "nyholm/psr7": "^1.2", - "phpbench/phpbench": "^0.14", + "phpbench/phpbench": "^0.16.10", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.18", - "phpstan/phpstan-phpunit": "0.12.6", + "phpstan/phpstan": "0.12.32", + "phpstan/phpstan-phpunit": "0.12.11", "phpstan/phpstan-strict-rules": "0.12.2", "phpunit/phpunit": "^7.2|^8.5", "psr/http-message": "^1.0", @@ -1746,7 +1746,7 @@ ], "support": { "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/master" + "source": "https://github.com/webonyx/graphql-php/tree/v14.4.0" }, "funding": [ { @@ -1754,7 +1754,7 @@ "type": "open_collective" } ], - "time": "2020-06-21T12:53:32+00:00" + "time": "2020-12-03T16:05:21+00:00" } ], "packages-dev": [ From 1349a1a8b594ff132ae6e9e9d246d856a949733d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 11 Jan 2021 00:25:07 +0200 Subject: [PATCH 07/17] Changed public dev port --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 12b7d91a0a..9e614f7090 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -493,7 +493,7 @@ services: graphiql: container_name: graphiql ports: - - '4000:4000' + - '9505:4000' environment: - API_URL=http://192.168.1.102/v1/graphql image: npalm/graphiql From b7674e327887507ea69c30630bd0272e6ee3a9ae Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 17 Jan 2021 08:36:11 +0200 Subject: [PATCH 08/17] Fixed TODO list --- app/controllers/api/graphql.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index c97bc1de0b..3959e4456a 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -11,9 +11,10 @@ use Utopia\App; * 1. Map all objects, object-params, object-fields * 2. Parse GraphQL request payload (use: https://github.com/webonyx/graphql-php) * 3. Route request to relevant controllers (of REST API?) / resolvers and aggergate data - * 4. Handle errors if any - * 5. Returen JSON response - * 6. Write tests! + * 4. Handle scope authentication + * 5. Handle errors + * 6. Return response + * 7. Write tests! * * Demo * curl -H "Content-Type: application/json" http://localhost/v1/graphql -d '{"query": "query { echo(message: \"Hello World\") }" }' From bb050e75d3344bc4865af40280930ec91529070e Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 26 Feb 2021 02:13:21 +0530 Subject: [PATCH 09/17] feat: defined logic for schema building --- .env | 2 +- app/controllers/api/graphql.php | 270 +++++++++++++++++++++++--------- docker-compose.yml | 2 +- 3 files changed, 202 insertions(+), 72 deletions(-) diff --git a/.env b/.env index ce43bfd853..4605affb91 100644 --- a/.env +++ b/.env @@ -15,7 +15,7 @@ _APP_DB_PORT=3306 _APP_DB_SCHEMA=appwrite _APP_DB_USER=user _APP_DB_PASS=password -_APP_STORAGE_ANTIVIRUS=enabled +_APP_STORAGE_ANTIVIRUS=disabled _APP_STORAGE_ANTIVIRUS_HOST=clamav _APP_STORAGE_ANTIVIRUS_PORT=3310 _APP_INFLUXDB_HOST=influxdb diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 3959e4456a..0f5f957758 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -4,7 +4,11 @@ use GraphQL\GraphQL; use GraphQL\Type\Schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; +use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Model; +use GraphQL\Type\Definition\NonNull; use Utopia\App; +use Utopia\Validator; /** * TODO: @@ -34,83 +38,210 @@ use Utopia\App; * - Objects */ +global $typeMapping; + +$typeMapping = [ + Model::TYPE_BOOLEAN => Type::boolean(), + Model::TYPE_STRING => Type::string(), + Model::TYPE_INTEGER => Type::int(), + Model::TYPE_FLOAT => Type::float(), + + // Outliers + Model::TYPE_JSON => Type::string(), + Response::MODEL_ANY => Type::string(), +]; + + +function createTypeMapping(Model $model, Response $response) { + + global $typeMapping; + + // If map already contains this complex type, then simply return + if (isset($typeMapping[$model->getType()])) return; + + + $rules = $model->getRules(); + $name = $model->getType(); + $fields = []; + foreach ($rules as $key => $props) { + // Replace this with php regex + $key = str_replace('$', '', $key); + if (isset( $typeMapping[$props['type']])) { + $type = $typeMapping[$props['type']]; + } else { + try { + $complexModel = $response->getModel($props['type']); + createTypeMapping($complexModel, $response); + $type = $typeMapping[$props['type']]; + } catch (Exception $e) { + var_dump("Could Not find model for : {$props['type']}"); + } + } + + if ($props['array']) { + $type = Type::listOf($type); + } + + $fields[$key] = [ + 'type' => $type, + 'description' => $props['description'], + ]; + } + + $objectType = [ + 'name' => $name, + 'fields' => $fields + ]; + + $typeMapping[$name] = new ObjectType($objectType); +} + + +function getArgType(Validator $validator, bool $required) { + + $type = []; + switch ((!empty($validator)) ? \get_class($validator) : '') { + case 'Utopia\Validator\Text': + $type = Type::string(); + break; + case 'Utopia\Validator\Boolean': + $type = Type::boolean(); + break; + case 'Appwrite\Database\Validator\UID': + $type = Type::string(); + break; + case 'Utopia\Validator\Email': + $type = Type::string(); + break; + case 'Utopia\Validator\URL': + $type = Type::string(); + break; + case 'Utopia\Validator\JSON': + case 'Utopia\Validator\Mock': + case 'Utopia\Validator\Assoc': + $type = Type::string(); + break; + case 'Appwrite\Storage\Validator\File': + $type = Type::string(); + case 'Utopia\Validator\ArrayList': + $type = Type::listOf(Type::string()); + break; + case 'Appwrite\Auth\Validator\Password': + $type = Type::string(); + break; + case 'Utopia\Validator\Range': /* @var $validator \Utopia\Validator\Range */ + $type = Type::int(); + break; + case 'Utopia\Validator\Numeric': + $type = Type::int(); + break; + case 'Utopia\Validator\Length': + $type = Type::string(); + break; + case 'Utopia\Validator\Host': + $type = Type::string(); + break; + case 'Utopia\Validator\WhiteList': /* @var $validator \Utopia\Validator\WhiteList */ + $type = Type::string(); + break; + default: + $type = 'string'; + break; + } + + if ($required) { + $type = Type::nonNull($type); + } + + return $type; +} + +function getArgs(array $params) { + $args = []; + foreach ($params as $key => $value) { + var_dump("Key : ${key}"); + var_dump($value); + $args[$key] = [ + 'type' => getArgType($value['validator'],!$value['optional']), + 'description' => $value['description'], + 'defaultValue' => $value['default'] + ]; + } + return $args; +} + +function buildSchema($utopia, $response) { + $start = microtime(true); + + global $typeMapping; + $fields = []; + foreach($utopia->getRoutes() as $method => $routes ){ + if ($method == "GET") { + foreach($routes as $route) { + $namespace = $route->getLabel('sdk.namespace', ''); + if( true ) { + $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); + $responseModelName = $route->getLabel('sdk.response.model', Response::MODEL_NONE); + + var_dump("******************************************"); + var_dump("Model Name : ${responseModelName}"); + + if ( $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { + $responseModel = $response->getModel($responseModelName); + createTypeMapping($responseModel, $response); + $fields[$methodName] = [ + 'type' => $typeMapping[$responseModel->getType()], + 'description' => $route->getDesc(), + 'args' => getArgs($route->getParams()), + ]; + + // print_r($fields[$methodName]); + var_dump("Processed route : {$route->getURL()}"); + } else { + var_dump("Skipping route : {$route->getURL()}"); + } + } + } + } + } + + ksort($fields); + + $queryType = new ObjectType([ + 'name' => 'Query', + 'description' => 'The root of all your queries', + 'fields' => $fields + ]); + + $schema = new Schema([ + 'query' => $queryType + ]); + + $time_elapsed_secs = microtime(true) - $start; + + var_dump("Time Taken To Build Schema : ${time_elapsed_secs}s"); + + return $schema; +} + + App::post('/v1/graphql') ->desc('GraphQL Endpoint') ->groups(['api', 'graphql']) ->label('scope', 'public') - ->action( - function () use ($request, $response, $utopia) { - - foreach ($utopia->getRoutes() as $method => $routes) { - var_dump($method); - - foreach ($routes as $key => $route) { - var_dump($key); - } - } - - $userType = new ObjectType([ - 'name' => 'User', - 'fields' => [ - 'name' => [ - 'type' => Type::string(), - ], - ], - ]); - - $queryType = new ObjectType([ - 'name' => 'Query', - 'fields' => [ - 'echo' => [ - 'type' => Type::string(), - 'args' => [ - 'message' => ['type' => Type::string()], - ], - 'resolve' => function ($rootValue, $args) { - return $rootValue['prefix'] . $args['message']; - } - ], - 'users' => [ - 'type' => Type::listOf($userType), - //'type' => $userType, - 'args' => [ - 'message' => ['type' => Type::string()], - ], - 'resolve' => function ($rootValue, $args) { - return ['name' => 'Eldad Fux']; - return [ - ['name' => 'Eldad Fux'], - ['name' => 'Sharon Kapon'], - ]; - } - ], - ], - ]); - - $mutationType = new ObjectType([ - 'name' => 'Mutation', - 'fields' => [ - 'sum' => [ - 'type' => Type::int(), - 'args' => [ - 'x' => ['type' => Type::int()], - 'y' => ['type' => Type::int()], - ], - 'resolve' => function ($calc, $args) { - return $args['x'] + $args['y']; - }, - ], - ], - ]); - - $schema = new Schema([ - 'query' => $queryType, - 'mutation' => $mutationType, - ]); + ->inject('request') + ->inject('response') + ->inject('utopia') + ->inject('schema') + ->action(function ($request, $response, $utopia, $schema) { + // Generate the Schema of the server on startup. + // Use the routes from utopia and get the params then construct the queries and mutations. + $schema = buildSchema($utopia, $response); $query = $request->getPayload('query', ''); $variables = $request->getPayload('variables', null); + try { $rootValue = []; $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); @@ -128,7 +259,6 @@ App::post('/v1/graphql') ] ]; } - $response->json($output); echo "\n"; //TODO REMOVE THIS } diff --git a/docker-compose.yml b/docker-compose.yml index 9e614f7090..5b390ddee9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -495,7 +495,7 @@ services: ports: - '9505:4000' environment: - - API_URL=http://192.168.1.102/v1/graphql + - API_URL=http://localhost/v1/graphql image: npalm/graphiql networks: From f11e4313419cc52a5976077c805067011f50bb05 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 26 Feb 2021 03:26:38 +0530 Subject: [PATCH 10/17] feat: got locale_getContinents working --- app/controllers/api/graphql.php | 30 ++++++++++++++++++++---------- app/controllers/api/locale.php | 2 ++ app/controllers/shared/api.php | 9 ++++++--- docker-compose.yml | 2 +- src/Appwrite/Utopia/Response.php | 2 +- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 0f5f957758..9352605798 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -159,8 +159,6 @@ function getArgType(Validator $validator, bool $required) { function getArgs(array $params) { $args = []; foreach ($params as $key => $value) { - var_dump("Key : ${key}"); - var_dump($value); $args[$key] = [ 'type' => getArgType($value['validator'],!$value['optional']), 'description' => $value['description'], @@ -183,22 +181,33 @@ function buildSchema($utopia, $response) { $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); $responseModelName = $route->getLabel('sdk.response.model', Response::MODEL_NONE); - var_dump("******************************************"); - var_dump("Model Name : ${responseModelName}"); + // var_dump("******************************************"); + // var_dump("Model Name : ${responseModelName}"); if ( $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { $responseModel = $response->getModel($responseModelName); createTypeMapping($responseModel, $response); + + $args = getArgs($route->getParams()); $fields[$methodName] = [ 'type' => $typeMapping[$responseModel->getType()], 'description' => $route->getDesc(), - 'args' => getArgs($route->getParams()), + 'args' => $args, + 'resolve' => function ($args) use (&$utopia, $route, $response) { + var_dump("************* REACHED RESOLVE *****************"); + var_dump($route); + $utopia->execute($route, $args); + var_dump("********************** ARGS *******************"); + var_dump($args); + var_dump("**************** OUTPUT ************"); + var_dump($response->getPayload()); + return $response->getPayload(); + } ]; - // print_r($fields[$methodName]); - var_dump("Processed route : {$route->getURL()}"); + // var_dump("Processed route : {$route->getURL()}"); } else { - var_dump("Skipping route : {$route->getURL()}"); + // var_dump("Skipping route : {$route->getURL()}"); } } } @@ -232,8 +241,7 @@ App::post('/v1/graphql') ->inject('request') ->inject('response') ->inject('utopia') - ->inject('schema') - ->action(function ($request, $response, $utopia, $schema) { + ->action(function ($request, $response, $utopia) { // Generate the Schema of the server on startup. // Use the routes from utopia and get the params then construct the queries and mutations. @@ -246,6 +254,8 @@ App::post('/v1/graphql') $rootValue = []; $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); $output = $result->toArray(); + var_dump("********** OUTPUT *********"); + var_dump($output); } catch (\Exception $error) { $output = [ 'errors' => [ diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 80826bdc03..d636a6be01 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -190,6 +190,8 @@ App::get('/v1/locale/continents') /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Locale\Locale $locale */ + var_dump("*************** IN LOCALE ************* "); + $list = $locale->getText('continents'); /* @var $list array */ \asort($list); diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 8dc0c097c7..7611e59282 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -47,9 +47,12 @@ App::init(function ($utopia, $request, $response, $project, $user, $register, $e //TODO make sure we get array here - foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys - $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); - } + + var_dump($request->getParams()); + + // foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys + // $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); + // } $abuse = new Abuse($timeLimit); diff --git a/docker-compose.yml b/docker-compose.yml index 1831a658e5..de2e7773bc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -504,7 +504,7 @@ services: graphiql: container_name: graphiql ports: - - '9505:4000' + - '9506:4000' environment: - API_URL=http://localhost/v1/graphql image: npalm/graphiql diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index b2203918d5..0a89eff2a3 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -260,7 +260,7 @@ class Response extends SwooleResponse $output = self::getFilter()->parse($output, $model); } - $this->json(!empty($output) ? $output : new stdClass()); + // $this->json(!empty($output) ? $output : new stdClass()); } /** From b3a0df734ece3bad11585505caf20121395d2ff9 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Sat, 27 Feb 2021 00:55:52 +0530 Subject: [PATCH 11/17] feat: added content type check in dynamic --- app/controllers/api/graphql.php | 102 +++++----- app/controllers/api/locale.php | 2 - app/controllers/shared/api.php | 8 +- app/init.php | 8 + composer.lock | 307 +++++++++++++------------------ src/Appwrite/Utopia/Response.php | 20 +- 6 files changed, 222 insertions(+), 225 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 9352605798..d295b72a96 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -97,8 +97,8 @@ function createTypeMapping(Model $model, Response $response) { } -function getArgType(Validator $validator, bool $required) { - +function getArgType($validator, bool $required, $utopia, $injections) { + $validator = (\is_callable($validator)) ? call_user_func_array($validator, $utopia->getResources($injections)) : $validator; $type = []; switch ((!empty($validator)) ? \get_class($validator) : '') { case 'Utopia\Validator\Text': @@ -145,7 +145,7 @@ function getArgType(Validator $validator, bool $required) { $type = Type::string(); break; default: - $type = 'string'; + $type = Type::string(); break; } @@ -156,11 +156,11 @@ function getArgType(Validator $validator, bool $required) { return $type; } -function getArgs(array $params) { +function getArgs(array $params, $utopia) { $args = []; foreach ($params as $key => $value) { $args[$key] = [ - 'type' => getArgType($value['validator'],!$value['optional']), + 'type' => getArgType($value['validator'],!$value['optional'], $utopia, $value['injections']), 'description' => $value['description'], 'defaultValue' => $value['default'] ]; @@ -172,58 +172,74 @@ function buildSchema($utopia, $response) { $start = microtime(true); global $typeMapping; - $fields = []; + $queryFields = []; + $mutationFields = []; foreach($utopia->getRoutes() as $method => $routes ){ - if ($method == "GET") { - foreach($routes as $route) { - $namespace = $route->getLabel('sdk.namespace', ''); - if( true ) { - $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); - $responseModelName = $route->getLabel('sdk.response.model', Response::MODEL_NONE); + foreach($routes as $route) { + $namespace = $route->getLabel('sdk.namespace', ''); + + if ($namespace == 'users') { + $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); + $responseModelName = $route->getLabel('sdk.response.model', ""); + var_dump("******************************************"); + var_dump("Processing route : ${method} : {$route->getURL()}"); + var_dump("Model Name : ${responseModelName}"); + if ( $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { + $responseModel = $response->getModel($responseModelName); + createTypeMapping($responseModel, $response); + $type = $typeMapping[$responseModel->getType()]; + var_dump("Type Created : ${type}"); + $args = getArgs($route->getParams(), $utopia); + var_dump("Args Generated : ${args}"); - // var_dump("******************************************"); - // var_dump("Model Name : ${responseModelName}"); - - if ( $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { - $responseModel = $response->getModel($responseModelName); - createTypeMapping($responseModel, $response); - - $args = getArgs($route->getParams()); - $fields[$methodName] = [ - 'type' => $typeMapping[$responseModel->getType()], - 'description' => $route->getDesc(), - 'args' => $args, - 'resolve' => function ($args) use (&$utopia, $route, $response) { - var_dump("************* REACHED RESOLVE *****************"); - var_dump($route); - $utopia->execute($route, $args); - var_dump("********************** ARGS *******************"); - var_dump($args); - var_dump("**************** OUTPUT ************"); - var_dump($response->getPayload()); - return $response->getPayload(); - } - ]; - - // var_dump("Processed route : {$route->getURL()}"); - } else { - // var_dump("Skipping route : {$route->getURL()}"); + $field = [ + 'type' => $type, + 'description' => $route->getDesc(), + 'args' => $args, + 'resolve' => function ($args) use (&$utopia, $route, $response) { + var_dump("************* REACHED RESOLVE *****************"); + var_dump($route); + $utopia->execute($route, $args); + var_dump("********************** ARGS *******************"); + var_dump($args); + var_dump("**************** OUTPUT ************"); + var_dump($response->getPayload()); + return $response->getPayload(); + } + ]; + + if ($method == 'GET') { + $queryFields[$methodName] = $field; + } else if ($method == 'POST' || $method == 'PUT' || $method == 'PATCH' || $method == 'DELETE') { + $mutationFields[$methodName] = $field; } + + var_dump("Processed route : ${method} : {$route->getURL()}"); + } else { + var_dump("Skipping route : {$route->getURL()}"); } } } } - ksort($fields); + ksort($queryFields); + ksort($mutationFields); $queryType = new ObjectType([ 'name' => 'Query', 'description' => 'The root of all your queries', - 'fields' => $fields + 'fields' => $queryFields + ]); + + $mutationType = new ObjectType([ + 'name' => 'Mutation', + 'description' => 'The root of all your mutations', + 'fields' => $mutationFields ]); $schema = new Schema([ - 'query' => $queryType + 'query' => $queryType, + 'mutation' => $mutationType ]); $time_elapsed_secs = microtime(true) - $start; @@ -248,7 +264,7 @@ App::post('/v1/graphql') $schema = buildSchema($utopia, $response); $query = $request->getPayload('query', ''); $variables = $request->getPayload('variables', null); - + $response->setContentType(Response::CONTENT_TYPE_NULL); try { $rootValue = []; diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index d636a6be01..c6f720bdc0 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -189,8 +189,6 @@ App::get('/v1/locale/continents') ->action(function ($response, $locale) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Locale\Locale $locale */ - - var_dump("*************** IN LOCALE ************* "); $list = $locale->getText('continents'); /* @var $list array */ diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 7611e59282..9676801493 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -48,11 +48,11 @@ App::init(function ($utopia, $request, $response, $project, $user, $register, $e //TODO make sure we get array here - var_dump($request->getParams()); + // var_dump($request->getParams()); - // foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys - // $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); - // } + foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys + $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); + } $abuse = new Abuse($timeLimit); diff --git a/app/init.php b/app/init.php index ed2441d51b..11edd77a2c 100644 --- a/app/init.php +++ b/app/init.php @@ -212,6 +212,10 @@ $register->set('geodb', function () { return new Reader(__DIR__.'/db/DBIP/dbip-country-lite-2021-02.mmdb'); }); +$register->set('schema', function () { + +}); + /* * Localization */ @@ -289,6 +293,10 @@ App::setResource('register', function() use ($register) { return $register; }); +App::setResource('schema', function() use ($register) { + return $register->get('schema'); +}); + App::setResource('layout', function($locale) { $layout = new View(__DIR__.'/views/layouts/default.phtml'); $layout->setParam('locale', $locale); diff --git a/composer.lock b/composer.lock index f29da2f0f4..9b07609ec9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,11 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], -<<<<<<< HEAD - "content-hash": "fa6cc030fa9dfe530d9109d1245bdf85", -======= - "content-hash": "5893b378d1dcda91aedf77059f4b0efb", ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 + "content-hash": "aed281e2643524e5f1320533abb612eb", "packages": [ { "name": "adhocore/jwt", @@ -1871,8 +1867,52 @@ "url": "https://github.com/utopia-php/system.git", "reference": "67c92c66ce8f0cc925a00bca89f7a188bf9183c0" }, -<<<<<<< HEAD - "time": "2020-10-29T12:42:38+00:00" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/utopia-php/system/zipball/67c92c66ce8f0cc925a00bca89f7a188bf9183c0", + "reference": "67c92c66ce8f0cc925a00bca89f7a188bf9183c0", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "vimeo/psalm": "4.0.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Utopia\\System\\": "src/System" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eldad Fux", + "email": "eldad@appwrite.io" + }, + { + "name": "Torsten Dittmann", + "email": "torsten@appwrite.io" + } + ], + "description": "A simple library for obtaining information about the host's system.", + "keywords": [ + "framework", + "php", + "system", + "upf", + "utopia" + ], + "support": { + "issues": "https://github.com/utopia-php/system/issues", + "source": "https://github.com/utopia-php/system/tree/0.4.0" + }, + "time": "2021-02-04T14:14:49+00:00" }, { "name": "webonyx/graphql-php", @@ -1911,36 +1951,17 @@ "suggest": { "psr/http-message": "To use standard GraphQL server", "react/promise": "To leverage async resolving on React PHP platform" -======= - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/system/zipball/67c92c66ce8f0cc925a00bca89f7a188bf9183c0", - "reference": "67c92c66ce8f0cc925a00bca89f7a188bf9183c0", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 }, "type": "library", "autoload": { "psr-4": { -<<<<<<< HEAD "GraphQL\\": "src/" -======= - "Utopia\\System\\": "src/System" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], -<<<<<<< HEAD "description": "A PHP port of GraphQL reference implementation", "homepage": "https://github.com/webonyx/graphql-php", "keywords": [ @@ -1958,31 +1979,6 @@ } ], "time": "2020-12-03T16:05:21+00:00" -======= - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - }, - { - "name": "Torsten Dittmann", - "email": "torsten@appwrite.io" - } - ], - "description": "A simple library for obtaining information about the host's system.", - "keywords": [ - "framework", - "php", - "system", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/system/issues", - "source": "https://github.com/utopia-php/system/tree/0.4.0" - }, - "time": "2021-02-04T14:14:49+00:00" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 } ], "packages-dev": [ @@ -1992,21 +1988,12 @@ "source": { "type": "git", "url": "https://github.com/amphp/amp.git", -<<<<<<< HEAD - "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/efca2b32a7580087adb8aabbff6be1dc1bb924a9", - "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9", -======= "reference": "7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/amp/zipball/7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb", "reference": "7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb", ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 "shasum": "" }, "require": { @@ -2075,7 +2062,7 @@ "support": { "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.5.2" + "source": "https://github.com/amphp/amp/tree/master" }, "funding": [ { @@ -2083,11 +2070,7 @@ "type": "github" } ], -<<<<<<< HEAD - "time": "2021-01-10T17:06:37+00:00" -======= "time": "2021-01-13T19:16:50+00:00" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 }, { "name": "amphp/byte-stream", @@ -2581,12 +2564,12 @@ "source": { "type": "git", "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541" + "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/85e83cacd2ed573238678c6875f8f0d7ec699541", - "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/9d846d1f5cf101deee7a61c8ba7caa0a975cd730", + "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730", "shasum": "" }, "require": { @@ -2628,9 +2611,9 @@ ], "support": { "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.0" + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/1.5.1" }, - "time": "2020-10-23T13:55:30+00:00" + "time": "2021-02-22T14:02:09+00:00" }, { "name": "matthiasmullie/minify", @@ -3045,16 +3028,16 @@ }, { "name": "phar-io/version", - "version": "3.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { @@ -3090,9 +3073,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.0.4" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2020-12-13T23:18:30+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3405,12 +3388,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "05fa32de35b15c94838d22482cc59d99860a706f" + "reference": "dae425925709122f7584cadeeb838edcaa491bb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/05fa32de35b15c94838d22482cc59d99860a706f", - "reference": "05fa32de35b15c94838d22482cc59d99860a706f", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/dae425925709122f7584cadeeb838edcaa491bb1", + "reference": "dae425925709122f7584cadeeb838edcaa491bb1", "shasum": "" }, "require": { @@ -3458,7 +3441,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:34+00:00" + "time": "2021-02-23T15:48:43+00:00" }, { "name": "phpunit/php-invoker", @@ -3466,12 +3449,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "7bba8d62fc6140730c268d5ff7fbf9c3a54996a8" + "reference": "5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/7bba8d62fc6140730c268d5ff7fbf9c3a54996a8", - "reference": "7bba8d62fc6140730c268d5ff7fbf9c3a54996a8", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40", + "reference": "5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40", "shasum": "" }, "require": { @@ -3522,7 +3505,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:42+00:00" + "time": "2021-02-23T15:48:51+00:00" }, { "name": "phpunit/php-text-template", @@ -3530,12 +3513,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "bca9f27936ccd6d7450f16f1ee3f125b755b7905" + "reference": "4ec5a2ac79a19b35d0cf83cce30604f77743067a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/bca9f27936ccd6d7450f16f1ee3f125b755b7905", - "reference": "bca9f27936ccd6d7450f16f1ee3f125b755b7905", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/4ec5a2ac79a19b35d0cf83cce30604f77743067a", + "reference": "4ec5a2ac79a19b35d0cf83cce30604f77743067a", "shasum": "" }, "require": { @@ -3582,7 +3565,7 @@ "type": "github" } ], - "time": "2021-02-14T06:53:15+00:00" + "time": "2021-02-23T15:49:24+00:00" }, { "name": "phpunit/php-timer", @@ -3590,12 +3573,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e3125d0dc516e7f7ab23d54ddefbce67627fd608" + "reference": "705821b0927b5e69e9e016c84de68dc6195c71b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e3125d0dc516e7f7ab23d54ddefbce67627fd608", - "reference": "e3125d0dc516e7f7ab23d54ddefbce67627fd608", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/705821b0927b5e69e9e016c84de68dc6195c71b9", + "reference": "705821b0927b5e69e9e016c84de68dc6195c71b9", "shasum": "" }, "require": { @@ -3642,7 +3625,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:50+00:00" + "time": "2021-02-23T15:48:59+00:00" }, { "name": "phpunit/phpunit", @@ -3807,12 +3790,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "5a6fc83d266e0fcbf890d4475bfbb713dbb4d202" + "reference": "3a42d843af4d27ca1155e1d926881af162733655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/5a6fc83d266e0fcbf890d4475bfbb713dbb4d202", - "reference": "5a6fc83d266e0fcbf890d4475bfbb713dbb4d202", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/3a42d843af4d27ca1155e1d926881af162733655", + "reference": "3a42d843af4d27ca1155e1d926881af162733655", "shasum": "" }, "require": { @@ -3856,7 +3839,7 @@ "type": "github" } ], - "time": "2021-02-14T06:53:40+00:00" + "time": "2021-02-23T15:49:50+00:00" }, { "name": "sebastian/code-unit", @@ -3920,12 +3903,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "96fc758350a824cf96f9e7847ecdf9bb82c87083" + "reference": "5f5db0b35f586eb5bca0581a10bb42dd56575986" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/96fc758350a824cf96f9e7847ecdf9bb82c87083", - "reference": "96fc758350a824cf96f9e7847ecdf9bb82c87083", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5f5db0b35f586eb5bca0581a10bb42dd56575986", + "reference": "5f5db0b35f586eb5bca0581a10bb42dd56575986", "shasum": "" }, "require": { @@ -3968,7 +3951,7 @@ "type": "github" } ], - "time": "2021-02-14T06:51:27+00:00" + "time": "2021-02-23T15:47:39+00:00" }, { "name": "sebastian/comparator", @@ -3976,12 +3959,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "3b943ec66244e5d0a5252708d1c9073ae6d3efc9" + "reference": "dbc5fb421f242a5749845dc8dd0dc8cde2979dd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b943ec66244e5d0a5252708d1c9073ae6d3efc9", - "reference": "3b943ec66244e5d0a5252708d1c9073ae6d3efc9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dbc5fb421f242a5749845dc8dd0dc8cde2979dd9", + "reference": "dbc5fb421f242a5749845dc8dd0dc8cde2979dd9", "shasum": "" }, "require": { @@ -4043,7 +4026,7 @@ "type": "github" } ], - "time": "2021-02-14T06:51:35+00:00" + "time": "2021-02-23T15:47:47+00:00" }, { "name": "sebastian/complexity", @@ -4108,12 +4091,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "1895a1a29e197f7d31099a320b2a3ae9e428b21d" + "reference": "93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1895a1a29e197f7d31099a320b2a3ae9e428b21d", - "reference": "1895a1a29e197f7d31099a320b2a3ae9e428b21d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90", + "reference": "93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90", "shasum": "" }, "require": { @@ -4167,7 +4150,7 @@ "type": "github" } ], - "time": "2021-02-14T06:51:43+00:00" + "time": "2021-02-23T15:47:55+00:00" }, { "name": "sebastian/environment", @@ -4175,12 +4158,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "7f8f2720df4d03d4368edadac24c3a7950b6cdc5" + "reference": "6e1743b808be9cfd33a716583ccb94b7d4d32e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/7f8f2720df4d03d4368edadac24c3a7950b6cdc5", - "reference": "7f8f2720df4d03d4368edadac24c3a7950b6cdc5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e1743b808be9cfd33a716583ccb94b7d4d32e94", + "reference": "6e1743b808be9cfd33a716583ccb94b7d4d32e94", "shasum": "" }, "require": { @@ -4231,7 +4214,7 @@ "type": "github" } ], - "time": "2021-02-14T06:51:52+00:00" + "time": "2021-02-23T15:48:03+00:00" }, { "name": "sebastian/exporter", @@ -4239,12 +4222,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c6819d6edff3496f28c29a9ed61c564a9fdae27b" + "reference": "eca7281ab29075df68b113a37a83be616b629b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c6819d6edff3496f28c29a9ed61c564a9fdae27b", - "reference": "c6819d6edff3496f28c29a9ed61c564a9fdae27b", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/eca7281ab29075df68b113a37a83be616b629b12", + "reference": "eca7281ab29075df68b113a37a83be616b629b12", "shasum": "" }, "require": { @@ -4309,7 +4292,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:00+00:00" + "time": "2021-02-23T15:48:12+00:00" }, { "name": "sebastian/global-state", @@ -4317,12 +4300,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "a912746c9e31610f52b8e6977107e745c758cfd8" + "reference": "0ac702e6d13725242edb9b294c5d20b92fcfb8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a912746c9e31610f52b8e6977107e745c758cfd8", - "reference": "a912746c9e31610f52b8e6977107e745c758cfd8", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ac702e6d13725242edb9b294c5d20b92fcfb8b4", + "reference": "0ac702e6d13725242edb9b294c5d20b92fcfb8b4", "shasum": "" }, "require": { @@ -4374,7 +4357,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:09+00:00" + "time": "2021-02-23T15:48:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -4439,12 +4422,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "79f258bf9b9f9f1aff7ec27fa3e0d5d7ef344088" + "reference": "8cc80b4bda00a4c5997c3fc597a34872f3a1007d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/79f258bf9b9f9f1aff7ec27fa3e0d5d7ef344088", - "reference": "79f258bf9b9f9f1aff7ec27fa3e0d5d7ef344088", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/8cc80b4bda00a4c5997c3fc597a34872f3a1007d", + "reference": "8cc80b4bda00a4c5997c3fc597a34872f3a1007d", "shasum": "" }, "require": { @@ -4489,7 +4472,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:17+00:00" + "time": "2021-02-23T15:48:28+00:00" }, { "name": "sebastian/object-reflector", @@ -4497,12 +4480,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "232add5a51167e359e1dd03334ebffaddfb95795" + "reference": "1d33587c2c3e636936f895e103a9e82dd8102a8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/232add5a51167e359e1dd03334ebffaddfb95795", - "reference": "232add5a51167e359e1dd03334ebffaddfb95795", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d33587c2c3e636936f895e103a9e82dd8102a8e", + "reference": "1d33587c2c3e636936f895e103a9e82dd8102a8e", "shasum": "" }, "require": { @@ -4545,7 +4528,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:26+00:00" + "time": "2021-02-23T15:48:35+00:00" }, { "name": "sebastian/recursion-context", @@ -4553,12 +4536,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "d6cde15be46e8e5cc8671ceb41b63b69dfd7bd5a" + "reference": "43f58a51e8f853aadb228ba818d2be388af7237b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/d6cde15be46e8e5cc8671ceb41b63b69dfd7bd5a", - "reference": "d6cde15be46e8e5cc8671ceb41b63b69dfd7bd5a", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/43f58a51e8f853aadb228ba818d2be388af7237b", + "reference": "43f58a51e8f853aadb228ba818d2be388af7237b", "shasum": "" }, "require": { @@ -4609,7 +4592,7 @@ "type": "github" } ], - "time": "2021-02-14T06:52:58+00:00" + "time": "2021-02-23T15:49:08+00:00" }, { "name": "sebastian/resource-operations", @@ -4673,12 +4656,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "8abc9c1947c9f928da999be28778a0ba48cdf5b4" + "reference": "557863473c1de00e165a288d5b547f1f83652e7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/8abc9c1947c9f928da999be28778a0ba48cdf5b4", - "reference": "8abc9c1947c9f928da999be28778a0ba48cdf5b4", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/557863473c1de00e165a288d5b547f1f83652e7e", + "reference": "557863473c1de00e165a288d5b547f1f83652e7e", "shasum": "" }, "require": { @@ -4722,7 +4705,7 @@ "type": "github" } ], - "time": "2021-02-14T06:53:07+00:00" + "time": "2021-02-23T15:49:16+00:00" }, { "name": "sebastian/version", @@ -4821,21 +4804,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/console.git", -<<<<<<< HEAD - "reference": "7286c70d99c958cd419f10dae098ed3fc33670d9" + "reference": "c08d7d0d458eceb62996d81d3be8d9fbf5564ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7286c70d99c958cd419f10dae098ed3fc33670d9", - "reference": "7286c70d99c958cd419f10dae098ed3fc33670d9", -======= - "reference": "2a6f75224a537ee506e9fa1e6fc4200ad411ffd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2a6f75224a537ee506e9fa1e6fc4200ad411ffd9", - "reference": "2a6f75224a537ee506e9fa1e6fc4200ad411ffd9", ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 + "url": "https://api.github.com/repos/symfony/console/zipball/c08d7d0d458eceb62996d81d3be8d9fbf5564ec4", + "reference": "c08d7d0d458eceb62996d81d3be8d9fbf5564ec4", "shasum": "" }, "require": { @@ -4920,11 +4894,7 @@ "type": "tidelift" } ], -<<<<<<< HEAD - "time": "2021-01-10T16:31:27+00:00" -======= - "time": "2021-02-17T15:27:35+00:00" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 + "time": "2021-02-23T10:10:15+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5424,12 +5394,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bf99754c6182a126968b1c2709d18548489f27eb" + "reference": "e830e6ceebd6377b019e4c9a523d6f2c27007e4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bf99754c6182a126968b1c2709d18548489f27eb", - "reference": "bf99754c6182a126968b1c2709d18548489f27eb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e830e6ceebd6377b019e4c9a523d6f2c27007e4a", + "reference": "e830e6ceebd6377b019e4c9a523d6f2c27007e4a", "shasum": "" }, "require": { @@ -5443,7 +5413,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5496,7 +5466,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T16:27:53+00:00" + "time": "2021-02-25T16:38:04+00:00" }, { "name": "symfony/string", @@ -5504,21 +5474,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/string.git", -<<<<<<< HEAD - "reference": "7a62495108b3dc7e749b709357ae720fccb5a39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7a62495108b3dc7e749b709357ae720fccb5a39b", - "reference": "7a62495108b3dc7e749b709357ae720fccb5a39b", -======= "reference": "6d830fae00e2bb336074eae141bb00db36cd3551" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/string/zipball/6d830fae00e2bb336074eae141bb00db36cd3551", "reference": "6d830fae00e2bb336074eae141bb00db36cd3551", ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 "shasum": "" }, "require": { @@ -5589,11 +5550,7 @@ "type": "tidelift" } ], -<<<<<<< HEAD - "time": "2021-01-10T16:38:27+00:00" -======= "time": "2021-02-17T15:27:35+00:00" ->>>>>>> a81668f7457d5df3f8539591c166139b3b1675f8 }, { "name": "theseer/tokenizer", @@ -5651,12 +5608,12 @@ "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "429f90a02d3bd4a06787ac9bc48c56c4320b58a0" + "reference": "728c611e8643a5dd44839ffa791e21763b04a694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/429f90a02d3bd4a06787ac9bc48c56c4320b58a0", - "reference": "429f90a02d3bd4a06787ac9bc48c56c4320b58a0", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/728c611e8643a5dd44839ffa791e21763b04a694", + "reference": "728c611e8643a5dd44839ffa791e21763b04a694", "shasum": "" }, "require": { @@ -5722,7 +5679,7 @@ "type": "tidelift" } ], - "time": "2021-02-08T09:50:07+00:00" + "time": "2021-02-22T11:56:05+00:00" }, { "name": "vimeo/psalm", diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 0a89eff2a3..2bb7d88017 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -116,6 +116,9 @@ class Response extends SwooleResponse const MODEL_DOMAIN = 'domain'; const MODEL_DOMAIN_LIST = 'domainList'; + // Content type + const CONTENT_TYPE_NULL = null; + /** * @var Filter */ @@ -260,7 +263,22 @@ class Response extends SwooleResponse $output = self::getFilter()->parse($output, $model); } - // $this->json(!empty($output) ? $output : new stdClass()); + switch($this->getContentType()) { + case self::CONTENT_TYPE_JSON: + $this->json(!empty($output) ? $output : new stdClass()); + break; + + case self::CONTENT_TYPE_NULL: + break; + + case self::CONTENT_TYPE_YAML: + $this->yaml(!empty($output) ? $output : new stdClass()); + break; + + default : + throw new Exception("No Response format set."); + break; + } } /** From 42d6194ed913841eeb3f787dcbe2f75fbd026896 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Fri, 5 Mar 2021 00:10:52 +0530 Subject: [PATCH 12/17] feat: error handling for graphQL --- .swiftlint.yml | 0 app/config/roles.php | 5 +- app/controllers/api/graphql.php | 120 ++++++++++++++++++++++++------- app/controllers/api/users.php | 4 +- app/controllers/general.php | 8 +++ app/controllers/shared/api.php | 10 ++- app/http.php | 1 + app/init.php | 12 ++-- composer.json | 4 +- composer.lock | 54 +++++++------- docker-compose.yml | 2 +- src/Appwrite/Utopia/Response.php | 12 +++- 12 files changed, 160 insertions(+), 72 deletions(-) create mode 100644 .swiftlint.yml diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/config/roles.php b/app/config/roles.php index 78dd24ad45..e6b297182b 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -7,6 +7,7 @@ $member = [ 'home', 'console', 'account', + 'graphql', 'teams.read', 'teams.write', 'documents.read', @@ -22,6 +23,7 @@ $member = [ ]; $admins = [ + 'graphql', 'teams.read', 'teams.write', 'documents.read', @@ -56,6 +58,7 @@ return [ 'public', 'home', 'console', + 'graphql', 'documents.read', 'files.read', 'locale.read', @@ -82,6 +85,6 @@ return [ ], Auth::USER_ROLE_APP => [ 'label' => 'Application', - 'scopes' => ['health.read'], + 'scopes' => ['health.read', 'graphql'], ], ]; diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index d295b72a96..fc5d2f8d7c 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -1,13 +1,19 @@ getType()])) return; - $rules = $model->getRules(); $name = $model->getType(); $fields = []; + $type = null; foreach ($rules as $key => $props) { // Replace this with php regex - $key = str_replace('$', '', $key); + $keyWithoutSpecialChars = str_replace('$', '', $key); if (isset( $typeMapping[$props['type']])) { $type = $typeMapping[$props['type']]; } else { @@ -82,10 +88,30 @@ function createTypeMapping(Model $model, Response $response) { $type = Type::listOf($type); } - $fields[$key] = [ + $fields[$keyWithoutSpecialChars] = [ 'type' => $type, 'description' => $props['description'], + 'resolve' => function ($type, $args, $context, $info) use ($key) { + var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); + // var_dump("isCompositeType : ", Type::isCompositeType($type)); + // var_dump("isLeafType : ", Type::isLeafType($type)); + if ( $type[$key] instanceof stdClass ) { + // var_dump("STD Class"); + return json_encode($type[$key]); + } else { + // var_dump("not stdclass"); + return $type[$key]; + } + } ]; + + // if ($keyWithoutSpecialChars !== $key) { + // $fields[$keyWithoutSpecialChars]['resolve'] = function ($value, $args, $context, $info) use ($key) { + // var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); + // var_dump($value); + // return $value[$key]; + // }; + // } } $objectType = [ @@ -168,6 +194,29 @@ function getArgs(array $params, $utopia) { return $args; } +function isModel($response, Model $model) { + + foreach ($model->getRules() as $key => $rule) { + if (!isset($response[$key])) { + return false; + } + } + return true; +} + +class MySafeException extends \Exception implements ClientAware +{ + public function isClientSafe() + { + return true; + } + + public function getCategory() + { + return 'businessLogic'; + } +} + function buildSchema($utopia, $response) { $start = microtime(true); @@ -178,33 +227,48 @@ function buildSchema($utopia, $response) { foreach($routes as $route) { $namespace = $route->getLabel('sdk.namespace', ''); - if ($namespace == 'users') { + if ($namespace == 'database' || true) { $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); $responseModelName = $route->getLabel('sdk.response.model', ""); - var_dump("******************************************"); - var_dump("Processing route : ${method} : {$route->getURL()}"); - var_dump("Model Name : ${responseModelName}"); - if ( $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { + // var_dump("******************************************"); + // var_dump("Processing route : ${method} : {$route->getURL()}"); + // var_dump("Model Name : ${responseModelName}"); + if ( $responseModelName !== "" && $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { $responseModel = $response->getModel($responseModelName); createTypeMapping($responseModel, $response); $type = $typeMapping[$responseModel->getType()]; - var_dump("Type Created : ${type}"); + // var_dump("Type Created : ${type}"); $args = getArgs($route->getParams(), $utopia); - var_dump("Args Generated : ${args}"); + // var_dump("Args Generated :"); + // var_dump($args); $field = [ 'type' => $type, 'description' => $route->getDesc(), 'args' => $args, - 'resolve' => function ($args) use (&$utopia, $route, $response) { - var_dump("************* REACHED RESOLVE *****************"); - var_dump($route); - $utopia->execute($route, $args); + 'resolve' => function ($type, $args, $context, $info) use (&$utopia, $route, $response) { + var_dump("************* REACHED RESOLVE FOR {$info->fieldName} *****************"); + // var_dump($route); + + // var_dump("************* CONTEXT *****************"); + // var_dump($context); + + var_dump("********************** ARGS *******************"); var_dump($args); + + $utopia->setRoute($route); + $utopia->execute($route, $args); + var_dump("**************** OUTPUT ************"); - var_dump($response->getPayload()); - return $response->getPayload(); + // var_dump($response->getPayload()); + $result = $response->getPayload(); + + if (isModel($result, $response->getModel(Response::MODEL_ERROR)) || isModel($result, $response->getModel(Response::MODEL_ERROR_DEV))) { + throw new MySafeException($result['message'], $result['code']); + } + + return $result; } ]; @@ -214,9 +278,9 @@ function buildSchema($utopia, $response) { $mutationFields[$methodName] = $field; } - var_dump("Processed route : ${method} : {$route->getURL()}"); + // var_dump("Processed route : ${method} : {$route->getURL()}"); } else { - var_dump("Skipping route : {$route->getURL()}"); + // var_dump("Skipping route : {$route->getURL()}"); } } } @@ -252,16 +316,19 @@ function buildSchema($utopia, $response) { App::post('/v1/graphql') ->desc('GraphQL Endpoint') - ->groups(['api', 'graphql']) - ->label('scope', 'public') + ->label('scope', 'graphql') ->inject('request') ->inject('response') ->inject('utopia') - ->action(function ($request, $response, $utopia) { + ->inject('user') + ->inject('project') + ->middleware(true) + ->action(function ($request, $response, $utopia, $user, $project) { + + // Generate the Schema of the server on startup. // Use the routes from utopia and get the params then construct the queries and mutations. - - $schema = buildSchema($utopia, $response); + $schema = buildSchema($utopia, $response, $request); $query = $request->getPayload('query', ''); $variables = $request->getPayload('variables', null); $response->setContentType(Response::CONTENT_TYPE_NULL); @@ -270,8 +337,8 @@ App::post('/v1/graphql') $rootValue = []; $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); $output = $result->toArray(); - var_dump("********** OUTPUT *********"); - var_dump($output); + // var_dump("********** OUTPUT *********"); + // var_dump($output); } catch (\Exception $error) { $output = [ 'errors' => [ @@ -286,6 +353,5 @@ App::post('/v1/graphql') ]; } $response->json($output); - echo "\n"; //TODO REMOVE THIS } - ); \ No newline at end of file + ); diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index efb0041cee..183c50b6b8 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -98,6 +98,8 @@ App::get('/v1/users') /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Database\Database $projectDB */ + var_dump("Running execute method for list users"); + $results = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, @@ -217,7 +219,7 @@ App::get('/v1/users/:userId/sessions') 'sum' => count($sessions), 'sessions' => $sessions ]), Response::MODEL_SESSION_LIST); - }, ['response', 'projectDB', 'locale']); + }); App::get('/v1/users/:userId/logs') ->desc('Get User Logs') diff --git a/app/controllers/general.php b/app/controllers/general.php index 614c400048..22a487cc1d 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -33,6 +33,8 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo /** @var bool $mode */ /** @var array $clients */ + var_dump("*********** In general.php init *************"); + $localeParam = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', '')); if (\in_array($localeParam, Config::getParam('locale-codes'))) { @@ -210,6 +212,10 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo // TDOO Check if user is god + var_dump("*********** Allowed Scopes *********"); + var_dump($scopes); + var_dump($scope); + if (!\in_array($scope, $scopes)) { if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { // Check if permission is denied because project is missing throw new Exception('Project not found', 404); @@ -252,6 +258,8 @@ App::error(function ($error, $utopia, $request, $response, $layout, $project) { /** @var Utopia\View $layout */ /** @var Appwrite\Database\Document $project */ + var_dump("*********** In general.php error *************"); + $route = $utopia->match($request); $template = ($route) ? $route->getLabel('error', null) : null; diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 9676801493..051904a5dc 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -22,6 +22,8 @@ App::init(function ($utopia, $request, $response, $project, $user, $register, $e /** @var Appwrite\Event\Event $deletes */ /** @var Appwrite\Event\Event $functions */ + var_dump("*********** In api.php init *************"); + Storage::setDevice('files', new Local(APP_STORAGE_UPLOADS.'/app-'.$project->getId())); Storage::setDevice('functions', new Local(APP_STORAGE_FUNCTIONS.'/app-'.$project->getId())); @@ -50,9 +52,9 @@ App::init(function ($utopia, $request, $response, $project, $user, $register, $e // var_dump($request->getParams()); - foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys - $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); - } + // foreach ($request->getParams() as $key => $value) { // Set request params as potential abuse keys + // $timeLimit->setParam('{param-'.$key.'}', (\is_array($value)) ? \json_encode($value) : $value); + // } $abuse = new Abuse($timeLimit); @@ -125,6 +127,8 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits /** @var Appwrite\Event\Event $functions */ /** @var bool $mode */ + var_dump("*********** In api.php shutdown *************"); + if (!empty($events->getParam('event'))) { if(empty($events->getParam('payload'))) { $events->setParam('payload', $response->getPayload()); diff --git a/app/http.php b/app/http.php index 9e45bc3b52..92ddca1265 100644 --- a/app/http.php +++ b/app/http.php @@ -102,6 +102,7 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo $app->run($request, $response); } catch (\Throwable $th) { + var_dump("*********** In http.php catching error *************"); Console::error('[Error] Type: '.get_class($th)); Console::error('[Error] Message: '.$th->getMessage()); Console::error('[Error] File: '.$th->getFile()); diff --git a/app/init.php b/app/init.php index 11edd77a2c..f469933b39 100644 --- a/app/init.php +++ b/app/init.php @@ -212,10 +212,6 @@ $register->set('geodb', function () { return new Reader(__DIR__.'/db/DBIP/dbip-country-lite-2021-02.mmdb'); }); -$register->set('schema', function () { - -}); - /* * Localization */ @@ -289,14 +285,14 @@ Locale::setLanguage('zh-tw', include __DIR__.'/config/locale/translations/zh-tw. // Runtime Execution +App::setResource('routeToScopeMapping', function($register) { + return new Event(Event::MAILS_QUEUE_NAME, Event::MAILS_CLASS_NAME); +}, ['register']); + App::setResource('register', function() use ($register) { return $register; }); -App::setResource('schema', function() use ($register) { - return $register->get('schema'); -}); - App::setResource('layout', function($locale) { $layout = new View(__DIR__.'/views/layouts/default.phtml'); $layout->setParam('locale', $locale); diff --git a/composer.json b/composer.json index d16a3f56e6..7454acbc43 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "appwrite/php-clamav": "1.0.*", - "utopia-php/framework": "0.10.0", + "utopia-php/framework": "0.12.0", "utopia-php/abuse": "0.3.*", "utopia-php/analytics": "0.1.*", "utopia-php/audit": "0.5.*", @@ -47,7 +47,7 @@ "utopia-php/domains": "0.2.*", "utopia-php/swoole": "0.2.*", "utopia-php/system": "0.4.*", - "utopia-php/storage": "0.2.*", + "utopia-php/storage": "0.4.*", "webonyx/graphql-php": "14.4.0", "resque/php-resque": "1.3.6", diff --git a/composer.lock b/composer.lock index 9b07609ec9..ac4cc88d24 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "aed281e2643524e5f1320533abb612eb", + "content-hash": "d1b9fa5657767534eefd141136bb3cfd", "packages": [ { "name": "adhocore/jwt", @@ -349,7 +349,7 @@ "issues": "https://github.com/domnikl/statsd-php/issues", "source": "https://github.com/domnikl/statsd-php/tree/master" }, - "abandoned": true, + "abandoned": "slickdeals/statsd", "time": "2020-01-03T14:24:58+00:00" }, { @@ -574,12 +574,12 @@ "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "f47ece9e6e8ce74e3be04bef47f46061dc18c095" + "reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f47ece9e6e8ce74e3be04bef47f46061dc18c095", - "reference": "f47ece9e6e8ce74e3be04bef47f46061dc18c095", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976", + "reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976", "shasum": "" }, "require": { @@ -641,7 +641,7 @@ "issues": "https://github.com/guzzle/psr7/issues", "source": "https://github.com/guzzle/psr7/tree/1.x" }, - "time": "2020-12-08T11:45:39+00:00" + "time": "2021-03-02T18:57:24+00:00" }, { "name": "influxdb/influxdb-php", @@ -1004,12 +1004,12 @@ "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "dd738d0b4491f32725492cf345f6b501f5922fec" + "reference": "a18c1e692e02b84abbafe4856c3cd7cc6903908c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/dd738d0b4491f32725492cf345f6b501f5922fec", - "reference": "dd738d0b4491f32725492cf345f6b501f5922fec", + "url": "https://api.github.com/repos/php-fig/log/zipball/a18c1e692e02b84abbafe4856c3cd7cc6903908c", + "reference": "a18c1e692e02b84abbafe4856c3cd7cc6903908c", "shasum": "" }, "require": { @@ -1047,7 +1047,7 @@ "support": { "source": "https://github.com/php-fig/log/tree/master" }, - "time": "2020-09-18T06:44:51+00:00" + "time": "2021-03-02T15:02:34+00:00" }, { "name": "ralouphie/getallheaders", @@ -1548,16 +1548,16 @@ }, { "name": "utopia-php/framework", - "version": "0.10.0", + "version": "0.12.0", "source": { "type": "git", "url": "https://github.com/utopia-php/framework.git", - "reference": "65909bdb24ef6b6c6751abfdea90caf96bbc6c50" + "reference": "bfdb236f91f4393f6db7faccd2d67550a1e73101" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/65909bdb24ef6b6c6751abfdea90caf96bbc6c50", - "reference": "65909bdb24ef6b6c6751abfdea90caf96bbc6c50", + "url": "https://api.github.com/repos/utopia-php/framework/zipball/bfdb236f91f4393f6db7faccd2d67550a1e73101", + "reference": "bfdb236f91f4393f6db7faccd2d67550a1e73101", "shasum": "" }, "require": { @@ -1591,9 +1591,9 @@ ], "support": { "issues": "https://github.com/utopia-php/framework/issues", - "source": "https://github.com/utopia-php/framework/tree/0.10.0" + "source": "https://github.com/utopia-php/framework/tree/0.12.0" }, - "time": "2020-12-26T12:02:39+00:00" + "time": "2021-03-04T17:14:23+00:00" }, { "name": "utopia-php/locale", @@ -1753,21 +1753,21 @@ }, { "name": "utopia-php/storage", - "version": "0.2.0", + "version": "0.4.3", "source": { "type": "git", "url": "https://github.com/utopia-php/storage.git", - "reference": "27bfd663c9b2a17ac0911522a87f42bee834df95" + "reference": "9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/storage/zipball/27bfd663c9b2a17ac0911522a87f42bee834df95", - "reference": "27bfd663c9b2a17ac0911522a87f42bee834df95", + "url": "https://api.github.com/repos/utopia-php/storage/zipball/9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7", + "reference": "9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7", "shasum": "" }, "require": { "php": ">=7.4", - "utopia-php/framework": "0.10.0" + "utopia-php/framework": "0.*.*" }, "require-dev": { "phpunit/phpunit": "^9.3", @@ -1799,9 +1799,9 @@ ], "support": { "issues": "https://github.com/utopia-php/storage/issues", - "source": "https://github.com/utopia-php/storage/tree/0.2.0" + "source": "https://github.com/utopia-php/storage/tree/0.4.3" }, - "time": "2021-01-27T12:21:27+00:00" + "time": "2021-03-02T20:25:02+00:00" }, { "name": "utopia-php/swoole", @@ -5792,12 +5792,12 @@ "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9c89b265ccc4092d58e66d72af5d343ee77a41ae" + "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9c89b265ccc4092d58e66d72af5d343ee77a41ae", - "reference": "9c89b265ccc4092d58e66d72af5d343ee77a41ae", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", + "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", "shasum": "" }, "require": { @@ -5843,7 +5843,7 @@ "issues": "https://github.com/webmozarts/assert/issues", "source": "https://github.com/webmozarts/assert/tree/master" }, - "time": "2021-01-18T12:52:36+00:00" + "time": "2021-02-28T20:01:57+00:00" }, { "name": "webmozart/path-util", diff --git a/docker-compose.yml b/docker-compose.yml index de2e7773bc..4f38b10cd7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -63,7 +63,7 @@ services: - ./psalm.xml:/usr/src/code/psalm.xml - ./tests:/usr/src/code/tests - ./app:/usr/src/code/app - # - ./vendor:/usr/src/code/vendor + - ./vendor:/usr/src/code/vendor - ./docs:/usr/src/code/docs - ./public:/usr/src/code/public - ./src:/usr/src/code/src diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 2bb7d88017..642a38954c 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -117,7 +117,7 @@ class Response extends SwooleResponse const MODEL_DOMAIN_LIST = 'domainList'; // Content type - const CONTENT_TYPE_NULL = null; + const CONTENT_TYPE_NULL = 'null'; /** * @var Filter @@ -276,7 +276,7 @@ class Response extends SwooleResponse break; default : - throw new Exception("No Response format set."); + $this->json(!empty($output) ? $output : new stdClass()); break; } } @@ -330,6 +330,14 @@ class Response extends SwooleResponse $this->payload = $output; + var_dump("********************** PAYLOAD SET *********************"); + var_dump("Message : {$output['message']}"); + var_dump("Code : {$output['code']}"); + var_dump("Version : {$output['version']}"); + var_dump("File : {$output['file']}"); + var_dump("Line : {$output['line']}"); + var_dump("Trace : "); + return $this->payload; } From 293b1b3c8a89d27a2579c6918fab9554367d6238 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Mon, 8 Mar 2021 20:13:28 +0530 Subject: [PATCH 13/17] feat: handle document response type --- app/controllers/api/graphql.php | 45 +++++++++++++++++++++++++------- src/Appwrite/Utopia/Response.php | 14 +++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index fc5d2f8d7c..f192ce849b 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -11,6 +11,7 @@ use Appwrite\Utopia\Response\Model; use GraphQL\Error\ClientAware; use GraphQL\Error\DebugFlag; use GraphQL\Language\Parser; +use GraphQL\Type\Definition\ListOfType; use GraphQL\Type\Definition\NonNull; use Utopia\App; use Utopia\Config\Config; @@ -55,6 +56,7 @@ $typeMapping = [ // Outliers Model::TYPE_JSON => Type::string(), Response::MODEL_ANY => Type::string(), + Response::MODEL_NONE => Type::string(), ]; @@ -91,17 +93,42 @@ function createTypeMapping(Model $model, Response $response) { $fields[$keyWithoutSpecialChars] = [ 'type' => $type, 'description' => $props['description'], - 'resolve' => function ($type, $args, $context, $info) use ($key) { + 'resolve' => function ($object, $args, $context, $info) use ($key, $type) { var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); - // var_dump("isCompositeType : ", Type::isCompositeType($type)); - // var_dump("isLeafType : ", Type::isLeafType($type)); - if ( $type[$key] instanceof stdClass ) { - // var_dump("STD Class"); - return json_encode($type[$key]); - } else { - // var_dump("not stdclass"); - return $type[$key]; + // var_dump($info->returnType->getWrappedType()); + + var_dump("isListType : ", $info->returnType instanceof ListOfType); + var_dump("isBuiltinType : ", Type::isBuiltInType($info->returnType)); + var_dump("isCompositeType : ", Type::isCompositeType($info->returnType)); + var_dump("isLeafType : ", Type::isLeafType($info->returnType)); + var_dump("isOutputType : ", Type::isOutputType($info->returnType)); + + var_dump("PHP Type of object: " . gettype($object[$key])); + switch(gettype($object[$key])) { + case 'array': + $isAssoc = count(array_filter(array_keys($object[$key]), 'is_string')) > 0 ; + if ($isAssoc) { + return json_encode($object[$key]); + } else { + return array_map('json_encode', $object[$key]); + } + case 'object': + return json_encode($object[$key]); + default: + return $object[$key]; } + + + + $isListType = $info->returnType instanceof ListOfType; + + if ($isListType) { + $isStringType = $info->returnType->getWrappedType() === Type::string(); + } else { + + } + + // $isString = $info->returnType->getWrappedType(); } ]; diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 642a38954c..7648cac44b 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -330,13 +330,13 @@ class Response extends SwooleResponse $this->payload = $output; - var_dump("********************** PAYLOAD SET *********************"); - var_dump("Message : {$output['message']}"); - var_dump("Code : {$output['code']}"); - var_dump("Version : {$output['version']}"); - var_dump("File : {$output['file']}"); - var_dump("Line : {$output['line']}"); - var_dump("Trace : "); + // var_dump("********************** PAYLOAD SET *********************"); + // var_dump("Message : {$output['message']}"); + // var_dump("Code : {$output['code']}"); + // var_dump("Version : {$output['version']}"); + // var_dump("File : {$output['file']}"); + // var_dump("Line : {$output['line']}"); + // var_dump("Trace : "); return $this->payload; } From 4eae1f6f02d1e7ff9e3f07563434bddf1e414604 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 10 Mar 2021 01:18:32 +0530 Subject: [PATCH 14/17] feat: added support for JSON types --- app/controllers/api/graphql.php | 181 +++++++++++++++++++++++++------- 1 file changed, 141 insertions(+), 40 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index f192ce849b..fa1f0697a0 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -11,6 +11,14 @@ use Appwrite\Utopia\Response\Model; use GraphQL\Error\ClientAware; use GraphQL\Error\DebugFlag; use GraphQL\Language\Parser; +use GraphQL\Language\AST\BooleanValueNode; +use GraphQL\Language\AST\FloatValueNode; +use GraphQL\Language\AST\IntValueNode; +use GraphQL\Language\AST\ListValueNode; +use GraphQL\Language\AST\Node; +use GraphQL\Language\AST\ObjectValueNode; +use GraphQL\Language\AST\StringValueNode; +use GraphQL\Type\Definition\ScalarType; use GraphQL\Type\Definition\ListOfType; use GraphQL\Type\Definition\NonNull; use Utopia\App; @@ -45,8 +53,69 @@ use Utopia\Validator; * - Objects */ + +class JsonType extends ScalarType +{ + public $name = 'Json'; + public $description = + 'The `JSON` scalar type represents JSON values as specified by + [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).'; + + public function __construct(?string $name = null) + { + if ($name) { + $this->name = $name; + } + parent::__construct(); + } + + public function parseValue($value) + { + return $this->identity($value); + } + + public function serialize($value) + { + return $this->identity($value); + } + + public function parseLiteral(Node $valueNode, ?array $variables = null) + { + switch ($valueNode) { + case ($valueNode instanceof StringValueNode): + case ($valueNode instanceof BooleanValueNode): + return $valueNode->value; + case ($valueNode instanceof IntValueNode): + case ($valueNode instanceof FloatValueNode): + return floatval($valueNode->value); + case ($valueNode instanceof ObjectValueNode): { + $value = []; + foreach ($valueNode->fields as $field) { + $value[$field->name->value] = $this->parseLiteral($field->value); + } + return $value; + } + case ($valueNode instanceof ListValueNode): + return array_map([$this, 'parseLiteral'], $valueNode->values); + default: + return null; + } + + } + + private function identity($value) + { + return $value; + } + +} + + global $typeMapping; +global $jsonParser; +$jsonParser = new JsonType(); + $typeMapping = [ Model::TYPE_BOOLEAN => Type::boolean(), Model::TYPE_STRING => Type::string(), @@ -54,8 +123,8 @@ $typeMapping = [ Model::TYPE_FLOAT => Type::float(), // Outliers - Model::TYPE_JSON => Type::string(), - Response::MODEL_ANY => Type::string(), + Model::TYPE_JSON => $jsonParser, + Response::MODEL_ANY => $jsonParser, Response::MODEL_NONE => Type::string(), ]; @@ -64,17 +133,42 @@ function createTypeMapping(Model $model, Response $response) { global $typeMapping; - // If map already contains this complex type, then simply return + /* + If the map already contains the type, end the recursion + and return. + */ if (isset($typeMapping[$model->getType()])) return; $rules = $model->getRules(); $name = $model->getType(); $fields = []; $type = null; + /* + Iterate through all the rules in the response model. Each rule is of the form + [ + [KEY 1] => [ + 'type' => A string from Appwrite/Utopia/Response + 'description' => A description of the type + 'default' => A default value for this type + 'example' => An example of this type + 'require' => a boolean representing whether this field is required + 'array' => a boolean representing whether this field is an array + ], + [KEY 2] => [ + ], + [KEY 3] => [ + ] ..... + ] + */ foreach ($rules as $key => $props) { - // Replace this with php regex + /* + If there are any field names containing characters other than a-z, A-Z, 0-9, _ , + we need to remove all those characters. Currently Appwrite's Response model has only the + $ sign which is prohibited. So we're only replacing that. We need to replace this with a regex + based approach. + */ $keyWithoutSpecialChars = str_replace('$', '', $key); - if (isset( $typeMapping[$props['type']])) { + if (isset($typeMapping[$props['type']])) { $type = $typeMapping[$props['type']]; } else { try { @@ -86,6 +180,9 @@ function createTypeMapping(Model $model, Response $response) { } } + /* If any of the rules is a list, + Wrap the base type with a listOf Type + */ if ($props['array']) { $type = Type::listOf($type); } @@ -104,41 +201,23 @@ function createTypeMapping(Model $model, Response $response) { var_dump("isOutputType : ", Type::isOutputType($info->returnType)); var_dump("PHP Type of object: " . gettype($object[$key])); - switch(gettype($object[$key])) { - case 'array': - $isAssoc = count(array_filter(array_keys($object[$key]), 'is_string')) > 0 ; - if ($isAssoc) { - return json_encode($object[$key]); - } else { - return array_map('json_encode', $object[$key]); - } - case 'object': - return json_encode($object[$key]); - default: - return $object[$key]; - } + // switch(gettype($object[$key])) { + // case 'array': + // $isAssoc = count(array_filter(array_keys($object[$key]), 'is_string')) > 0 ; + // if ($isAssoc) { + // return json_encode($object[$key]); + // } else { + // return array_map('json_encode', $object[$key]); + // } + // case 'object': + // return json_encode($object[$key]); + // default: + // return $object[$key]; + // } - - - $isListType = $info->returnType instanceof ListOfType; - - if ($isListType) { - $isStringType = $info->returnType->getWrappedType() === Type::string(); - } else { - - } - - // $isString = $info->returnType->getWrappedType(); + return $object[$key]; } ]; - - // if ($keyWithoutSpecialChars !== $key) { - // $fields[$keyWithoutSpecialChars]['resolve'] = function ($value, $args, $context, $info) use ($key) { - // var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); - // var_dump($value); - // return $value[$key]; - // }; - // } } $objectType = [ @@ -260,7 +339,7 @@ function buildSchema($utopia, $response) { // var_dump("******************************************"); // var_dump("Processing route : ${method} : {$route->getURL()}"); // var_dump("Model Name : ${responseModelName}"); - if ( $responseModelName !== "" && $responseModelName !== Response::MODEL_NONE && $responseModelName !== Response::MODEL_ANY ) { + if ( $responseModelName !== "" && $responseModelName !== Response::MODEL_NONE ) { $responseModel = $response->getModel($responseModelName); createTypeMapping($responseModel, $response); $type = $typeMapping[$responseModel->getType()]; @@ -349,7 +428,7 @@ App::post('/v1/graphql') ->inject('utopia') ->inject('user') ->inject('project') - ->middleware(true) + ->middleware(true) ->action(function ($request, $response, $utopia, $user, $project) { @@ -360,9 +439,31 @@ App::post('/v1/graphql') $variables = $request->getPayload('variables', null); $response->setContentType(Response::CONTENT_TYPE_NULL); + $callable = function ($objectValue, $args, $context, $info) { + + var_dump("Entering Custom Field Resolver. \n"); + var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); + $fieldName = $info->fieldName; + $property = null; + + if (is_array($objectValue) || $objectValue instanceof \ArrayAccess) { + if (isset($objectValue[$fieldName])) { + $property = $objectValue[$fieldName]; + } + } elseif (is_object($objectValue)) { + if (isset($objectValue->{$fieldName})) { + $property = $objectValue->{$fieldName}; + } + } + + return $property instanceof Closure + ? $property($objectValue, $args, $context, $info) + : $property; + }; + try { $rootValue = []; - $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); + $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables, null, $callable); $output = $result->toArray(); // var_dump("********** OUTPUT *********"); // var_dump($output); From 3b0884e628e1698c968b087175679d33bfaa9e96 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 10 Mar 2021 13:12:45 +0530 Subject: [PATCH 15/17] feat: refactoring and code clean up --- app/controllers/api/graphql.php | 407 +----------------------- app/init.php | 26 +- src/Appwrite/GraphQL/GraphQLBuilder.php | 296 +++++++++++++++++ src/Appwrite/GraphQL/Types/JsonType.php | 67 ++++ 4 files changed, 390 insertions(+), 406 deletions(-) create mode 100644 src/Appwrite/GraphQL/GraphQLBuilder.php create mode 100644 src/Appwrite/GraphQL/Types/JsonType.php diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index fa1f0697a0..15d347e241 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -1,29 +1,16 @@ name = $name; - } - parent::__construct(); - } - - public function parseValue($value) - { - return $this->identity($value); - } - - public function serialize($value) - { - return $this->identity($value); - } - - public function parseLiteral(Node $valueNode, ?array $variables = null) - { - switch ($valueNode) { - case ($valueNode instanceof StringValueNode): - case ($valueNode instanceof BooleanValueNode): - return $valueNode->value; - case ($valueNode instanceof IntValueNode): - case ($valueNode instanceof FloatValueNode): - return floatval($valueNode->value); - case ($valueNode instanceof ObjectValueNode): { - $value = []; - foreach ($valueNode->fields as $field) { - $value[$field->name->value] = $this->parseLiteral($field->value); - } - return $value; - } - case ($valueNode instanceof ListValueNode): - return array_map([$this, 'parseLiteral'], $valueNode->values); - default: - return null; - } - - } - - private function identity($value) - { - return $value; - } - -} - - -global $typeMapping; - -global $jsonParser; -$jsonParser = new JsonType(); - -$typeMapping = [ - Model::TYPE_BOOLEAN => Type::boolean(), - Model::TYPE_STRING => Type::string(), - Model::TYPE_INTEGER => Type::int(), - Model::TYPE_FLOAT => Type::float(), - - // Outliers - Model::TYPE_JSON => $jsonParser, - Response::MODEL_ANY => $jsonParser, - Response::MODEL_NONE => Type::string(), -]; - - -function createTypeMapping(Model $model, Response $response) { - - global $typeMapping; - - /* - If the map already contains the type, end the recursion - and return. - */ - if (isset($typeMapping[$model->getType()])) return; - - $rules = $model->getRules(); - $name = $model->getType(); - $fields = []; - $type = null; - /* - Iterate through all the rules in the response model. Each rule is of the form - [ - [KEY 1] => [ - 'type' => A string from Appwrite/Utopia/Response - 'description' => A description of the type - 'default' => A default value for this type - 'example' => An example of this type - 'require' => a boolean representing whether this field is required - 'array' => a boolean representing whether this field is an array - ], - [KEY 2] => [ - ], - [KEY 3] => [ - ] ..... - ] - */ - foreach ($rules as $key => $props) { - /* - If there are any field names containing characters other than a-z, A-Z, 0-9, _ , - we need to remove all those characters. Currently Appwrite's Response model has only the - $ sign which is prohibited. So we're only replacing that. We need to replace this with a regex - based approach. - */ - $keyWithoutSpecialChars = str_replace('$', '', $key); - if (isset($typeMapping[$props['type']])) { - $type = $typeMapping[$props['type']]; - } else { - try { - $complexModel = $response->getModel($props['type']); - createTypeMapping($complexModel, $response); - $type = $typeMapping[$props['type']]; - } catch (Exception $e) { - var_dump("Could Not find model for : {$props['type']}"); - } - } - - /* If any of the rules is a list, - Wrap the base type with a listOf Type - */ - if ($props['array']) { - $type = Type::listOf($type); - } - - $fields[$keyWithoutSpecialChars] = [ - 'type' => $type, - 'description' => $props['description'], - 'resolve' => function ($object, $args, $context, $info) use ($key, $type) { - var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); - // var_dump($info->returnType->getWrappedType()); - - var_dump("isListType : ", $info->returnType instanceof ListOfType); - var_dump("isBuiltinType : ", Type::isBuiltInType($info->returnType)); - var_dump("isCompositeType : ", Type::isCompositeType($info->returnType)); - var_dump("isLeafType : ", Type::isLeafType($info->returnType)); - var_dump("isOutputType : ", Type::isOutputType($info->returnType)); - - var_dump("PHP Type of object: " . gettype($object[$key])); - // switch(gettype($object[$key])) { - // case 'array': - // $isAssoc = count(array_filter(array_keys($object[$key]), 'is_string')) > 0 ; - // if ($isAssoc) { - // return json_encode($object[$key]); - // } else { - // return array_map('json_encode', $object[$key]); - // } - // case 'object': - // return json_encode($object[$key]); - // default: - // return $object[$key]; - // } - - return $object[$key]; - } - ]; - } - - $objectType = [ - 'name' => $name, - 'fields' => $fields - ]; - - $typeMapping[$name] = new ObjectType($objectType); -} - - -function getArgType($validator, bool $required, $utopia, $injections) { - $validator = (\is_callable($validator)) ? call_user_func_array($validator, $utopia->getResources($injections)) : $validator; - $type = []; - switch ((!empty($validator)) ? \get_class($validator) : '') { - case 'Utopia\Validator\Text': - $type = Type::string(); - break; - case 'Utopia\Validator\Boolean': - $type = Type::boolean(); - break; - case 'Appwrite\Database\Validator\UID': - $type = Type::string(); - break; - case 'Utopia\Validator\Email': - $type = Type::string(); - break; - case 'Utopia\Validator\URL': - $type = Type::string(); - break; - case 'Utopia\Validator\JSON': - case 'Utopia\Validator\Mock': - case 'Utopia\Validator\Assoc': - $type = Type::string(); - break; - case 'Appwrite\Storage\Validator\File': - $type = Type::string(); - case 'Utopia\Validator\ArrayList': - $type = Type::listOf(Type::string()); - break; - case 'Appwrite\Auth\Validator\Password': - $type = Type::string(); - break; - case 'Utopia\Validator\Range': /* @var $validator \Utopia\Validator\Range */ - $type = Type::int(); - break; - case 'Utopia\Validator\Numeric': - $type = Type::int(); - break; - case 'Utopia\Validator\Length': - $type = Type::string(); - break; - case 'Utopia\Validator\Host': - $type = Type::string(); - break; - case 'Utopia\Validator\WhiteList': /* @var $validator \Utopia\Validator\WhiteList */ - $type = Type::string(); - break; - default: - $type = Type::string(); - break; - } - - if ($required) { - $type = Type::nonNull($type); - } - - return $type; -} - -function getArgs(array $params, $utopia) { - $args = []; - foreach ($params as $key => $value) { - $args[$key] = [ - 'type' => getArgType($value['validator'],!$value['optional'], $utopia, $value['injections']), - 'description' => $value['description'], - 'defaultValue' => $value['default'] - ]; - } - return $args; -} - -function isModel($response, Model $model) { - - foreach ($model->getRules() as $key => $rule) { - if (!isset($response[$key])) { - return false; - } - } - return true; -} - class MySafeException extends \Exception implements ClientAware { public function isClientSafe() @@ -323,150 +53,23 @@ class MySafeException extends \Exception implements ClientAware } } -function buildSchema($utopia, $response) { - $start = microtime(true); - - global $typeMapping; - $queryFields = []; - $mutationFields = []; - foreach($utopia->getRoutes() as $method => $routes ){ - foreach($routes as $route) { - $namespace = $route->getLabel('sdk.namespace', ''); - - if ($namespace == 'database' || true) { - $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); - $responseModelName = $route->getLabel('sdk.response.model', ""); - // var_dump("******************************************"); - // var_dump("Processing route : ${method} : {$route->getURL()}"); - // var_dump("Model Name : ${responseModelName}"); - if ( $responseModelName !== "" && $responseModelName !== Response::MODEL_NONE ) { - $responseModel = $response->getModel($responseModelName); - createTypeMapping($responseModel, $response); - $type = $typeMapping[$responseModel->getType()]; - // var_dump("Type Created : ${type}"); - $args = getArgs($route->getParams(), $utopia); - // var_dump("Args Generated :"); - // var_dump($args); - - $field = [ - 'type' => $type, - 'description' => $route->getDesc(), - 'args' => $args, - 'resolve' => function ($type, $args, $context, $info) use (&$utopia, $route, $response) { - var_dump("************* REACHED RESOLVE FOR {$info->fieldName} *****************"); - // var_dump($route); - - // var_dump("************* CONTEXT *****************"); - // var_dump($context); - - - var_dump("********************** ARGS *******************"); - var_dump($args); - - $utopia->setRoute($route); - $utopia->execute($route, $args); - - var_dump("**************** OUTPUT ************"); - // var_dump($response->getPayload()); - $result = $response->getPayload(); - - if (isModel($result, $response->getModel(Response::MODEL_ERROR)) || isModel($result, $response->getModel(Response::MODEL_ERROR_DEV))) { - throw new MySafeException($result['message'], $result['code']); - } - - return $result; - } - ]; - - if ($method == 'GET') { - $queryFields[$methodName] = $field; - } else if ($method == 'POST' || $method == 'PUT' || $method == 'PATCH' || $method == 'DELETE') { - $mutationFields[$methodName] = $field; - } - - // var_dump("Processed route : ${method} : {$route->getURL()}"); - } else { - // var_dump("Skipping route : {$route->getURL()}"); - } - } - } - } - - ksort($queryFields); - ksort($mutationFields); - - $queryType = new ObjectType([ - 'name' => 'Query', - 'description' => 'The root of all your queries', - 'fields' => $queryFields - ]); - - $mutationType = new ObjectType([ - 'name' => 'Mutation', - 'description' => 'The root of all your mutations', - 'fields' => $mutationFields - ]); - - $schema = new Schema([ - 'query' => $queryType, - 'mutation' => $mutationType - ]); - - $time_elapsed_secs = microtime(true) - $start; - - var_dump("Time Taken To Build Schema : ${time_elapsed_secs}s"); - - return $schema; -} - - App::post('/v1/graphql') ->desc('GraphQL Endpoint') ->label('scope', 'graphql') ->inject('request') ->inject('response') - ->inject('utopia') - ->inject('user') - ->inject('project') + ->inject('schema') ->middleware(true) - ->action(function ($request, $response, $utopia, $user, $project) { + ->action(function ($request, $response, $schema) { - - // Generate the Schema of the server on startup. - // Use the routes from utopia and get the params then construct the queries and mutations. - $schema = buildSchema($utopia, $response, $request); $query = $request->getPayload('query', ''); $variables = $request->getPayload('variables', null); $response->setContentType(Response::CONTENT_TYPE_NULL); - $callable = function ($objectValue, $args, $context, $info) { - - var_dump("Entering Custom Field Resolver. \n"); - var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); - $fieldName = $info->fieldName; - $property = null; - - if (is_array($objectValue) || $objectValue instanceof \ArrayAccess) { - if (isset($objectValue[$fieldName])) { - $property = $objectValue[$fieldName]; - } - } elseif (is_object($objectValue)) { - if (isset($objectValue->{$fieldName})) { - $property = $objectValue->{$fieldName}; - } - } - - return $property instanceof Closure - ? $property($objectValue, $args, $context, $info) - : $property; - }; - try { $rootValue = []; - $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables, null, $callable); + $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); $output = $result->toArray(); - // var_dump("********** OUTPUT *********"); - // var_dump($output); } catch (\Exception $error) { $output = [ 'errors' => [ diff --git a/app/init.php b/app/init.php index f469933b39..14e1f802a1 100644 --- a/app/init.php +++ b/app/init.php @@ -21,6 +21,7 @@ use Appwrite\Database\Document; use Appwrite\Database\Validator\Authorization; use Appwrite\Event\Event; use Appwrite\Extend\PDO; +use Appwrite\GraphQL\GraphQLBuilder; use Appwrite\OpenSSL\OpenSSL; use Utopia\App; use Utopia\View; @@ -285,10 +286,6 @@ Locale::setLanguage('zh-tw', include __DIR__.'/config/locale/translations/zh-tw. // Runtime Execution -App::setResource('routeToScopeMapping', function($register) { - return new Event(Event::MAILS_QUEUE_NAME, Event::MAILS_CLASS_NAME); -}, ['register']); - App::setResource('register', function() use ($register) { return $register; }); @@ -490,3 +487,24 @@ App::setResource('geodb', function($register) { /** @var Utopia\Registry\Registry $register */ return $register->get('geodb'); }, ['register']); + +App::setResource('schema', function($utopia, $response, $request, $register) { + + $schema = null; + try { + /* + Try to get the schema from the register. + If there is no schema, an exception will be thrown + */ + var_dump('[INFO] Getting Schema from register..'); + $schema = $register->get('_schema'); + } catch (Exception $e) { + var_dump('[INFO] Exception, Schema not present. Generating Schema'); + $schema = GraphQLBuilder::buildSchema($utopia, $response, $request); + $register->set('_schema', function () use ($schema){ // Register cache connection + return $schema; + }); + } + + return $schema; +}, ['utopia', 'response', 'request', 'register']); diff --git a/src/Appwrite/GraphQL/GraphQLBuilder.php b/src/Appwrite/GraphQL/GraphQLBuilder.php new file mode 100644 index 0000000000..c8c56a4074 --- /dev/null +++ b/src/Appwrite/GraphQL/GraphQLBuilder.php @@ -0,0 +1,296 @@ + Type::boolean(), + Model::TYPE_STRING => Type::string(), + Model::TYPE_INTEGER => Type::int(), + Model::TYPE_FLOAT => Type::float(), + Response::MODEL_NONE => Type::string(), + Model::TYPE_JSON => self::$jsonParser, + Response::MODEL_ANY => self::$jsonParser, + ]; + } + + static function createTypeMapping(Model $model, Response $response) { + + /* + If the map already contains the type, end the recursion + and return. + */ + if (isset(self::$typeMapping[$model->getType()])) return; + + $rules = $model->getRules(); + $name = $model->getType(); + $fields = []; + $type = null; + /* + Iterate through all the rules in the response model. Each rule is of the form + [ + [KEY 1] => [ + 'type' => A string from Appwrite/Utopia/Response + 'description' => A description of the type + 'default' => A default value for this type + 'example' => An example of this type + 'require' => a boolean representing whether this field is required + 'array' => a boolean representing whether this field is an array + ], + [KEY 2] => [ + ], + [KEY 3] => [ + ] ..... + ] + */ + foreach ($rules as $key => $props) { + /* + If there are any field names containing characters other than a-z, A-Z, 0-9, _ , + we need to remove all those characters. Currently Appwrite's Response model has only the + $ sign which is prohibited. So we're only replacing that. We need to replace this with a regex + based approach. + */ + $keyWithoutSpecialChars = str_replace('$', '', $key); + if (isset(self::$typeMapping[$props['type']])) { + $type = self::$typeMapping[$props['type']]; + } else { + try { + $complexModel = $response->getModel($props['type']); + self::createTypeMapping($complexModel, $response); + $type = self::$typeMapping[$props['type']]; + } catch (Exception $e) { + var_dump("Could Not find model for : {$props['type']}"); + } + } + + /* + If any of the rules is a list, + Wrap the base type with a listOf Type + */ + if ($props['array']) { + $type = Type::listOf($type); + } + + $fields[$keyWithoutSpecialChars] = [ + 'type' => $type, + 'description' => $props['description'], + 'resolve' => function ($object, $args, $context, $info) use ($key, $type) { + + // var_dump("************* RESOLVING FIELD {$info->fieldName} *************"); + // var_dump($info->returnType->getWrappedType()); + // var_dump("isListType : ", $info->returnType instanceof ListOfType); + // var_dump("isCompositeType : ", Type::isCompositeType($info->returnType)); + // var_dump("isBuiltinType : ", Type::isBuiltInType($info->returnType)); + // var_dump("isLeafType : ", Type::isLeafType($info->returnType)); + // var_dump("isOutputType : ", Type::isOutputType($info->returnType)); + // var_dump("PHP Type of object: " . gettype($object[$key])); + + return $object[$key]; + } + ]; + } + + $objectType = [ + 'name' => $name, + 'fields' => $fields + ]; + + self::$typeMapping[$name] = new ObjectType($objectType); + } + + private static function getArgType($validator, bool $required, $utopia, $injections) { + $validator = (\is_callable($validator)) ? call_user_func_array($validator, $utopia->getResources($injections)) : $validator; + $type = []; + switch ((!empty($validator)) ? \get_class($validator) : '') { + case 'Utopia\Validator\Text': + $type = Type::string(); + break; + case 'Utopia\Validator\Boolean': + $type = Type::boolean(); + break; + case 'Appwrite\Database\Validator\UID': + $type = Type::string(); + break; + case 'Utopia\Validator\Email': + $type = Type::string(); + break; + case 'Utopia\Validator\URL': + $type = Type::string(); + break; + case 'Utopia\Validator\JSON': + case 'Utopia\Validator\Mock': + case 'Utopia\Validator\Assoc': + $type = Type::string(); + break; + case 'Appwrite\Storage\Validator\File': + $type = Type::string(); + case 'Utopia\Validator\ArrayList': + $type = Type::listOf(Type::string()); + break; + case 'Appwrite\Auth\Validator\Password': + $type = Type::string(); + break; + case 'Utopia\Validator\Range': /* @var $validator \Utopia\Validator\Range */ + $type = Type::int(); + break; + case 'Utopia\Validator\Numeric': + $type = Type::int(); + break; + case 'Utopia\Validator\Length': + $type = Type::string(); + break; + case 'Utopia\Validator\Host': + $type = Type::string(); + break; + case 'Utopia\Validator\WhiteList': /* @var $validator \Utopia\Validator\WhiteList */ + $type = Type::string(); + break; + default: + $type = Type::string(); + break; + } + + if ($required) { + $type = Type::nonNull($type); + } + + return $type; + } + + private static function getArgs(array $params, $utopia) { + $args = []; + foreach ($params as $key => $value) { + $args[$key] = [ + 'type' => self::getArgType($value['validator'],!$value['optional'], $utopia, $value['injections']), + 'description' => $value['description'], + 'defaultValue' => $value['default'] + ]; + } + return $args; + } + + private static function isModel($response, Model $model) { + + foreach ($model->getRules() as $key => $rule) { + if (!isset($response[$key])) { + return false; + } + } + return true; + } + + public static function buildSchema($utopia, $response) { + + self::init(); + + var_dump("[INFO] Building GraphQL Schema..."); + $start = microtime(true); + + $queryFields = []; + $mutationFields = []; + foreach($utopia->getRoutes() as $method => $routes ){ + foreach($routes as $route) { + $namespace = $route->getLabel('sdk.namespace', ''); + + if ($namespace == 'database' || true) { + $methodName = $namespace.'_'.$route->getLabel('sdk.method', ''); + $responseModelName = $route->getLabel('sdk.response.model', ""); + // var_dump("******************************************"); + // var_dump("Processing route : ${method} : {$route->getURL()}"); + // var_dump("Model Name : ${responseModelName}"); + if ( $responseModelName !== "" && $responseModelName !== Response::MODEL_NONE ) { + $responseModel = $response->getModel($responseModelName); + self::createTypeMapping($responseModel, $response); + $type = self::$typeMapping[$responseModel->getType()]; + // var_dump("Type Created : ${type}"); + $args = self::getArgs($route->getParams(), $utopia); + // var_dump("Args Generated :"); + // var_dump($args); + + $field = [ + 'type' => $type, + 'description' => $route->getDesc(), + 'args' => $args, + 'resolve' => function ($type, $args, $context, $info) use (&$utopia, $route, $response) { + // var_dump("************* REACHED RESOLVE FOR {$info->fieldName} *****************"); + // var_dump($route); + // var_dump("************* CONTEXT *****************"); + // var_dump($context); + // var_dump("********************** ARGS *******************"); + // var_dump($args); + + $utopia->setRoute($route); + $utopia->execute($route, $args); + + // var_dump("**************** OUTPUT ************"); + // var_dump($response->getPayload()); + + $result = $response->getPayload(); + + if (self::isModel($result, $response->getModel(Response::MODEL_ERROR)) || self::isModel($result, $response->getModel(Response::MODEL_ERROR_DEV))) { + throw new MySafeException($result['message'], $result['code']); + } + + return $result; + } + ]; + + if ($method == 'GET') { + $queryFields[$methodName] = $field; + } else if ($method == 'POST' || $method == 'PUT' || $method == 'PATCH' || $method == 'DELETE') { + $mutationFields[$methodName] = $field; + } + + // var_dump("Processed route : ${method} : {$route->getURL()}"); + } else { + // var_dump("Skipping route : {$route->getURL()}"); + } + } + } + } + + ksort($queryFields); + ksort($mutationFields); + + $queryType = new ObjectType([ + 'name' => 'Query', + 'description' => 'The root of all your queries', + 'fields' => $queryFields + ]); + + $mutationType = new ObjectType([ + 'name' => 'Mutation', + 'description' => 'The root of all your mutations', + 'fields' => $mutationFields + ]); + + $schema = new Schema([ + 'query' => $queryType, + 'mutation' => $mutationType + ]); + + + $time_elapsed_secs = microtime(true) - $start; + var_dump("[INFO] Time Taken To Build Schema : ${time_elapsed_secs}s"); + + return $schema; + } +} diff --git a/src/Appwrite/GraphQL/Types/JsonType.php b/src/Appwrite/GraphQL/Types/JsonType.php new file mode 100644 index 0000000000..c2994c1f18 --- /dev/null +++ b/src/Appwrite/GraphQL/Types/JsonType.php @@ -0,0 +1,67 @@ +name = $name; + } + parent::__construct(); + } + + public function parseValue($value) + { + return $this->identity($value); + } + + public function serialize($value) + { + return $this->identity($value); + } + + public function parseLiteral(Node $valueNode, ?array $variables = null) + { + switch ($valueNode) { + case ($valueNode instanceof StringValueNode): + case ($valueNode instanceof BooleanValueNode): + return $valueNode->value; + case ($valueNode instanceof IntValueNode): + case ($valueNode instanceof FloatValueNode): + return floatval($valueNode->value); + case ($valueNode instanceof ObjectValueNode): { + $value = []; + foreach ($valueNode->fields as $field) { + $value[$field->name->value] = $this->parseLiteral($field->value); + } + return $value; + } + case ($valueNode instanceof ListValueNode): + return array_map([$this, 'parseLiteral'], $valueNode->values); + default: + return null; + } + + } + + private function identity($value) + { + return $value; + } +} From 2b9f974125083e231f7a4db5b315607160b6ce2a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 10 Mar 2021 19:21:03 +0530 Subject: [PATCH 16/17] feat: refactoring and code clean up --- app/controllers/api/graphql.php | 50 ++++++++++++++----------- app/controllers/general.php | 13 ++++--- app/http.php | 5 ++- src/Appwrite/GraphQL/GraphQLBuilder.php | 1 - src/Appwrite/GraphQL/Types/JsonType.php | 1 + 5 files changed, 42 insertions(+), 28 deletions(-) diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 15d347e241..58cb0c3f44 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -8,7 +8,9 @@ use GraphQL\Type\Definition\Type; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Appwrite\GraphQL\Types\JsonType; +use GraphQL\Error\Error; use GraphQL\Error\ClientAware; +use GraphQL\Error\FormattedError; use GraphQL\Type\Definition\ListOfType; use Utopia\App; @@ -59,30 +61,36 @@ App::post('/v1/graphql') ->inject('request') ->inject('response') ->inject('schema') - ->middleware(true) + ->middleware(false) ->action(function ($request, $response, $schema) { - $query = $request->getPayload('query', ''); - $variables = $request->getPayload('variables', null); - $response->setContentType(Response::CONTENT_TYPE_NULL); + // $myErrorFormatter = function(Error $error) { + // $formattedError = FormattedError::createFromException($error); + // var_dump("***** IN ERROR FORMATTER ******"); + // return $formattedError; + // }; - try { - $rootValue = []; - $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); - $output = $result->toArray(); - } catch (\Exception $error) { - $output = [ - 'errors' => [ - [ - 'message' => $error->getMessage().'xxx', - 'code' => $error->getCode(), - 'file' => $error->getFile(), - 'line' => $error->getLine(), - 'trace' => $error->getTrace(), - ] + $query = $request->getPayload('query', ''); + $variables = $request->getPayload('variables', null); + $response->setContentType(Response::CONTENT_TYPE_NULL); + + try { + $rootValue = []; + $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variables); + $output = $result->toArray(); + } catch (\Exception $error) { + $output = [ + 'errors' => [ + [ + 'message' => $error->getMessage().'xxx', + 'code' => $error->getCode(), + 'file' => $error->getFile(), + 'line' => $error->getLine(), + 'trace' => $error->getTrace(), ] - ]; - } - $response->json($output); + ] + ]; + } + $response->json($output); } ); diff --git a/app/controllers/general.php b/app/controllers/general.php index 22a487cc1d..53be8fcf98 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -33,7 +33,6 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo /** @var bool $mode */ /** @var array $clients */ - var_dump("*********** In general.php init *************"); $localeParam = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', '')); @@ -43,6 +42,8 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo $route = $utopia->match($request); + var_dump("*********** In general.php init with route {$route->getURL()} *************"); + if (!empty($route->getLabel('sdk.platform', [])) && empty($project->getId()) && ($route->getLabel('scope', '') !== 'public')) { throw new Exception('Missing or unknown project ID', 400); } @@ -169,7 +170,9 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo $scopes = $roles[$role]['scopes']; // Allowed scopes for user role $authKey = $request->getHeader('x-appwrite-key', ''); - + var_dump("***** AUTH KEY ******"); + + var_dump($authKey); if (!empty($authKey)) { // API Key authentication // Check if given key match project API keys $key = $project->search('secret', $authKey, $project->getAttribute('keys', [])); @@ -212,9 +215,9 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo // TDOO Check if user is god - var_dump("*********** Allowed Scopes *********"); - var_dump($scopes); - var_dump($scope); + // var_dump("*********** Allowed Scopes *********"); + // var_dump($scopes); + // var_dump($scope); if (!\in_array($scope, $scopes)) { if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { // Check if permission is denied because project is missing diff --git a/app/http.php b/app/http.php index 92ddca1265..93ba580efe 100644 --- a/app/http.php +++ b/app/http.php @@ -81,6 +81,8 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo $request = new Request($swooleRequest); $response = new Response($swooleResponse); + var_dump($swooleRequest->header); + if(Files::isFileLoaded($request->getURI())) { $time = (60 * 60 * 24 * 365 * 2); // 45 days cache @@ -99,7 +101,8 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo try { Authorization::cleanRoles(); Authorization::setRole('*'); - + var_dump("******* Running App ******* "); + $app->run($request, $response); } catch (\Throwable $th) { var_dump("*********** In http.php catching error *************"); diff --git a/src/Appwrite/GraphQL/GraphQLBuilder.php b/src/Appwrite/GraphQL/GraphQLBuilder.php index c8c56a4074..b323515cd1 100644 --- a/src/Appwrite/GraphQL/GraphQLBuilder.php +++ b/src/Appwrite/GraphQL/GraphQLBuilder.php @@ -18,7 +18,6 @@ class GraphQLBuilder { public static $typeMapping; - private static function init() { self::$jsonParser = new JsonType(); self::$typeMapping = [ diff --git a/src/Appwrite/GraphQL/Types/JsonType.php b/src/Appwrite/GraphQL/Types/JsonType.php index c2994c1f18..99c82fbcd9 100644 --- a/src/Appwrite/GraphQL/Types/JsonType.php +++ b/src/Appwrite/GraphQL/Types/JsonType.php @@ -11,6 +11,7 @@ use GraphQL\Language\AST\ObjectValueNode; use GraphQL\Language\AST\StringValueNode; use GraphQL\Type\Definition\ScalarType; +// https://github.com/webonyx/graphql-php/issues/129#issuecomment-309366803 class JsonType extends ScalarType { public $name = 'Json'; From 99d00742809afb2ca329b410008f0772aabe9210 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 10 Mar 2021 19:37:02 +0530 Subject: [PATCH 17/17] feat: refactoring and code clean up --- composer.lock | 6435 ------------------------------------------------- 1 file changed, 6435 deletions(-) delete mode 100644 composer.lock diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 9ef5950c89..0000000000 --- a/composer.lock +++ /dev/null @@ -1,6435 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], -<<<<<<< HEAD - "content-hash": "d1b9fa5657767534eefd141136bb3cfd", -======= - "content-hash": "442d6d8b6c76ef7ae5ea26e500af6479", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "packages": [ - { - "name": "adhocore/jwt", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/adhocore/php-jwt.git", - "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/adhocore/php-jwt/zipball/6c434af7170090bb7a8880d2bc220a2254ba7899", - "reference": "6c434af7170090bb7a8880d2bc220a2254ba7899", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5 || ^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ahc\\Jwt\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jitendra Adhikari", - "email": "jiten.adhikary@gmail.com" - } - ], - "description": "Ultra lightweight JSON web token (JWT) library for PHP5.5+.", - "keywords": [ - "auth", - "json-web-token", - "jwt", - "jwt-auth", - "jwt-php", - "token" - ], - "support": { - "issues": "https://github.com/adhocore/php-jwt/issues", - "source": "https://github.com/adhocore/php-jwt/tree/1.1.2" - }, - "funding": [ - { - "url": "https://paypal.me/ji10", - "type": "custom" - } - ], - "time": "2021-02-20T09:56:44+00:00" - }, - { - "name": "appwrite/php-clamav", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/appwrite/php-clamav.git", - "reference": "4c13abddfc89d59395da0bd75c18a8eeadc2a542" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/appwrite/php-clamav/zipball/4c13abddfc89d59395da0bd75c18a8eeadc2a542", - "reference": "4c13abddfc89d59395da0bd75c18a8eeadc2a542", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Appwrite\\ClamAV\\": "src/ClamAV" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "ClamAV network and pipe client for PHP", - "keywords": [ - "anti virus", - "appwrite", - "clamav", - "php" - ], - "support": { - "issues": "https://github.com/appwrite/php-clamav/issues", - "source": "https://github.com/appwrite/php-clamav/tree/master" - }, - "time": "2020-02-29T11:35:01+00:00" - }, - { - "name": "chillerlan/php-qrcode", - "version": "4.3.0", - "source": { - "type": "git", - "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "4968063fb3baeedb658293f89f9673fbf2499a3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/4968063fb3baeedb658293f89f9673fbf2499a3e", - "reference": "4968063fb3baeedb658293f89f9673fbf2499a3e", - "shasum": "" - }, - "require": { - "chillerlan/php-settings-container": "^2.1", - "ext-mbstring": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phan/phan": "^3.2.2", - "phpunit/phpunit": "^9.4", - "setasign/fpdf": "^1.8.2" - }, - "suggest": { - "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", - "setasign/fpdf": "Required to use the QR FPDF output." - }, - "type": "library", - "autoload": { - "psr-4": { - "chillerlan\\QRCode\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kazuhiko Arase", - "homepage": "https://github.com/kazuhikoarase" - }, - { - "name": "Smiley", - "email": "smiley@chillerlan.net", - "homepage": "https://github.com/codemasher" - }, - { - "name": "Contributors", - "homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors" - } - ], - "description": "A QR code generator. PHP 7.4+", - "homepage": "https://github.com/chillerlan/php-qrcode", - "keywords": [ - "phpqrcode", - "qr", - "qr code", - "qrcode", - "qrcode-generator" - ], - "support": { - "issues": "https://github.com/chillerlan/php-qrcode/issues", - "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", - "type": "custom" - }, - { - "url": "https://ko-fi.com/codemasher", - "type": "ko_fi" - } - ], - "time": "2020-11-18T20:49:20+00:00" - }, - { - "name": "chillerlan/php-settings-container", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "98ccc1b31b31a53bcb563465c4961879b2b93096" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/98ccc1b31b31a53bcb563465c4961879b2b93096", - "reference": "98ccc1b31b31a53bcb563465c4961879b2b93096", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phan/phan": "^4.0", - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "chillerlan\\Settings\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Smiley", - "email": "smiley@chillerlan.net", - "homepage": "https://github.com/codemasher" - } - ], - "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+", - "homepage": "https://github.com/chillerlan/php-settings-container", - "keywords": [ - "PHP7", - "Settings", - "container", - "helper" - ], - "support": { - "issues": "https://github.com/chillerlan/php-settings-container/issues", - "source": "https://github.com/chillerlan/php-settings-container" - }, - "funding": [ - { - "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", - "type": "custom" - }, - { - "url": "https://ko-fi.com/codemasher", - "type": "ko_fi" - } - ], - "time": "2021-01-06T15:57:03+00:00" - }, - { - "name": "colinmollenhour/credis", - "version": "v1.12.1", - "source": { - "type": "git", - "url": "https://github.com/colinmollenhour/credis.git", - "reference": "c27faa11724229986335c23f4b6d0f1d8d6547fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/c27faa11724229986335c23f4b6d0f1d8d6547fb", - "reference": "c27faa11724229986335c23f4b6d0f1d8d6547fb", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "Client.php", - "Cluster.php", - "Sentinel.php", - "Module.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Colin Mollenhour", - "email": "colin@mollenhour.com" - } - ], - "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.", - "homepage": "https://github.com/colinmollenhour/credis", - "support": { - "issues": "https://github.com/colinmollenhour/credis/issues", - "source": "https://github.com/colinmollenhour/credis/tree/v1.12.1" - }, - "time": "2020-11-06T16:09:14+00:00" - }, - { -<<<<<<< HEAD - "name": "domnikl/statsd", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/domnikl/statsd-php.git", - "reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/domnikl/statsd-php/zipball/393c6565efbfb23c8296ae3099a62fb6366c6ce3", - "reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3", - "shasum": "" - }, - "require": { - "php": ">= 7.2" - }, - "require-dev": { - "flyeralarm/php-code-validator": "^2.2", - "phpunit/phpunit": "~8.0", - "vimeo/psalm": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Domnikl\\Statsd\\": "src/", - "Domnikl\\Test\\Statsd\\": "tests/unit" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dominik Liebler", - "email": "liebler.dominik@gmail.com" - } - ], - "description": "a PHP client for statsd", - "homepage": "https://domnikl.github.com/statsd-php", - "keywords": [ - "Metrics", - "monitoring", - "statistics", - "statsd", - "udp" - ], - "support": { - "issues": "https://github.com/domnikl/statsd-php/issues", - "source": "https://github.com/domnikl/statsd-php/tree/master" - }, - "abandoned": "slickdeals/statsd", - "time": "2020-01-03T14:24:58+00:00" - }, - { -======= ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "name": "dragonmantank/cron-expression", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", - "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0", - "webmozart/assert": "^1.7.0" - }, - "replace": { - "mtdowling/cron-expression": "^1.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-webmozart-assert": "^0.12.7", - "phpunit/phpunit": "^7.0|^8.0|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0" - }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2020-11-24T19:55:57+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.2.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79", - "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.1-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.2.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://github.com/alexeyshockov", - "type": "github" - }, - { - "url": "https://github.com/gmponos", - "type": "github" - } - ], - "time": "2020-10-10T11:47:56+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.1" - }, - "time": "2021-03-07T09:25:29+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", -<<<<<<< HEAD - "reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976", - "reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976", -======= - "reference": "d7fe0a0eabc266c3dcf2f20aa12121044ff196a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/d7fe0a0eabc266c3dcf2f20aa12121044ff196a4", - "reference": "d7fe0a0eabc266c3dcf2f20aa12121044ff196a4", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.x" - }, -<<<<<<< HEAD - "time": "2021-03-02T18:57:24+00:00" -======= - "time": "2021-03-09T14:42:40+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "influxdb/influxdb-php", - "version": "1.15.2", - "source": { - "type": "git", - "url": "https://github.com/influxdata/influxdb-php.git", - "reference": "d6e59f4f04ab9107574fda69c2cbe36671253d03" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/influxdata/influxdb-php/zipball/d6e59f4f04ab9107574fda69c2cbe36671253d03", - "reference": "d6e59f4f04ab9107574fda69c2cbe36671253d03", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0|^7.0", - "php": "^5.5 || ^7.0 || ^8.0" - }, - "require-dev": { - "dms/phpunit-arraysubset-asserts": "^0.2.1", - "phpunit/phpunit": "^9.5" - }, - "suggest": { - "ext-curl": "Curl extension, needed for Curl driver", - "stefanotorresi/influxdb-php-async": "An asyncronous client for InfluxDB, implemented via ReactPHP." - }, - "type": "library", - "autoload": { - "psr-4": { - "InfluxDB\\": "src/InfluxDB" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Hoogendijk", - "email": "stephen@tca0.nl" - }, - { - "name": "Daniel Martinez", - "email": "danimartcas@hotmail.com" - }, - { - "name": "Gianluca Arbezzano", - "email": "gianarb92@gmail.com" - } - ], - "description": "InfluxDB client library for PHP", - "keywords": [ - "client", - "influxdata", - "influxdb", - "influxdb class", - "influxdb client", - "influxdb library", - "time series" - ], - "support": { - "issues": "https://github.com/influxdata/influxdb-php/issues", - "source": "https://github.com/influxdata/influxdb-php/tree/1.15.2" - }, - "time": "2020-12-26T17:45:17+00:00" - }, - { - "name": "matomo/device-detector", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/matomo-org/device-detector.git", - "reference": "6b3facc35e7a465bc4223fddfa5fa88c5b327554" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/6b3facc35e7a465bc4223fddfa5fa88c5b327554", - "reference": "6b3facc35e7a465bc4223fddfa5fa88c5b327554", - "shasum": "" - }, - "require": { - "mustangostang/spyc": "*", - "php": ">=7.2" - }, - "replace": { - "piwik/device-detector": "self.version" - }, - "require-dev": { - "matthiasmullie/scrapbook": "^1.4.7", - "mayflower/mo4-coding-standard": "dev-master#275cb9d", - "phpstan/phpstan": "^0.12.52", - "phpunit/phpunit": "^8.5.8", - "psr/cache": "^1.0.1", - "psr/simple-cache": "^1.0.1", - "symfony/yaml": "^5.1.7" - }, - "suggest": { - "doctrine/cache": "Can directly be used for caching purpose", - "ext-yaml": "Necessary for using the Pecl YAML parser" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeviceDetector\\": "" - }, - "exclude-from-classmap": [ - "Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "The Matomo Team", - "email": "hello@matomo.org", - "homepage": "https://matomo.org/team/" - } - ], - "description": "The Universal Device Detection library, that parses User Agents and detects devices (desktop, tablet, mobile, tv, cars, console, etc.), clients (browsers, media players, mobile apps, feed readers, libraries, etc), operating systems, devices, brands and models.", - "homepage": "https://matomo.org", - "keywords": [ - "devicedetection", - "parser", - "useragent" - ], - "support": { - "forum": "http://forum.matomo.org/", - "issues": "https://github.com/matomo-org/device-detector/issues", - "source": "https://github.com/matomo-org/piwik", - "wiki": "https://dev.matomo.org/" - }, - "time": "2021-01-08T14:14:55+00:00" - }, - { - "name": "mustangostang/spyc", - "version": "0.6.3", - "source": { - "type": "git", - "url": "git@github.com:mustangostang/spyc.git", - "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mustangostang/spyc/zipball/4627c838b16550b666d15aeae1e5289dd5b77da0", - "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "phpunit/phpunit": "4.3.*@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5.x-dev" - } - }, - "autoload": { - "files": [ - "Spyc.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" - } - ], - "description": "A simple YAML loader/dumper class for PHP", - "homepage": "https://github.com/mustangostang/spyc/", - "keywords": [ - "spyc", - "yaml", - "yml" - ], - "time": "2019-09-10T13:16:29+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.3.0", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb", - "reference": "4a08cf4cdd2c38d12ee2b9fa69e5d235f37a6dcb", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.5.6", - "yoast/phpunit-polyfills": "^0.2.0" - }, - "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.3.0" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2021-02-19T15:28:08+00:00" - }, - { - "name": "psr/http-client", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "22b2ef5687f43679481615605d7a15c557ce85b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/22b2ef5687f43679481615605d7a15c557ce85b1", - "reference": "22b2ef5687f43679481615605d7a15c557ce85b1", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-09-19T09:12:31+00:00" - }, - { - "name": "psr/http-message", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "efd67d1dc14a7ef4fc4e518e7dee91c271d524e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/efd67d1dc14a7ef4fc4e518e7dee91c271d524e4", - "reference": "efd67d1dc14a7ef4fc4e518e7dee91c271d524e4", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2019-08-29T13:16:46+00:00" - }, - { - "name": "psr/log", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "a18c1e692e02b84abbafe4856c3cd7cc6903908c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/a18c1e692e02b84abbafe4856c3cd7cc6903908c", - "reference": "a18c1e692e02b84abbafe4856c3cd7cc6903908c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/master" - }, - "time": "2021-03-02T15:02:34+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "resque/php-resque", - "version": "v1.3.6", - "source": { - "type": "git", - "url": "https://github.com/resque/php-resque.git", - "reference": "fe41c04763699b1318d97ed14cc78583e9380161" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/resque/php-resque/zipball/fe41c04763699b1318d97ed14cc78583e9380161", - "reference": "fe41c04763699b1318d97ed14cc78583e9380161", - "shasum": "" - }, - "require": { - "colinmollenhour/credis": "~1.7", - "php": ">=5.6.0", - "psr/log": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-pcntl": "REQUIRED for forking processes on platforms that support it (so anything but Windows).", - "ext-proctitle": "Allows php-resque to rename the title of UNIX processes to show the status of a worker.", - "ext-redis": "Native PHP extension for Redis connectivity. Credis will automatically utilize when available." - }, - "bin": [ - "bin/resque", - "bin/resque-scheduler" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Resque": "lib", - "ResqueScheduler": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dan Hunsaker", - "email": "danhunsaker+resque@gmail.com", - "role": "Maintainer" - }, - { - "name": "Rajib Ahmed", - "homepage": "https://github.com/rajibahmed", - "role": "Maintainer" - }, - { - "name": "Steve Klabnik", - "email": "steve@steveklabnik.com", - "role": "Maintainer" - }, - { - "name": "Chris Boulton", - "email": "chris@bigcommerce.com", - "role": "Creator" - } - ], - "description": "Redis backed library for creating background jobs and processing them later. Based on resque for Ruby.", - "homepage": "http://www.github.com/resque/php-resque/", - "keywords": [ - "background", - "job", - "redis", - "resque" - ], - "support": { - "issues": "https://github.com/resque/php-resque/issues", - "source": "https://github.com/resque/php-resque/tree/v1.3.6" - }, - "time": "2020-04-16T16:39:50+00:00" - }, - { - "name": "slickdeals/statsd", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/Slickdeals/statsd-php.git", - "reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Slickdeals/statsd-php/zipball/393c6565efbfb23c8296ae3099a62fb6366c6ce3", - "reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3", - "shasum": "" - }, - "require": { - "php": ">= 7.2" - }, - "require-dev": { - "flyeralarm/php-code-validator": "^2.2", - "phpunit/phpunit": "~8.0", - "vimeo/psalm": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Domnikl\\Statsd\\": "src/", - "Domnikl\\Test\\Statsd\\": "tests/unit" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dominik Liebler", - "email": "liebler.dominik@gmail.com" - } - ], - "description": "a PHP client for statsd", - "homepage": "https://domnikl.github.com/statsd-php", - "keywords": [ - "Metrics", - "monitoring", - "statistics", - "statsd", - "udp" - ], - "support": { - "source": "https://github.com/Slickdeals/statsd-php/tree/3.0.2" - }, - "time": "2020-01-03T14:24:58+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "utopia-php/abuse", - "version": "0.3.1", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/abuse.git", - "reference": "23c2eb533bca8f3ef5548ae265398fa7d4d39a1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/abuse/zipball/23c2eb533bca8f3ef5548ae265398fa7d4d39a1c", - "reference": "23c2eb533bca8f3ef5548ae265398fa7d4d39a1c", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.4", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Abuse\\": "src/Abuse" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple abuse library to manage application usage limits", - "keywords": [ - "Abuse", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/abuse/issues", - "source": "https://github.com/utopia-php/abuse/tree/0.3.1" - }, - "time": "2020-12-21T17:28:03+00:00" - }, - { - "name": "utopia-php/analytics", - "version": "0.1.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/analytics.git", - "reference": "a1f2a1672a927bef8cd4d9b47e5cfbc856a3c72f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/analytics/zipball/a1f2a1672a927bef8cd4d9b47e5cfbc856a3c72f", - "reference": "a1f2a1672a927bef8cd4d9b47e5cfbc856a3c72f", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Analytics\\": "src/Analytics" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - }, - { - "name": "Torsten Dittmann", - "email": "torsten@appwrite.io" - } - ], - "description": "A simple library to track events & users.", - "keywords": [ - "analytics", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/analytics/issues", - "source": "https://github.com/utopia-php/analytics/tree/0.1.0" - }, - "time": "2021-02-03T17:07:09+00:00" - }, - { - "name": "utopia-php/audit", - "version": "0.5.1", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/audit.git", - "reference": "154a850170a58667a15e4b65fbabb6cd0b709dd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/154a850170a58667a15e4b65fbabb6cd0b709dd9", - "reference": "154a850170a58667a15e4b65fbabb6cd0b709dd9", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Audit\\": "src/Audit" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple audit library to manage application users logs", - "keywords": [ - "Audit", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/0.5.1" - }, - "time": "2020-12-21T17:28:53+00:00" - }, - { - "name": "utopia-php/cache", - "version": "0.2.3", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/cache.git", - "reference": "a44b904127f88fa64673e402e5c0732ff6687d47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/cache/zipball/a44b904127f88fa64673e402e5c0732ff6687d47", - "reference": "a44b904127f88fa64673e402e5c0732ff6687d47", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Cache\\": "src/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple cache library to manage application cache storing, loading and purging", - "keywords": [ - "cache", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/cache/issues", - "source": "https://github.com/utopia-php/cache/tree/0.2.3" - }, - "time": "2020-10-24T10:11:01+00:00" - }, - { - "name": "utopia-php/cli", - "version": "0.10.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/cli.git", - "reference": "69ae40187fb4b68ef14f0224a68d9cc016b83634" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/cli/zipball/69ae40187fb4b68ef14f0224a68d9cc016b83634", - "reference": "69ae40187fb4b68ef14f0224a68d9cc016b83634", - "shasum": "" - }, - "require": { - "php": ">=7.4", - "utopia-php/framework": "0.*.*" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\CLI\\": "src/CLI" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple CLI library to manage command line applications", - "keywords": [ - "cli", - "command line", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/cli/issues", - "source": "https://github.com/utopia-php/cli/tree/0.10.0" - }, - "time": "2021-01-26T16:35:15+00:00" - }, - { - "name": "utopia-php/config", - "version": "0.2.2", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/config.git", - "reference": "a3d7bc0312d7150d5e04b1362dc34b2b136908cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/config/zipball/a3d7bc0312d7150d5e04b1362dc34b2b136908cc", - "reference": "a3d7bc0312d7150d5e04b1362dc34b2b136908cc", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Config\\": "src/Config" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple Config library to managing application config variables", - "keywords": [ - "config", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/config/issues", - "source": "https://github.com/utopia-php/config/tree/0.2.2" - }, - "time": "2020-10-24T09:49:09+00:00" - }, - { - "name": "utopia-php/domains", - "version": "0.2.3", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/domains.git", - "reference": "6c9b3706b0df4e0150a1f9062321ff114270a643" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/domains/zipball/6c9b3706b0df4e0150a1f9062321ff114270a643", - "reference": "6c9b3706b0df4e0150a1f9062321ff114270a643", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Domains\\": "src/Domains" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "Utopia Domains library is simple and lite library for parsing web domains. This library is aiming to be as simple and easy to learn and use.", - "keywords": [ - "domains", - "framework", - "icann", - "php", - "public suffix", - "tld", - "tld extract", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/domains/issues", - "source": "https://github.com/utopia-php/domains/tree/0.2.3" - }, - "time": "2020-10-23T09:59:51+00:00" - }, - { - "name": "utopia-php/framework", - "version": "0.12.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/framework.git", - "reference": "bfdb236f91f4393f6db7faccd2d67550a1e73101" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/bfdb236f91f4393f6db7faccd2d67550a1e73101", - "reference": "bfdb236f91f4393f6db7faccd2d67550a1e73101", - "shasum": "" - }, - "require": { - "php": ">=7.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.4", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple, light and advanced PHP framework", - "keywords": [ - "framework", - "php", - "upf" - ], - "support": { - "issues": "https://github.com/utopia-php/framework/issues", - "source": "https://github.com/utopia-php/framework/tree/0.12.0" - }, - "time": "2021-03-04T17:14:23+00:00" - }, - { - "name": "utopia-php/image", - "version": "0.1.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/image.git", - "reference": "66e38db211b1d6fe93de09d82606641e0f996e42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/image/zipball/66e38db211b1d6fe93de09d82606641e0f996e42", - "reference": "66e38db211b1d6fe93de09d82606641e0f996e42", - "shasum": "" - }, - "require": { - "chillerlan/php-qrcode": "4.3.0", - "ext-imagick": "*", - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Image\\": "src/Image" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple Image manipulation library", - "keywords": [ - "framework", - "image", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/image/issues", - "source": "https://github.com/utopia-php/image/tree/0.1.0" - }, - "time": "2021-02-19T05:09:46+00:00" - }, - { - "name": "utopia-php/locale", - "version": "0.3.3", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/locale.git", - "reference": "5b5b22aab786d6e66eb3b9d546b7e606deae68e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/locale/zipball/5b5b22aab786d6e66eb3b9d546b7e606deae68e4", - "reference": "5b5b22aab786d6e66eb3b9d546b7e606deae68e4", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Locale\\": "src/Locale" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple locale library to manage application translations", - "keywords": [ - "framework", - "locale", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/locale/issues", - "source": "https://github.com/utopia-php/locale/tree/0.3.3" - }, - "time": "2020-10-24T08:12:55+00:00" - }, - { - "name": "utopia-php/preloader", - "version": "0.2.4", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/preloader.git", - "reference": "65ef48392e72172f584b0baa2e224f9a1cebcce0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/preloader/zipball/65ef48392e72172f584b0baa2e224f9a1cebcce0", - "reference": "65ef48392e72172f584b0baa2e224f9a1cebcce0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Preloader\\": "src/Preloader" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "team@appwrite.io" - } - ], - "description": "Utopia Preloader library is simple and lite library for managing PHP preloading configuration", - "keywords": [ - "framework", - "php", - "preload", - "preloader", - "preloading", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/preloader/issues", - "source": "https://github.com/utopia-php/preloader/tree/0.2.4" - }, - "time": "2020-10-24T07:04:59+00:00" - }, - { - "name": "utopia-php/registry", - "version": "0.2.4", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/registry.git", - "reference": "428a94f1a36147e7b7221e778c01e1be08db2893" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/registry/zipball/428a94f1a36147e7b7221e778c01e1be08db2893", - "reference": "428a94f1a36147e7b7221e778c01e1be08db2893", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Registry\\": "src/Registry" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple dependency management library for PHP", - "keywords": [ - "dependency management", - "di", - "framework", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/registry/issues", - "source": "https://github.com/utopia-php/registry/tree/0.2.4" - }, - "time": "2020-10-24T08:51:37+00:00" - }, - { - "name": "utopia-php/storage", - "version": "0.4.3", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/storage.git", - "reference": "9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/storage/zipball/9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7", - "reference": "9db3ab713a6d392c3c2c799aeea751f6c8dc2ff7", - "shasum": "" - }, - "require": { - "php": ">=7.4", - "utopia-php/framework": "0.*.*" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Storage\\": "src/Storage" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "A simple Storage library to manage application storage", - "keywords": [ - "framework", - "php", - "storage", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/storage/issues", - "source": "https://github.com/utopia-php/storage/tree/0.4.3" - }, - "time": "2021-03-02T20:25:02+00:00" - }, - { - "name": "utopia-php/swoole", - "version": "0.2.1", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/swoole.git", - "reference": "63168a82037f371516a199d75da101c8caa3edc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/swoole/zipball/63168a82037f371516a199d75da101c8caa3edc1", - "reference": "63168a82037f371516a199d75da101c8caa3edc1", - "shasum": "" - }, - "require": { - "ext-swoole": "*", - "php": ">=7.4", - "utopia-php/framework": "0.*.*" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "swoole/ide-helper": "4.5.5", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Swoole\\": "src/Swoole" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "team@appwrite.io" - } - ], - "description": "An extension for Utopia Framework to work with PHP Swoole as a PHP FPM alternative", - "keywords": [ - "framework", - "http", - "php", - "server", - "swoole", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/swoole/issues", - "source": "https://github.com/utopia-php/swoole/tree/0.2.1" - }, - "time": "2021-02-10T06:20:43+00:00" - }, - { - "name": "utopia-php/system", - "version": "0.4.0", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/system.git", - "reference": "67c92c66ce8f0cc925a00bca89f7a188bf9183c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/system/zipball/67c92c66ce8f0cc925a00bca89f7a188bf9183c0", - "reference": "67c92c66ce8f0cc925a00bca89f7a188bf9183c0", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\System\\": "src/System" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - }, - { - "name": "Torsten Dittmann", - "email": "torsten@appwrite.io" - } - ], - "description": "A simple library for obtaining information about the host's system.", - "keywords": [ - "framework", - "php", - "system", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/system/issues", - "source": "https://github.com/utopia-php/system/tree/0.4.0" - }, - "time": "2021-02-04T14:14:49+00:00" - }, - { -<<<<<<< HEAD - "name": "webonyx/graphql-php", - "version": "v14.4.0", - "source": { - "type": "git", - "url": "https://github.com/webonyx/graphql-php.git", - "reference": "aab3d49181467db064b41429cde117a7589625fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/aab3d49181467db064b41429cde117a7589625fc", - "reference": "aab3d49181467db064b41429cde117a7589625fc", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": "^7.1||^8.0" - }, - "require-dev": { - "amphp/amp": "^2.3", - "doctrine/coding-standard": "^6.0", - "nyholm/psr7": "^1.2", - "phpbench/phpbench": "^0.16.10", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.32", - "phpstan/phpstan-phpunit": "0.12.11", - "phpstan/phpstan-strict-rules": "0.12.2", - "phpunit/phpunit": "^7.2|^8.5", - "psr/http-message": "^1.0", - "react/promise": "2.*", - "simpod/php-coveralls-mirror": "^3.0", - "squizlabs/php_codesniffer": "3.5.4" - }, - "suggest": { - "psr/http-message": "To use standard GraphQL server", - "react/promise": "To leverage async resolving on React PHP platform" - }, - "type": "library", - "autoload": { - "psr-4": { - "GraphQL\\": "src/" -======= - "name": "webmozart/assert", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", - "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], -<<<<<<< HEAD - "description": "A PHP port of GraphQL reference implementation", - "homepage": "https://github.com/webonyx/graphql-php", - "keywords": [ - "api", - "graphql" - ], - "support": { - "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/v14.4.0" - }, - "funding": [ - { - "url": "https://opencollective.com/webonyx-graphql-php", - "type": "open_collective" - } - ], - "time": "2020-12-03T16:05:21+00:00" -======= - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/master" - }, - "time": "2021-02-28T20:01:57+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb", - "reference": "7d4bbc6e0b47c6bb39b6cce1a4b5942e0c5125fb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\": "lib" - }, - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "http://amphp.org/amp", - "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/master" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-01-13T19:16:50+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "f813a658f0446192c5e17f96727070ee9342b93a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/f813a658f0446192c5e17f96727070ee9342b93a", - "reference": "f813a658f0446192c5e17f96727070ee9342b93a", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Amp\\ByteStream\\": "lib" - }, - "files": [ - "lib/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/master" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2020-08-30T19:23:04+00:00" - }, - { - "name": "appwrite/sdk-generator", - "version": "0.6.3", - "source": { - "type": "git", - "url": "https://github.com/appwrite/sdk-generator", - "reference": "583248c57c5bcbd9c74f8312cc7fc3ab6cda51a3" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "matthiasmullie/minify": "^1.3", - "php": ">=7.0.0", - "twig/twig": "^2.12" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Appwrite\\SDK\\": "src/SDK", - "Appwrite\\Spec\\": "src/Spec" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - } - ], - "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2021-03-07T08:45:05+00:00" - }, - { - "name": "composer/package-versions-deprecated", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "f921205948ab93bb19f86327c793a81edb62f236" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/f921205948ab93bb19f86327c793a81edb62f236", - "reference": "f921205948ab93bb19f86327c793a81edb62f236", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "default-branch": true, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/master" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-27T20:11:05+00:00" - }, - { - "name": "composer/semver", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "dd61cb4efbd0cff1700b217faf24ce596af4fc4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/dd61cb4efbd0cff1700b217faf24ce596af4fc4e", - "reference": "dd61cb4efbd0cff1700b217faf24ce596af4fc4e", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.54", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/main" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-10T07:55:43+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f28d44c286812c714741478d968104c5e604a1d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", - "reference": "f28d44c286812c714741478d968104c5e604a1d4", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-11-13T08:04:11+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "6410c4b8352cb64218641457cef64997e6b784fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/6410c4b8352cb64218641457cef64997e6b784fb", - "reference": "6410c4b8352cb64218641457cef64997e6b784fb", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-11-10T19:05:51+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.0", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/06f0b06043c7438959dbdeed8bb3f699a19be22e", - "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.0" - }, - "time": "2021-01-10T17:48:47+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/9d846d1f5cf101deee7a61c8ba7caa0a975cd730", - "reference": "9d846d1f5cf101deee7a61c8ba7caa0a975cd730", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/1.5.1" - }, - "time": "2021-02-22T14:02:09+00:00" - }, - { - "name": "matthiasmullie/minify", - "version": "1.3.66", - "source": { - "type": "git", - "url": "https://github.com/matthiasmullie/minify.git", - "reference": "45fd3b0f1dfa2c965857c6d4a470bea52adc31a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/45fd3b0f1dfa2c965857c6d4a470bea52adc31a6", - "reference": "45fd3b0f1dfa2c965857c6d4a470bea52adc31a6", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "matthiasmullie/path-converter": "~1.1", - "php": ">=5.3.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.0", - "matthiasmullie/scrapbook": "dev-master", - "phpunit/phpunit": ">=4.8" - }, - "suggest": { - "psr/cache-implementation": "Cache implementation to use with Minify::cache" - }, - "bin": [ - "bin/minifycss", - "bin/minifyjs" - ], - "type": "library", - "autoload": { - "psr-4": { - "MatthiasMullie\\Minify\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthias Mullie", - "email": "minify@mullie.eu", - "homepage": "http://www.mullie.eu", - "role": "Developer" - } - ], - "description": "CSS & JavaScript minifier, in PHP. Removes whitespace, strips comments, combines files (incl. @import statements and small assets in CSS files), and optimizes/shortens a few common programming patterns.", - "homepage": "http://www.minifier.org", - "keywords": [ - "JS", - "css", - "javascript", - "minifier", - "minify" - ], - "support": { - "issues": "https://github.com/matthiasmullie/minify/issues", - "source": "https://github.com/matthiasmullie/minify/tree/1.3.66" - }, - "funding": [ - { - "url": "https://github.com/[user1", - "type": "github" - }, - { - "url": "https://github.com/matthiasmullie] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g.", - "type": "github" - }, - { - "url": "https://github.com/user2", - "type": "github" - } - ], - "time": "2021-01-06T15:18:10+00:00" - }, - { - "name": "matthiasmullie/path-converter", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/matthiasmullie/path-converter.git", - "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/e7d13b2c7e2f2268e1424aaed02085518afa02d9", - "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "MatthiasMullie\\PathConverter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthias Mullie", - "email": "pathconverter@mullie.eu", - "homepage": "http://www.mullie.eu", - "role": "Developer" - } - ], - "description": "Relative path converter", - "homepage": "http://github.com/matthiasmullie/path-converter", - "keywords": [ - "converter", - "path", - "paths", - "relative" - ], - "support": { - "issues": "https://github.com/matthiasmullie/path-converter/issues", - "source": "https://github.com/matthiasmullie/path-converter/tree/1.1.3" - }, - "time": "2019-02-05T23:41:09+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-11-13T09:40:50+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/master" - }, - "time": "2020-04-16T18:48:43+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.10.4", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" - }, - "time": "2020-12-20T10:01:03+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.1" - }, - "time": "2020-06-27T14:33:11+00:00" - }, - { - "name": "phar-io/version", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" - }, - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/cf8df60735d98fd18070b7cab0019ba0831e219c", - "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" - }, - "time": "2020-06-19T17:42:03+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "f8d350d8514ff60b5993dd0121c62299480c989c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f8d350d8514ff60b5993dd0121c62299480c989c", - "reference": "f8d350d8514ff60b5993dd0121c62299480c989c", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2021-03-07T11:12:25+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6759f2268deb9f329812679e9dcb2d0083b2a30b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6759f2268deb9f329812679e9dcb2d0083b2a30b", - "reference": "6759f2268deb9f329812679e9dcb2d0083b2a30b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.x" - }, - "time": "2021-02-02T21:09:27+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.12.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.2" - }, - "time": "2020-12-19T10:15:11+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ad069801f3d0cdb7102e58afd5f9f32834ec7160" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ad069801f3d0cdb7102e58afd5f9f32834ec7160", - "reference": "ad069801f3d0cdb7102e58afd5f9f32834ec7160", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-02-08T09:55:27+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", -<<<<<<< HEAD - "reference": "dae425925709122f7584cadeeb838edcaa491bb1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/dae425925709122f7584cadeeb838edcaa491bb1", - "reference": "dae425925709122f7584cadeeb838edcaa491bb1", -======= - "reference": "330949c62cbc3e44120990701c949e59a4f3e141" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/330949c62cbc3e44120990701c949e59a4f3e141", - "reference": "330949c62cbc3e44120990701c949e59a4f3e141", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:43+00:00" -======= - "time": "2021-03-10T06:29:10+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "phpunit/php-invoker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", -<<<<<<< HEAD - "reference": "5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40", - "reference": "5ad9e5f5d6ee1a837e1d50bab1017e0daf423b40", -======= - "reference": "fe3276f5cd81d19a8e8ef90a32855545f7aae7cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/fe3276f5cd81d19a8e8ef90a32855545f7aae7cb", - "reference": "fe3276f5cd81d19a8e8ef90a32855545f7aae7cb", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:51+00:00" -======= - "time": "2021-03-10T06:29:18+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "phpunit/php-text-template", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", -<<<<<<< HEAD - "reference": "4ec5a2ac79a19b35d0cf83cce30604f77743067a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/4ec5a2ac79a19b35d0cf83cce30604f77743067a", - "reference": "4ec5a2ac79a19b35d0cf83cce30604f77743067a", -======= - "reference": "11d864dc75b7f73d1e03361bff717894587f3987" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/11d864dc75b7f73d1e03361bff717894587f3987", - "reference": "11d864dc75b7f73d1e03361bff717894587f3987", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:49:24+00:00" -======= - "time": "2021-03-10T06:29:48+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "phpunit/php-timer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", -<<<<<<< HEAD - "reference": "705821b0927b5e69e9e016c84de68dc6195c71b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/705821b0927b5e69e9e016c84de68dc6195c71b9", - "reference": "705821b0927b5e69e9e016c84de68dc6195c71b9", -======= - "reference": "95242c4aa540e9b3655c7edbe8f76d55ac237b7b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/95242c4aa540e9b3655c7edbe8f76d55ac237b7b", - "reference": "95242c4aa540e9b3655c7edbe8f76d55ac237b7b", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:59+00:00" -======= - "time": "2021-03-10T06:29:26+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "phpunit/phpunit", - "version": "9.4.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa", - "reference": "3866b2eeeed21b1b099c4bc0b7a1690ac6fd5baa", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/Framework/Assert/Functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.4.2" - }, - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-19T09:23:29+00:00" - }, - { - "name": "psr/container", - "version": "1.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.x" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", -<<<<<<< HEAD - "reference": "3a42d843af4d27ca1155e1d926881af162733655" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/3a42d843af4d27ca1155e1d926881af162733655", - "reference": "3a42d843af4d27ca1155e1d926881af162733655", -======= - "reference": "c8472024d13a267ba49f4c1e194a01cba5b094f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c8472024d13a267ba49f4c1e194a01cba5b094f5", - "reference": "c8472024d13a267ba49f4c1e194a01cba5b094f5", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:49:50+00:00" -======= - "time": "2021-03-10T06:30:16+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", -<<<<<<< HEAD - "reference": "5f5db0b35f586eb5bca0581a10bb42dd56575986" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5f5db0b35f586eb5bca0581a10bb42dd56575986", - "reference": "5f5db0b35f586eb5bca0581a10bb42dd56575986", -======= - "reference": "84710fb3a027eb62978539705a0cd00713d474c8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/84710fb3a027eb62978539705a0cd00713d474c8", - "reference": "84710fb3a027eb62978539705a0cd00713d474c8", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:47:39+00:00" -======= - "time": "2021-03-10T06:28:05+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/comparator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", -<<<<<<< HEAD - "reference": "dbc5fb421f242a5749845dc8dd0dc8cde2979dd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dbc5fb421f242a5749845dc8dd0dc8cde2979dd9", - "reference": "dbc5fb421f242a5749845dc8dd0dc8cde2979dd9", -======= - "reference": "5dfac003e3be0ca24000cee2a2e19ba2f21aa8f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5dfac003e3be0ca24000cee2a2e19ba2f21aa8f8", - "reference": "5dfac003e3be0ca24000cee2a2e19ba2f21aa8f8", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:47:47+00:00" -======= - "time": "2021-03-10T06:28:15+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", -<<<<<<< HEAD - "reference": "93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90", - "reference": "93e6aa13f3dc5f8327e7fb9756e9655fc4c23e90", -======= - "reference": "08ab1620f0f35c41e50d847433193da76d33151e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/08ab1620f0f35c41e50d847433193da76d33151e", - "reference": "08ab1620f0f35c41e50d847433193da76d33151e", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:47:55+00:00" -======= - "time": "2021-03-10T06:28:23+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/environment", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", -<<<<<<< HEAD - "reference": "6e1743b808be9cfd33a716583ccb94b7d4d32e94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e1743b808be9cfd33a716583ccb94b7d4d32e94", - "reference": "6e1743b808be9cfd33a716583ccb94b7d4d32e94", -======= - "reference": "e34aa76b02666b7f12417f2000b6d4fbb9c2016c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/e34aa76b02666b7f12417f2000b6d4fbb9c2016c", - "reference": "e34aa76b02666b7f12417f2000b6d4fbb9c2016c", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:03+00:00" -======= - "time": "2021-03-10T06:28:31+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/exporter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", -<<<<<<< HEAD - "reference": "eca7281ab29075df68b113a37a83be616b629b12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/eca7281ab29075df68b113a37a83be616b629b12", - "reference": "eca7281ab29075df68b113a37a83be616b629b12", -======= - "reference": "889b30136f9f8a6c0c4d71954b772ac8b8d7feab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/889b30136f9f8a6c0c4d71954b772ac8b8d7feab", - "reference": "889b30136f9f8a6c0c4d71954b772ac8b8d7feab", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:12+00:00" -======= - "time": "2021-03-10T06:28:38+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/global-state", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", -<<<<<<< HEAD - "reference": "0ac702e6d13725242edb9b294c5d20b92fcfb8b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ac702e6d13725242edb9b294c5d20b92fcfb8b4", - "reference": "0ac702e6d13725242edb9b294c5d20b92fcfb8b4", -======= - "reference": "8a1428d5351ea5dae3aa386d3b321499ac23adea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/8a1428d5351ea5dae3aa386d3b321499ac23adea", - "reference": "8a1428d5351ea5dae3aa386d3b321499ac23adea", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:19+00:00" -======= - "time": "2021-03-10T06:28:46+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", -<<<<<<< HEAD - "reference": "8cc80b4bda00a4c5997c3fc597a34872f3a1007d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/8cc80b4bda00a4c5997c3fc597a34872f3a1007d", - "reference": "8cc80b4bda00a4c5997c3fc597a34872f3a1007d", -======= - "reference": "b218fb1d63287edb7613b61122890f39e82ae8c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b218fb1d63287edb7613b61122890f39e82ae8c2", - "reference": "b218fb1d63287edb7613b61122890f39e82ae8c2", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:28+00:00" -======= - "time": "2021-03-10T06:28:54+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/object-reflector", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", -<<<<<<< HEAD - "reference": "1d33587c2c3e636936f895e103a9e82dd8102a8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d33587c2c3e636936f895e103a9e82dd8102a8e", - "reference": "1d33587c2c3e636936f895e103a9e82dd8102a8e", -======= - "reference": "cbf30bc9ed44451f5301480f668cd4fcf6bb225a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/cbf30bc9ed44451f5301480f668cd4fcf6bb225a", - "reference": "cbf30bc9ed44451f5301480f668cd4fcf6bb225a", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:48:35+00:00" -======= - "time": "2021-03-10T06:29:02+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/recursion-context", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", -<<<<<<< HEAD - "reference": "43f58a51e8f853aadb228ba818d2be388af7237b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/43f58a51e8f853aadb228ba818d2be388af7237b", - "reference": "43f58a51e8f853aadb228ba818d2be388af7237b", -======= - "reference": "c3333538e25ec932d0cbdce77b6ac846757b809d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c3333538e25ec932d0cbdce77b6ac846757b809d", - "reference": "c3333538e25ec932d0cbdce77b6ac846757b809d", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:49:08+00:00" -======= - "time": "2021-03-10T06:29:33+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/resource-operations", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", -<<<<<<< HEAD - "reference": "557863473c1de00e165a288d5b547f1f83652e7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/557863473c1de00e165a288d5b547f1f83652e7e", - "reference": "557863473c1de00e165a288d5b547f1f83652e7e", -======= - "reference": "1bba184dccb563769fab9bd69c623c1a353dec98" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1bba184dccb563769fab9bd69c623c1a353dec98", - "reference": "1bba184dccb563769fab9bd69c623c1a353dec98", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T15:49:16+00:00" -======= - "time": "2021-03-10T06:29:41+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "swoole/ide-helper", - "version": "4.5.5", - "source": { - "type": "git", - "url": "https://github.com/swoole/ide-helper.git", - "reference": "aefd9d15e00cf14b89a5ed87cfa3bd79c9889028" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swoole/ide-helper/zipball/aefd9d15e00cf14b89a5ed87cfa3bd79c9889028", - "reference": "aefd9d15e00cf14b89a5ed87cfa3bd79c9889028", - "shasum": "" - }, - "require-dev": { - "guzzlehttp/guzzle": "~6.5.0", - "laminas/laminas-code": "~3.4.0", - "squizlabs/php_codesniffer": "~3.5.0", - "symfony/filesystem": "~4.0" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Team Swoole", - "email": "team@swoole.com" - } - ], - "description": "IDE help files for Swoole.", - "support": { - "issues": "https://github.com/swoole/ide-helper/issues", - "source": "https://github.com/swoole/ide-helper/tree/4.5.5" - }, - "time": "2020-10-14T18:05:12+00:00" - }, - { - "name": "symfony/console", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", -<<<<<<< HEAD - "reference": "c08d7d0d458eceb62996d81d3be8d9fbf5564ec4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c08d7d0d458eceb62996d81d3be8d9fbf5564ec4", - "reference": "c08d7d0d458eceb62996d81d3be8d9fbf5564ec4", -======= - "reference": "4e102e4de39852a1dcd3b2169d263b88afee7fff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4e102e4de39852a1dcd3b2169d263b88afee7fff", - "reference": "4e102e4de39852a1dcd3b2169d263b88afee7fff", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/5.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], -<<<<<<< HEAD - "time": "2021-02-23T10:10:15+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" -======= - "time": "2021-03-08T21:52:55+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", -<<<<<<< HEAD - "reference": "e830e6ceebd6377b019e4c9a523d6f2c27007e4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e830e6ceebd6377b019e4c9a523d6f2c27007e4a", - "reference": "e830e6ceebd6377b019e4c9a523d6f2c27007e4a", -======= - "reference": "96cd360b9f03a22a30cf5354e630c557bd3aac33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/96cd360b9f03a22a30cf5354e630c557bd3aac33", - "reference": "96cd360b9f03a22a30cf5354e630c557bd3aac33", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/main" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], -<<<<<<< HEAD - "time": "2021-02-25T16:38:04+00:00" -======= - "time": "2021-03-05T22:51:52+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "symfony/string", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "6d830fae00e2bb336074eae141bb00db36cd3551" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/6d830fae00e2bb336074eae141bb00db36cd3551", - "reference": "6d830fae00e2bb336074eae141bb00db36cd3551", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/5.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-17T15:27:35+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "twig/twig", - "version": "2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", -<<<<<<< HEAD - "reference": "728c611e8643a5dd44839ffa791e21763b04a694" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/728c611e8643a5dd44839ffa791e21763b04a694", - "reference": "728c611e8643a5dd44839ffa791e21763b04a694", -======= - "reference": "37e48403c21e06f63bc27d7ccd997fbb72b0ae2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/37e48403c21e06f63bc27d7ccd997fbb72b0ae2a", - "reference": "37e48403c21e06f63bc27d7ccd997fbb72b0ae2a", ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.14-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - }, - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/2.x" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], -<<<<<<< HEAD - "time": "2021-02-22T11:56:05+00:00" -======= - "time": "2021-03-10T10:07:14+00:00" ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - }, - { - "name": "vimeo/psalm", - "version": "4.1.1", - "source": { - "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "16bfbd9224698bd738c665f33039fade2a1a3977" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/16bfbd9224698bd738c665f33039fade2a1a3977", - "reference": "16bfbd9224698bd738c665f33039fade2a1a3977", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.1", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.4", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0", - "nikic/php-parser": "^4.10.1", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" - }, - "require-dev": { - "amphp/amp": "^2.4.2", - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0.0", - "ext-curl": "*", - "php": "^7.3|^8", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.13", - "slevomat/coding-standard": "^5.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-igbinary": "^2.0.5" - }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psalm\\": "src/Psalm/" - }, - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Brown" - } - ], - "description": "A static analysis tool for finding errors in PHP applications", - "keywords": [ - "code", - "inspection", - "php" - ], - "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.1.1" - }, - "time": "2020-11-02T05:54:12+00:00" - }, - { -<<<<<<< HEAD - "name": "webmozart/assert", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", - "reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/master" - }, - "time": "2021-02-28T20:01:57+00:00" - }, - { -======= ->>>>>>> 2823c95929c18807f93bd5b0dc6fcf8eb1f9318f - "name": "webmozart/path-util", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2", - "reference": "95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2", - "shasum": "" - }, - "require": { - "php": "^5.3.3|^7.0", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/master" - }, - "time": "2016-08-15T15:31:42+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.4.0", - "ext-curl": "*", - "ext-imagick": "*", - "ext-mbstring": "*", - "ext-json": "*", - "ext-yaml": "*", - "ext-dom": "*", - "ext-redis": "*", - "ext-swoole": "*", - "ext-pdo": "*", - "ext-openssl": "*", - "ext-zlib": "*", - "ext-sockets": "*" - }, - "platform-dev": [], - "platform-overrides": { - "php": "7.4" - }, - "plugin-api-version": "2.0.0" -}