├── .gitignore ├── src ├── event │ ├── Event.php │ ├── request │ │ ├── BeforeRequestEvent.php │ │ ├── AfterRequestEvent.php │ │ └── RequestEvent.php │ └── EventsHandler.php ├── error │ ├── RuntimeErrorException.php │ ├── InternalErrorException.php │ ├── PrismaException.php │ ├── ErrorCodes.php │ ├── Error.php │ └── HTTPCodes.php ├── type │ ├── TypeManagerException.php │ ├── TypeException.php │ ├── validators │ │ ├── exception │ │ │ ├── ValidatorException.php │ │ │ └── BadValidationException.php │ │ ├── StringValidator.php │ │ ├── ArrayValidator.php │ │ ├── IntValidator.php │ │ ├── FloatValidator.php │ │ └── BoolValidator.php │ ├── TypeValidator.php │ ├── TypedArrayTypeValidator.php │ └── TypeManager.php ├── handler │ ├── exception │ │ ├── RequestException.php │ │ └── VersionException.php │ └── RequestHandler.php ├── controller │ ├── exception │ │ ├── ControllerException.php │ │ ├── BadInputException.php │ │ ├── UnknownMethodException.php │ │ ├── UnknownControllerException.php │ │ └── WrongHttpMethodException.php │ ├── MethodParameter.php │ ├── Controller.php │ ├── ControllerManager.php │ ├── Method.php │ └── ControllerChecker.php ├── Response.php ├── settings │ └── PrismaFrameSettings.php └── PrismaFrame.php ├── composer.json ├── tests └── validators │ └── IntValidatorTest.php ├── README.md ├── .github └── workflows │ └── php.yml ├── LICENSE └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | /.phpunit.result.cache 3 | /vendor/ 4 | /libffi.6.dylib 5 | -------------------------------------------------------------------------------- /src/event/Event.php: -------------------------------------------------------------------------------- 1 | response = $response; 17 | $this->httpCode = $httpCode; 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /src/settings/PrismaFrameSettings.php: -------------------------------------------------------------------------------- 1 | debug = $debug; 10 | $this->apiVersion = $apiVersion; 11 | } 12 | 13 | /** @var bool */ 14 | public $debug; 15 | 16 | /** @var string */ 17 | public $apiVersion; 18 | 19 | } -------------------------------------------------------------------------------- /src/error/InternalErrorException.php: -------------------------------------------------------------------------------- 1 | httpCode = $httpCode; 17 | } 18 | 19 | $this->id = $id; 20 | parent::__construct($message, 0, $previous); 21 | } 22 | } -------------------------------------------------------------------------------- /src/controller/exception/UnknownMethodException.php: -------------------------------------------------------------------------------- 1 | response = $response; 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /src/type/validators/exception/BadValidationException.php: -------------------------------------------------------------------------------- 1 | request = $request; 28 | $this->controller = $controller; 29 | $this->method = $method; 30 | $this->args = $args; 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /src/error/ErrorCodes.php: -------------------------------------------------------------------------------- 1 | getFullTypeName(); // \namespace\a\b\c\SomeClass 21 | 22 | $parts = explode("\\", $name); // [namespace, a, b, c, SomeClass] 23 | 24 | return array_pop($parts); // SomeClass 25 | } 26 | 27 | abstract public function createAlsoArrayType(): bool; 28 | 29 | abstract public function validateAndGetValue(string $input, array $extraData); 30 | 31 | } -------------------------------------------------------------------------------- /src/type/validators/BoolValidator.php: -------------------------------------------------------------------------------- 1 | getValidator(); 21 | 22 | $a = 5; 23 | 24 | $val = $v->validateAndGetValue("107", []); 25 | 26 | $this->assertEquals(107, $val); 27 | } 28 | 29 | public function testNoValue(): void{ 30 | $this->expectException(RuntimeErrorException::class); 31 | 32 | $v = $this->getValidator(); 33 | 34 | $val = $v->validateAndGetValue("", []); 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## prismaFrame 2 | 3 | prismaFrame - фреймворк для быстрого и удобного создания API 4 | 5 | --- 6 | 7 | Код | Скриншот работы 8 | :-------------------------:|:-------------------------: 9 | ![](https://sun9-22.userapi.com/9F1_r7ORKdE_C48dhdS1kXaaD-K6eoLTYqvD3w/lrJBP7xb60M.jpg) | ![](https://sun9-43.userapi.com/IU3iUs8b1s2eNKdBD6MTgjI28ILlyZjF6uAhjw/IAYLWUdvZag.jpg) 10 | 11 | --- 12 | 13 | ## Требования к установке 14 | + PHP 7.3+ 15 | 16 | ## Установка 17 | 18 | ```shell script 19 | composer require greenwix/prismaframe:1.0.2 20 | ``` 21 | 22 | Вместо 1.0.2 можете использовать интересующую Вас версию из [списка](https://github.com/GreenWix/prismaFrame/releases) 23 | 24 | ## Быстрый старт 25 | 26 | Если вы хотите использовать шаблон, чтобы быстро начать разрабатывать, посмотрите [prismaFrameExample](https://github.com/GreenWix/prismaFrameExample) 27 | 28 | --- 29 | 30 | ## Документация 31 | 32 | [Wiki](https://github.com/GreenWix/prismaFrame/wiki) -------------------------------------------------------------------------------- /src/error/Error.php: -------------------------------------------------------------------------------- 1 | getMessage(); 14 | 15 | if (!$isDebug && $httpCode === HTTPCodes::INTERNAL_SERVER_ERROR) { 16 | $message = "Internal server error"; 17 | $id = ErrorCodes::INTERNAL_ERROR; 18 | } 19 | 20 | return new Response([ 21 | "error" => [ 22 | "code" => $id, 23 | "message" => $message, 24 | ] 25 | ], $httpCode); 26 | } 27 | 28 | protected static function getIdAndHttpCode(Throwable $e): array { 29 | if ($e instanceof PrismaException) { 30 | $id = $e->id; 31 | $httpCode = $e->httpCode; 32 | } else { 33 | $id = ErrorCodes::INTERNAL_ERROR; 34 | $httpCode = HTTPCodes::INTERNAL_SERVER_ERROR; 35 | } 36 | 37 | return [$id, $httpCode]; 38 | } 39 | 40 | private function __construct() { 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /.github/workflows/php.yml: -------------------------------------------------------------------------------- 1 | name: PHP Composer 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | 17 | - name: Validate composer.json and composer.lock 18 | run: composer validate 19 | 20 | - name: Cache Composer packages 21 | id: composer-cache 22 | uses: actions/cache@v2 23 | with: 24 | path: vendor 25 | key: ${{ runner.os }}-node-${{ hashFiles('**/composer.lock') }} 26 | restore-keys: | 27 | ${{ runner.os }}-node- 28 | 29 | - name: Install dependencies 30 | if: steps.composer-cache.outputs.cache-hit != 'true' 31 | run: composer install --prefer-dist --no-progress --no-suggest 32 | 33 | # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" 34 | # Docs: https://getcomposer.org/doc/articles/scripts.md 35 | 36 | # - name: Run test suite 37 | # run: composer run-script test 38 | -------------------------------------------------------------------------------- /src/type/TypedArrayTypeValidator.php: -------------------------------------------------------------------------------- 1 | typeName = $typeName; 17 | $this->typeManager = $manager; 18 | } 19 | 20 | public function getFullTypeName(): string { 21 | return $this->typeName . '[]'; 22 | } 23 | 24 | public function createAlsoArrayType(): bool { 25 | return false; 26 | } 27 | 28 | /** 29 | * @param string $input 30 | * @param array $extraData 31 | * @return array 32 | * @throws TypeManagerException 33 | */ 34 | public function validateAndGetValue(string $input, array $extraData): array { 35 | $result = []; 36 | $elements = explode(",", $input); 37 | 38 | foreach ($elements as $element) { 39 | $value = $this->typeManager->validateTypedInput($this->typeName, $element, $extraData); 40 | 41 | $result[] = $value; 42 | } 43 | return $result; 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 GreenWix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/controller/MethodParameter.php: -------------------------------------------------------------------------------- 1 | name = $name; 28 | $this->typeName = $typeName; 29 | $this->extraData = $extraData; 30 | $this->required = $required; 31 | 32 | $this->typeManager = $typeManager; 33 | } 34 | 35 | /** 36 | * @param string $input 37 | * @return mixed 38 | * @throws TypeManagerException 39 | */ 40 | public function validateAndGetValue(string $input) { 41 | $typeManager = $this->typeManager; 42 | 43 | return $typeManager->validateTypedInput($this->typeName, $input, $this->extraData); 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /src/controller/Controller.php: -------------------------------------------------------------------------------- 1 | checkIfMethodExists($methodName); 24 | 25 | return $this->methods[$methodName]->invoke($httpMethod, $args); 26 | } 27 | 28 | /** 29 | * @throws UnknownMethodException 30 | */ 31 | private function checkIfMethodExists(string $methodName): void { 32 | if (isset($this->methods[$methodName])) { 33 | return; 34 | } 35 | 36 | $controllerName = $this->getName(); 37 | $controllerAndMethodName = "$controllerName.$methodName"; 38 | 39 | throw new UnknownMethodException("Unknown method \"$controllerAndMethodName\""); 40 | } 41 | 42 | abstract public function getName(): string; 43 | 44 | } -------------------------------------------------------------------------------- /src/controller/ControllerManager.php: -------------------------------------------------------------------------------- 1 | checker = new ControllerChecker($prismaFrame); 23 | } 24 | 25 | /** 26 | * @param string $name 27 | * @return Controller 28 | * @throws UnknownControllerException 29 | */ 30 | public function getController(string $name): Controller { 31 | if (!isset($this->controllers[$name])) { 32 | throw new UnknownControllerException("Unknown controller"); 33 | } 34 | 35 | return $this->controllers[$name]; 36 | } 37 | 38 | /** 39 | * @param Controller $controller 40 | * @throws InternalErrorException 41 | */ 42 | public function addController(Controller $controller) { 43 | $controllerName = $controller->getName(); 44 | if (isset($this->controllers[$controllerName])) { 45 | throw new InternalErrorException("Controller $controllerName is already registered"); 46 | } 47 | 48 | $controller->methods = $this->checker->getControllerMethods($controller); 49 | 50 | $this->controllers[$controllerName] = $controller; 51 | } 52 | 53 | } -------------------------------------------------------------------------------- /src/controller/Method.php: -------------------------------------------------------------------------------- 1 | name = $name; 39 | $this->parameters = $parameters; 40 | foreach ($httpMethods as $method) { 41 | $this->httpMethods[$method] = true; // чтобы можно было потом ускоренно проверять через isset 42 | } 43 | $this->flatHttpMethods = implode("|", $httpMethods); 44 | $this->controller = $controller; 45 | } 46 | 47 | /** 48 | * @param string $httpMethod 49 | * @param array $args 50 | * @return array 51 | * @throws BadInputException 52 | * @throws TypeManagerException 53 | * @throws WrongHttpMethodException 54 | */ 55 | public function invoke(string $httpMethod, array $args): array { 56 | if (!isset($this->httpMethods[strtoupper($httpMethod)])) { 57 | throw new WrongHttpMethodException("This method supports only $this->flatHttpMethods HTTP method(s). Got $httpMethod"); 58 | } 59 | 60 | $values = []; 61 | foreach ($this->parameters as $name => $param) { 62 | if ($param->required && !isset($args[$name])) { 63 | throw new BadInputException("Parameter \"$name\" is required"); 64 | } 65 | 66 | if (!isset($args[$name])) { 67 | continue; 68 | } 69 | 70 | $argValue = $args[$name]; 71 | $values[] = $param->validateAndGetValue($argValue); 72 | } 73 | 74 | return $this->controller->{$this->name}(...$values); 75 | } 76 | 77 | } -------------------------------------------------------------------------------- /src/type/TypeManager.php: -------------------------------------------------------------------------------- 1 | initBaseSupportedTypes(); 25 | } 26 | 27 | /** 28 | * @throws TypeManagerException 29 | */ 30 | protected function initBaseSupportedTypes(): void { 31 | $this->addTypeValidator(new ArrayValidator()); 32 | $this->addTypeValidator(new BoolValidator()); 33 | $this->addTypeValidator(new FloatValidator()); 34 | $this->addTypeValidator(new IntValidator()); 35 | $this->addTypeValidator(new StringValidator()); 36 | } 37 | 38 | /** 39 | * @throws TypeManagerException 40 | */ 41 | public function addTypeValidator(TypeValidator $validator): void { 42 | $docTypeName = $validator->getDocTypeName(); 43 | if (isset($this->types[$docTypeName])) { 44 | throw new TypeManagerException("The type with name \"$docTypeName\" is already busy. Please choose a different name for " . get_class($validator)); 45 | } 46 | 47 | $this->types[$docTypeName] = $validator; 48 | 49 | if ($validator->createAlsoArrayType()) { 50 | $this->addTypeValidator(new TypedArrayTypeValidator($docTypeName, $this)); 51 | } 52 | } 53 | 54 | /** 55 | * @param string $typeName 56 | * @param string $input 57 | * @param array $extraData 58 | * @return mixed 59 | * @throws TypeManagerException 60 | */ 61 | public function validateTypedInput(string $typeName, string $input, array $extraData = []) { 62 | $this->checkTypeValidatorExistence($typeName); 63 | 64 | $type = $this->types[$typeName]; 65 | 66 | return $type->validateAndGetValue($input, $extraData); 67 | } 68 | 69 | public function hasTypeValidator(string $typeName): bool { 70 | return isset($this->types[$typeName]); 71 | } 72 | 73 | /** 74 | * @param string $typeName 75 | * @return TypeValidator 76 | * @throws TypeManagerException 77 | */ 78 | public function getTypeValidator(string $typeName): TypeValidator { 79 | $this->checkTypeValidatorExistence($typeName); 80 | 81 | return $this->types[$typeName]; 82 | } 83 | 84 | /** 85 | * @param string $typeName 86 | * @throws TypeManagerException 87 | */ 88 | public function checkTypeValidatorExistence(string $typeName): void { 89 | if (!$this->hasTypeValidator($typeName)) { 90 | throw new TypeManagerException("No validator for type " . $typeName); 91 | } 92 | } 93 | 94 | } -------------------------------------------------------------------------------- /src/PrismaFrame.php: -------------------------------------------------------------------------------- 1 | settings = $settings; 43 | $this->logger = $logger; 44 | $this->typeManager = new TypeManager(); 45 | $this->controllerManager = new ControllerManager($this); 46 | $this->requestHandler = new RequestHandler($this); 47 | 48 | $this->eventsHandler = $eventsHandler; 49 | } 50 | 51 | public function getLogger(): LoggerInterface { 52 | return $this->logger; 53 | } 54 | 55 | /** 56 | * @param ServerRequestInterface $request 57 | * @return Response 58 | * @throws InternalErrorException 59 | */ 60 | public function handleRequest(ServerRequestInterface $request): Response { 61 | if (!$this->isWorking()) { 62 | throw new InternalErrorException("Start prismaFrame before handling requests"); 63 | } 64 | 65 | return $this->requestHandler->handle($request); 66 | } 67 | 68 | public function getEventsHandler(): EventsHandler { 69 | return $this->eventsHandler; 70 | } 71 | 72 | /** 73 | * @param Controller $controller 74 | * @throws InternalErrorException 75 | */ 76 | public function addController(Controller $controller): void { 77 | if ($this->isWorking()) { 78 | throw new InternalErrorException("You can't add new controllers while prismaFrame is working"); 79 | } 80 | 81 | $this->controllerManager->addController($controller); 82 | } 83 | 84 | /** 85 | * @throws type\TypeManagerException 86 | */ 87 | public function addTypeValidator(TypeValidator $validator): void { 88 | $this->typeManager->addTypeValidator($validator); 89 | } 90 | 91 | public function isDebug(): bool { 92 | return $this->settings->debug; 93 | } 94 | 95 | public function getApiVersion(): string { 96 | return $this->settings->apiVersion; 97 | } 98 | 99 | public function getSettings(): PrismaFrameSettings { 100 | return $this->settings; 101 | } 102 | 103 | public function start() { 104 | $this->working = true; 105 | } 106 | 107 | public function isWorking(): bool { 108 | return $this->working; 109 | } 110 | 111 | public function getControllerManager(): ControllerManager { 112 | return $this->controllerManager; 113 | } 114 | 115 | public function getTypeManager(): TypeManager { 116 | return $this->typeManager; 117 | } 118 | 119 | } -------------------------------------------------------------------------------- /src/error/HTTPCodes.php: -------------------------------------------------------------------------------- 1 | prismaFrame = $prismaFrame; 27 | } 28 | 29 | /** 30 | * @param ServerRequestInterface $request 31 | * @return Response 32 | */ 33 | public function handle(ServerRequestInterface $request): Response { 34 | $prismaFrame = $this->prismaFrame; 35 | 36 | $eventsHandler = $prismaFrame->getEventsHandler(); 37 | 38 | try { 39 | $url = $request->getUri()->getPath(); 40 | $httpMethod = strtoupper($request->getMethod()); 41 | $queryParams = $request->getQueryParams(); 42 | 43 | $args = $this->getRequestArgs($request, $httpMethod); 44 | 45 | $this->checkVersion($queryParams); 46 | 47 | [$controller, $method] = $this->getControllerNameAndMethod($url); 48 | 49 | $event = new BeforeRequestEvent($request, $controller, $method, $args); 50 | $eventsHandler->beforeRequest($event); 51 | 52 | $controllerManager = $prismaFrame->getControllerManager(); 53 | $controller = $controllerManager->getController($controller); 54 | 55 | return new Response($controller->callMethod($method, $httpMethod, $args), HTTPCodes::OK); 56 | } catch (Throwable $e) { 57 | return Error::make($prismaFrame->isDebug(), $e); 58 | } finally { 59 | if (isset($controller, $method, $args, $response)) { 60 | $event = new AfterRequestEvent($request, $controller, $method, $args, $response); 61 | $eventsHandler->afterRequest($event); 62 | } 63 | } 64 | } 65 | 66 | /** 67 | * @param ServerRequestInterface $req 68 | * @param string $httpMethod 69 | * @return array 70 | * @throws BadInputException 71 | */ 72 | private function getRequestArgs(ServerRequestInterface $req, string $httpMethod): array { 73 | $parsedBody = $req->getParsedBody(); 74 | $queryParams = $req->getQueryParams(); 75 | 76 | //todo более корректно отрабатывать момент, когда мы льем файл 77 | if (empty($parsedBody)) { 78 | if ($httpMethod === 'GET') { 79 | $args = $queryParams; 80 | } else { 81 | $args = json_decode($req->getBody()->getContents(), true, JSON_THROW_ON_ERROR); 82 | } 83 | } else { 84 | $args = $parsedBody; 85 | } 86 | 87 | if (!isset($args)) { 88 | throw new BadInputException("Couldn't get args"); 89 | } 90 | 91 | return $args; 92 | } 93 | 94 | /** 95 | * @param array $queryParams 96 | * @throws VersionException 97 | */ 98 | private function checkVersion(array $queryParams): void { 99 | if (!isset($queryParams["v"])) { 100 | throw new VersionException("Parameter \"v\" is required"); 101 | } 102 | 103 | if ($queryParams["v"] !== $this->prismaFrame->getApiVersion()) { 104 | throw new VersionException("This version is incompatible"); 105 | } 106 | } 107 | 108 | private function getControllerNameAndMethod(string $url): array { 109 | $hostAndControllerAndMethod = explode("/", $url, 2); 110 | 111 | $controllerAndMethod = $hostAndControllerAndMethod[1]; 112 | $controllerAndMethodArray = explode(".", $controllerAndMethod ?? "", 2); 113 | 114 | $controller = $controllerAndMethodArray[0] ?? ""; 115 | $method = $controllerAndMethodArray[1] ?? ""; 116 | 117 | return [$controller, $method]; 118 | } 119 | 120 | } -------------------------------------------------------------------------------- /src/controller/ControllerChecker.php: -------------------------------------------------------------------------------- 1 | prismaFrame = $prismaFrame; 21 | } 22 | 23 | /** 24 | * @param Controller $controller 25 | * @return Method[] 26 | * @throws InternalErrorException 27 | */ 28 | public function getControllerMethods(Controller $controller): array { 29 | $resultMethods = []; 30 | $controllerClass = new ReflectionClass($controller); 31 | $controllerName = $controller->getName(); 32 | 33 | $methods = $controllerClass->getMethods(ReflectionMethod::IS_PUBLIC); 34 | foreach ($methods as $method) { 35 | $methodName = $method->getName(); 36 | if ($this->isMethodInternal($methodName)) continue; 37 | 38 | $controllerAndMethodName = "$controllerName.$methodName"; 39 | 40 | try { 41 | $resultMethods[$methodName] = $this->checkAndGetMethod($method, $controller); 42 | } catch (Throwable $e) { 43 | throw new InternalErrorException("An error occurred while processing $controllerAndMethodName method", HTTPCodes::INTERNAL_SERVER_ERROR, $e); 44 | } 45 | } 46 | return $resultMethods; 47 | } 48 | 49 | /** 50 | * @param ReflectionMethod $method 51 | * @param Controller $controller 52 | * @return Method 53 | * @throws InternalErrorException 54 | * @throws InternalErrorException 55 | */ 56 | protected function checkAndGetMethod(ReflectionMethod $method, Controller $controller): Method { 57 | $methodName = $method->getName(); 58 | 59 | $comment = $method->getDocComment(); 60 | if ($comment === false) { 61 | throw new InternalErrorException("No PHPDoc"); 62 | } 63 | 64 | $doc = self::parseDoc($comment); 65 | 66 | $this->checkReturnType($method, $doc); 67 | 68 | if (!isset($doc['httpMethod'])) { 69 | throw new InternalErrorException('PHPDoc must contain @httpMethod '); 70 | } 71 | 72 | $httpMethods = $this->getHttpMethods($doc); 73 | foreach ($httpMethods as $httpMethod) { 74 | if (!$this->isHttpMethodAllowed($httpMethod)) { 75 | throw new InternalErrorException("HTTP method $httpMethod is not supported"); 76 | } 77 | } 78 | 79 | $parameters = $this->checkAndGetParameters($method, $doc); 80 | 81 | return new Method($methodName, $parameters, $httpMethods, $controller); 82 | } 83 | 84 | /** 85 | * @param ReflectionMethod $method 86 | * @param array $doc 87 | * @return array 88 | * @throws InternalErrorException 89 | * @throws InternalErrorException 90 | */ 91 | protected function checkAndGetParameters(ReflectionMethod $method, array $doc): array { 92 | $docParameters = $this->getParametersFromDocArray($doc); 93 | $resultParameters = []; 94 | 95 | $i = 0; 96 | foreach ($method->getParameters() as $methodParameter) { 97 | if (!isset($docParameters[$i])) { 98 | throw new InternalErrorException("PHPDoc does not contain all method arguments"); 99 | } 100 | 101 | $docParameter = $docParameters[$i]; 102 | $parameterName = $methodParameter->getName(); 103 | if ($docParameter->name !== $parameterName) { 104 | throw new InternalErrorException("The order of the arguments in PHPDoc not match the order of the method arguments"); 105 | } 106 | 107 | $docParameter->required = !$methodParameter->isOptional(); 108 | $resultParameters[$parameterName] = $docParameter; 109 | 110 | $this->checkParameterType($docParameter); 111 | 112 | ++$i; 113 | } 114 | 115 | return $resultParameters; 116 | } 117 | 118 | /** 119 | * @throws InternalErrorException 120 | */ 121 | protected function checkParameterType(MethodParameter $docParameter): void { 122 | $parameterTypeName = $docParameter->typeName; 123 | $parameterName = $docParameter->name; 124 | 125 | $typeManager = $this->prismaFrame->getTypeManager(); 126 | 127 | if (!$typeManager->hasTypeValidator($parameterTypeName)) { 128 | throw new InternalErrorException("Type $parameterTypeName of $parameterName argument is not supported"); 129 | } 130 | } 131 | 132 | protected function getHttpMethods(array $doc): array { 133 | $methods = implode(" ", $doc['httpMethod']); 134 | $uppercaseMethods = strtoupper($methods); 135 | 136 | return explode('|', $uppercaseMethods); 137 | } 138 | 139 | /** 140 | * @param ReflectionMethod $method 141 | * @param array $doc 142 | * @throws InternalErrorException 143 | */ 144 | protected function checkReturnType(ReflectionMethod $method, array $doc): void { 145 | $returnType = $method->getReturnType(); 146 | 147 | $requiredReturnType = 'array'; 148 | 149 | if ($returnType === null) { 150 | throw new InternalErrorException("Method returns void instead of $requiredReturnType"); 151 | } 152 | 153 | $actualReturnTypeName = $returnType->getName(); 154 | if ($actualReturnTypeName !== $requiredReturnType) { 155 | throw new InternalErrorException("Method returns $actualReturnTypeName instead of $requiredReturnType"); 156 | } 157 | 158 | if (!isset($doc['return'])) { 159 | throw new InternalErrorException("There is no @return in PHPDoc"); 160 | } 161 | 162 | $docReturnType = $doc['return'][0]; 163 | if ($docReturnType !== $requiredReturnType) { 164 | throw new InternalErrorException("The @return in PHPDoc refers to $docReturnType instead of $requiredReturnType"); 165 | } 166 | } 167 | 168 | protected function parseDoc(string $data): array { 169 | $result = []; 170 | $lines = explode("\n", $data); 171 | 172 | foreach ($lines as $line) { 173 | $line = trim($line); 174 | 175 | /* 176 | * проверяется сценарий такой же как в этом комментарии 177 | * @parameter value 178 | */ 179 | $parameterPrefix = "* @"; // первые 3 символа строки с параметром 180 | $isLineWithParameter = substr($line, 0, 3) === $parameterPrefix; 181 | 182 | if (!$isLineWithParameter) { 183 | continue; 184 | } 185 | 186 | $tokens = explode(' ', $line); 187 | array_shift($tokens); //Избавляемся от '*' в начале 188 | 189 | $parameterNameWithAmpersat = array_shift($tokens); // ampersat - @ 190 | $parameterName = substr($parameterNameWithAmpersat, 1); 191 | 192 | if ($this->isArrayParameter($parameterName)) { 193 | $result[$parameterName][] = $tokens; 194 | } else { 195 | $result[$parameterName] = $tokens; 196 | } 197 | } 198 | 199 | return $result; 200 | } 201 | 202 | /** 203 | * @param array $doc 204 | * @return MethodParameter[] 205 | * @throws InternalErrorException 206 | */ 207 | private function getParametersFromDocArray(array $doc): array { 208 | $result = []; 209 | 210 | foreach ($doc['param'] ?? [] as $param) { 211 | /* просто напомню как в доке это лежит 212 | * @param type $var some extra data 213 | * 214 | * соответственно в $param будет 215 | * ["type", "$var", "some", "extra", "data"] 216 | */ 217 | 218 | if (!isset($param[0], $param[1])) { 219 | throw new InternalErrorException('Wrong @param line'); 220 | } 221 | 222 | $typeName = array_shift($param); 223 | $parameterName = array_shift($param); 224 | 225 | if ($parameterName[0] !== "$") { 226 | throw new InternalErrorException("@param \"{$parameterName}\" has bad name (without '$')"); 227 | } 228 | 229 | if (isset($result[$parameterName])) { 230 | throw new InternalErrorException("Duplicate @param $parameterName"); 231 | } 232 | 233 | $extraData = $param; 234 | 235 | $parameterName = substr($parameterName, 1); // убираем $ 236 | 237 | $result[] = new MethodParameter($this->prismaFrame->getTypeManager(), $parameterName, $typeName, $extraData, false); 238 | } 239 | 240 | return $result; 241 | } 242 | 243 | 244 | public function isArrayParameter(string $parameterName): bool { 245 | $arrayParameters = ['param', 'throws']; 246 | 247 | return in_array($parameterName, $arrayParameters, true); 248 | } 249 | 250 | public function isMethodInternal(string $methodName): bool { 251 | $internalMethods = ['getName', 'callMethod']; 252 | 253 | return in_array($methodName, $internalMethods, true); 254 | } 255 | 256 | public function isHttpMethodAllowed(string $httpMethod): bool { 257 | $allowedHttpMethods = ['GET', 'POST', 'PATCH', 'PUT']; 258 | 259 | return in_array($httpMethod, $allowedHttpMethods, true); 260 | } 261 | 262 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "c43a66d2583d8f75c1e58ec5a5f039f3", 8 | "packages": [ 9 | { 10 | "name": "doctrine/instantiator", 11 | "version": "1.4.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/instantiator.git", 15 | "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", 20 | "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1 || ^8.0" 25 | }, 26 | "require-dev": { 27 | "doctrine/coding-standard": "^8.0", 28 | "ext-pdo": "*", 29 | "ext-phar": "*", 30 | "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", 31 | "phpstan/phpstan": "^0.12", 32 | "phpstan/phpstan-phpunit": "^0.12", 33 | "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" 34 | }, 35 | "type": "library", 36 | "autoload": { 37 | "psr-4": { 38 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 39 | } 40 | }, 41 | "notification-url": "https://packagist.org/downloads/", 42 | "license": [ 43 | "MIT" 44 | ], 45 | "authors": [ 46 | { 47 | "name": "Marco Pivetta", 48 | "email": "ocramius@gmail.com", 49 | "homepage": "https://ocramius.github.io/" 50 | } 51 | ], 52 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 53 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 54 | "keywords": [ 55 | "constructor", 56 | "instantiate" 57 | ], 58 | "support": { 59 | "issues": "https://github.com/doctrine/instantiator/issues", 60 | "source": "https://github.com/doctrine/instantiator/tree/1.4.0" 61 | }, 62 | "funding": [ 63 | { 64 | "url": "https://www.doctrine-project.org/sponsorship.html", 65 | "type": "custom" 66 | }, 67 | { 68 | "url": "https://www.patreon.com/phpdoctrine", 69 | "type": "patreon" 70 | }, 71 | { 72 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 73 | "type": "tidelift" 74 | } 75 | ], 76 | "time": "2020-11-10T18:47:58+00:00" 77 | }, 78 | { 79 | "name": "laminas/laminas-diactoros", 80 | "version": "2.8.0", 81 | "source": { 82 | "type": "git", 83 | "url": "https://github.com/laminas/laminas-diactoros.git", 84 | "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" 85 | }, 86 | "dist": { 87 | "type": "zip", 88 | "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", 89 | "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", 90 | "shasum": "" 91 | }, 92 | "require": { 93 | "php": "^7.3 || ~8.0.0 || ~8.1.0", 94 | "psr/http-factory": "^1.0", 95 | "psr/http-message": "^1.0" 96 | }, 97 | "conflict": { 98 | "phpspec/prophecy": "<1.9.0", 99 | "zendframework/zend-diactoros": "*" 100 | }, 101 | "provide": { 102 | "psr/http-factory-implementation": "1.0", 103 | "psr/http-message-implementation": "1.0" 104 | }, 105 | "require-dev": { 106 | "ext-curl": "*", 107 | "ext-dom": "*", 108 | "ext-gd": "*", 109 | "ext-libxml": "*", 110 | "http-interop/http-factory-tests": "^0.8.0", 111 | "laminas/laminas-coding-standard": "~1.0.0", 112 | "php-http/psr7-integration-tests": "^1.1", 113 | "phpspec/prophecy-phpunit": "^2.0", 114 | "phpunit/phpunit": "^9.1", 115 | "psalm/plugin-phpunit": "^0.14.0", 116 | "vimeo/psalm": "^4.3" 117 | }, 118 | "type": "library", 119 | "extra": { 120 | "laminas": { 121 | "config-provider": "Laminas\\Diactoros\\ConfigProvider", 122 | "module": "Laminas\\Diactoros" 123 | } 124 | }, 125 | "autoload": { 126 | "files": [ 127 | "src/functions/create_uploaded_file.php", 128 | "src/functions/marshal_headers_from_sapi.php", 129 | "src/functions/marshal_method_from_sapi.php", 130 | "src/functions/marshal_protocol_version_from_sapi.php", 131 | "src/functions/marshal_uri_from_sapi.php", 132 | "src/functions/normalize_server.php", 133 | "src/functions/normalize_uploaded_files.php", 134 | "src/functions/parse_cookie_header.php", 135 | "src/functions/create_uploaded_file.legacy.php", 136 | "src/functions/marshal_headers_from_sapi.legacy.php", 137 | "src/functions/marshal_method_from_sapi.legacy.php", 138 | "src/functions/marshal_protocol_version_from_sapi.legacy.php", 139 | "src/functions/marshal_uri_from_sapi.legacy.php", 140 | "src/functions/normalize_server.legacy.php", 141 | "src/functions/normalize_uploaded_files.legacy.php", 142 | "src/functions/parse_cookie_header.legacy.php" 143 | ], 144 | "psr-4": { 145 | "Laminas\\Diactoros\\": "src/" 146 | } 147 | }, 148 | "notification-url": "https://packagist.org/downloads/", 149 | "license": [ 150 | "BSD-3-Clause" 151 | ], 152 | "description": "PSR HTTP Message implementations", 153 | "homepage": "https://laminas.dev", 154 | "keywords": [ 155 | "http", 156 | "laminas", 157 | "psr", 158 | "psr-17", 159 | "psr-7" 160 | ], 161 | "support": { 162 | "chat": "https://laminas.dev/chat", 163 | "docs": "https://docs.laminas.dev/laminas-diactoros/", 164 | "forum": "https://discourse.laminas.dev", 165 | "issues": "https://github.com/laminas/laminas-diactoros/issues", 166 | "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", 167 | "source": "https://github.com/laminas/laminas-diactoros" 168 | }, 169 | "funding": [ 170 | { 171 | "url": "https://funding.communitybridge.org/projects/laminas-project", 172 | "type": "community_bridge" 173 | } 174 | ], 175 | "time": "2021-09-22T03:54:36+00:00" 176 | }, 177 | { 178 | "name": "myclabs/deep-copy", 179 | "version": "1.10.2", 180 | "source": { 181 | "type": "git", 182 | "url": "https://github.com/myclabs/DeepCopy.git", 183 | "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" 184 | }, 185 | "dist": { 186 | "type": "zip", 187 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", 188 | "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", 189 | "shasum": "" 190 | }, 191 | "require": { 192 | "php": "^7.1 || ^8.0" 193 | }, 194 | "require-dev": { 195 | "doctrine/collections": "^1.0", 196 | "doctrine/common": "^2.6", 197 | "phpunit/phpunit": "^7.1" 198 | }, 199 | "type": "library", 200 | "autoload": { 201 | "files": [ 202 | "src/DeepCopy/deep_copy.php" 203 | ], 204 | "psr-4": { 205 | "DeepCopy\\": "src/DeepCopy/" 206 | } 207 | }, 208 | "notification-url": "https://packagist.org/downloads/", 209 | "license": [ 210 | "MIT" 211 | ], 212 | "description": "Create deep copies (clones) of your objects", 213 | "keywords": [ 214 | "clone", 215 | "copy", 216 | "duplicate", 217 | "object", 218 | "object graph" 219 | ], 220 | "support": { 221 | "issues": "https://github.com/myclabs/DeepCopy/issues", 222 | "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" 223 | }, 224 | "funding": [ 225 | { 226 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 227 | "type": "tidelift" 228 | } 229 | ], 230 | "time": "2020-11-13T09:40:50+00:00" 231 | }, 232 | { 233 | "name": "nikic/php-parser", 234 | "version": "v4.13.2", 235 | "source": { 236 | "type": "git", 237 | "url": "https://github.com/nikic/PHP-Parser.git", 238 | "reference": "210577fe3cf7badcc5814d99455df46564f3c077" 239 | }, 240 | "dist": { 241 | "type": "zip", 242 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", 243 | "reference": "210577fe3cf7badcc5814d99455df46564f3c077", 244 | "shasum": "" 245 | }, 246 | "require": { 247 | "ext-tokenizer": "*", 248 | "php": ">=7.0" 249 | }, 250 | "require-dev": { 251 | "ircmaxell/php-yacc": "^0.0.7", 252 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 253 | }, 254 | "bin": [ 255 | "bin/php-parse" 256 | ], 257 | "type": "library", 258 | "extra": { 259 | "branch-alias": { 260 | "dev-master": "4.9-dev" 261 | } 262 | }, 263 | "autoload": { 264 | "psr-4": { 265 | "PhpParser\\": "lib/PhpParser" 266 | } 267 | }, 268 | "notification-url": "https://packagist.org/downloads/", 269 | "license": [ 270 | "BSD-3-Clause" 271 | ], 272 | "authors": [ 273 | { 274 | "name": "Nikita Popov" 275 | } 276 | ], 277 | "description": "A PHP parser written in PHP", 278 | "keywords": [ 279 | "parser", 280 | "php" 281 | ], 282 | "support": { 283 | "issues": "https://github.com/nikic/PHP-Parser/issues", 284 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" 285 | }, 286 | "time": "2021-11-30T19:35:32+00:00" 287 | }, 288 | { 289 | "name": "phar-io/manifest", 290 | "version": "2.0.3", 291 | "source": { 292 | "type": "git", 293 | "url": "https://github.com/phar-io/manifest.git", 294 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 295 | }, 296 | "dist": { 297 | "type": "zip", 298 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 299 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 300 | "shasum": "" 301 | }, 302 | "require": { 303 | "ext-dom": "*", 304 | "ext-phar": "*", 305 | "ext-xmlwriter": "*", 306 | "phar-io/version": "^3.0.1", 307 | "php": "^7.2 || ^8.0" 308 | }, 309 | "type": "library", 310 | "extra": { 311 | "branch-alias": { 312 | "dev-master": "2.0.x-dev" 313 | } 314 | }, 315 | "autoload": { 316 | "classmap": [ 317 | "src/" 318 | ] 319 | }, 320 | "notification-url": "https://packagist.org/downloads/", 321 | "license": [ 322 | "BSD-3-Clause" 323 | ], 324 | "authors": [ 325 | { 326 | "name": "Arne Blankerts", 327 | "email": "arne@blankerts.de", 328 | "role": "Developer" 329 | }, 330 | { 331 | "name": "Sebastian Heuer", 332 | "email": "sebastian@phpeople.de", 333 | "role": "Developer" 334 | }, 335 | { 336 | "name": "Sebastian Bergmann", 337 | "email": "sebastian@phpunit.de", 338 | "role": "Developer" 339 | } 340 | ], 341 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 342 | "support": { 343 | "issues": "https://github.com/phar-io/manifest/issues", 344 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 345 | }, 346 | "time": "2021-07-20T11:28:43+00:00" 347 | }, 348 | { 349 | "name": "phar-io/version", 350 | "version": "3.2.1", 351 | "source": { 352 | "type": "git", 353 | "url": "https://github.com/phar-io/version.git", 354 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 355 | }, 356 | "dist": { 357 | "type": "zip", 358 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 359 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 360 | "shasum": "" 361 | }, 362 | "require": { 363 | "php": "^7.2 || ^8.0" 364 | }, 365 | "type": "library", 366 | "autoload": { 367 | "classmap": [ 368 | "src/" 369 | ] 370 | }, 371 | "notification-url": "https://packagist.org/downloads/", 372 | "license": [ 373 | "BSD-3-Clause" 374 | ], 375 | "authors": [ 376 | { 377 | "name": "Arne Blankerts", 378 | "email": "arne@blankerts.de", 379 | "role": "Developer" 380 | }, 381 | { 382 | "name": "Sebastian Heuer", 383 | "email": "sebastian@phpeople.de", 384 | "role": "Developer" 385 | }, 386 | { 387 | "name": "Sebastian Bergmann", 388 | "email": "sebastian@phpunit.de", 389 | "role": "Developer" 390 | } 391 | ], 392 | "description": "Library for handling version information and constraints", 393 | "support": { 394 | "issues": "https://github.com/phar-io/version/issues", 395 | "source": "https://github.com/phar-io/version/tree/3.2.1" 396 | }, 397 | "time": "2022-02-21T01:04:05+00:00" 398 | }, 399 | { 400 | "name": "phpdocumentor/reflection-common", 401 | "version": "2.2.0", 402 | "source": { 403 | "type": "git", 404 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 405 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 406 | }, 407 | "dist": { 408 | "type": "zip", 409 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 410 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 411 | "shasum": "" 412 | }, 413 | "require": { 414 | "php": "^7.2 || ^8.0" 415 | }, 416 | "type": "library", 417 | "extra": { 418 | "branch-alias": { 419 | "dev-2.x": "2.x-dev" 420 | } 421 | }, 422 | "autoload": { 423 | "psr-4": { 424 | "phpDocumentor\\Reflection\\": "src/" 425 | } 426 | }, 427 | "notification-url": "https://packagist.org/downloads/", 428 | "license": [ 429 | "MIT" 430 | ], 431 | "authors": [ 432 | { 433 | "name": "Jaap van Otterdijk", 434 | "email": "opensource@ijaap.nl" 435 | } 436 | ], 437 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 438 | "homepage": "http://www.phpdoc.org", 439 | "keywords": [ 440 | "FQSEN", 441 | "phpDocumentor", 442 | "phpdoc", 443 | "reflection", 444 | "static analysis" 445 | ], 446 | "support": { 447 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 448 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 449 | }, 450 | "time": "2020-06-27T09:03:43+00:00" 451 | }, 452 | { 453 | "name": "phpdocumentor/reflection-docblock", 454 | "version": "5.3.0", 455 | "source": { 456 | "type": "git", 457 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 458 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" 459 | }, 460 | "dist": { 461 | "type": "zip", 462 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", 463 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", 464 | "shasum": "" 465 | }, 466 | "require": { 467 | "ext-filter": "*", 468 | "php": "^7.2 || ^8.0", 469 | "phpdocumentor/reflection-common": "^2.2", 470 | "phpdocumentor/type-resolver": "^1.3", 471 | "webmozart/assert": "^1.9.1" 472 | }, 473 | "require-dev": { 474 | "mockery/mockery": "~1.3.2", 475 | "psalm/phar": "^4.8" 476 | }, 477 | "type": "library", 478 | "extra": { 479 | "branch-alias": { 480 | "dev-master": "5.x-dev" 481 | } 482 | }, 483 | "autoload": { 484 | "psr-4": { 485 | "phpDocumentor\\Reflection\\": "src" 486 | } 487 | }, 488 | "notification-url": "https://packagist.org/downloads/", 489 | "license": [ 490 | "MIT" 491 | ], 492 | "authors": [ 493 | { 494 | "name": "Mike van Riel", 495 | "email": "me@mikevanriel.com" 496 | }, 497 | { 498 | "name": "Jaap van Otterdijk", 499 | "email": "account@ijaap.nl" 500 | } 501 | ], 502 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 503 | "support": { 504 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 505 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" 506 | }, 507 | "time": "2021-10-19T17:43:47+00:00" 508 | }, 509 | { 510 | "name": "phpdocumentor/type-resolver", 511 | "version": "1.6.0", 512 | "source": { 513 | "type": "git", 514 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 515 | "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" 516 | }, 517 | "dist": { 518 | "type": "zip", 519 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", 520 | "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", 521 | "shasum": "" 522 | }, 523 | "require": { 524 | "php": "^7.2 || ^8.0", 525 | "phpdocumentor/reflection-common": "^2.0" 526 | }, 527 | "require-dev": { 528 | "ext-tokenizer": "*", 529 | "psalm/phar": "^4.8" 530 | }, 531 | "type": "library", 532 | "extra": { 533 | "branch-alias": { 534 | "dev-1.x": "1.x-dev" 535 | } 536 | }, 537 | "autoload": { 538 | "psr-4": { 539 | "phpDocumentor\\Reflection\\": "src" 540 | } 541 | }, 542 | "notification-url": "https://packagist.org/downloads/", 543 | "license": [ 544 | "MIT" 545 | ], 546 | "authors": [ 547 | { 548 | "name": "Mike van Riel", 549 | "email": "me@mikevanriel.com" 550 | } 551 | ], 552 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 553 | "support": { 554 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 555 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" 556 | }, 557 | "time": "2022-01-04T19:58:01+00:00" 558 | }, 559 | { 560 | "name": "phpspec/prophecy", 561 | "version": "v1.15.0", 562 | "source": { 563 | "type": "git", 564 | "url": "https://github.com/phpspec/prophecy.git", 565 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" 566 | }, 567 | "dist": { 568 | "type": "zip", 569 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 570 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 571 | "shasum": "" 572 | }, 573 | "require": { 574 | "doctrine/instantiator": "^1.2", 575 | "php": "^7.2 || ~8.0, <8.2", 576 | "phpdocumentor/reflection-docblock": "^5.2", 577 | "sebastian/comparator": "^3.0 || ^4.0", 578 | "sebastian/recursion-context": "^3.0 || ^4.0" 579 | }, 580 | "require-dev": { 581 | "phpspec/phpspec": "^6.0 || ^7.0", 582 | "phpunit/phpunit": "^8.0 || ^9.0" 583 | }, 584 | "type": "library", 585 | "extra": { 586 | "branch-alias": { 587 | "dev-master": "1.x-dev" 588 | } 589 | }, 590 | "autoload": { 591 | "psr-4": { 592 | "Prophecy\\": "src/Prophecy" 593 | } 594 | }, 595 | "notification-url": "https://packagist.org/downloads/", 596 | "license": [ 597 | "MIT" 598 | ], 599 | "authors": [ 600 | { 601 | "name": "Konstantin Kudryashov", 602 | "email": "ever.zet@gmail.com", 603 | "homepage": "http://everzet.com" 604 | }, 605 | { 606 | "name": "Marcello Duarte", 607 | "email": "marcello.duarte@gmail.com" 608 | } 609 | ], 610 | "description": "Highly opinionated mocking framework for PHP 5.3+", 611 | "homepage": "https://github.com/phpspec/prophecy", 612 | "keywords": [ 613 | "Double", 614 | "Dummy", 615 | "fake", 616 | "mock", 617 | "spy", 618 | "stub" 619 | ], 620 | "support": { 621 | "issues": "https://github.com/phpspec/prophecy/issues", 622 | "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" 623 | }, 624 | "time": "2021-12-08T12:19:24+00:00" 625 | }, 626 | { 627 | "name": "phpunit/php-code-coverage", 628 | "version": "9.2.13", 629 | "source": { 630 | "type": "git", 631 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 632 | "reference": "deac8540cb7bd40b2b8cfa679b76202834fd04e8" 633 | }, 634 | "dist": { 635 | "type": "zip", 636 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/deac8540cb7bd40b2b8cfa679b76202834fd04e8", 637 | "reference": "deac8540cb7bd40b2b8cfa679b76202834fd04e8", 638 | "shasum": "" 639 | }, 640 | "require": { 641 | "ext-dom": "*", 642 | "ext-libxml": "*", 643 | "ext-xmlwriter": "*", 644 | "nikic/php-parser": "^4.13.0", 645 | "php": ">=7.3", 646 | "phpunit/php-file-iterator": "^3.0.3", 647 | "phpunit/php-text-template": "^2.0.2", 648 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 649 | "sebastian/complexity": "^2.0", 650 | "sebastian/environment": "^5.1.2", 651 | "sebastian/lines-of-code": "^1.0.3", 652 | "sebastian/version": "^3.0.1", 653 | "theseer/tokenizer": "^1.2.0" 654 | }, 655 | "require-dev": { 656 | "phpunit/phpunit": "^9.3" 657 | }, 658 | "suggest": { 659 | "ext-pcov": "*", 660 | "ext-xdebug": "*" 661 | }, 662 | "type": "library", 663 | "extra": { 664 | "branch-alias": { 665 | "dev-master": "9.2-dev" 666 | } 667 | }, 668 | "autoload": { 669 | "classmap": [ 670 | "src/" 671 | ] 672 | }, 673 | "notification-url": "https://packagist.org/downloads/", 674 | "license": [ 675 | "BSD-3-Clause" 676 | ], 677 | "authors": [ 678 | { 679 | "name": "Sebastian Bergmann", 680 | "email": "sebastian@phpunit.de", 681 | "role": "lead" 682 | } 683 | ], 684 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 685 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 686 | "keywords": [ 687 | "coverage", 688 | "testing", 689 | "xunit" 690 | ], 691 | "support": { 692 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 693 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.13" 694 | }, 695 | "funding": [ 696 | { 697 | "url": "https://github.com/sebastianbergmann", 698 | "type": "github" 699 | } 700 | ], 701 | "time": "2022-02-23T17:02:38+00:00" 702 | }, 703 | { 704 | "name": "phpunit/php-file-iterator", 705 | "version": "3.0.6", 706 | "source": { 707 | "type": "git", 708 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 709 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 710 | }, 711 | "dist": { 712 | "type": "zip", 713 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 714 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 715 | "shasum": "" 716 | }, 717 | "require": { 718 | "php": ">=7.3" 719 | }, 720 | "require-dev": { 721 | "phpunit/phpunit": "^9.3" 722 | }, 723 | "type": "library", 724 | "extra": { 725 | "branch-alias": { 726 | "dev-master": "3.0-dev" 727 | } 728 | }, 729 | "autoload": { 730 | "classmap": [ 731 | "src/" 732 | ] 733 | }, 734 | "notification-url": "https://packagist.org/downloads/", 735 | "license": [ 736 | "BSD-3-Clause" 737 | ], 738 | "authors": [ 739 | { 740 | "name": "Sebastian Bergmann", 741 | "email": "sebastian@phpunit.de", 742 | "role": "lead" 743 | } 744 | ], 745 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 746 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 747 | "keywords": [ 748 | "filesystem", 749 | "iterator" 750 | ], 751 | "support": { 752 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 753 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 754 | }, 755 | "funding": [ 756 | { 757 | "url": "https://github.com/sebastianbergmann", 758 | "type": "github" 759 | } 760 | ], 761 | "time": "2021-12-02T12:48:52+00:00" 762 | }, 763 | { 764 | "name": "phpunit/php-invoker", 765 | "version": "3.1.1", 766 | "source": { 767 | "type": "git", 768 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 769 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 770 | }, 771 | "dist": { 772 | "type": "zip", 773 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 774 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 775 | "shasum": "" 776 | }, 777 | "require": { 778 | "php": ">=7.3" 779 | }, 780 | "require-dev": { 781 | "ext-pcntl": "*", 782 | "phpunit/phpunit": "^9.3" 783 | }, 784 | "suggest": { 785 | "ext-pcntl": "*" 786 | }, 787 | "type": "library", 788 | "extra": { 789 | "branch-alias": { 790 | "dev-master": "3.1-dev" 791 | } 792 | }, 793 | "autoload": { 794 | "classmap": [ 795 | "src/" 796 | ] 797 | }, 798 | "notification-url": "https://packagist.org/downloads/", 799 | "license": [ 800 | "BSD-3-Clause" 801 | ], 802 | "authors": [ 803 | { 804 | "name": "Sebastian Bergmann", 805 | "email": "sebastian@phpunit.de", 806 | "role": "lead" 807 | } 808 | ], 809 | "description": "Invoke callables with a timeout", 810 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 811 | "keywords": [ 812 | "process" 813 | ], 814 | "support": { 815 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 816 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 817 | }, 818 | "funding": [ 819 | { 820 | "url": "https://github.com/sebastianbergmann", 821 | "type": "github" 822 | } 823 | ], 824 | "time": "2020-09-28T05:58:55+00:00" 825 | }, 826 | { 827 | "name": "phpunit/php-text-template", 828 | "version": "2.0.4", 829 | "source": { 830 | "type": "git", 831 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 832 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 833 | }, 834 | "dist": { 835 | "type": "zip", 836 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 837 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 838 | "shasum": "" 839 | }, 840 | "require": { 841 | "php": ">=7.3" 842 | }, 843 | "require-dev": { 844 | "phpunit/phpunit": "^9.3" 845 | }, 846 | "type": "library", 847 | "extra": { 848 | "branch-alias": { 849 | "dev-master": "2.0-dev" 850 | } 851 | }, 852 | "autoload": { 853 | "classmap": [ 854 | "src/" 855 | ] 856 | }, 857 | "notification-url": "https://packagist.org/downloads/", 858 | "license": [ 859 | "BSD-3-Clause" 860 | ], 861 | "authors": [ 862 | { 863 | "name": "Sebastian Bergmann", 864 | "email": "sebastian@phpunit.de", 865 | "role": "lead" 866 | } 867 | ], 868 | "description": "Simple template engine.", 869 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 870 | "keywords": [ 871 | "template" 872 | ], 873 | "support": { 874 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 875 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 876 | }, 877 | "funding": [ 878 | { 879 | "url": "https://github.com/sebastianbergmann", 880 | "type": "github" 881 | } 882 | ], 883 | "time": "2020-10-26T05:33:50+00:00" 884 | }, 885 | { 886 | "name": "phpunit/php-timer", 887 | "version": "5.0.3", 888 | "source": { 889 | "type": "git", 890 | "url": "https://github.com/sebastianbergmann/php-timer.git", 891 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 892 | }, 893 | "dist": { 894 | "type": "zip", 895 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 896 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 897 | "shasum": "" 898 | }, 899 | "require": { 900 | "php": ">=7.3" 901 | }, 902 | "require-dev": { 903 | "phpunit/phpunit": "^9.3" 904 | }, 905 | "type": "library", 906 | "extra": { 907 | "branch-alias": { 908 | "dev-master": "5.0-dev" 909 | } 910 | }, 911 | "autoload": { 912 | "classmap": [ 913 | "src/" 914 | ] 915 | }, 916 | "notification-url": "https://packagist.org/downloads/", 917 | "license": [ 918 | "BSD-3-Clause" 919 | ], 920 | "authors": [ 921 | { 922 | "name": "Sebastian Bergmann", 923 | "email": "sebastian@phpunit.de", 924 | "role": "lead" 925 | } 926 | ], 927 | "description": "Utility class for timing", 928 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 929 | "keywords": [ 930 | "timer" 931 | ], 932 | "support": { 933 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 934 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 935 | }, 936 | "funding": [ 937 | { 938 | "url": "https://github.com/sebastianbergmann", 939 | "type": "github" 940 | } 941 | ], 942 | "time": "2020-10-26T13:16:10+00:00" 943 | }, 944 | { 945 | "name": "phpunit/phpunit", 946 | "version": "9.5.16", 947 | "source": { 948 | "type": "git", 949 | "url": "https://github.com/sebastianbergmann/phpunit.git", 950 | "reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc" 951 | }, 952 | "dist": { 953 | "type": "zip", 954 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc", 955 | "reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc", 956 | "shasum": "" 957 | }, 958 | "require": { 959 | "doctrine/instantiator": "^1.3.1", 960 | "ext-dom": "*", 961 | "ext-json": "*", 962 | "ext-libxml": "*", 963 | "ext-mbstring": "*", 964 | "ext-xml": "*", 965 | "ext-xmlwriter": "*", 966 | "myclabs/deep-copy": "^1.10.1", 967 | "phar-io/manifest": "^2.0.3", 968 | "phar-io/version": "^3.0.2", 969 | "php": ">=7.3", 970 | "phpspec/prophecy": "^1.12.1", 971 | "phpunit/php-code-coverage": "^9.2.13", 972 | "phpunit/php-file-iterator": "^3.0.5", 973 | "phpunit/php-invoker": "^3.1.1", 974 | "phpunit/php-text-template": "^2.0.3", 975 | "phpunit/php-timer": "^5.0.2", 976 | "sebastian/cli-parser": "^1.0.1", 977 | "sebastian/code-unit": "^1.0.6", 978 | "sebastian/comparator": "^4.0.5", 979 | "sebastian/diff": "^4.0.3", 980 | "sebastian/environment": "^5.1.3", 981 | "sebastian/exporter": "^4.0.3", 982 | "sebastian/global-state": "^5.0.1", 983 | "sebastian/object-enumerator": "^4.0.3", 984 | "sebastian/resource-operations": "^3.0.3", 985 | "sebastian/type": "^2.3.4", 986 | "sebastian/version": "^3.0.2" 987 | }, 988 | "require-dev": { 989 | "ext-pdo": "*", 990 | "phpspec/prophecy-phpunit": "^2.0.1" 991 | }, 992 | "suggest": { 993 | "ext-soap": "*", 994 | "ext-xdebug": "*" 995 | }, 996 | "bin": [ 997 | "phpunit" 998 | ], 999 | "type": "library", 1000 | "extra": { 1001 | "branch-alias": { 1002 | "dev-master": "9.5-dev" 1003 | } 1004 | }, 1005 | "autoload": { 1006 | "files": [ 1007 | "src/Framework/Assert/Functions.php" 1008 | ], 1009 | "classmap": [ 1010 | "src/" 1011 | ] 1012 | }, 1013 | "notification-url": "https://packagist.org/downloads/", 1014 | "license": [ 1015 | "BSD-3-Clause" 1016 | ], 1017 | "authors": [ 1018 | { 1019 | "name": "Sebastian Bergmann", 1020 | "email": "sebastian@phpunit.de", 1021 | "role": "lead" 1022 | } 1023 | ], 1024 | "description": "The PHP Unit Testing framework.", 1025 | "homepage": "https://phpunit.de/", 1026 | "keywords": [ 1027 | "phpunit", 1028 | "testing", 1029 | "xunit" 1030 | ], 1031 | "support": { 1032 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1033 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16" 1034 | }, 1035 | "funding": [ 1036 | { 1037 | "url": "https://phpunit.de/sponsors.html", 1038 | "type": "custom" 1039 | }, 1040 | { 1041 | "url": "https://github.com/sebastianbergmann", 1042 | "type": "github" 1043 | } 1044 | ], 1045 | "time": "2022-02-23T17:10:58+00:00" 1046 | }, 1047 | { 1048 | "name": "psr/http-factory", 1049 | "version": "1.0.1", 1050 | "source": { 1051 | "type": "git", 1052 | "url": "https://github.com/php-fig/http-factory.git", 1053 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" 1054 | }, 1055 | "dist": { 1056 | "type": "zip", 1057 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 1058 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 1059 | "shasum": "" 1060 | }, 1061 | "require": { 1062 | "php": ">=7.0.0", 1063 | "psr/http-message": "^1.0" 1064 | }, 1065 | "type": "library", 1066 | "extra": { 1067 | "branch-alias": { 1068 | "dev-master": "1.0.x-dev" 1069 | } 1070 | }, 1071 | "autoload": { 1072 | "psr-4": { 1073 | "Psr\\Http\\Message\\": "src/" 1074 | } 1075 | }, 1076 | "notification-url": "https://packagist.org/downloads/", 1077 | "license": [ 1078 | "MIT" 1079 | ], 1080 | "authors": [ 1081 | { 1082 | "name": "PHP-FIG", 1083 | "homepage": "http://www.php-fig.org/" 1084 | } 1085 | ], 1086 | "description": "Common interfaces for PSR-7 HTTP message factories", 1087 | "keywords": [ 1088 | "factory", 1089 | "http", 1090 | "message", 1091 | "psr", 1092 | "psr-17", 1093 | "psr-7", 1094 | "request", 1095 | "response" 1096 | ], 1097 | "support": { 1098 | "source": "https://github.com/php-fig/http-factory/tree/master" 1099 | }, 1100 | "time": "2019-04-30T12:38:16+00:00" 1101 | }, 1102 | { 1103 | "name": "psr/http-message", 1104 | "version": "1.0.1", 1105 | "source": { 1106 | "type": "git", 1107 | "url": "https://github.com/php-fig/http-message.git", 1108 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1109 | }, 1110 | "dist": { 1111 | "type": "zip", 1112 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1113 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1114 | "shasum": "" 1115 | }, 1116 | "require": { 1117 | "php": ">=5.3.0" 1118 | }, 1119 | "type": "library", 1120 | "extra": { 1121 | "branch-alias": { 1122 | "dev-master": "1.0.x-dev" 1123 | } 1124 | }, 1125 | "autoload": { 1126 | "psr-4": { 1127 | "Psr\\Http\\Message\\": "src/" 1128 | } 1129 | }, 1130 | "notification-url": "https://packagist.org/downloads/", 1131 | "license": [ 1132 | "MIT" 1133 | ], 1134 | "authors": [ 1135 | { 1136 | "name": "PHP-FIG", 1137 | "homepage": "http://www.php-fig.org/" 1138 | } 1139 | ], 1140 | "description": "Common interface for HTTP messages", 1141 | "homepage": "https://github.com/php-fig/http-message", 1142 | "keywords": [ 1143 | "http", 1144 | "http-message", 1145 | "psr", 1146 | "psr-7", 1147 | "request", 1148 | "response" 1149 | ], 1150 | "support": { 1151 | "source": "https://github.com/php-fig/http-message/tree/master" 1152 | }, 1153 | "time": "2016-08-06T14:39:51+00:00" 1154 | }, 1155 | { 1156 | "name": "psr/log", 1157 | "version": "3.0.0", 1158 | "source": { 1159 | "type": "git", 1160 | "url": "https://github.com/php-fig/log.git", 1161 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 1162 | }, 1163 | "dist": { 1164 | "type": "zip", 1165 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 1166 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 1167 | "shasum": "" 1168 | }, 1169 | "require": { 1170 | "php": ">=8.0.0" 1171 | }, 1172 | "type": "library", 1173 | "extra": { 1174 | "branch-alias": { 1175 | "dev-master": "3.x-dev" 1176 | } 1177 | }, 1178 | "autoload": { 1179 | "psr-4": { 1180 | "Psr\\Log\\": "src" 1181 | } 1182 | }, 1183 | "notification-url": "https://packagist.org/downloads/", 1184 | "license": [ 1185 | "MIT" 1186 | ], 1187 | "authors": [ 1188 | { 1189 | "name": "PHP-FIG", 1190 | "homepage": "https://www.php-fig.org/" 1191 | } 1192 | ], 1193 | "description": "Common interface for logging libraries", 1194 | "homepage": "https://github.com/php-fig/log", 1195 | "keywords": [ 1196 | "log", 1197 | "psr", 1198 | "psr-3" 1199 | ], 1200 | "support": { 1201 | "source": "https://github.com/php-fig/log/tree/3.0.0" 1202 | }, 1203 | "time": "2021-07-14T16:46:02+00:00" 1204 | }, 1205 | { 1206 | "name": "sebastian/cli-parser", 1207 | "version": "1.0.1", 1208 | "source": { 1209 | "type": "git", 1210 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1211 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1212 | }, 1213 | "dist": { 1214 | "type": "zip", 1215 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1216 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1217 | "shasum": "" 1218 | }, 1219 | "require": { 1220 | "php": ">=7.3" 1221 | }, 1222 | "require-dev": { 1223 | "phpunit/phpunit": "^9.3" 1224 | }, 1225 | "type": "library", 1226 | "extra": { 1227 | "branch-alias": { 1228 | "dev-master": "1.0-dev" 1229 | } 1230 | }, 1231 | "autoload": { 1232 | "classmap": [ 1233 | "src/" 1234 | ] 1235 | }, 1236 | "notification-url": "https://packagist.org/downloads/", 1237 | "license": [ 1238 | "BSD-3-Clause" 1239 | ], 1240 | "authors": [ 1241 | { 1242 | "name": "Sebastian Bergmann", 1243 | "email": "sebastian@phpunit.de", 1244 | "role": "lead" 1245 | } 1246 | ], 1247 | "description": "Library for parsing CLI options", 1248 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1249 | "support": { 1250 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1251 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1252 | }, 1253 | "funding": [ 1254 | { 1255 | "url": "https://github.com/sebastianbergmann", 1256 | "type": "github" 1257 | } 1258 | ], 1259 | "time": "2020-09-28T06:08:49+00:00" 1260 | }, 1261 | { 1262 | "name": "sebastian/code-unit", 1263 | "version": "1.0.8", 1264 | "source": { 1265 | "type": "git", 1266 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1267 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1268 | }, 1269 | "dist": { 1270 | "type": "zip", 1271 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1272 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1273 | "shasum": "" 1274 | }, 1275 | "require": { 1276 | "php": ">=7.3" 1277 | }, 1278 | "require-dev": { 1279 | "phpunit/phpunit": "^9.3" 1280 | }, 1281 | "type": "library", 1282 | "extra": { 1283 | "branch-alias": { 1284 | "dev-master": "1.0-dev" 1285 | } 1286 | }, 1287 | "autoload": { 1288 | "classmap": [ 1289 | "src/" 1290 | ] 1291 | }, 1292 | "notification-url": "https://packagist.org/downloads/", 1293 | "license": [ 1294 | "BSD-3-Clause" 1295 | ], 1296 | "authors": [ 1297 | { 1298 | "name": "Sebastian Bergmann", 1299 | "email": "sebastian@phpunit.de", 1300 | "role": "lead" 1301 | } 1302 | ], 1303 | "description": "Collection of value objects that represent the PHP code units", 1304 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1305 | "support": { 1306 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1307 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1308 | }, 1309 | "funding": [ 1310 | { 1311 | "url": "https://github.com/sebastianbergmann", 1312 | "type": "github" 1313 | } 1314 | ], 1315 | "time": "2020-10-26T13:08:54+00:00" 1316 | }, 1317 | { 1318 | "name": "sebastian/code-unit-reverse-lookup", 1319 | "version": "2.0.3", 1320 | "source": { 1321 | "type": "git", 1322 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1323 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1324 | }, 1325 | "dist": { 1326 | "type": "zip", 1327 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1328 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1329 | "shasum": "" 1330 | }, 1331 | "require": { 1332 | "php": ">=7.3" 1333 | }, 1334 | "require-dev": { 1335 | "phpunit/phpunit": "^9.3" 1336 | }, 1337 | "type": "library", 1338 | "extra": { 1339 | "branch-alias": { 1340 | "dev-master": "2.0-dev" 1341 | } 1342 | }, 1343 | "autoload": { 1344 | "classmap": [ 1345 | "src/" 1346 | ] 1347 | }, 1348 | "notification-url": "https://packagist.org/downloads/", 1349 | "license": [ 1350 | "BSD-3-Clause" 1351 | ], 1352 | "authors": [ 1353 | { 1354 | "name": "Sebastian Bergmann", 1355 | "email": "sebastian@phpunit.de" 1356 | } 1357 | ], 1358 | "description": "Looks up which function or method a line of code belongs to", 1359 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1360 | "support": { 1361 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1362 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1363 | }, 1364 | "funding": [ 1365 | { 1366 | "url": "https://github.com/sebastianbergmann", 1367 | "type": "github" 1368 | } 1369 | ], 1370 | "time": "2020-09-28T05:30:19+00:00" 1371 | }, 1372 | { 1373 | "name": "sebastian/comparator", 1374 | "version": "4.0.6", 1375 | "source": { 1376 | "type": "git", 1377 | "url": "https://github.com/sebastianbergmann/comparator.git", 1378 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382" 1379 | }, 1380 | "dist": { 1381 | "type": "zip", 1382 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", 1383 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382", 1384 | "shasum": "" 1385 | }, 1386 | "require": { 1387 | "php": ">=7.3", 1388 | "sebastian/diff": "^4.0", 1389 | "sebastian/exporter": "^4.0" 1390 | }, 1391 | "require-dev": { 1392 | "phpunit/phpunit": "^9.3" 1393 | }, 1394 | "type": "library", 1395 | "extra": { 1396 | "branch-alias": { 1397 | "dev-master": "4.0-dev" 1398 | } 1399 | }, 1400 | "autoload": { 1401 | "classmap": [ 1402 | "src/" 1403 | ] 1404 | }, 1405 | "notification-url": "https://packagist.org/downloads/", 1406 | "license": [ 1407 | "BSD-3-Clause" 1408 | ], 1409 | "authors": [ 1410 | { 1411 | "name": "Sebastian Bergmann", 1412 | "email": "sebastian@phpunit.de" 1413 | }, 1414 | { 1415 | "name": "Jeff Welch", 1416 | "email": "whatthejeff@gmail.com" 1417 | }, 1418 | { 1419 | "name": "Volker Dusch", 1420 | "email": "github@wallbash.com" 1421 | }, 1422 | { 1423 | "name": "Bernhard Schussek", 1424 | "email": "bschussek@2bepublished.at" 1425 | } 1426 | ], 1427 | "description": "Provides the functionality to compare PHP values for equality", 1428 | "homepage": "https://github.com/sebastianbergmann/comparator", 1429 | "keywords": [ 1430 | "comparator", 1431 | "compare", 1432 | "equality" 1433 | ], 1434 | "support": { 1435 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1436 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" 1437 | }, 1438 | "funding": [ 1439 | { 1440 | "url": "https://github.com/sebastianbergmann", 1441 | "type": "github" 1442 | } 1443 | ], 1444 | "time": "2020-10-26T15:49:45+00:00" 1445 | }, 1446 | { 1447 | "name": "sebastian/complexity", 1448 | "version": "2.0.2", 1449 | "source": { 1450 | "type": "git", 1451 | "url": "https://github.com/sebastianbergmann/complexity.git", 1452 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1453 | }, 1454 | "dist": { 1455 | "type": "zip", 1456 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1457 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1458 | "shasum": "" 1459 | }, 1460 | "require": { 1461 | "nikic/php-parser": "^4.7", 1462 | "php": ">=7.3" 1463 | }, 1464 | "require-dev": { 1465 | "phpunit/phpunit": "^9.3" 1466 | }, 1467 | "type": "library", 1468 | "extra": { 1469 | "branch-alias": { 1470 | "dev-master": "2.0-dev" 1471 | } 1472 | }, 1473 | "autoload": { 1474 | "classmap": [ 1475 | "src/" 1476 | ] 1477 | }, 1478 | "notification-url": "https://packagist.org/downloads/", 1479 | "license": [ 1480 | "BSD-3-Clause" 1481 | ], 1482 | "authors": [ 1483 | { 1484 | "name": "Sebastian Bergmann", 1485 | "email": "sebastian@phpunit.de", 1486 | "role": "lead" 1487 | } 1488 | ], 1489 | "description": "Library for calculating the complexity of PHP code units", 1490 | "homepage": "https://github.com/sebastianbergmann/complexity", 1491 | "support": { 1492 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1493 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1494 | }, 1495 | "funding": [ 1496 | { 1497 | "url": "https://github.com/sebastianbergmann", 1498 | "type": "github" 1499 | } 1500 | ], 1501 | "time": "2020-10-26T15:52:27+00:00" 1502 | }, 1503 | { 1504 | "name": "sebastian/diff", 1505 | "version": "4.0.4", 1506 | "source": { 1507 | "type": "git", 1508 | "url": "https://github.com/sebastianbergmann/diff.git", 1509 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 1510 | }, 1511 | "dist": { 1512 | "type": "zip", 1513 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1514 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1515 | "shasum": "" 1516 | }, 1517 | "require": { 1518 | "php": ">=7.3" 1519 | }, 1520 | "require-dev": { 1521 | "phpunit/phpunit": "^9.3", 1522 | "symfony/process": "^4.2 || ^5" 1523 | }, 1524 | "type": "library", 1525 | "extra": { 1526 | "branch-alias": { 1527 | "dev-master": "4.0-dev" 1528 | } 1529 | }, 1530 | "autoload": { 1531 | "classmap": [ 1532 | "src/" 1533 | ] 1534 | }, 1535 | "notification-url": "https://packagist.org/downloads/", 1536 | "license": [ 1537 | "BSD-3-Clause" 1538 | ], 1539 | "authors": [ 1540 | { 1541 | "name": "Sebastian Bergmann", 1542 | "email": "sebastian@phpunit.de" 1543 | }, 1544 | { 1545 | "name": "Kore Nordmann", 1546 | "email": "mail@kore-nordmann.de" 1547 | } 1548 | ], 1549 | "description": "Diff implementation", 1550 | "homepage": "https://github.com/sebastianbergmann/diff", 1551 | "keywords": [ 1552 | "diff", 1553 | "udiff", 1554 | "unidiff", 1555 | "unified diff" 1556 | ], 1557 | "support": { 1558 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1559 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 1560 | }, 1561 | "funding": [ 1562 | { 1563 | "url": "https://github.com/sebastianbergmann", 1564 | "type": "github" 1565 | } 1566 | ], 1567 | "time": "2020-10-26T13:10:38+00:00" 1568 | }, 1569 | { 1570 | "name": "sebastian/environment", 1571 | "version": "5.1.3", 1572 | "source": { 1573 | "type": "git", 1574 | "url": "https://github.com/sebastianbergmann/environment.git", 1575 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac" 1576 | }, 1577 | "dist": { 1578 | "type": "zip", 1579 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", 1580 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac", 1581 | "shasum": "" 1582 | }, 1583 | "require": { 1584 | "php": ">=7.3" 1585 | }, 1586 | "require-dev": { 1587 | "phpunit/phpunit": "^9.3" 1588 | }, 1589 | "suggest": { 1590 | "ext-posix": "*" 1591 | }, 1592 | "type": "library", 1593 | "extra": { 1594 | "branch-alias": { 1595 | "dev-master": "5.1-dev" 1596 | } 1597 | }, 1598 | "autoload": { 1599 | "classmap": [ 1600 | "src/" 1601 | ] 1602 | }, 1603 | "notification-url": "https://packagist.org/downloads/", 1604 | "license": [ 1605 | "BSD-3-Clause" 1606 | ], 1607 | "authors": [ 1608 | { 1609 | "name": "Sebastian Bergmann", 1610 | "email": "sebastian@phpunit.de" 1611 | } 1612 | ], 1613 | "description": "Provides functionality to handle HHVM/PHP environments", 1614 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1615 | "keywords": [ 1616 | "Xdebug", 1617 | "environment", 1618 | "hhvm" 1619 | ], 1620 | "support": { 1621 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1622 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" 1623 | }, 1624 | "funding": [ 1625 | { 1626 | "url": "https://github.com/sebastianbergmann", 1627 | "type": "github" 1628 | } 1629 | ], 1630 | "time": "2020-09-28T05:52:38+00:00" 1631 | }, 1632 | { 1633 | "name": "sebastian/exporter", 1634 | "version": "4.0.4", 1635 | "source": { 1636 | "type": "git", 1637 | "url": "https://github.com/sebastianbergmann/exporter.git", 1638 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" 1639 | }, 1640 | "dist": { 1641 | "type": "zip", 1642 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", 1643 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", 1644 | "shasum": "" 1645 | }, 1646 | "require": { 1647 | "php": ">=7.3", 1648 | "sebastian/recursion-context": "^4.0" 1649 | }, 1650 | "require-dev": { 1651 | "ext-mbstring": "*", 1652 | "phpunit/phpunit": "^9.3" 1653 | }, 1654 | "type": "library", 1655 | "extra": { 1656 | "branch-alias": { 1657 | "dev-master": "4.0-dev" 1658 | } 1659 | }, 1660 | "autoload": { 1661 | "classmap": [ 1662 | "src/" 1663 | ] 1664 | }, 1665 | "notification-url": "https://packagist.org/downloads/", 1666 | "license": [ 1667 | "BSD-3-Clause" 1668 | ], 1669 | "authors": [ 1670 | { 1671 | "name": "Sebastian Bergmann", 1672 | "email": "sebastian@phpunit.de" 1673 | }, 1674 | { 1675 | "name": "Jeff Welch", 1676 | "email": "whatthejeff@gmail.com" 1677 | }, 1678 | { 1679 | "name": "Volker Dusch", 1680 | "email": "github@wallbash.com" 1681 | }, 1682 | { 1683 | "name": "Adam Harvey", 1684 | "email": "aharvey@php.net" 1685 | }, 1686 | { 1687 | "name": "Bernhard Schussek", 1688 | "email": "bschussek@gmail.com" 1689 | } 1690 | ], 1691 | "description": "Provides the functionality to export PHP variables for visualization", 1692 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1693 | "keywords": [ 1694 | "export", 1695 | "exporter" 1696 | ], 1697 | "support": { 1698 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1699 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" 1700 | }, 1701 | "funding": [ 1702 | { 1703 | "url": "https://github.com/sebastianbergmann", 1704 | "type": "github" 1705 | } 1706 | ], 1707 | "time": "2021-11-11T14:18:36+00:00" 1708 | }, 1709 | { 1710 | "name": "sebastian/global-state", 1711 | "version": "5.0.5", 1712 | "source": { 1713 | "type": "git", 1714 | "url": "https://github.com/sebastianbergmann/global-state.git", 1715 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 1716 | }, 1717 | "dist": { 1718 | "type": "zip", 1719 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1720 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1721 | "shasum": "" 1722 | }, 1723 | "require": { 1724 | "php": ">=7.3", 1725 | "sebastian/object-reflector": "^2.0", 1726 | "sebastian/recursion-context": "^4.0" 1727 | }, 1728 | "require-dev": { 1729 | "ext-dom": "*", 1730 | "phpunit/phpunit": "^9.3" 1731 | }, 1732 | "suggest": { 1733 | "ext-uopz": "*" 1734 | }, 1735 | "type": "library", 1736 | "extra": { 1737 | "branch-alias": { 1738 | "dev-master": "5.0-dev" 1739 | } 1740 | }, 1741 | "autoload": { 1742 | "classmap": [ 1743 | "src/" 1744 | ] 1745 | }, 1746 | "notification-url": "https://packagist.org/downloads/", 1747 | "license": [ 1748 | "BSD-3-Clause" 1749 | ], 1750 | "authors": [ 1751 | { 1752 | "name": "Sebastian Bergmann", 1753 | "email": "sebastian@phpunit.de" 1754 | } 1755 | ], 1756 | "description": "Snapshotting of global state", 1757 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1758 | "keywords": [ 1759 | "global state" 1760 | ], 1761 | "support": { 1762 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1763 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 1764 | }, 1765 | "funding": [ 1766 | { 1767 | "url": "https://github.com/sebastianbergmann", 1768 | "type": "github" 1769 | } 1770 | ], 1771 | "time": "2022-02-14T08:28:10+00:00" 1772 | }, 1773 | { 1774 | "name": "sebastian/lines-of-code", 1775 | "version": "1.0.3", 1776 | "source": { 1777 | "type": "git", 1778 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1779 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 1780 | }, 1781 | "dist": { 1782 | "type": "zip", 1783 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1784 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1785 | "shasum": "" 1786 | }, 1787 | "require": { 1788 | "nikic/php-parser": "^4.6", 1789 | "php": ">=7.3" 1790 | }, 1791 | "require-dev": { 1792 | "phpunit/phpunit": "^9.3" 1793 | }, 1794 | "type": "library", 1795 | "extra": { 1796 | "branch-alias": { 1797 | "dev-master": "1.0-dev" 1798 | } 1799 | }, 1800 | "autoload": { 1801 | "classmap": [ 1802 | "src/" 1803 | ] 1804 | }, 1805 | "notification-url": "https://packagist.org/downloads/", 1806 | "license": [ 1807 | "BSD-3-Clause" 1808 | ], 1809 | "authors": [ 1810 | { 1811 | "name": "Sebastian Bergmann", 1812 | "email": "sebastian@phpunit.de", 1813 | "role": "lead" 1814 | } 1815 | ], 1816 | "description": "Library for counting the lines of code in PHP source code", 1817 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1818 | "support": { 1819 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1820 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 1821 | }, 1822 | "funding": [ 1823 | { 1824 | "url": "https://github.com/sebastianbergmann", 1825 | "type": "github" 1826 | } 1827 | ], 1828 | "time": "2020-11-28T06:42:11+00:00" 1829 | }, 1830 | { 1831 | "name": "sebastian/object-enumerator", 1832 | "version": "4.0.4", 1833 | "source": { 1834 | "type": "git", 1835 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1836 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1837 | }, 1838 | "dist": { 1839 | "type": "zip", 1840 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1841 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1842 | "shasum": "" 1843 | }, 1844 | "require": { 1845 | "php": ">=7.3", 1846 | "sebastian/object-reflector": "^2.0", 1847 | "sebastian/recursion-context": "^4.0" 1848 | }, 1849 | "require-dev": { 1850 | "phpunit/phpunit": "^9.3" 1851 | }, 1852 | "type": "library", 1853 | "extra": { 1854 | "branch-alias": { 1855 | "dev-master": "4.0-dev" 1856 | } 1857 | }, 1858 | "autoload": { 1859 | "classmap": [ 1860 | "src/" 1861 | ] 1862 | }, 1863 | "notification-url": "https://packagist.org/downloads/", 1864 | "license": [ 1865 | "BSD-3-Clause" 1866 | ], 1867 | "authors": [ 1868 | { 1869 | "name": "Sebastian Bergmann", 1870 | "email": "sebastian@phpunit.de" 1871 | } 1872 | ], 1873 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1874 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1875 | "support": { 1876 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1877 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1878 | }, 1879 | "funding": [ 1880 | { 1881 | "url": "https://github.com/sebastianbergmann", 1882 | "type": "github" 1883 | } 1884 | ], 1885 | "time": "2020-10-26T13:12:34+00:00" 1886 | }, 1887 | { 1888 | "name": "sebastian/object-reflector", 1889 | "version": "2.0.4", 1890 | "source": { 1891 | "type": "git", 1892 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1893 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1894 | }, 1895 | "dist": { 1896 | "type": "zip", 1897 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1898 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1899 | "shasum": "" 1900 | }, 1901 | "require": { 1902 | "php": ">=7.3" 1903 | }, 1904 | "require-dev": { 1905 | "phpunit/phpunit": "^9.3" 1906 | }, 1907 | "type": "library", 1908 | "extra": { 1909 | "branch-alias": { 1910 | "dev-master": "2.0-dev" 1911 | } 1912 | }, 1913 | "autoload": { 1914 | "classmap": [ 1915 | "src/" 1916 | ] 1917 | }, 1918 | "notification-url": "https://packagist.org/downloads/", 1919 | "license": [ 1920 | "BSD-3-Clause" 1921 | ], 1922 | "authors": [ 1923 | { 1924 | "name": "Sebastian Bergmann", 1925 | "email": "sebastian@phpunit.de" 1926 | } 1927 | ], 1928 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1929 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1930 | "support": { 1931 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1932 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1933 | }, 1934 | "funding": [ 1935 | { 1936 | "url": "https://github.com/sebastianbergmann", 1937 | "type": "github" 1938 | } 1939 | ], 1940 | "time": "2020-10-26T13:14:26+00:00" 1941 | }, 1942 | { 1943 | "name": "sebastian/recursion-context", 1944 | "version": "4.0.4", 1945 | "source": { 1946 | "type": "git", 1947 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1948 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" 1949 | }, 1950 | "dist": { 1951 | "type": "zip", 1952 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", 1953 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", 1954 | "shasum": "" 1955 | }, 1956 | "require": { 1957 | "php": ">=7.3" 1958 | }, 1959 | "require-dev": { 1960 | "phpunit/phpunit": "^9.3" 1961 | }, 1962 | "type": "library", 1963 | "extra": { 1964 | "branch-alias": { 1965 | "dev-master": "4.0-dev" 1966 | } 1967 | }, 1968 | "autoload": { 1969 | "classmap": [ 1970 | "src/" 1971 | ] 1972 | }, 1973 | "notification-url": "https://packagist.org/downloads/", 1974 | "license": [ 1975 | "BSD-3-Clause" 1976 | ], 1977 | "authors": [ 1978 | { 1979 | "name": "Sebastian Bergmann", 1980 | "email": "sebastian@phpunit.de" 1981 | }, 1982 | { 1983 | "name": "Jeff Welch", 1984 | "email": "whatthejeff@gmail.com" 1985 | }, 1986 | { 1987 | "name": "Adam Harvey", 1988 | "email": "aharvey@php.net" 1989 | } 1990 | ], 1991 | "description": "Provides functionality to recursively process PHP variables", 1992 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1993 | "support": { 1994 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1995 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" 1996 | }, 1997 | "funding": [ 1998 | { 1999 | "url": "https://github.com/sebastianbergmann", 2000 | "type": "github" 2001 | } 2002 | ], 2003 | "time": "2020-10-26T13:17:30+00:00" 2004 | }, 2005 | { 2006 | "name": "sebastian/resource-operations", 2007 | "version": "3.0.3", 2008 | "source": { 2009 | "type": "git", 2010 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2011 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2012 | }, 2013 | "dist": { 2014 | "type": "zip", 2015 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2016 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2017 | "shasum": "" 2018 | }, 2019 | "require": { 2020 | "php": ">=7.3" 2021 | }, 2022 | "require-dev": { 2023 | "phpunit/phpunit": "^9.0" 2024 | }, 2025 | "type": "library", 2026 | "extra": { 2027 | "branch-alias": { 2028 | "dev-master": "3.0-dev" 2029 | } 2030 | }, 2031 | "autoload": { 2032 | "classmap": [ 2033 | "src/" 2034 | ] 2035 | }, 2036 | "notification-url": "https://packagist.org/downloads/", 2037 | "license": [ 2038 | "BSD-3-Clause" 2039 | ], 2040 | "authors": [ 2041 | { 2042 | "name": "Sebastian Bergmann", 2043 | "email": "sebastian@phpunit.de" 2044 | } 2045 | ], 2046 | "description": "Provides a list of PHP built-in functions that operate on resources", 2047 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2048 | "support": { 2049 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2050 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2051 | }, 2052 | "funding": [ 2053 | { 2054 | "url": "https://github.com/sebastianbergmann", 2055 | "type": "github" 2056 | } 2057 | ], 2058 | "time": "2020-09-28T06:45:17+00:00" 2059 | }, 2060 | { 2061 | "name": "sebastian/type", 2062 | "version": "2.3.4", 2063 | "source": { 2064 | "type": "git", 2065 | "url": "https://github.com/sebastianbergmann/type.git", 2066 | "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" 2067 | }, 2068 | "dist": { 2069 | "type": "zip", 2070 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", 2071 | "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", 2072 | "shasum": "" 2073 | }, 2074 | "require": { 2075 | "php": ">=7.3" 2076 | }, 2077 | "require-dev": { 2078 | "phpunit/phpunit": "^9.3" 2079 | }, 2080 | "type": "library", 2081 | "extra": { 2082 | "branch-alias": { 2083 | "dev-master": "2.3-dev" 2084 | } 2085 | }, 2086 | "autoload": { 2087 | "classmap": [ 2088 | "src/" 2089 | ] 2090 | }, 2091 | "notification-url": "https://packagist.org/downloads/", 2092 | "license": [ 2093 | "BSD-3-Clause" 2094 | ], 2095 | "authors": [ 2096 | { 2097 | "name": "Sebastian Bergmann", 2098 | "email": "sebastian@phpunit.de", 2099 | "role": "lead" 2100 | } 2101 | ], 2102 | "description": "Collection of value objects that represent the types of the PHP type system", 2103 | "homepage": "https://github.com/sebastianbergmann/type", 2104 | "support": { 2105 | "issues": "https://github.com/sebastianbergmann/type/issues", 2106 | "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" 2107 | }, 2108 | "funding": [ 2109 | { 2110 | "url": "https://github.com/sebastianbergmann", 2111 | "type": "github" 2112 | } 2113 | ], 2114 | "time": "2021-06-15T12:49:02+00:00" 2115 | }, 2116 | { 2117 | "name": "sebastian/version", 2118 | "version": "3.0.2", 2119 | "source": { 2120 | "type": "git", 2121 | "url": "https://github.com/sebastianbergmann/version.git", 2122 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2123 | }, 2124 | "dist": { 2125 | "type": "zip", 2126 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2127 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2128 | "shasum": "" 2129 | }, 2130 | "require": { 2131 | "php": ">=7.3" 2132 | }, 2133 | "type": "library", 2134 | "extra": { 2135 | "branch-alias": { 2136 | "dev-master": "3.0-dev" 2137 | } 2138 | }, 2139 | "autoload": { 2140 | "classmap": [ 2141 | "src/" 2142 | ] 2143 | }, 2144 | "notification-url": "https://packagist.org/downloads/", 2145 | "license": [ 2146 | "BSD-3-Clause" 2147 | ], 2148 | "authors": [ 2149 | { 2150 | "name": "Sebastian Bergmann", 2151 | "email": "sebastian@phpunit.de", 2152 | "role": "lead" 2153 | } 2154 | ], 2155 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2156 | "homepage": "https://github.com/sebastianbergmann/version", 2157 | "support": { 2158 | "issues": "https://github.com/sebastianbergmann/version/issues", 2159 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2160 | }, 2161 | "funding": [ 2162 | { 2163 | "url": "https://github.com/sebastianbergmann", 2164 | "type": "github" 2165 | } 2166 | ], 2167 | "time": "2020-09-28T06:39:44+00:00" 2168 | }, 2169 | { 2170 | "name": "symfony/polyfill-ctype", 2171 | "version": "v1.24.0", 2172 | "source": { 2173 | "type": "git", 2174 | "url": "https://github.com/symfony/polyfill-ctype.git", 2175 | "reference": "30885182c981ab175d4d034db0f6f469898070ab" 2176 | }, 2177 | "dist": { 2178 | "type": "zip", 2179 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", 2180 | "reference": "30885182c981ab175d4d034db0f6f469898070ab", 2181 | "shasum": "" 2182 | }, 2183 | "require": { 2184 | "php": ">=7.1" 2185 | }, 2186 | "provide": { 2187 | "ext-ctype": "*" 2188 | }, 2189 | "suggest": { 2190 | "ext-ctype": "For best performance" 2191 | }, 2192 | "type": "library", 2193 | "extra": { 2194 | "branch-alias": { 2195 | "dev-main": "1.23-dev" 2196 | }, 2197 | "thanks": { 2198 | "name": "symfony/polyfill", 2199 | "url": "https://github.com/symfony/polyfill" 2200 | } 2201 | }, 2202 | "autoload": { 2203 | "psr-4": { 2204 | "Symfony\\Polyfill\\Ctype\\": "" 2205 | }, 2206 | "files": [ 2207 | "bootstrap.php" 2208 | ] 2209 | }, 2210 | "notification-url": "https://packagist.org/downloads/", 2211 | "license": [ 2212 | "MIT" 2213 | ], 2214 | "authors": [ 2215 | { 2216 | "name": "Gert de Pagter", 2217 | "email": "BackEndTea@gmail.com" 2218 | }, 2219 | { 2220 | "name": "Symfony Community", 2221 | "homepage": "https://symfony.com/contributors" 2222 | } 2223 | ], 2224 | "description": "Symfony polyfill for ctype functions", 2225 | "homepage": "https://symfony.com", 2226 | "keywords": [ 2227 | "compatibility", 2228 | "ctype", 2229 | "polyfill", 2230 | "portable" 2231 | ], 2232 | "support": { 2233 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0" 2234 | }, 2235 | "funding": [ 2236 | { 2237 | "url": "https://symfony.com/sponsor", 2238 | "type": "custom" 2239 | }, 2240 | { 2241 | "url": "https://github.com/fabpot", 2242 | "type": "github" 2243 | }, 2244 | { 2245 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2246 | "type": "tidelift" 2247 | } 2248 | ], 2249 | "time": "2021-10-20T20:35:02+00:00" 2250 | }, 2251 | { 2252 | "name": "theseer/tokenizer", 2253 | "version": "1.2.1", 2254 | "source": { 2255 | "type": "git", 2256 | "url": "https://github.com/theseer/tokenizer.git", 2257 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 2258 | }, 2259 | "dist": { 2260 | "type": "zip", 2261 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 2262 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 2263 | "shasum": "" 2264 | }, 2265 | "require": { 2266 | "ext-dom": "*", 2267 | "ext-tokenizer": "*", 2268 | "ext-xmlwriter": "*", 2269 | "php": "^7.2 || ^8.0" 2270 | }, 2271 | "type": "library", 2272 | "autoload": { 2273 | "classmap": [ 2274 | "src/" 2275 | ] 2276 | }, 2277 | "notification-url": "https://packagist.org/downloads/", 2278 | "license": [ 2279 | "BSD-3-Clause" 2280 | ], 2281 | "authors": [ 2282 | { 2283 | "name": "Arne Blankerts", 2284 | "email": "arne@blankerts.de", 2285 | "role": "Developer" 2286 | } 2287 | ], 2288 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2289 | "support": { 2290 | "issues": "https://github.com/theseer/tokenizer/issues", 2291 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 2292 | }, 2293 | "funding": [ 2294 | { 2295 | "url": "https://github.com/theseer", 2296 | "type": "github" 2297 | } 2298 | ], 2299 | "time": "2021-07-28T10:34:58+00:00" 2300 | }, 2301 | { 2302 | "name": "webmozart/assert", 2303 | "version": "1.10.0", 2304 | "source": { 2305 | "type": "git", 2306 | "url": "https://github.com/webmozarts/assert.git", 2307 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" 2308 | }, 2309 | "dist": { 2310 | "type": "zip", 2311 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", 2312 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", 2313 | "shasum": "" 2314 | }, 2315 | "require": { 2316 | "php": "^7.2 || ^8.0", 2317 | "symfony/polyfill-ctype": "^1.8" 2318 | }, 2319 | "conflict": { 2320 | "phpstan/phpstan": "<0.12.20", 2321 | "vimeo/psalm": "<4.6.1 || 4.6.2" 2322 | }, 2323 | "require-dev": { 2324 | "phpunit/phpunit": "^8.5.13" 2325 | }, 2326 | "type": "library", 2327 | "extra": { 2328 | "branch-alias": { 2329 | "dev-master": "1.10-dev" 2330 | } 2331 | }, 2332 | "autoload": { 2333 | "psr-4": { 2334 | "Webmozart\\Assert\\": "src/" 2335 | } 2336 | }, 2337 | "notification-url": "https://packagist.org/downloads/", 2338 | "license": [ 2339 | "MIT" 2340 | ], 2341 | "authors": [ 2342 | { 2343 | "name": "Bernhard Schussek", 2344 | "email": "bschussek@gmail.com" 2345 | } 2346 | ], 2347 | "description": "Assertions to validate method input/output with nice error messages.", 2348 | "keywords": [ 2349 | "assert", 2350 | "check", 2351 | "validate" 2352 | ], 2353 | "support": { 2354 | "issues": "https://github.com/webmozarts/assert/issues", 2355 | "source": "https://github.com/webmozarts/assert/tree/1.10.0" 2356 | }, 2357 | "time": "2021-03-09T10:59:23+00:00" 2358 | } 2359 | ], 2360 | "packages-dev": [], 2361 | "aliases": [], 2362 | "minimum-stability": "stable", 2363 | "stability-flags": [], 2364 | "prefer-stable": false, 2365 | "prefer-lowest": false, 2366 | "platform": { 2367 | "ext-json": "*" 2368 | }, 2369 | "platform-dev": [], 2370 | "plugin-api-version": "2.2.0" 2371 | } 2372 | --------------------------------------------------------------------------------