From 5ac080636620d19cde93c8a4c0bc72ef3d94cda8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 24 Dec 2019 22:28:43 +0100 Subject: [PATCH 001/221] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b94f9a4..63c73b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -#TLE API +# TLE API ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) From 2971dcba8f2fe20df46190281d89330aa9359685 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 29 Dec 2019 22:18:08 +0100 Subject: [PATCH 002/221] refactor --- composer.json | 1 + composer.lock | 47 ++- .../{Api => }/AbstractApiController.php | 300 ++++++++---------- src/Controller/{Api => }/TleController.php | 157 ++++----- src/Event/ApiExceptionSubscriber.php | 54 ++-- src/Repository/TleRepository.php | 5 - src/Service/Validator/RequestValidator.php | 81 +++++ src/ViewModel/SortDirectionEnum.php | 11 + .../TleCollectionSortableFieldsEnum.php | 11 + symfony.lock | 3 + 10 files changed, 401 insertions(+), 269 deletions(-) rename src/Controller/{Api => }/AbstractApiController.php (69%) rename src/Controller/{Api => }/TleController.php (69%) create mode 100644 src/Service/Validator/RequestValidator.php create mode 100644 src/ViewModel/SortDirectionEnum.php create mode 100644 src/ViewModel/TleCollectionSortableFieldsEnum.php diff --git a/composer.json b/composer.json index 91a68f9..4024eaa 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", + "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", "symfony/asset": "5.0.*", "symfony/browser-kit": "5.0.*", diff --git a/composer.lock b/composer.lock index 568f416..8ecd477 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ad45ae0642275997354a798821f94a16", + "content-hash": "ec5c6ae08688e1589ca9aacfd26a1e50", "packages": [ { "name": "doctrine/annotations", @@ -1194,6 +1194,51 @@ ], "time": "2014-01-12T16:20:24+00:00" }, + { + "name": "myclabs/php-enum", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "45f01adf6922df6082bcda36619deb466e826acf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/45f01adf6922df6082bcda36619deb466e826acf", + "reference": "45f01adf6922df6082bcda36619deb466e826acf", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "time": "2019-08-19T13:53:00+00:00" + }, { "name": "ocramius/package-versions", "version": "1.5.1", diff --git a/src/Controller/Api/AbstractApiController.php b/src/Controller/AbstractApiController.php similarity index 69% rename from src/Controller/Api/AbstractApiController.php rename to src/Controller/AbstractApiController.php index 90e4743..1c29db5 100644 --- a/src/Controller/Api/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -1,170 +1,130 @@ -serializer = $serializer; - } - - /** - * @required - * - * @param RouterInterface $router - */ - public function setRouter(RouterInterface $router): void - { - $this->router = $router; - } - - public function getSort(Request $request, string $default, array $available): string - { - if ($request->get(self::SORT_PARAM) && \in_array($request->get(self::SORT_PARAM), $available, true)) { - $default = strtolower($request->get('sort')); - } - - return $default; - } - - public function getSortDirection(Request $request, string $default): string - { - if ($request->get(self::SORT_DIR_PARAM) && \in_array( - $request->get(self::SORT_DIR_PARAM), - self::$sortDirection, - true - )) { - $default = strtolower($request->get(self::SORT_DIR_PARAM)); - } - - return $default; - } - - public function getPageSize(Request $request, int $default = self::PAGE_SIZE): int - { - if ($request->get(self::PAGE_SIZE_PARAM) && \is_numeric($request->get(self::PAGE_SIZE_PARAM))) { - $default = $request->get(self::PAGE_SIZE_PARAM); - } - - return $default; - } - - public function getPage(Request $request): int - { - $page = $request->get(self::PAGE_PARAM, 1); - - if ($page < 1) { - throw new \LogicException('Page parameter must be greater than zero.'); - } - - return $page; - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getPagination(Request $request, int $total, int $pageSize): array - { - $params = $request->query->all(); - - $page = $this->getPage($request); - $pages = max(1, ceil($total / $pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function response($response): Response - { - return new Response( - $this->serializer->serialize($response, 'json'), - Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - ] - ); - } -} +serializer = $serializer; + } + + /** + * @required + * + * @param RouterInterface $router + */ + public function setRouter(RouterInterface $router): void + { + $this->router = $router; + } + + public function getPage(Request $request): int + { + return (int)$request->get(self::PAGE_PARAM, 1); + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getPagination(Request $request, int $total, int $pageSize): array + { + $params = $request->query->all(); + + $page = $this->getPage($request); + $pages = max(1, ceil($total / $pageSize)); + + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; + } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function response($response): Response + { + return new Response( + $this->serializer->serialize($response, 'json'), + Response::HTTP_OK, + [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + ] + ); + } +} diff --git a/src/Controller/Api/TleController.php b/src/Controller/TleController.php similarity index 69% rename from src/Controller/Api/TleController.php rename to src/Controller/TleController.php index 516f8ad..206ad46 100644 --- a/src/Controller/Api/TleController.php +++ b/src/Controller/TleController.php @@ -1,73 +1,84 @@ -findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $this->response($tle); - } - - /** - * @Route(name="tle_collection") - */ - public function collection(Request $request, TleRepository $repository): Response - { - $search = $request->get(self::SEARCH_PARAM); - $sort = $this->getSort($request, TleRepository::SORT_NAME, TleRepository::$sort); - $sortDir = $this->getSortDirection($request, self::SORT_ASC); - $pageSize = min($this->getPageSize($request, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - - $collection = $repository->collection( - $search, - $sort, - $sortDir, - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) - ); - - return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] - ); - } -} +findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $this->response($tle); + } + + /** + * @Route(name="tle_collection") + */ + public function collection(Request $request, TleRepository $repository): Response + { + $this + ->assertParamIsInteger($request, self::PAGE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) + ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) + ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) + ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + + $search = $request->get(self::SEARCH_PARAM); + $sort = $request->get(self::SORT_DIR_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); + + $collection = $repository->collection( + $search, + $sort, + $sortDir, + $pageSize, + $this->getPageOffset($this->getPage($request), $pageSize) + ); + + return $this->response( + [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ], + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ] + ); + } +} diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 268ba55..83a5b91 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -4,9 +4,9 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface @@ -32,37 +32,51 @@ public static function getSubscribedEvents(): array public function onException(ExceptionEvent $event): void { + if (strpos($event->getRequest()->getPathInfo(), self::API_PATH) === false) { + return; + } + $exception = $event->getThrowable(); - $path = $event->getRequest()->getPathInfo(); + $response = ['message' => 'Unspecified error']; - if (strpos($path, self::API_PATH) === false) { - return; + if ($this->env === 'dev') { + $response['message'] = $exception->getMessage(); + $response['exception'] = $this->throwableToArray($exception); } - if ($exception instanceof NotFoundHttpException) { - $this->setResponse($event, $exception->getMessage()); - } + if ($exception instanceof HttpException) { + $response['message'] = $exception->getMessage(); - if ($exception instanceof AccessDeniedHttpException) { - $this->setResponse($event, 'Forbidden'); + $this->setJsonResponse($event, $response); + return; } - if ($this->env === 'dev') { - $this->setResponse($event, $exception->getMessage()); - } + $this->setJsonResponse($event, $response); } - private function setResponse(ExceptionEvent $event, string $message): void + private function setJsonResponse(ExceptionEvent $event, array $response): void { - $response = new JsonResponse( - [ - 'response' => [ - 'message' => $message, + $event->setResponse( + new JsonResponse( + [ + 'response' => $response ], - ] + Response::HTTP_OK, + [ + 'Access-Control-Allow-Origin' => '*', + ] + ) ); + } - $event->setResponse($response); + private function throwableToArray(\Throwable $throwable): array + { + return [ + 'code' => $throwable->getCode(), + 'file' => $throwable->getFile() . ':' . $throwable->getLine(), + 'message' => $throwable->getMessage(), + 'trace' => $throwable->getTrace(), + ]; } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 1d825a2..31935ec 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -10,11 +10,6 @@ class TleRepository extends ServiceEntityRepository { - public const SORT_ID = 'id'; - public const SORT_NAME = 'name'; - - public static array $sort = [self::SORT_ID, self::SORT_NAME]; - public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Tle::class); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php new file mode 100644 index 0000000..e99095b --- /dev/null +++ b/src/Service/Validator/RequestValidator.php @@ -0,0 +1,81 @@ +get($name); + + if ($param === null) { + return $this; + } + + if (!preg_match('/^\d+$/', $param)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be integer.', $name) + ); + } + + return $this; + } + + protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param > $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamIsLessThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param <= $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamInEnum(Request $request, string $name, array $values): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!\in_array($param, $values, true)) { + throw new BadRequestHttpException( + \sprintf( + 'Parameter \'%s\' must be one of the following: %s', + $name, + '\'' . implode('\', \'', $values) . '\'', + ) + ); + } + + return $this; + } +} \ No newline at end of file diff --git a/src/ViewModel/SortDirectionEnum.php b/src/ViewModel/SortDirectionEnum.php new file mode 100644 index 0000000..9c18548 --- /dev/null +++ b/src/ViewModel/SortDirectionEnum.php @@ -0,0 +1,11 @@ + Date: Wed, 1 Jan 2020 22:28:09 +0100 Subject: [PATCH 003/221] Add web profiler --- composer.json | 6 +- composer.lock | 94 +++++++++++++++++++++++- config/bundles.php | 2 +- config/packages/dev/web_profiler.yaml | 6 ++ config/packages/test/web_profiler.yaml | 6 ++ config/routes/dev/web_profiler.yaml | 7 ++ deploy.php | 41 +++++++++++ src/Controller/ApiController.php | 2 +- src/Controller/TleController.php | 2 +- src/Migrations/Version20191217203053.php | 26 ++++--- src/Repository/TleRepository.php | 19 +++-- src/ViewModel/Model/TleModel.php | 1 + symfony.lock | 17 +++++ tests/CollectionTest.php | 23 ++---- tests/DocumentationTest.php | 7 -- 15 files changed, 213 insertions(+), 46 deletions(-) create mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/test/web_profiler.yaml create mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 deploy.php diff --git a/composer.json b/composer.json index 4024eaa..b8f8515 100644 --- a/composer.json +++ b/composer.json @@ -16,13 +16,13 @@ "symfony/framework-bundle": "5.0.*", "symfony/orm-pack": "^1.0", "symfony/serializer": "5.0.*", - "symfony/twig-bundle": "5.0.*", "symfony/yaml": "5.0.*" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/maker-bundle": "^1.9", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.0", + "symfony/profiler-pack": "^1.0" }, "config": { "preferred-install": { @@ -68,7 +68,7 @@ "symfony/symfony": "*" }, "extra": { - "public-dir": "./", + "public-dir": "./public", "symfony": { "allow-contrib": false, "require": "5.0.*" diff --git a/composer.lock b/composer.lock index 8ecd477..23d5066 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec5c6ae08688e1589ca9aacfd26a1e50", + "content-hash": "c2da72aac0eebb9bc8c88b53206965a5", "packages": [ { "name": "doctrine/annotations", @@ -4319,6 +4319,98 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "time": "2019-11-28T14:20:16+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "99c4370632c2a59bb0444852f92140074ef02209" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", + "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "*", + "symfony/twig-bundle": "*", + "symfony/web-profiler-bundle": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony web profiler", + "time": "2018-12-10T12:11:44+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "6cc40446060e174a690e0f6da90731133b29b664" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6cc40446060e174a690e0f6da90731133b29b664", + "reference": "6cc40446060e174a690e0f6da90731133b29b664", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/form": "<4.4", + "symfony/messenger": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony WebProfilerBundle", + "homepage": "https://symfony.com", + "time": "2019-11-21T07:02:40+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index e1fa41c..879419a 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,5 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 index 0000000..e92166a --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 index 0000000..03752de --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 index 0000000..c82beff --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/deploy.php b/deploy.php new file mode 100644 index 0000000..ec33a3d --- /dev/null +++ b/deploy.php @@ -0,0 +1,41 @@ +user('glutenfr') + ->port(2233) + ->stage('production') + ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); + +// Tasks + +task('build', function () { + run('cd {{release_path}} && build'); +}); + +// [Optional] if deploy fails automatically unlock. +after('deploy:failed', 'deploy:unlock'); + +// Migrate database before symlink new release. + +before('deploy:symlink', 'database:migrate'); + diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index af187a7..80f2ad9 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/api/{name}.json", name="app_api_docs_json") + * @Route("/api/{name}/json", name="app_api_docs_json") */ public function getJson(string $name): JsonResponse { diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 206ad46..d9baea1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -51,7 +51,7 @@ public function collection(Request $request, TleRepository $repository): Respons ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_DIR_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index a34cb43..9147c0d 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -7,28 +7,32 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; -/** - * Auto-generated Migration: Please modify to your needs! - */ final class Version20191217203053 extends AbstractMigration { - public function getDescription() : string + public function getDescription(): string { return ''; } - public function up(Schema $schema) : void + public function up(Schema $schema): void { - // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('CREATE TABLE tle (id INT AUTO_INCREMENT NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(255) NOT NULL, line1 VARCHAR(255) NOT NULL, line2 VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql( + 'CREATE TABLE tle (id INT AUTO_INCREMENT NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(255) NOT NULL, line1 VARCHAR(255) NOT NULL, line2 VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB' + ); } - public function down(Schema $schema) : void + public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); $this->addSql('DROP TABLE tle'); } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 31935ec..478d10a 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -6,6 +6,7 @@ use App\ViewModel\Model\PaginationCollection; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; class TleRepository extends ServiceEntityRepository @@ -31,8 +32,7 @@ public function collection( string $sortDir, int $pageSize, int $offset - ): PaginationCollection - { + ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); // search @@ -44,14 +44,13 @@ public function collection( $builder->expr()->like('tle.name', ':search') ) ) - ->setParameter('search', '%'.$search.'%'); + ->setParameter('search', '%' . $search . '%'); } - // get total - $total = \count($builder->getQuery()->getResult()); + $total = $this->getCount($builder); // sort - $builder->orderBy('tle.'.$sort, $sortDir); + $builder->orderBy('tle.' . $sort, $sortDir); // limit $builder->setMaxResults($pageSize); @@ -64,4 +63,12 @@ public function collection( return $collection; } + + private function getCount(QueryBuilder $builder): int + { + $builder = clone $builder; + + $builder->select('count(tle.id)'); + return $builder->getQuery()->getSingleScalarResult(); + } } diff --git a/src/ViewModel/Model/TleModel.php b/src/ViewModel/Model/TleModel.php index 5409119..4bbeda8 100644 --- a/src/ViewModel/Model/TleModel.php +++ b/src/ViewModel/Model/TleModel.php @@ -197,6 +197,7 @@ private function getLineByNumber(int $lineNumber): string throw new \InvalidArgumentException(\sprintf('Invalid line number %d', $lineNumber)); } + // refactor: TleValidator private function checksum(string $line): int { $line = substr($line, 0, -1); // remove checksum diff --git a/symfony.lock b/symfony.lock index 1190672..cb43eda 100644 --- a/symfony.lock +++ b/symfony.lock @@ -265,6 +265,9 @@ "symfony/polyfill-php73": { "version": "v1.13.1" }, + "symfony/profiler-pack": { + "version": "v1.0.4" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -314,6 +317,20 @@ "symfony/var-exporter": { "version": "v5.0.1" }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + }, + "files": [ + "config/packages/dev/web_profiler.yaml", + "config/packages/test/web_profiler.yaml", + "config/routes/dev/web_profiler.yaml" + ] + }, "symfony/yaml": { "version": "v5.0.1" }, diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 5feec34..2319e07 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -2,13 +2,10 @@ namespace App\Tests; -use LogicException; use Symfony\Component\HttpFoundation\Response; final class CollectionTest extends AbstractWebTestCase { - // ToDo add tests for page -1, 0, and page size -1, 0, 1 - private const TEST = [ [ 'page' => 1, @@ -69,36 +66,32 @@ public function testPaginationWorks(): void public function testPaginationError(): void { - $this->expectException(LogicException::class); $response = $this->getCollection(-1, 2); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page -1' + 'Assert HTTP 400 is returned for page -1' ); - $this->expectException(LogicException::class); $response = $this->getCollection(0, 2); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page 0' + 'Assert HTTP 400 is returned for page 0' ); - $this->expectException(LogicException::class); $response = $this->getCollection(1, -1); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page size -1' + 'Assert HTTP 400 is returned for page size -1' ); - $this->expectException(LogicException::class); $response = $this->getCollection(1, 0); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page size 0' + 'Assert HTTP 400 is returned for page size 0' ); } diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index fc3997a..c8c999e 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -6,13 +6,6 @@ final class DocumentationTest extends AbstractWebTestCase { - public function testDocumentationIsAvailable(): void - { - $response = $this->get('/api/tle/docs'); - - self::assertEquals(200, $response->getStatusCode(), 'Assert documentation is available'); - } - public function testDocumentationIsCorrect(): void { $response = $this->get('/api/tle/json'); From 6c25ea84254efdd658014f095df22893c52ed725 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 1 Jan 2020 22:46:11 +0100 Subject: [PATCH 004/221] Remove twig --- composer.json | 1 - composer.lock | 688 ++++++++++++----------------- config/bundles.php | 1 - config/custom/general.json | 210 --------- config/custom/tle.json | 2 +- config/packages/test/twig.yaml | 2 - deploy.php | 12 +- symfony.lock | 12 - templates/base-empty.html.twig | 23 - templates/base.html.twig | 12 - templates/pages/api/docs.html.twig | 9 - 11 files changed, 295 insertions(+), 677 deletions(-) delete mode 100644 config/custom/general.json delete mode 100644 config/packages/test/twig.yaml delete mode 100644 templates/base-empty.html.twig delete mode 100644 templates/base.html.twig delete mode 100644 templates/pages/api/docs.html.twig diff --git a/composer.json b/composer.json index b8f8515..a39ec65 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,6 @@ }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/maker-bundle": "^1.9", "symfony/phpunit-bridge": "^5.0", "symfony/profiler-pack": "^1.0" }, diff --git a/composer.lock b/composer.lock index 23d5066..604dad4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c2da72aac0eebb9bc8c88b53206965a5", + "content-hash": "ffa9487bbc881e7e0d42386efe326e94", "packages": [ { "name": "doctrine/annotations", @@ -3401,239 +3401,6 @@ "homepage": "https://symfony.com", "time": "2019-11-18T17:27:11+00:00" }, - { - "name": "symfony/translation-contracts", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-11-18T17:27:11+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.0", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "time": "2019-12-18T16:23:52+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" - }, { "name": "symfony/var-dumper", "version": "v5.0.2", @@ -3829,89 +3596,25 @@ "time": "2019-12-10T11:06:55+00:00" }, { - "name": "twig/twig", - "version": "v3.0.0", + "name": "zendframework/zend-code", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" + "url": "https://github.com/zendframework/zend-code.git", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", "shasum": "" }, "require": { - "php": "^7.2.9", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "php": "^7.1", + "zendframework/zend-eventmanager": "^2.6 || ^3.0" }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "^3.4|^4.2|^5.0", - "symfony/phpunit-bridge": "^4.4@dev|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "homepage": "https://twig.symfony.com/contributors", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "time": "2019-11-15T20:38:32+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" + "conflict": { + "phpspec/prophecy": "<1.9.0" }, "require-dev": { "doctrine/annotations": "^1.7", @@ -3947,6 +3650,7 @@ "code", "zf" ], + "abandoned": "laminas/laminas-code", "time": "2019-12-10T19:21:15+00:00" }, { @@ -4001,6 +3705,7 @@ "events", "zf2" ], + "abandoned": "laminas/laminas-eventmanager", "time": "2018-04-25T15:33:34+00:00" } ], @@ -4136,103 +3841,127 @@ "time": "2019-11-13T15:46:58+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.3.0", + "name": "symfony/phpunit-bridge", + "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", + "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=5.5.9" }, - "require-dev": { - "ircmaxell/php-yacc": "0.0.5", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + "conflict": { + "phpunit/phpunit": "<5.4.3" + }, + "suggest": { + "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" }, "bin": [ - "bin/php-parse" + "bin/simple-phpunit" ], - "type": "library", + "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "5.0-dev" + }, + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "PhpParser\\": "lib/PhpParser" - } + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" + "description": "Symfony PHPUnit Bridge", + "homepage": "https://symfony.com", + "time": "2019-11-28T14:20:16+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "99c4370632c2a59bb0444852f92140074ef02209" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", + "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "*", + "symfony/twig-bundle": "*", + "symfony/web-profiler-bundle": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2019-11-08T13:50:10+00:00" + "description": "A pack for the Symfony web profiler", + "time": "2018-12-10T12:11:44+00:00" }, { - "name": "symfony/maker-bundle", - "version": "v1.14.3", + "name": "symfony/translation-contracts", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c864e7f9b8d1e1f5f60acc3beda11299f637aded", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", + "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", "shasum": "" }, "require": { - "doctrine/inflector": "^1.2", - "nikic/php-parser": "^4.0", - "php": "^7.0.8", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/framework-bundle": "^3.4|^4.0|^5.0", - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "php": "^7.2.5" }, - "require-dev": { - "doctrine/doctrine-bundle": "^1.8|^2.0", - "doctrine/orm": "^2.3", - "friendsofphp/php-cs-fixer": "^2.8", - "friendsoftwig/twigcs": "^3.1.2", - "symfony/http-client": "^4.3|^5.0", - "symfony/phpunit-bridge": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/security-core": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "suggest": { + "symfony/translation-implementation": "" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Bundle\\MakerBundle\\": "src/" + "Symfony\\Contracts\\Translation\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4240,63 +3969,105 @@ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", - "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "code generator", - "generator", - "scaffold", - "scaffolding" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], - "time": "2019-11-07T00:56:03+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { - "name": "symfony/phpunit-bridge", + "name": "symfony/twig-bridge", "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", + "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^7.2.5", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.10|^3.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3" + "symfony/console": "<4.4", + "symfony/form": "<5.0", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.0", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12", + "twig/inky-extra": "^2.12", + "twig/markdown-extra": "^2.12" }, "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" }, - "bin": [ - "bin/simple-phpunit" - ], "type": "symfony-bridge", "extra": { "branch-alias": { "dev-master": "5.0-dev" - }, - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" + "Symfony\\Bridge\\Twig\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4308,45 +4079,92 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PHPUnit Bridge", + "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2019-11-28T14:20:16+00:00" + "time": "2019-12-18T16:23:52+00:00" }, { - "name": "symfony/profiler-pack", - "version": "v1.0.4", + "name": "symfony/twig-bundle", + "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/profiler-pack.git", - "reference": "99c4370632c2a59bb0444852f92140074ef02209" + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", - "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", + "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", "shasum": "" }, "require": { - "php": "^7.0", - "symfony/stopwatch": "*", - "symfony/twig-bundle": "*", - "symfony/web-profiler-bundle": "*" + "php": "^7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Symfony web profiler", - "time": "2018-12-10T12:11:44+00:00" + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "https://symfony.com", + "time": "2019-12-10T11:06:55+00:00" }, { "name": "symfony/web-profiler-bundle", @@ -4411,6 +4229,70 @@ "description": "Symfony WebProfilerBundle", "homepage": "https://symfony.com", "time": "2019-11-21T07:02:40+00:00" + }, + { + "name": "twig/twig", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "shasum": "" + }, + "require": { + "php": "^7.2.9", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "^3.4|^4.2|^5.0", + "symfony/phpunit-bridge": "^4.4@dev|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "homepage": "https://twig.symfony.com/contributors", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "time": "2019-11-15T20:38:32+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index 879419a..fb04fb4 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -4,7 +4,6 @@ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/custom/general.json b/config/custom/general.json deleted file mode 100644 index e70dacc..0000000 --- a/config/custom/general.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "TLE API", - "version": "1.3.0" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": {}, - "components": { - "schemas": { - "ValueUnit": { - "properties": { - "value": { - "type": "float" - }, - "unit": { - "type": "string" - } - } - }, - "Pagination": { - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - }, - "type": "object" - }, - "Exception": { - "properties": { - "response": { - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "METAR": { - "allOf": [ - { - "properties": { - "icao": { - "type": "string", - "example": "LYBE" - }, - "date": { - "type": "string", - "example": "2018-10-23T19:00:00+00:00" - }, - "temperature": { - "$ref": "#/components/schemas/ValueUnit" - }, - "dewPoint": { - "$ref": "#/components/schemas/ValueUnit" - }, - "pressure": { - "$ref": "#/components/schemas/ValueUnit" - }, - "raw": { - "type": "string", - "example": "METAR LYBE 171530Z 11004KT CAVOK 22/04 Q1018 NOSIG" - } - }, - "type": "object" - } - ] - }, - "TLE": { - "allOf": [ - { - "properties": { - "@id": { - "type": "string", - "example": "https://ivanstanojevic.me/api/tle/43630" - }, - "@type": { - "type": "string", - "example": "TleModel" - }, - "satelliteId": { - "type": "integer", - "example": "43630" - }, - "date": { - "type": "string", - "example": "2018-10-21T11:40:23+00:00" - }, - "name": { - "type": "string", - "example": "HTV-7 (KOUNOTORI 7)" - }, - "line1": { - "type": "string", - "example": "1 43630U 18073A 18285.64337553 .00002296 00000-0 42374-4 0 9998" - }, - "line2": { - "type": "string", - "example": "2 43630 51.6412 153.3949 0003517 275.8456 137.9883 15.53813372136786" - } - }, - "type": "object" - } - ] - } - }, - "responses": { - "404": { - "description": "Resource not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "code": 404, - "message": "Not found" - } - } - } - } - }, - "500": { - "description": "Server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "code": 500, - "message": "Server error" - } - } - } - } - } - }, - "parameters": { - "search": { - "name": "search", - "in": "query", - "description": "Search string", - "schema": { - "type": "string", - "default": "*" - } - }, - "sortDirection": { - "name": "sort-dir", - "in": "query", - "description": "Sort direction", - "schema": { - "type": "string", - "default": "asc", - "enum": [ - "asc", - "desc" - ] - } - }, - "pageNumber": { - "name": "page", - "in": "query", - "description": "Page number", - "schema": { - "type": "integer", - "default": 1, - "minimum": "1" - } - }, - "pageSize": { - "name": "page-size", - "in": "query", - "description": "Number of items per page", - "schema": { - "type": "integer", - "default": "50" - } - } - } - } -} diff --git a/config/custom/tle.json b/config/custom/tle.json index 1af51be..48670b2 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -310,4 +310,4 @@ } } } -} +} \ No newline at end of file diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml deleted file mode 100644 index 8c6e0b4..0000000 --- a/config/packages/test/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - strict_variables: true diff --git a/deploy.php b/deploy.php index ec33a3d..f4de55d 100644 --- a/deploy.php +++ b/deploy.php @@ -11,11 +11,17 @@ set('git_tty', true); // Shared files/dirs between deploys -add('shared_files', []); -add('shared_dirs', []); +add('shared_files', [ + '.env' +]); +add('shared_dirs', [ + 'var' +]); // Writable dirs by web server -add('writable_dirs', []); +add('writable_dirs', [ + 'var' +]); // Hosts diff --git a/symfony.lock b/symfony.lock index cb43eda..e9c1c0e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -96,9 +96,6 @@ "myclabs/php-enum": { "version": "1.7.2" }, - "nikic/php-parser": { - "version": "v4.3.0" - }, "ocramius/package-versions": { "version": "1.5.1" }, @@ -225,15 +222,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/maker-bundle": { - "version": "1.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.0", - "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" - } - }, "symfony/mime": { "version": "v5.0.1" }, diff --git a/templates/base-empty.html.twig b/templates/base-empty.html.twig deleted file mode 100644 index 5ecab0c..0000000 --- a/templates/base-empty.html.twig +++ /dev/null @@ -1,23 +0,0 @@ - - - - {% block head %} - - - {% block title %}{{ app_name }}{% endblock %} - {% block stylesheets %} -{# #} - - {% endblock %} - {% endblock %} - - - {% block body %} - {% block javascripts %} - - - {% endblock %} - {% endblock %} - - diff --git a/templates/base.html.twig b/templates/base.html.twig deleted file mode 100644 index 043f42d..0000000 --- a/templates/base.html.twig +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {% block title %}Welcome!{% endblock %} - {% block stylesheets %}{% endblock %} - - - {% block body %}{% endblock %} - {% block javascripts %}{% endblock %} - - diff --git a/templates/pages/api/docs.html.twig b/templates/pages/api/docs.html.twig deleted file mode 100644 index 770fac5..0000000 --- a/templates/pages/api/docs.html.twig +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'base-empty.html.twig' %} - -{% block title %} API Documentation | {{ parent() }}{% endblock %} - -{% block body %} -
- {{ parent() }} -{% endblock %} - From 0cd4d6fff8e4afebec79e8e4604513e1ee4f6971 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 1 Jan 2020 23:04:27 +0100 Subject: [PATCH 005/221] change deployment --- composer.json | 2 -- deploy.php | 57 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index a39ec65..01586f7 100644 --- a/composer.json +++ b/composer.json @@ -52,8 +52,6 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd", - "doctrine:migrations:migrate --no-interaction": "symfony-cmd", "cache:warmup": "symfony-cmd" }, "post-install-cmd": [ diff --git a/deploy.php b/deploy.php index f4de55d..ae59b2f 100644 --- a/deploy.php +++ b/deploy.php @@ -8,21 +8,29 @@ set('repository', 'https://github.com/ivanstan/tle-api'); // [Optional] Allocate tty for git clone. Default value is false. -set('git_tty', true); +set('git_tty', true); // Shared files/dirs between deploys -add('shared_files', [ - '.env' -]); -add('shared_dirs', [ - 'var' -]); +add( + 'shared_files', + [ + '.env' + ] +); +add( + 'shared_dirs', + [ + 'var' + ] +); // Writable dirs by web server -add('writable_dirs', [ - 'var' -]); - +add( + 'writable_dirs', + [ + 'var' + ] +); // Hosts @@ -31,12 +39,31 @@ ->port(2233) ->stage('production') ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); - + // Tasks -task('build', function () { - run('cd {{release_path}} && build'); -}); +task( + 'deploy', + [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', + ] +); // [Optional] if deploy fails automatically unlock. after('deploy:failed', 'deploy:unlock'); From d791e757b7b4550b6c6c017f7f82d1e933d887d8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 20:50:09 +0100 Subject: [PATCH 006/221] add twig as dev dependency --- composer.lock | 89 +++++++++++++++++++++++++++++++++++++++++++++- config/bundles.php | 1 + deploy.php | 10 +++--- symfony.lock | 6 ++++ 4 files changed, 99 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 604dad4..85cd8ca 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ffa9487bbc881e7e0d42386efe326e94", + "content-hash": "22241f1d5382f4ed3664dbec0f50d5f0", "packages": [ { "name": "doctrine/annotations", @@ -4166,6 +4166,34 @@ "homepage": "https://symfony.com", "time": "2019-12-10T11:06:55+00:00" }, + { + "name": "symfony/twig-pack", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-pack.git", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-pack/zipball/8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/twig-bundle": "*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Twig pack for Symfony projects", + "time": "2019-10-17T05:44:22+00:00" + }, { "name": "symfony/web-profiler-bundle", "version": "v5.0.2", @@ -4230,6 +4258,65 @@ "homepage": "https://symfony.com", "time": "2019-11-21T07:02:40+00:00" }, + { + "name": "twig/extra-bundle", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", + "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/framework-bundle": "^4.3|^5.0", + "symfony/twig-bundle": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "time": "2019-12-28T07:09:27+00:00" + }, { "name": "twig/twig", "version": "v3.0.0", diff --git a/config/bundles.php b/config/bundles.php index fb04fb4..26f3038 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,4 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/deploy.php b/deploy.php index ae59b2f..334cc9a 100644 --- a/deploy.php +++ b/deploy.php @@ -9,6 +9,9 @@ // [Optional] Allocate tty for git clone. Default value is false. set('git_tty', true); +set('bin_dir', 'bin'); +set('http_user', 'glutenfr'); +set('writable_mode', 'chmod'); // Shared files/dirs between deploys add( @@ -25,12 +28,7 @@ ); // Writable dirs by web server -add( - 'writable_dirs', - [ - 'var' - ] -); +add('writable_dirs', []); // Hosts diff --git a/symfony.lock b/symfony.lock index e9c1c0e..1fcaa55 100644 --- a/symfony.lock +++ b/symfony.lock @@ -299,6 +299,9 @@ "templates/base.html.twig" ] }, + "symfony/twig-pack": { + "version": "v1.0.0" + }, "symfony/var-dumper": { "version": "v5.0.1" }, @@ -322,6 +325,9 @@ "symfony/yaml": { "version": "v5.0.1" }, + "twig/extra-bundle": { + "version": "v3.0.1" + }, "twig/twig": { "version": "v3.0.0" }, From 7d90b5cf17334da9b8e6c0d2d379f29bb1663a26 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 22:12:24 +0100 Subject: [PATCH 007/221] setup tests before deploy --- deploy.php | 81 +++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/deploy.php b/deploy.php index 334cc9a..f5c94eb 100644 --- a/deploy.php +++ b/deploy.php @@ -1,72 +1,49 @@ -user('glutenfr') ->port(2233) ->stage('production') ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); -// Tasks - -task( - 'deploy', - [ - 'deploy:info', - 'deploy:prepare', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:clear_paths', - 'deploy:create_cache_dir', - 'deploy:shared', - 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'deploy:writable', - 'database:migrate', - 'deploy:symlink', - 'deploy:unlock', - 'cleanup', - ] -); - -// [Optional] if deploy fails automatically unlock. +task('test', function () { + set('symfony_env', 'dev'); + runLocally('bin/phpunit'); +}); + +task('deploy', [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', +]); + +before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); - -// Migrate database before symlink new release. - -before('deploy:symlink', 'database:migrate'); - From 6dbb1b9c01a8696591bd4eb09bfb9ba5e72ffa80 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 22:59:18 +0100 Subject: [PATCH 008/221] update documentation --- config/custom/tle.json | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 48670b2..fe47e27 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -13,7 +13,7 @@ "/api/tle/{id}": { "get": { "summary": "Record", - "operationId": "tle-record", + "operationId": "record", "parameters": [ { "name": "id", @@ -48,24 +48,15 @@ "/api/tle": { "get": { "summary": "Collection", - "operationId": "tle-collection", + "operationId": "collection", "parameters": [ { "$ref": "#/components/parameters/search" }, - { - "name": "prn", - "in": "query", - "description": "Filter by pseudo-random noise.", - "schema": { - "type": "number", - "default": "null" - } - }, { "name": "sort", "in": "query", - "description": "Sort field", + "description": "Sort by", "schema": { "type": "string", "default": "name", @@ -182,9 +173,6 @@ "properties": { "response": { "properties": { - "code": { - "type": "integer" - }, "message": { "type": "string" } @@ -206,10 +194,6 @@ "type": "string", "example": "TleModel" }, - "satelliteId": { - "type": "integer", - "example": "43630" - }, "name": { "type": "string", "example": "HTV-7 (KOUNOTORI 7)" @@ -242,7 +226,6 @@ }, "example": { "response": { - "code": 404, "message": "Not found" } } @@ -258,7 +241,6 @@ }, "example": { "response": { - "code": 500, "message": "Server error" } } @@ -296,7 +278,7 @@ "schema": { "type": "integer", "default": 1, - "minimum": "1" + "minimum": 1 } }, "pageSize": { @@ -305,7 +287,9 @@ "description": "Number of items per page", "schema": { "type": "integer", - "default": "50" + "default": 20, + "minimum": 1, + "maximum": 100 } } } From b06ca938a0c4044f0faf679a46e5076f7c2cf39e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 3 Jan 2020 22:04:45 +0100 Subject: [PATCH 009/221] fix tests --- composer.json | 3 +- composer.lock | 478 +------------------------ config/bootstrap.php | 10 +- config/bundles.php | 2 - config/packages/dev/web_profiler.yaml | 6 - config/packages/test/web_profiler.yaml | 6 - config/parameters.yaml | 1 - config/routes/dev/web_profiler.yaml | 7 - src/Serializer/TleModelNormalizer.php | 1 - symfony.lock | 46 --- tests/TleTest.php | 2 - 11 files changed, 7 insertions(+), 555 deletions(-) delete mode 100644 config/packages/dev/web_profiler.yaml delete mode 100644 config/packages/test/web_profiler.yaml delete mode 100644 config/routes/dev/web_profiler.yaml diff --git a/composer.json b/composer.json index 01586f7..ba6d382 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,7 @@ }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0", - "symfony/profiler-pack": "^1.0" + "symfony/phpunit-bridge": "^5.0" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index 85cd8ca..7625623 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "22241f1d5382f4ed3664dbec0f50d5f0", + "content-hash": "757b98014fe5c4a0788a2cbb83297329", "packages": [ { "name": "doctrine/annotations", @@ -3904,482 +3904,6 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "time": "2019-11-28T14:20:16+00:00" - }, - { - "name": "symfony/profiler-pack", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/profiler-pack.git", - "reference": "99c4370632c2a59bb0444852f92140074ef02209" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", - "reference": "99c4370632c2a59bb0444852f92140074ef02209", - "shasum": "" - }, - "require": { - "php": "^7.0", - "symfony/stopwatch": "*", - "symfony/twig-bundle": "*", - "symfony/web-profiler-bundle": "*" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A pack for the Symfony web profiler", - "time": "2018-12-10T12:11:44+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-11-18T17:27:11+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.0", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "time": "2019-12-18T16:23:52+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" - }, - { - "name": "symfony/twig-pack", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-pack.git", - "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-pack/zipball/8b278ea4b61fba7c051f172aacae6d87ef4be0e0", - "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0", - "shasum": "" - }, - "require": { - "php": "^7.0", - "symfony/twig-bundle": "*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A Twig pack for Symfony projects", - "time": "2019-10-17T05:44:22+00:00" - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "6cc40446060e174a690e0f6da90731133b29b664" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6cc40446060e174a690e0f6da90731133b29b664", - "reference": "6cc40446060e174a690e0f6da90731133b29b664", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/form": "<4.4", - "symfony/messenger": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony WebProfilerBundle", - "homepage": "https://symfony.com", - "time": "2019-11-21T07:02:40+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", - "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "require-dev": { - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "time": "2019-12-28T07:09:27+00:00" - }, - { - "name": "twig/twig", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "shasum": "" - }, - "require": { - "php": "^7.2.9", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "^3.4|^4.2|^5.0", - "symfony/phpunit-bridge": "^4.4@dev|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "homepage": "https://twig.symfony.com/contributors", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "time": "2019-11-15T20:38:32+00:00" } ], "aliases": [], diff --git a/config/bootstrap.php b/config/bootstrap.php index 1a0c60f..d40335e 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -15,16 +15,16 @@ && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] ) { foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v); + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); } -} elseif (!class_exists(Dotenv::class)) { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} else { +} elseif (class_exists(Dotenv::class)) { // load all the .env files (new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); } -if ('test' === $_SERVER['APP_ENV']) { +if ($_SERVER['APP_ENV'] === 'test') { $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel $kernel->boot(); diff --git a/config/bundles.php b/config/bundles.php index 26f3038..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,6 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml deleted file mode 100644 index e92166a..0000000 --- a/config/packages/dev/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: true - intercept_redirects: false - -framework: - profiler: { only_exceptions: false } diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml deleted file mode 100644 index 03752de..0000000 --- a/config/packages/test/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: false - intercept_redirects: false - -framework: - profiler: { collect: false } diff --git a/config/parameters.yaml b/config/parameters.yaml index 89b37f7..05163a5 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -1,2 +1 @@ parameters: - app_name: 'TLE API' diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml deleted file mode 100644 index c82beff..0000000 --- a/config/routes/dev/web_profiler.yaml +++ /dev/null @@ -1,7 +0,0 @@ -web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt - -web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 0e8bedd..57201d0 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -32,7 +32,6 @@ public function normalize($entity, string $format = null, array $context = []) return [ '@id' => $id, '@type' => 'TleModel', - 'satelliteId' => $model->getId(), 'name' => $model->getName(), 'date' => $model->getDate(), 'line1' => $model->getLine1(), diff --git a/symfony.lock b/symfony.lock index 1fcaa55..412623f 100644 --- a/symfony.lock +++ b/symfony.lock @@ -253,9 +253,6 @@ "symfony/polyfill-php73": { "version": "v1.13.1" }, - "symfony/profiler-pack": { - "version": "v1.0.4" - }, "symfony/routing": { "version": "4.2", "recipe": { @@ -279,58 +276,15 @@ "symfony/stopwatch": { "version": "v5.0.1" }, - "symfony/translation-contracts": { - "version": "v2.0.1" - }, - "symfony/twig-bridge": { - "version": "v5.0.1" - }, - "symfony/twig-bundle": { - "version": "5.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "5.0", - "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" - }, - "files": [ - "config/packages/test/twig.yaml", - "config/packages/twig.yaml", - "templates/base.html.twig" - ] - }, - "symfony/twig-pack": { - "version": "v1.0.0" - }, "symfony/var-dumper": { "version": "v5.0.1" }, "symfony/var-exporter": { "version": "v5.0.1" }, - "symfony/web-profiler-bundle": { - "version": "3.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "3.3", - "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" - }, - "files": [ - "config/packages/dev/web_profiler.yaml", - "config/packages/test/web_profiler.yaml", - "config/routes/dev/web_profiler.yaml" - ] - }, "symfony/yaml": { "version": "v5.0.1" }, - "twig/extra-bundle": { - "version": "v3.0.1" - }, - "twig/twig": { - "version": "v3.0.0" - }, "zendframework/zend-code": { "version": "3.4.1" }, diff --git a/tests/TleTest.php b/tests/TleTest.php index 3829923..062b163 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -18,7 +18,6 @@ public function testTleSingleRecord(): void self::assertArrayHasKey('@id', $response); self::assertArrayHasKey('@type', $response); - self::assertArrayHasKey('satelliteId', $response); self::assertArrayHasKey('name', $response); self::assertArrayHasKey('date', $response); self::assertArrayHasKey('line1', $response); @@ -26,7 +25,6 @@ public function testTleSingleRecord(): void self::assertEquals('http://localhost/api/tle/'.$tle->getId(), $response['@id']); self::assertEquals('TleModel', $response['@type']); - self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals(TleFixtures::$date, $response['date']); self::assertEquals($tle->getLine1(), $response['line1']); From e182fb67862dd1d05289a031e872ae21704b0ff9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 3 Jan 2020 22:17:32 +0100 Subject: [PATCH 010/221] fix code issues --- deploy.php | 6 ++++++ src/Command/DoctrineReloadCommand.php | 13 +++++++++---- src/Kernel.php | 7 +++++++ src/Migrations/Version20191217203053.php | 8 ++------ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/deploy.php b/deploy.php index f5c94eb..2e0c7f2 100644 --- a/deploy.php +++ b/deploy.php @@ -25,6 +25,11 @@ runLocally('bin/phpunit'); }); + +task('dump-autoload', function () { + run('composer dump-env prod'); +}); + task('deploy', [ 'deploy:info', 'deploy:prepare', @@ -38,6 +43,7 @@ 'deploy:vendors', 'deploy:cache:clear', 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', 'database:migrate', 'deploy:symlink', diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 784de82..95ea3bc 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -11,8 +11,6 @@ final class DoctrineReloadCommand extends Command { - protected static $defaultName = 'doctrine:reload'; - private static array $choices = [ 'y' => 'Yes', 'n' => 'No', @@ -31,11 +29,18 @@ public function __construct($env) $this->env = $env; } + /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { - $this->setDescription('Purge database, execute migrations and load fixtures'); + $this + ->setName('doctrine:reload') + ->setDescription('Purge database, execute migrations and load fixtures'); } + /** + * @noinspection PhpMissingParentCallCommonInspection + * @throws \Exception + */ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); @@ -51,7 +56,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $application = $this->getApplication(); if ($application === null) { - return 1; + throw new \RuntimeException('Application instance not found.'); } if ($input->getOption('no-interaction') || $helper->ask($input, $output, $question) === 'y') { diff --git a/src/Kernel.php b/src/Kernel.php index 5ffa385..65c5230 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -15,6 +15,10 @@ class Kernel extends BaseKernel private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; + /** + * @noinspection UsingInclusionReturnValueInspection + * @noinspection PhpIncludeInspection + */ public function registerBundles(): iterable { $contents = require $this->getProjectDir().'/config/bundles.php'; @@ -25,11 +29,13 @@ public function registerBundles(): iterable } } + /** @noinspection PhpMissingParentCallCommonInspection */ public function getProjectDir(): string { return \dirname(__DIR__); } + /** @throws \Exception */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); @@ -44,6 +50,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); } + /** @throws \Exception */ protected function configureRoutes(RouteCollectionBuilder $routes): void { $confDir = $this->getProjectDir().'/config'; diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index 9147c0d..db9f18d 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -9,11 +9,7 @@ final class Version20191217203053 extends AbstractMigration { - public function getDescription(): string - { - return ''; - } - + /** @throws \Exception */ public function up(Schema $schema): void { $this->abortIf( @@ -26,9 +22,9 @@ public function up(Schema $schema): void ); } + /** @throws \Exception */ public function down(Schema $schema): void { - // this down() migration is auto-generated, please modify it to your needs $this->abortIf( $this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.' From 53afc0176191171e6971f4f5975e5b6c7c42c2ec Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:05:44 +0100 Subject: [PATCH 011/221] Create php.yml --- .github/workflows/php.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/php.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml new file mode 100644 index 0000000..8962a94 --- /dev/null +++ b/.github/workflows/php.yml @@ -0,0 +1,26 @@ +name: PHP Composer + +on: + push: + branches: + - production + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" + # Docs: https://getcomposer.org/doc/articles/scripts.md + + # - name: Run test suite + # run: composer run-script test From 6e6aa21615379b389421a53cccb52b29b543ef78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:20:29 +0100 Subject: [PATCH 012/221] add travis ci --- README.md | 1 + composer.json | 3 ++- travis.yaml | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 travis.yaml diff --git a/README.md b/README.md index 63c73b4..f22dc3e 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,4 @@ ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) +[![Known Vulnerabilities](https://snyk.io/test/github/ivanstan/tle-api/badge.svg?targetFile=composer.lock)](https://snyk.io/test/github/ivanstan/tle-api?targetFile=composer.lock) \ No newline at end of file diff --git a/composer.json b/composer.json index ba6d382..1683ff5 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,8 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd" + "cache:warmup": "symfony-cmd", + "test": "bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" diff --git a/travis.yaml b/travis.yaml new file mode 100644 index 0000000..d2bc1be --- /dev/null +++ b/travis.yaml @@ -0,0 +1,19 @@ +language: php + +cache: + directories: + - $HOME/.composer/cache + +branches: + only: + - master + +matrix: + include: + - php: 7.4 + +install: + - composer update $COMPOSER_FLAGS + +script: + - composer test \ No newline at end of file From e938182765865e981f65b95dc161611c2625ee78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:28:35 +0100 Subject: [PATCH 013/221] Rename travis.yaml to travis.yml --- travis.yaml => travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename travis.yaml => travis.yml (91%) diff --git a/travis.yaml b/travis.yml similarity index 91% rename from travis.yaml rename to travis.yml index d2bc1be..006f820 100644 --- a/travis.yaml +++ b/travis.yml @@ -16,4 +16,4 @@ install: - composer update $COMPOSER_FLAGS script: - - composer test \ No newline at end of file + - composer test From f22ac4abfa6d40880e9bb660b364abac8fe8a23c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:29:37 +0100 Subject: [PATCH 014/221] Rename travis.yml to .travis.yaml --- travis.yml => .travis.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename travis.yml => .travis.yaml (100%) diff --git a/travis.yml b/.travis.yaml similarity index 100% rename from travis.yml rename to .travis.yaml From 0d5c94012a828f32e837dfdd7102ba55367f97b3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:30:00 +0100 Subject: [PATCH 015/221] Rename .travis.yaml to .travis.yml --- .travis.yaml => .travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .travis.yaml => .travis.yml (100%) diff --git a/.travis.yaml b/.travis.yml similarity index 100% rename from .travis.yaml rename to .travis.yml From dc5b73d350b7a80902edad2b36bdd6063341bc10 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:35:58 +0100 Subject: [PATCH 016/221] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1683ff5..154cefc 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "auto-scripts": { "cache:clear": "symfony-cmd", "cache:warmup": "symfony-cmd", - "test": "bin/phpunit" + "test": "php bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" From be3700edc4cd17f60a41e8189c02aa6fbe578b77 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:38:07 +0100 Subject: [PATCH 017/221] add travis ci --- .travis.yml | 2 +- composer.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 006f820..26637aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ matrix: - php: 7.4 install: - - composer update $COMPOSER_FLAGS + - composer install script: - composer test diff --git a/composer.json b/composer.json index 154cefc..9b19612 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "symfony/yaml": "5.0.*" }, "require-dev": { + "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.0" }, From c6d57b08c81d952cea418c651fa02c94ebb86a26 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:40:14 +0100 Subject: [PATCH 018/221] add travis ci --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9b19612..944765b 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,7 @@ "auto-scripts": { "cache:clear": "symfony-cmd", "cache:warmup": "symfony-cmd", - "test": "php bin/phpunit" + "test": "@php bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" From 17171cc4a1c8a269a69f241c6e23e692f29d6ec5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:00:01 +0100 Subject: [PATCH 019/221] add travis ci --- .env.test | 1 + .travis.yml | 3 +++ composer.json | 6 +++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.env.test b/.env.test index d048686..8f679b3 100644 --- a/.env.test +++ b/.env.test @@ -3,3 +3,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther +DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 26637aa..48923d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: php +services: + - mysql + cache: directories: - $HOME/.composer/cache diff --git a/composer.json b/composer.json index 944765b..7930a5f 100644 --- a/composer.json +++ b/composer.json @@ -52,15 +52,15 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd", - "test": "@php bin/phpunit" + "cache:warmup": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" - ] + ], + "test": "@php bin/phpunit" }, "conflict": { "symfony/symfony": "*" From f005b4dc0997f99b7022d27e32b2944da63ba22c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:13:58 +0100 Subject: [PATCH 020/221] add coveralls --- .coveralls.yml | 1 + README.md | 3 ++- composer.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 .coveralls.yml diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..f28385f --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1 @@ +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo \ No newline at end of file diff --git a/README.md b/README.md index f22dc3e..0ef2d36 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # TLE API +[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) + ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -[![Known Vulnerabilities](https://snyk.io/test/github/ivanstan/tle-api/badge.svg?targetFile=composer.lock)](https://snyk.io/test/github/ivanstan/tle-api?targetFile=composer.lock) \ No newline at end of file diff --git a/composer.json b/composer.json index 7930a5f..e5e6959 100644 --- a/composer.json +++ b/composer.json @@ -60,7 +60,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit" + "test": "@php bin/phpunit --coverage-text" }, "conflict": { "symfony/symfony": "*" From a146b8dbe8353a3d44fe7bd52d7d972d0365aefa Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:19:49 +0100 Subject: [PATCH 021/221] add coveralls --- .coveralls.yml | 5 ++++- .travis.yml | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index f28385f..93f2685 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1 +1,4 @@ -repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo \ No newline at end of file +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json +service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 48923d2..f9d1ab5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,14 @@ matrix: include: - php: 7.4 +before_install: + - composer require satooshi/php-coveralls:dev-master + install: - composer install script: - - composer test + - php bin/phpunit --coverage-clover ./tests/logs/clover.xml + +after_script: + - php vendor/bin/coveralls -v From 24a4fb160f6834c6d011456c7be52ea053de25ea Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:21:33 +0100 Subject: [PATCH 022/221] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f9d1ab5..f5bee87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ matrix: - php: 7.4 before_install: - - composer require satooshi/php-coveralls:dev-master + - composer require satooshi/php-coveralls install: - composer install From 86a584af9a5acd94a38dbba974975cb7cb9ab145 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:31:25 +0100 Subject: [PATCH 023/221] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f5bee87..6ef876a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/bin/coveralls -v + - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage-clover ./tests/logs/clover.xml From b83e50ce4a94e1ec297fa2526e435bc7d4324434 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:34:18 +0100 Subject: [PATCH 024/221] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6ef876a..c43e132 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage-clover ./tests/logs/clover.xml + - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage_clover ./tests/logs/clover.xml From 1dcf63d14c8997c76916bba9713a949d6c3dc936 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:38:32 +0100 Subject: [PATCH 025/221] add coveralls --- .coveralls.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index 93f2685..15d2afe 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,4 +1 @@ repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo -coverage_clover: tests/logs/clover.xml -json_path: tests/logs/coveralls-upload.json -service_name: travis-ci \ No newline at end of file From 6a793a806b0d0511178e92c5bb7354923fdaa226 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:42:06 +0100 Subject: [PATCH 026/221] `add coveralls` --- .coveralls.yml | 3 +++ .travis.yml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.coveralls.yml b/.coveralls.yml index 15d2afe..93f2685 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1 +1,4 @@ repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json +service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index c43e132..a85f38e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage_clover ./tests/logs/clover.xml + - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml From 6c6b349bca69e86b8e38bba1b265e9dd933f0555 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:47:38 +0100 Subject: [PATCH 027/221] `add coveralls` --- .travis.yml | 3 +++ README.md | 2 ++ 2 files changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index a85f38e..b7cf21c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,7 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: + - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" + - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" + - export CI_BRANCH="$TRAVIS_BRANCH" - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml diff --git a/README.md b/README.md index 0ef2d36..45c3f31 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,5 @@ ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) + +Code repository that powers TLE API, listed on NASA api page \ No newline at end of file From 9b942103857690a898eaf6265a0d9ecc54caefe0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:55:53 +0100 Subject: [PATCH 028/221] `add coveralls` --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c3f31..88a3b42 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +[![Coverage Status](https://coveralls.io/repos/github/ivanstan/tle-api/badge.svg?branch=master)](https://coveralls.io/github/ivanstan/tle-api?branch=master) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -Code repository that powers TLE API, listed on NASA api page \ No newline at end of file +Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ + From b308d456ba5ffe1bd5ffc238cb20572c1d502ddc Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:10:44 +0100 Subject: [PATCH 029/221] update documentation --- README.md | 27 +++++++++++++-- docs/logo512.png | Bin 0 -> 36838 bytes docs/tle.html | 56 +++++++++++++++++++++++++++++++ src/Controller/ApiController.php | 2 +- tests/DocumentationTest.php | 2 +- 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 docs/logo512.png create mode 100644 docs/tle.html diff --git a/README.md b/README.md index 88a3b42..b3efc73 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,32 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) -[![Coverage Status](https://coveralls.io/repos/github/ivanstan/tle-api/badge.svg?branch=master)](https://coveralls.io/github/ivanstan/tle-api?branch=master) - ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ +Code repository that powers TLE API backend, listed on NASA API catalog +https://api.nasa.gov/ + +API provides up to date two line element set records, the data is updated +daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) +is a data format encoding a list of orbital elements of an +Earth-orbiting object for a given point in time. +For more information on TLE data format visit [Definition of +Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). + +## Usage +Further documentation and response examples are available at: +http://data.ivanstanojevic.me/api/tle/docs + + +Available endpoints +The TLE API consists of two endpoints GET http://data.ivanstanojevic.me + +| Endpoint | Description | +|----------|:------:| +| `GET /api/tle?search={q}` | Perform search by satellite name | +| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | +Example query +http://data.ivanstanojevic.me/api/tle diff --git a/docs/logo512.png b/docs/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..2a06d5e7e8ba9f7eb8bbec665675b07c115fceac GIT binary patch literal 36838 zcmce-cQo8z*Ec){A(4d9OO%*|h~A@RMlgDaUW4debb=YFdN0vMFF~|O2qTFa(Fq|+ z1`#bX2!k=-_bb2ay6^X1>%HDTp7lHrYmJ%lJ?HGR&pu~=_Gj-Ct$$nn!a4SH5D4Ug zriQ8k1Of%$LLt;=z(0Gz6Gz}5Hh(oUe?xC4{~$YGM~Je6_dQ1*O;0;#M*~MYhmiaI zj*1WnIiIVMnZKE?j=a6Mr-;;x|Oa zZitFY3X99gONq%#NbvmYhZh{p*TG5NKo#|`vA|DCye|I!KJucXK|w(xL6RcgzRsfJ za&mH_ViKYf62jmU!hRuM{&vB_UViX@_n_+NXYcFkGNORdiniJO`yU=gYA4o#YMzUr}Xa!b#?#$ANBP7uc!U|4IKYl-v7^z{ft6<97PQr z{k#Kw?ZJg}f}alMBd_A?Xy@Iy?g!S)h=igVz>Gp>}#Qwfw z{yqdb|M!FK-`D@;CY}E@|3B6J|Cq%8e(C>5_y0pj|67#vpS%AbOYnbnxfbb9SL}aT zmD9-FHxwKL40>U-EbqBo6-k)h-e4m<^>2bR7rMLn(KFgiYD`X!X!x4S8)|SAAr%Ru zf**JomqPHBECf3DS!^%%cW{O}YbNNTHi3tfwv7?8Kr!3elqd}S;(4!g2$3NXy?mcF zlLi8@g>()kMx9WF5ZP#h(t6W>6XINLl9j@-v1+Q^BL%!z*xPS~tp;n%>uZU>5A zOZd^ND4xfObf-&)^hgG0-S$n0p~->znHp3163#ZyD%E zb=vX6lX{ovPLH}X5F|0a4{KsdSGMYS z0VnxDBJ@zWYvJeB#YPF?6iUJY!R_xXXVdAqY?kUR56(7pENt%@M!|tJMt&Nfu?q^p z>Q{Eq{ZYgdlD-i>GmpCTj{Zr4aM0i~HqY8_v;3uN*QIsnqr}qrI)-b(NJg zL(IdM)JS(w=Ves!7>qR@2o-|WM*Z4+nJBM7<>KO!Vj;3WR=c&*gtiebEe+{grO_9A zKJ6MwiATT9O2~Utk#WK%2>HT{Hoq7=FdsV8(VYG5Hvgni#+{AQ+s2)&j-|*F=EY3H zCkP~o3?i$LvJad|q?&?vrrgS;KH6DPmOs*>2|sQV9UrK(vK7C0RSN!!^-wm45Y~PNlf09wJDIN3SrI;FQD}NZFCDB@$LHX+n-N-r`X66T`5{ysn$yE z2locIFO`~3Q&W7gqga-c&;#gW0sNG77lP4%GP32@Tr&^p#mJ5l*%iUdchH*mFR!dR z*&J*OzDe(8`7I5Fc%Z~6Aw_B=n<*wVj7asF5AhM6>c3;8AZ`8Ac+C$MWDVz0VT-I) zX6MSsP5pc^ry%GGkl3|!?^oYb&Z|6K>r%C7?C>q(igfqAiAf`alh^Xb&2KW^Jey8) zaCRE0-3r(n!>6YG(6!!hlne=r>ovs(Ku`BvP9(iTGM0KD+(jc>EuN(lMzkv{j{0}* z$ZXA8s(9yh=nQ<*(e>PXiPHt}ga2}kf${49GZ-fqg zlj_jM+L&#w!8udD$2P6+F4wldd}Y%c%(H<{)R*&(tFdfx4YIJ6s=|@ zTO5&cjucO)sdYx*I>|uWuCH~HEPU};%?Arp^Dc&U9J<7h+Fig138nQXxTza)YveOj z8yv!-QgaWO+hIikvr`EF!ko^!Fq=ga<^I*?mCdgFr$2!AlU} zu#>?aWU*INT`zpF?OLc8K@^$6miGwpO$<}3R>RHM54jofdgfSyXs(Jz17xkq&;7#S zp!y)x;WvT0BNPI0fON)xK)vU#e7mo)%&mvFaiyRzhU;IIhO$jeo7Jq7m)MSMXNrVh ztcmMf$LVPiY3J@49rtPzjhT6x-tZ#fG(I$TYT&%tAU=b;qGKMKw;SCYhndQ` zHE96%8TLBr>ity~{-7#zQ`%OYs3|;LU3uMjgBah0<~^^Ic`X6!4<7# zQB~JzJUCBhWiQEnd48sTQi3LFXi4QCcio9nC0T5RJ0^sOh9-C^ z>8n$Df4wCj@QZ_wGyp#oI|UA+?cYkyM{<&jZSUS0f3p90poaDQvyaN9YKPZpZ12x` z!HY#fQNS~cLzHA_xZC9IEj$;nDv};SOYu;aq@A6snmJQ9Dw;1>+6sJ?p;bin@>f)s z>s2o;hEi8_K(dPhi5v>a zXjNiqY3)l-z29kXGYBm~R>kE74ETZsO(M&aEEkV314ptHhFr>|3ABmR8PB?ElRR4C z1_&UUi2ZTrNuAKCJYA1OcZ2JO$V*#*_m(XqDhIL#`B7*ezbN1;Gf>z`ZR=UulS9B@*l!J_ghpBLTkhhE{A zq2Y0I@QO(2;pZ#%WO%oCQ)m@GTLvRYNPy=6D}*kV0KCrQ?|UlWkToP*pr{4xe_WEf zA*C!*4*$;k)}*9EY!xAHFF?8#pmuidH8wIPcBitc=rb?PVlj*dD(|-a19y^@310-%eppx9hwf)ut>DQg3?|QdKMt(0pWhVWV&_AH;(2fop_DI%m0*^-uKjUCC%St(dGMy`qjV#S~4pg6Bo{ zbp>Vh^_n-IP4A1CbyN4P99yRm?m$TQKkHJfM3= zmaDEl!Eu*{0%Czr$4yEq=&GE33!a%N-~+AZ{H0``7(>w`Lh z-DJi;euc(~mb($c5{PYC9XN*lFWBuudpZbMxN2T3_3iQ~Z(AsWQCG$x2cFzL`Vw@v zh#T0vz|Lh}083g8u=-W*oUfp3za*KFMG3q8)$3rfV=iqS|8i#5hQita-*9HZ&X`6_ zTr+QOV*q-C^I~>>){CimMeRA$qe(f{HZBsz|C~mMpqY58StNX$&h%11RDGff1(bvITv zF~`WkY4oj)=^F`p^#pDf{A%BV7BRd70-~pp2qr{oviKqC=O}qfa*Bp`S^sC z&v6)?3w_KVZC3Ekica?*Kp-!D!tk*+UB=VM{Lrcp6%ZkqbYY+V!nP#)`i=K*1>P}t z6`7ne)ep5e7ayln5Bptt=$5B(mkWN2|DNbWzV<`4&XSwRuE7o6`rP9LMxxTmrmH7@ zc<57M&_YK+gQP^$*nWe6UiOpfpQ|3 z9MaM)HqCzk?`cQgY_Fd6>HPWgIu%>7_I(w73`aFLIVFe0 zAnak2354xA!|E;szk+UaMY_iLnob!ABGWT|=!2vMNmlg21-;6?o6I0glvb2iTg`dk z5*++69(5*mb{)k-e~2jkLHrYXEQm*R;R>=|2#@)ONys94e>esEdrbPJ6!cH@El)^I znq*d1g)89D-)aed%h=K~jb^HhVddLb?-_MbZ+;s>b#j-ye}DE|w-d!D?;&@Ih$C+D22(-1X9^ zUe)TS1|;VREIH-!Lq1SqMa|Xh*2#jWu-`)O5)^As8eoU~2E@#B&9c%@X4*oF9mqTuCGhTG&)SsQ^nby+BfxoV; zu13S2m+;t3El*28LBa}$zr)2fPW^f5A_WNH&Mf|rgxE|n18fCa$FT&CwxcISW$(c= zWCD37(vG5`@mo{jk9EHrt9 zV(!!ggPA*x5CcZJ-o(lpkwl9d*LoEPacEv%k|sN@U;qd7MO3ZyAy}!^q;cI`(F~Vgf?&i|)b8D%(GhtKhs}tJ z`@SV}XWpA$9ibN{K~6L|fZ4qrI1@Gk5itu{*g>dwbT_Rue0m zj@&f%Z^c|b_~KpuG|$r5w96$KO&g0&c|sVNxD}DFN_tA5f?l>>#~`YZ9aE-ry0C-NV{vJV7!uVM%wf5l6BaKM_3PSC|;Z^9Q#K0qsB z6(uiq>ay9N8+Jbo#WBG8G~zq2#ZJE)t`jB&bt@C$z2ALrxCTb#KNV_#H12j7H$q@| z#1L))H14mrh>y~Gae!GI4l4xj?8WH@jK3BxZSu6NJo4bOQU{!<_F_px+~#{#GzJ6-+G4APlRGk>bk;RQAkzOd(Z{u9{V5KHNDm!(lkC(4Ub? zZlRrCDwm_puKG^GfR`^p%W*yxYW3b8Wrfkeei3K6)UIp0f5_Lp$JDP%PHZ0Rex}FU z9G`S;YP?^tSHJii$89wgq8dZF!p_X>P&sURGxou+DpNyBiFO9~q$25I+$0n`{PBt9 z#nZ) zKJ?Ww&R4ZnVS~JgW_8T4`c_`M6vEp-#7~ntW15=v^gT zfZLV;k`e}M)-BtG!(lr&TaV}3jGo$Zg1p~l51o3mx$8yx$O3%!|*XX86{5tuod~g}^aqM7Zc29M!pTXZ)r(Z&sP!;y(Fe z9=SZ3mxyX!N0A`OprR$*Qs5L%e(KjWeBvDaaxIR!@e_4$d>ry5!Pm_liz>ezG_tt( zM(fWk3tIDdyIANdDOw?-AL>zAYa5Auw@!S^D1UV0XnXyaVa|p2kXB75qWNGm6>}E= znKWXm+V6<2t%(m~zDFT3*8YiFN@ijt%P)^;-ZZ|v{O!a2*@}giABCw;*#_}~C#s}^ z$&gns88Q7lUq7RSf0|jf<(I@^gg9R=7}r{mb1Otdo;kzs@s7E2p7ixB zGg{86WkAhx{d#4)Vbz*xVp?fX=kzk8((Z?9x5L78!oY^cc(LXF6yBYsG4l5~O5~-v z6NQAq&mo1tk@=qM^5L&j=jHvf;yYhvw~lnh&eCCmEr`{bTF3yl}GtJUjn?6qfH z3ZIkFrK+Te*3tM})lGHv^0jA(@Vr_pPGjN6Te#ihwXqd0;~SYjg)mm4=A*Ct+;t~} zkW#nG2n!*{7h4~}(P$oIPU(vbtDA|vnl+wNKUekgij-v>xLQ_pY*-QzE29aP^rur3 zCpNz(97ByPa#gmI`>^Xhr6;B_0BbCeXhy7SASk4yUNbpiCKr=bXt@k)7+5P=k1=T0 z!&rZ3#;Hl`#l zyw|-<0;$9IdbjmKj`>S2_T|SG`hD$8*;;0#2}N2abIQl>6A=lQu>K$$`laSNd2!pF zv7Q*fvg)FW3Q?i|n*7OCFU?b?q(^^n$;5i}G6`+$c-he@)HUL!E$IU`8CT%(`4CtR zXbtt8@XgB2eI#`#7q-orW?x@ju*o#?C7&RKVa@2TWRnkht)@UuCznrC)4n&zZ&Nam zNB$$`Szia0tUl3vQ}ng9u^)+CWvMDU`6&UuMSE%mw%3D~zeaD)-w25&;W@BHOZ*n* zZ=B3kQ@x^ovf>bxUD)lJsC^nv;y^ z;yyKt_ZqC+O}iA$9CH(wPIkI?_u{?VHR{^us{+esHQA<@X;!!ZBWwIa7|j*Zu?zE-{w?WRxHjuBz;9mk?| zBP+FJ0iPvOQW?A{n7goZbin2IChTd(2OBj@2Zpk*@b7w-O3m_r8qJOkjn++5hn?hz zUW3~@P-q0z1bN_ww-qGh9aTx;@PWVqOKqZGgT&geSx4=K&rhNj*8Io5v|gW-x@N(Q zlvz%;zyyDhkGeK|Oz!_;OTyY?J1#(Q&Nv=9oPJpb+PjtmlCplf)=~4hHv@~HM6q8L|dhYiqcAY*s$-p63|{fE29Tp>a9E7 z>|bjINbr<>#EYtvnl2mOlg-WZt+Cw*LHom8EYTWdY+POM*nlds^4Pvp$3%N#ghOnX zXT)ay+&eU>sf_LW^`P~kP$G5)Q5N&N1HZ+xCd3i>*1X^-MDdiIhijiaeag2Lh2TYl zL~!Q?)v6)XDSgWQ`)Bl@C%Lz&bca7z$92kfbfXrVW2J81RJkm9p?#ibiVhGsdarjE zWV@I@GqyaN51)-_en0F6y>5=#VmF6WQa;bmvkYRky+c$mBZ|63V=v`wzT{7AcBbGJ zyi#VQJddb{-3aPPbpn$yl~b09Fta$~G2u^hH+GH@D1P$?0vU+tMgMo~Ah%;$NuIQZ zLF2^x?FAF#`nE&cc=_GOWlyCWaZ_--I-wutsC{pv51WWpDR*%(vm~M!aI`WC z>IoA|yq%DD#pjU}S@gkKy)A<_(<_QGUmPjq!K9W0yp#9(09EO3-p8jfGo53Ot?;~7 z9NGnu&d6fck$9bFnd%Si#p?Vc_vrPmWybWKjncA`Y48}#+Lh%6B(;deHd_7JC5;5^ z#{QOD-+FAG!l#Pb*JhsQrNqUn6?KJBwt-*tYFLhqX68NF$(~(+^Yqs8qGjkMy2Yf5 zu97l&NZP+T<7Pz{&4eUi=Vn2MGMYj^X^O6gp_d_vzs#+ zFK!{Mel8B&fi|Tla_b2H*}%!b!y|I>xK1#tl2(&akR0xHWVA+Q2(Gh5mQaF_SGvZt z4A%F%${joA!G_y5bJ>Bn9V-*bPQ$O@2OOAE)S{phibn*6jX($&3SdOL#m>iH$B)R^ArXu zU$;g%m4)|6=)`nWU)c@eKq0^E4Dj8|BF^-e!Sr#%1@G0sY~!nl8DN(V4LU+wh*t#p zD+!RyN5)X@_WzjZ1gVLUtNqkXe=2XaefF=TFX)y7U{@7QKCIz`e~K^z5;@7h4t3@r z6^%8}InxZ;X-!QXH!?9{l&0Ys{!`tD{fJr?J%bATW0}9-!h4TmJ;=DCoy^Ipi~4ir zd2JySQUWT>q63<9L2_~xFOV=mUNwUbcFVIUT4@1<<#pgnN3a;~<2V+iMnq+iJK4GCF_2S&?L5ZCfX8e`b8H83{$BY(d-pMDB zUh=uIneNSMc+T$Auy*;UPtf&k?&AD;J5GFN={ddM1omHIK9W17qT$pmWM?2}c+S9o z_bRgAlZGaj$;uD9WvG#~h#wgfw}(pyl=gbo_|8#4-5tn2xW(L(VN6k?G&u(bCpnf^ zcf2PPiQCi4Eeo&bzD;_cu!ggwOrFu~O|U5(xYT|;ZPw*P!P`db=18wfL>KfT7Jos- zAe~>fg{>auWN+`@=v-P-yuI_BKd0>{>n_l5fh#ELLfcq%+f-BvmB#HgNvn-bKjv3m zwVch|n$K+VAF^qgu~8%8nb1qkA3baz8W}xT;|>G1_M#IP)Mi^UzoQ4N2ry>|MMU(FO#Wc%2Zp8XPo zU>DF(MtGJ^Sh(-34ulnS9nMY^ zR|@#LZHqUIIkJim-YEUZMH9Qx;xziGEM{{|QWhm0F%qM745rabu59$#uphsRg#!u~ zYrKbSfL1nCVac_en|qP7YpL8|!VMYyiMmhj40J;RYX8p&X7L5P!Owf`e=OKbKpV6= zb5e?A_M?Ml(33))U)-9BViwGWE#AmK7hSwOW#Qj~g0>ZR)6Bq=6S>&|)(Rg3d!arj~^;9d)+p|X&;8|bWQCA z0mg)o5qH02`z@e^kA{K#s)YsT_8x=8SOzSqM}CRH@VaAuRQOiiF!aj!uPw`BC$i<$ zamhvtKhlnT+lHVy@jztnH#WIXI&C2M&kSpx(v;fxxL?MA$Q1G%(DATN`gBcy?!;ul zf<+SxQtoKH=DVGlYB3`+PFQyMtg!P{O$O*6?oV*L@zPZ2v9WCX)4BA$pWjcK*i2eK zi4TZhxTrfKIh=RrOy@>G-RjlSr3KUEvk=fJKol-X>UI{OB*}P>Qpd+9=KPF}zgeoy z;gP(=IfeC!GjjDhazZg^CZ(OQ6^wlcP=eCnV#03mv3>~4rI(h0~fLRabISJ z{F?|%^Xs6>nvhhPYc%=>R$y++{B?ltc@?m%08~>GTeg*O6u=V;G?uT0`L($HaSw1Y zU@r_I7D(zsemR~R*N9U>FJkw3LN?{|?6RTx>Z-Y4C`U5(ATN00Y^gAAN9^l2mxX+b z(7oSejV|{Y)JVgPgqA&hRA|+TTr{C=uHU00w@Ug|*;#^u!#}cJL=P_gsW68y?>`$moDHq$uXh{od$d*Iw?Hl*vLF{gM(c^`+!l!HSkJ9Bo4+$11ebUk85*Rw>+arA_wESMWQ&|}tK`?EewV-A?c4=$-+JzU?S_E^N;dTCy9x zC3Svuz~SZX;QTn@m{Z4Yo4VVg$UgN6O8vt2xk#YDL7<6z$TS_r(sRnFD0I-av3&TK z4uWVl=1Oz;ug@cE(oosiB-xXifNTg=qTVh68_c+21?39LT9QfxI+w0_2}5M~E65;V zCCzG)5;A6U28?y4yBw?r1~X!?{)fAiQwzZwahTpEg8_)%yNKit{Ia(H-U{FP7N=9> zAN<=J_dGu^SQDR}5`B8(Z_7k#+|V$8kT_|txixqgOAz%OWfU_6+72?STOo(Nn7g_d z9jdTyM!Z?y3f`K_W}Fd7-(11NC0@V$o1xJiT1ZlxF=>Dp&|UKk;Jj}Jqk{pUuQoL! zp1il6C{x)nD?k+Hg(qdE@S-ZsZ`8(h#(tvS+dD4+UksG{(%zsv^nOL`2Urr9lieyH z`O%&2aNu2s?4;VUIWb7)6=9fQx;0!;6rrB-iQ*aqolHcT-3MN6iY=!jEnSs2^SU#Q zy5y0A^JF0O%E{$kcOVn#7NB`0u|w+uR;t7{Z@$XJ-LG~-&lz=mqJ9$}*ICUEhEJ;% z5>PO+|KrCr^&3ucw(M>jEGabK1QpI4FF<)mlpDj9z-R`SH zAIpS55>bfFZ>N)5i5%;Klk#BI5(}8?ow)tL&yPfzJjLMgOahu`{b<7f zg}P_xm8ZAds3rp2?b`Vi2eOGmpARiri2XAWw6VaKr}S0dvh_%ZJaW>XpI!26fJcA2 z?t4wTTQ^+Eewmgczzw>OPrCKcrf)zsBsc5_(6{vJPyOQwe8uq9{syH+A+|K=_+7zA zXXmpn$r&WZf>@0F)!8@59+MBv?h&qLFHxwTiiV=cV`B!M9GECGRbG%qp_9JA4Fgb< zvuN(vCUxV3?QeH_&U7jJ2`$!hMAC6YUUu{PWsE}VV0757!IAD9k)^s3`4RJGs|A%H zR(wVetZzM$lKj}qMVEJ;$6d^C2ZD zBq;alT|{|T`NxqW9bkN;y~T3bQb-$hYv}U1N{5$Ml71N0-8nyNNDh``pUSV<0O38; z{e)8J=8-wXcy1US_-AiakpIfg6bqn!QPk@N2ldl5!qgY$dRT?N-|yWH2&Gw^gO?4L z^8)pGeM9ZKYzsODo^j|?n1+Qhanb+*19pW-S*^*~N3W&WaR`L7(ec1|7lnquC?&d@ za-5gso1k|1HEpO&yVl$|AYVRXC_%Y{Ylg4z9uvbNZ?WxfzdOYd9Y1*YLMXGE8tYSD zZ(T3msZtCOS}GoQvrt*e*5>0u_VgHmR4a(*AZKhDoX8TAM)w?zmorJff3g~9r0ciJ z8Y?)8?2HKDfYvg?t{*!`TzvR>Jgw+qkiFNp6)l;#&VAnm4Nk32$B3{%5gE8oRy@*A z8?1oJb?e6H$W_>{97usBbiesegCG{X|AXA7n)Q_Tyo-cciz_nq*3UsI~4n%m%ij(Oj@DPORiVd@3NVp2A)phwcFLqjc?8!`@px{ zUKW1NmAWqUxy(}`{w`&>68!1eS9h)N*B#FP_p~JJ(kbcg&?$=uGz>w7R7vem3EDFY zFD{cBstY{U+Q768A}|_O0fXz8@w%epP@RtKkqJX&Zmw&_hUa(q3{;=52UPEO4BsqA ztcnWwiPHxBQ8Q|(cF7{tNs&dMH5@N}6ZuFHMHtxmaE}@AU`A){CMrf$o~66OP$>fI9blc^Smtf>xBBjB0X{iGz(S zq96o~Y%d3Mi5u&Ctoq_$Faem+%-R8YdfAp zJ8aVqq|)?-@ihFErD!i1xLSx1$vhTJPT^q;`qm8MWGY%o(mEKa@FQ!k7Q-|qXvz-l zPQ_OP)dR(*oCd#fm#1|f$J|+EV)+ECb|#grH#m%i<5rIC?pJP0N|N>3LTyiR$@$J7 z_rAqVj1{Z3yzq(A`cgp&!UXkfBH=`clu!X?jOxqlXEcu8V}Ny3r>5ol6}Y|~d!+4W z6f)sZYk@lNre79Hy`0&C#xfe4t8*b1c&$|GH2H4wIGX;cv0dKB?SL`lFoE#ZXxJRayQ~c9&dB>wjXd?KX*+~F#V`5 zVRSQ2PnXKf>W2m&gb&;h9%4VqAw_t5F5NrEkKq&h1463aGL$ zUhgg=P-u=U-}-D$9DnC3ROoe;G^%Pu@{ABEqyXlrf~qd}4d2_Us9+a4d}ySftM+WZ zJ+Hxc%xuJz1^t$>;qmwY-<9!=l4rErg}n>d#D)e#W6me2kiG&uf#H_BFIe}8JY#Ek zS)pxCZ`6&<$e~S<2K0$Tzix&e{%JAmDvCurOd-MVkFs5uS2XcEUORp#EF9oGU0k3&yaiYD~rz&}5W5>qdNlC66PW3GLnq@=a42xot zWc^iQViH&HSrS*lfEMV0Kd30;vr*fv&KKm)d91s*V+2Hh|gX@sK)4CB>%mo~8qPm8&8ZzXpdQBw_!Vrgk*uCH_Oft~n%h^{v z`b~Btr2s=4-fYj#rcb3GfGZU`+9qY z>K5;BWI?T3fuh5TKH^@@tIH+&0}>2U{i-BL@B{Bxx<0m4bF#2v z7&CCp?OLLhKr9#TLO4eg>J-P-7?SQyQK+6Hw*&VM5~_RwGV-0@p}wZNWI}E4nR;(! zarM;C-{k@%>B%R1^Su|V9@eXRjJGlG+#QS73%u|S=$PB`o6H2)=VfbyOH+0E}(45-p_yFy<6z;@&29H5xSk|6@0J59#}MWg_>~=Vol;m zRB`Z6v9wkV&Q%=OQGwgLz0FN0Xs@?}?94on|0peM#keQ{E*6K3>i(=o`>id*x1>#jk;sqnM6JfJK8)U-a0*s>xN7>h|OIHos5Sfe2bkm z#_QXNW4xu*rz!Oe5eo+>=`(S6ID~Nj7|hH<-rUb!zOOh#UQ$2Y9CW^7!s$yraD>4)=Ii>o}V0X5EXL-{{T*7`%Pe!$ZKlM-Z0hBtSe zHLGLL?gP?Ccx+ygV7omtPVXs!#Q`i9etiLNBSyCL^lb2E`|&k}-Y@GI#4Wy4`}bKo zq~TH;<>IM^qy%(fW4ZyQ76X&OnKC*c>iMUJo(}ioz2bs*x50}2uT_OC!WrzCJ*JY5>yrjfNg0tsMJa^iKhxH|Q0H#h!oCoA-&b)k2*X50@D5bs{APhzK9U z80_Y+gFQcQHV&do(;=wYx`5HN=a5E&h;|&h{Ves!UYNcbP$O(=4l0EeR_6-skw649qulXkT6$oE!*hoaB@;!H>g^2t89Ge@C-cwD5KOuDGtSEgB5k|jE%VkKxp=-f1bZ!#aW)RWA&+T-=I^}{bLnj--d}(LeKNySXj!O{NwWI9RN{ndd6kpQoy;e>ZH>*iVF(fIPRR%5BKeJhre0c^*uVa1^Ap*$89F?S~l zdLY1x9gJgTTU=rR!0IvyMvCwC-g*8i)MjmTVM;*gI&D;>F$Hst?fVXIZnH zzGvtl^G7K(B^eg=UD4(A082qL%i%)Z7>RO}hNMaypIg=qsMRCtk{1e+1|-SeF0X9A zA6YD!d4{ab>gGC=tb=K)%Kzxi>hKS$>k&ht&MD?R+Y6oa682;zTYU&~>F`l2jVKL& z^&C<+)jnc_$j2eT+W?cKP@HI9AZg~-DMX81gM6fjOVAk=qY1umF5>8>L&b^{O$IRZ zfO3S_Q>SG#00*m(F2T^xLI(q)5!f#;jgCPjmGTun)O9`s6#s2xL6H(w|A=~<9a0sX6rJPxs1{17KJ`Ms{86MpQxA7Uv1*(T&jK0*C=pgm;)VEuZLKEvNEgDpgc&h;Q5*)WAR8}K!XIQM1Kiy{!WN%(I$@T4 zg^H$s)XiL>CMc2$n3z+(!#r2sg|N{hUftrhz!HX!wNVVm=PtMNWOoL+OfVK>zrB9FgOKamXimaTq%aD=mr{h1z-; ztJQP%zJWn~raz;92{Ju)-3SXA9ndZ?&xCa`<5FagVx`Hx`)Du`0|NKPV~2BPyAX!h z_PQuw85M&q=mudS;!OnJCe+j68OpTk(WPHkvRU&=zq)cu{A=JvzCr3P@Qw<6WKzjR zCRMX+b5p9h$hH&~<-f>)NAvNL?j{b+o?v>tyYa+7l4LN3&RaGn`Ra0ST_+;&*VRe; zT?m6MZe3!YX7WY!eMaCu+NvAgKi5oeP_Nxzrb_h&t zlvSXPU%pFRYW{rgC%%he;iH;Z31$fD0(uCzsNJuUH z3-^T2P4moz>P_-xK{FD}U2 z=rSPh6wj36MB9$kn1J8s@U*>_#H9z3s>D^6(|dOXVROymI>=T#=AOm=Iq-@F+UL=*u}kF?}Aw-ehyBO(K7d&`yeD~%+L8_7;*oM z<4U=pAN>k3aOXE}9}3#Ww@au+cd#-)2u!qcX}<+?Y7yXVl1ZIT=U}V&t2=eC+;$ke z@db&hq!*8)fLsuo#=Oi(`hYZ7hB-Q`!O*l`f~UndgC8eS;*ed`gnMB%8q1;)MHm?$e(UJJ2Qcs_2th{-gOs5?7 z;*ZbNVb^-%K(va$Mt3bJ_v|#$n#BOQqq6`>eXtMB8$;mF!WH1mY?{$yMTA5?Eu#6m zNAGzq#B1q23$etBuCDCgaP{!d?s?|SJfvjN0BM2!?RS_u?0FohHt9G_6d>B?veTH= z1)SvqJ`#_!aoduodF$$ct_9t-yQ>d1dW1-t(JTN2`>V6>xfZ}b%ZS#CG4%8f`@YB2 z!MAHN>@AK}_>0L?;Y@pIy@6Ot@;hBNW278MPJ#ixC62f|SsQ_Rzwk5$D~dn$TN4v6 z4?9A)VKBgz8OTU&m-2Ufn9?V4giuE@pM|`l*aNSeQo(t`DN0_990yM%iL(hkMb31R z5VFMtFmpU@by^yng=Yrvs^urWt|{FMRjcpUaR@zK{<;y{1(5a8X}F1URaSa9O9{fq z-}_QfuwI;#OF@U6r~9F^%&2$_0eHZLcKw5Ny)TpuoT%>`sOffO5S+V|iKTPDJRB-* zpj`|7I8o0>ROZC;d-Ukc7-G)t{SmNqU~ExCh3J^xo%2TR)Cj%3%VgF>k2RLP1xSsO zyJ@MJ$_I#@eR}jW&?Rm#0!~*+OQ>U;c6%ZN7v~#k$Q!N+@U~@es%O?di-TOQ?3_x_ zd`oK8`nh=!ky6(a61%eZZQ_Vjo6*2j2$9uB`Sfb$BI=tB7Ob&#ygfO-(UFey z0pp;Yvj=ilt!juACc-ixQ?}Y}F~wCPqdc-xe9aT#xAjr5f|Wt|k7Qh?uLgc{UV)Ly zWMQuE=dx1$3>M&}Boy*7I+t-inzktm5TAYrQxF1^L~z)Ohu6;Pg~0ew4o&biF*;_VEaFHk7k zAD%Z->E?ftwm71?BsgZBf#As9i-Nf&!i{}U%RwpgHs{mf`q-ORrBC?wkXF5fkWicj zXPZuRv|#GR;O3(+@)pY02}cTGObKwlz0wL^{MiT0zR%l=IgfPMQX~o{+0Kb}cU4|C z*cag@nZ&{O3#AGAwkCu4a8UuQM@roh|triMW(4pe2}43B^Yh01`vV5$cm z;@lY)7hpVi2B}0O4vK=;%+bNCOE4oesilj2C<&wvd;rJUD#}?nvT3+v?7B!s*ehCGG;N=@i(? z(f$PQ9gvz&{!5GD00GcNJE19BVm;qlD*@09D&#WS3emjC{&z;gw2ljrz0V9!jEB#k z_by9<){T(?a8xhM(Pv9Zio?4ZritH3eu_W5mw=nS4iDQ4>kd|xmo3Og`1_|_Vdds& zqRVLH^gTc`J|18L25KVmum{SVRy$loc)H4}u+3K;A+=3FyKo$!!j~S{H%W&j!8A9? z7p4t*;ljaaf2Cyu4zbzf!DV$^wZO*PCefr%jV4xFFY5f#nzRMfbk#f|Fu2t>!VO?O zUrlcu8R-X~)|L_|yuvz}TbO{D<@jVZ<#fa$=QKNO{YQz7m+3L99*$QpdPV|YQHvX> z!u{1r!vF$yyq~ICHTqvOt1E03WJxn0v6i~GL!ilnTnI?Xp?+HgZe=+AwT@}CD+dlSRn_?sR^C8@X zyxq>|hc-NY4(s^lm^nZbf#SyR2_Gu-F1y~sXKLdbH-TVSFt2=gK_n}ss%a*N4Z@&F zg@uMY>8~n?B0$0MjaYNGHg0OFbNf8u=HS@(58Am^Pi+$iw5GOZI+Z& z{Y=5WX6}Q-YBF0lNFS`^90_#S6yW&!gz+1$#e``RG_6en9BquIt$mj$sUkNnz@18i zbXQo@5$IuVlHoAye5G^i2_8Q1=KJs^4 zdc(@8c#p4Pd&5E;5#?478cG*^pdf&*4pdRXozU0miK6Rw5^E{ea7 zjmwnng}+J!nk9mAufyp_ek7U?#gY$J^6vXedO>#c5$8|u<84Hdj7O@xd*i6m^nYdm zc)~pr=2lRe+IIbvP68kaV1D~UJ3oE~YrS?9x8o6k z_+X4%4Gp9L`pMGT>Ku%d*)E!j0f7xJBv2T{RLK`x$!Je_z?s5S1t+-q}J4ws&K>iH=4_UgqrH-2=OlW8V)g9cflHuOY#}9vA+1m<5?bgEZv8esSlO@byQ6#i2FX{!Nl?D&idF ziQ@QG)#)vXe<=T83>*8asP7JoDL%WrU6;*$Fv0BLW$TAqZ8blix@J{XZT$RrKT0Wj z!b%>z5R&yHPBq$4jQJP~WZ$16kJy+5R_txk;mtR(ngAyw)nThYKihh5<8})-<<%wm ztEkE9fhRo!_sF3>GAutDI~w+Co~TykgB`;MUEC!A6pH#B#7@|5x`SVt;dr0mFF*If zXP;3FOAHw{$n?Gby#Tx0_yjMfr}k@6e6FxS{VqIydpmKHh^sq>BB@DFO)j-zYI}*D z7lj1WYwp(Z1mi@?qqh|wdbV#@GOeTr{Qp$IczN}FJRue8`^^^O6H_pyjt`oMdUBvg z9u8zC+#2W*jT!7nPB+jG2aulmd#>n)isu=+6eQ}kE8|rp!K!1rh@j&m&2`-6vzPI3$6^$haXP`w%YWNKP$YIh z@$k&}^1TLNz!RHeb}=HAK)z|`49NfruZg$tI)&s~^yPU7T2UErjys(cIBw7qT9$uW zx-kf(+YT?p&<@&n?P;=^tlYqXfHTY0LD7E%Lm+=9;iwq6b++u4X7rJU`G`${9y&sr z(cZp}+TT(id90P@JnWG?)`;zbZz~C@eZlPhRzIQKtd@sax5w-oahmmdo=-dyu=L2@ zf1|5rcPr}P&9%Kekmv4^oOJN@CPsMavcLI-!Y}QMhEd31BI3N*#$4s>hL$|)vUU2u zv!R1S>dUu}LK#-1D2N=Cf)h&c*m(iRd%dt${2hSG)e)QhN&9{VE0G9qO9bvOf~x?c z!60N=s1VFmSsj*z8ELlOiE^vjsHys_<_bxk23rfLofBnQUy5gy(2#_+1&we%`3}@@ zX5G2#z`{C7?{ooo0z6p@+kf{?0{q$KrvC(S=lQ2R#FJUQYg##KpAYp~F{%CKE8~pt zYG4i5D~wf=kOfCAbcDW*jQM3pKYLdChopVybnaDArXvC?FSydb_E7OJ{yCAgmjup@ z(hEOiW%?(XDYMeJ6FMvU57ka_wdfC^sQ-m#gr>_4Lbd?++$}k}Ax`2cm-ULA4^zb9Wn1cZG1h{W}OdYQIBhP8;A;$^cA+ z;uigAsq1dg-JBOi{n%g=G`5iVn91;|nA@B>t zCpcieC!rU8-rNV=i#xRM><`@e@z^{0!b{=<+b;ALN}T84Ipt~_LDoLM7t$-y8(!zbU46ApX6XD&jJO%~S_}A`uB^2b4 z-v)L97JDbUGxa&oMgI&K%}hvm$a=G|BF)OkUlVuFZT_lZx1pDibI8&Q^SlelF9;tz zA?ly?5I>1=^Kt&=iNm(m??ZoRWji%AWU%c()1MI=R&*DS@i;h17kNUpu1KOOcb4mqB za0EGH%xRB5VyfLMeyGH;)dbr}WoNlg+0p(q33KJtv&sjh-s^keU$R-YD$!)<=*0Xb zG?8#$7sbVdwjhD03&1A&9LPx3vrN+T!yfei3o-Ay%uR&b>*pjU0y-sa21&&sfgXP+ z2xbfFQ}tcpWU6l_y7^nV{`$S&Av$`M)^%LEX&4E9C7Bn&{tY&tU#tjMpfS{(&{i>^ zAsocUi+`YqD(y$Xm;b1kc2wrA-$~5<+L-Z)T^`(FCgAAxRgr<)_r-Y0ZiUOIByJd7 zMZobcPO#d;G66Qn1fO0Y*dizXq`q!Aa!4Fmt?2$vzwO5++rE4!^MnV^M0iKFUw}fk zlasyog8bbwHjz?Qyf=xZF8i(NzJ5=&y4#zm|9cdA(LId1@mA^dtM_t$_4Jy< zLvN%m547;z+1q#`p{ok8wO!813Koj@X>93L~C01ztxn5$oMJE)0 zSLSf}%_QDCfgsJWq96k<5Ky~60;uc#H|RK`*4e2o^FVKgQg7jTKgPpg=97O_ICyJU z4C2iIqZ8tnn_q9{(@08#4{ZcFQOMAL73ajGn6I*uw*ljnL4s|=yqzQy+M(c@yKOebT#IB;&rIrDP;C#Xj{jLL?GIs3jjau23f7e^$$wSXx zNOPp=WE$xr=+gyj$Ue6u>Gd>v7b4;@saL*pcX7p{r%QYHg3@EGKW{wU9>XF>SF4J7sAH0%0P2et2 zP<1>e&&!*T2CEdul5ZjvKaUc>9n30)$$z9l=MEAkC7X+O%{Zv~s5~C04{#lZDx_8i z=^~c7Uay;|$Sx|?^e+E-{Hs0MyX$itEE8zZ4aZuH1%0ecEuv8YEZokF02_@5K@wJo z8R{X(;F;QQm!g!SenFvYyh<$5Ut}Q!H4U`z6%P4T_I$t{PU6?y2oGWBta5osZ4?w24V&BVcA>)c;KdG!9CBih|5hg4NR zac-Menp)rMl*lS}#dT<*cO^wPcSY|}i&eIddk3s{6#{ZL_O({NC0qRvQ60%cmE$wD6_k!jL za!qtV$zP}Z(M4aK@b)Y{!HS8{4kVXP_x);xCH@%Iexmm_c)&L?SM@mth=0s*m+Y_k z0!)M|^Jyb#jfzmSU>Y3I(Zcz4j~WPqmTaEa2}2&VbXH?f-Rfo- z_1AXHoXS3vZ*o>Km#P@-?O8yx*b{43{O{rnPT#hZ0=)pxjW>0;!aPK(O(8-u%y?0F z;W4hyO@_g7oLC5LAax}_J2huR!A4Ny=~q17yLUl{SX`5Lgji+hqV~!gS1{@IAIt#0 zd}QV$bk98ZUBhFebbr=of?+tsz>C(gtE*&|SBD@x%ed_rzbGo7ZF6L%sWkmpke$b& zrvX|1N?%|FJVmT)T?nF&uj}FsT5leal~UBH@$}nEzMo;WC*et`G66aSJDgwPEM&l} z`9PHtg9C>HOn$z&D}-UMUtEVb-=#;E9doCNBBto0 z8W4?Q%*;6w{RTJ=QJk;vd1@xmEeP2cbm>Dp0*pxaXs#v`ho7~9YHFAZ-x#ct?_PQS zSf@aqQ}Kf%WcZ0$DX6ZCi0A8{Kt+#7js*q3cgsJfd%mZBnK3$uEaW9rWp+iXg74wp zw*h8*MkxcY@I>M*PXK#2~wDVaBMp41F<2{h|+g-h+m+Wxr+I~$M+fZ zfDb9xmn*{uP<+Ln^*z~uoLa)yPw!$riyS7|P=Fp7W}q0!?Puj%d6p-M`D%34uBRLu zd?Md;WsrO$-)*H+$b*7c+EL(rk_gPQeefD`jF2ZI>9BIQgDXVbu<;JZ2f)07N8JRl zt0WXC0;W=>g>Txofqm+rk_3;nc5acK%tem;dojJn513XQx;&hU+w-aJjKw4+>}>Cu zOd!YiQ-$$|mt^RW`e^q%Q5d2SLtj1mu~7`5QQBWak1I!yu14c1fT+7toX7~0*Dw*v zFZ@2LZ|1$4tKq_9t--`iFHlyZEpjNUr}haTe+Cu0W63Rr@nadM2JbKp--w&u0bQ!` z1d(wClZd(~G$1bA>4QCgM7(V#h7j~}Kz#XQ)GjaChOL&UKk%a zy3mq6;iBnRei`AtrIN~CMhicnsjU|-+alq0Oj71d&HNZ?C=EILV{x^E_hla~!2@Ii zu9uIFo`~BV3O?!iq>1Z2rXr|BxBNf_A?DbF-jnHF4*U*#XoKUmLICVbvv3d4 zAnW0oR71+gg9ln^9HLgK^z;pYTT!2hpvn2$AV0rm`0d{{*U6H8ukif{nn_L71M%AH zypk%+b@XY;J;;Ka&mzzwfGi9VLh&%?OwD+*_Bj+HB_mUvlQp;Gp`pZZ@WZdRUc^{w z=YdMEmVl#U;`ids*PO48IU+~5@}aU49fw_WI`6A5OsT(-Ccw6n z>k!tDf~iVXRB42@*vJ{t7`ac|5y33!1$Aa_>Mr#JqqyUS+a6m7;UP7xW1I~D#=J(Q= zfjd3a^{Fa{(){bLp9b|4R7oo{^MQ)34JFc6xO=Q9E-X()by!U;;D0A!XFhHtHk>=_ z<=1uJY^~1=Nm@5<-!@wDh#%je(Yw4A?;J~oUT*8kdiD4(pehVpBE9>EE*-{bxFMne zuv*2!!$&pMA$j^GUe%vpdH)T(GxYu}Uo(yMndaax+SRk6O>rR=5(q{Pd`17uQPQ21 zzNrl7C*nr_c=Acc)Rc*quTN}iKWQu~=sbny#?77k1%XA<>l+YRr9B&r)u(mVu&QZB zLhkj)#RCBOVEUTtqb!)cuN%GnKry5?vwxr}r80U5=%UcH0T|R3`v?@$qx-ojvMaVd zy#BFl*ZFZ0&d1rSpgp|dFv2WvO3bLYG_|9_!2#C?`bUR`b(W6bGJBsDAKcZ;J}9;J ziGJ|AKA@-5Q~~7cW0|>|#u2c##m^~fim6Iri`xC9R?fuTB)kWwL?*x~Pc}UrdyqoG zzt*myZ5F*XjMQOr^obM}_ip7Si7?(gMNPSTI{TPgbTa#U9mze4f9zFN!vMwW=poDp z)D)6tMvs-Lsb3Y^(VX-;0L7(2*c70ydFxP+TPyOeo#?t;^JlhnEGu)U5iV{MQz+jH zx2ciZ@V|whjWQUsgZ7ch{V81oNo0ki-gl88L;NYPP#X`%U*wtx`;dPe_nsoNbXp^#lgZT;CR0P zVW>drp%)(d{$f+pOm>?im*laNtzBy&3LbIY(F2094@~wo^%11RR{`~;%J27Z*^CIv z{h4%~Y9_=@V-rM~rYt4ef9G#Lyi)nyP!k3o&>@N`{2>0TF}a7rlQ?i|7TIJoL-uZr zUPEoMnyy4aUym67Dr<_1HVMtAstVkY@ou*T{eLnr;Xmx|an2OScng#nhB)dXdGiqC@lhUt*MOb@XxW1&9Wge2_`i!^MsC38R}A`%I|PoQy{R?`BJp<||B+ z=dFoggx|cd7@E2~rocCCNC=ObyAWQc^%71u*mE@;jai=Y&D*x;lw3}7p3mo==?Owq z#f6(rn}#Zm$5!}@N)yo47_w)8lehJs%-!K*x4*XcXP-VnR8i^UGpV2d4eXJ8dU`A( z7L2{O{E|K`y~{4)GBw(=G9LNlZpO?`MG!_Qfcf8LnHPj++y>{GS!yhGM4O6{5iRPA z!7^?HZ3SCqK|%Xuc>x+dO&AM6OvgTX1HKlaH*t7l==c|JVfL?OF0utZb1z~@BE4mf zR%NH`LFLl%$;O$9rx8s`s@|YI@vWYkp8X7CS+c7c)UMC?tz7uP%_Dif;9`x+&LZt6 z?a?24iRO?qLwA3e9x2Xv(dzGpsL)hzsXLx4pNU{3)h*T!&l}jO=Ubzz$P7XMZX{nJ zdKrE56J{fD*MaqOKH(iB_pN7#GxY+6b}*9G;BR^i&k)v+Ju_3Df3HRP%h18w8el5< z(U)5n9@tNOZ6vbS57tuaG#s&qd`^C!wuW9TY*jLIR%Lu;Ka6oB{?vz&R#m?mta)hC zd_dP67GsGh*lvIHvBCcF{X)V^ZIi_lZ4K#XnOYElK8ANmk4j3OnQWBV8r>3+UT6^GXiBe_F(j^ zG2->}$iO?t<5n!}oK^kn^4RW>x8A^Bb{GX5{oE8>-&+g7xjdWhBMh2#wUeu(&INu;Q04{alu1=2a(^FE_VOj4zvmh3C>;Y9|td zo!QUAHl*a&8NR}JVoGTb|3DNt6$&rjqD+f#pb1Z=K^~pF{ZJ{Iw84A+N)v>$5cSu`WJ7#&Si!wRfDO{>Sht^AP8w(C@XEgAkDM zG(s}fY1Pp+zHvxIN9Q2slC(?_fcoxI#3)YCuZUOrN6>Q_ddjz+2D za>ZEDT%2xbq?$!-VRp_$IhW55ykjzPoJQbOsFa(eyege(8&;Z@zb#(m(?#Q zL*)0vp_+ik+P7F))%}B3S+FP$48=*g&0n1V%qPIDoX_$?#Bt?Ld@^#CC7%_}l7ITO zm_)eKHYa>Ry=!&_>*uJV0nlPO%+%DR??52)u zKD#GKq9%4#A~2#HZ^f=;idF2U&+?m#Wue^ec27VLX;P*fmj~a~Lk=x1RF@1i>Z*1~ zBezEhC5-S_i+1AGKD*y+paYSsQys#71{PjkDp`Fb&xR7{4Zs=KQJzuuG-k8yVwIq} zmz%K5-tP~1@i_mq5KvJ=&=fZ5-w;OxV?8a1b-Dxy85_3!}yB-q4nI~xy|=vTH2 z<3ryoT5oS0FOTtiFpE26iiM?E|NFl4!dPXprS?45XY-Ny;2rsf2LEacdziYQf!T;( zgmPxdfb|8g580XXioJtpzvg$&11LV2%~$-l)`9}_L~Zhotn4=9J7B5Xw3!LVRKS7x z@Jp|!<)^IUtreB?<%&v+gEIvn0>^LvzW8kXr(YTC&VI@4Z*5RBG<0`0ib+z{Gu2?t zB_O4js<5wg;Ue1Hh`)O_ZLNXpNYBuH15}KE7i+H)l%{VO3tabJVvc%Wh7ONS7=YP>ubC~s&2=YwsYK$4-cReglo&F(bar_UfAk6J zB(+8pYiIYuG`hPa`moU?2=nIX=M-BQucQesm9xVKXuax%i=IcOSk+BJl}1b{5ZzZp zxUZtTgngM+a)B!kh9-}XQAe~=|7%E}EIBJ-B;;A43>t%t9N!10`O!B_dR`4@(pdRMSxf&RW{K8S2&a8e5{cT+8A_2X`MxDLJcrOf}?#}DR?8u=@JHK&1rbrVs0a^TDL_DZ#uPV{# z{PPfuX%FouSoOKGvPcTz-9m01K53LZ@=n)S$%u=_ne>qzOoAwbZtEuV;K9OmZ{P3^ zG|*iLcj&Lyc%mhM{i2=t=whcQ`Qm+-!(9H&tis0m&Ep=;bcks52WmQyw+6zS2yc~~ z+BazUAW{&zLFU8g(#BHvbKvNCK$q}&q~rJlso}m&`fnn!aPr^0CaCcPRzMfE&^HP% zrpp~FtNwu=N-ToN%D0$khS1*GpmWKGP(`?kf!Ih3$Cv^gKyx!8LCN29>|W!)+yy?J z8lbp~+KKeqhcs$%Yp_1UN6SN~O>JfYs18V~IM_T~HEJ0T4DGLl@c+FT5f<}leSF+$ zcJBGG`Z#&-`fFP&F zQ)gUJ*3_Bp_IQ>~6gwsE?K$}N*MjQkJ>$M6%o9_9@u$BLpATE+?BexkW_0w`&ne1& zf>X{FI@&#%r&d_2AIdO#Dij5_9My=yl;U!dVoTtvfOUw&`V zSQII5Ir%y-25Oz%ZCjFRxco~!K)>4P|F^NIm5gNaf*M?;A1T8RoSyNWkp*qapK<{% z2E9-XlMl`nW$Szlj5dJ|pF%yN}$(qvJ{ zprkJq{ck?|bu$4G_ZwH8dHiR9xu!)TGzG{oO=RpM=c+^lOFRC#G&Dx= zS?A`8DLHOeTu*RT9>{&cmE9M&x0dVBZ)d5diYa4N0E^zhGegHRsQTdQ@#xQ!U(@;= z=*3=#<|b)Gx%`|`pljlSjlaAgC3UR~SC1_6i+W~$AUKQb&`U(#izj5ZxZ%Gv8Q4Um zriK^;$n?tp<>h^5YMSt&oi!K1QD#cvI1VVew&n)NuEDdi&^JojZg5bG9{w*E1>e2j z-1+AtDQf(0gPk6&Hkx+ta>YAPkzLw%Yj*~+jLd?`0- zH=k0cPO;1C3cn*}lcRM5g~eRt(-S(w5(%S>+%Sd0#T2pdW)QhEjug7!afz9*Qg#IF zV;r*y(0(qK@n6-CsF1!IyD%=ayCv>AY846-Tqu)3?3s(H(Pc_*o4MgR?3RXo7Ck=m z)f4hx^ve)dG}NqEwe%BnJ$o!lA`m6f&djd$+Rd%9WupgeJ^qg#C2wypY7ET5+GX)ZH*NwrC?O#NS zqtC+H=A=(s=DuD;12?XIlq$<#B1+z`F(85hG1O9 z)TFCHnO{sm^(1M6B>K98;o!D)czwqFnkrld#ie6VbAkKDkN=Xa_F58BL>756LOYr1 zu=w!i7W7t#Oy@n^6Z5GTXTH=ryKp7j+n~XrA#seJ*OgUp&X==|ITsq@}i~z zCnNC2)_t`In6oK*Sz-J+>>Fdxezn=n5znqR#uaaj(SMW5ywv_$v^Rz~OjX)kqJTDp zg8KrpSpibsX{ZmFsuuiiR6YM^Tz7XI1zVOQ7^Z+6xX!4B#N2ofxK;R5)Dr*Y^e>dg zQG>V^8~x8d#}`QPljNBiBjl{IL;;q^H*ZyIi*ltmmEr2wgkwyT=N;igJTl6t%9&IB zJF6x8=r%XERv+2c{FIVED?7DEvOpah`DuDw3&#=M#)Q13{t-ESGtyX{-FLpJV5VV2 zRt$x^E;wC$t@9+%3v5qZ4HB8kooc_@0HuO!vbq350mWbco`^30O~kIQyu)UF^`Zk_ zanb{-X6*d@AJe@?F~98RNRC^+CrQLUph%Qlpwh~d4X=}ey+v#@3W@*XbSV3qYJ`5s z%>+?2o$uAsUj{|!=z(o9>Hkd_ElgmIxVMeOlxz$^SG+zG%xY7{i0}rrLR9RlnR;~J zaJ-s@o&92J9x~W{O-D#b0GZjot$rg|pLnyYnXI&f?p0`)>5eC#AI`f}gl(aoNKWN8$Ixga{5L(Fgv9m# zHnIQ-nKflkqx(P5uOC5~q;VQN;>w?xdMbZHdi(C&6ACVTeR-k%H@!o@I*L9X*$O<_ z%Box(bncVlQ_a4;YxfYWQ8Tl|$M7;n3yj%ZpU%J86tHA{xV2A)d0qhN{i8_%lrZTy zA~l9@?%xeiEH+*KrCYqzl{52xqY&~~tf!*VWDnA`|BUArerIScQ1m)lur?&*M+a9? zE)+4xKz(8i(0Jgm=&$OX%#mV|4tJ72?l5yJnlTtAazTM2liKlPt>nWMs2Y`C@Q`TSHno*D%bG`}wfcch=8+28ecyP)ueyaccO;WAnwFEH z>plC3RIGi<7@?>S=E1SLOs^(MICS03&TSas=YFw2FhElMXMp_bcc`@Xh0gj=ti-R3 zWF{vdI;&b(j?noG%P`b{7xn@TOb~s^SG4^4X@y^5=QB&DR>8FrHjDb;CN6POo z#9VmT)?$c8{cQzD4ZWoy@{}6Rw|5FksECX){tnd#p7__00D@NVK{E%dO z<`sT&;$muVWN>-;?eIgP)=jV;ZmDw}j_G`WUe-@YAV1_&tM6P+E9KSANnk81=YO{k zpwlGa`)a)p4+Jw&aP4HSM5$OV{;S0dssg#TLlH2we^utJEUYv(6lE2Z3_;tr{LN2K zUsf(7s;orIUfi=+3`Ple1#Yr%zye~zFJ96g7!-K%`sm>vCK8n5Qrz*@g)7N7MmEd4 zlqxXZ&f|m*QMnij`E{LpbfP3HycymqV^e#v-)`Y;BMhIu&-re{Kwy&U7SZ61lf+2< zH}mckWe$`pkJG9@X3s0Of8{9?#fv(Y+O_I(*r^v}v8*dTtMX%vf zi{)9SMNLbHmU-*=*;CyCd`a*v{Dxiv%wc@^*wuL*Y0{6EaX&v~j}2wM@oqfZQ|$vI zqM@y&^a9c}$n@n89bshpsWEPEy$@-XynO3Lea2Ps{{tqhn92)mDeM1J!DzW>rPCM$ zRaD>A&oBF}s->mEFX?X|uLmdwYzv>9S}8yx^#aETL<}EcP`ziCIIj5) zJF-aiA9E^5&fF1bDnTzfRYn*5OD!e?(tGHA<1E!%Nw{HVP^<(nLw86*(?>sIy7oEO zA^K*B6BxVl!fTQE17n+T|E2R^5(bWc_n8k2h9UAyLL$@=vS^r{J#=9{;~{#PU`W3A zyD|u~YPB<8L^W^w$(;52`yPY3q84ZER?e~$H!iyxzbdI^;>t?C!72rf>HPvsq4kkP zpF`56dp&mNOJhL&vA^d|Q6m9TSSq#Ls%s3Ss$yM3xOt4~OnAZOE><`!N?=FA5=StT zM8mEy=3OlSEEpx`%}*6pm`sc{j#U-z{ro-c3nejhCV+}R@!{`ZJIw{adawpUSy|{i zG!x<9c`T&TT8%J{32ihKPCztksfkmY{+#gkXRpqzu5(QR`9~Fr0NG9bSspXo*d5N>$sHivTu%Tm8&S}j^o^`LBUvdF$JaP z6`+r@>qq1+au0R_XY;PZ|9!CB@vCUOVRon@1;tZW^y0a8RLICdz{9j^L8}a_8yZlx zk+IN*@j3<99G&I=J|WydTCF)n&oi?#&fF^%tBA5ZZfjfYV#=SWRb}~c1%BI>JOJxzbdnQ&neI6&G*%y zpF50~9sz2|c$19Gs}Q&r+>I^L9h_y|_{-?ntV{nq|5kTDr#@IYqzYu+41cdVii@FN zjqs8>9VmbS&}@ZsRZi;F4!O%av7B0Om7h~el67M5^?XGl+TTqE?E>0rFGWnuUSJZJ z1kot7Co!tHDN0AR>#F<3mL+M_tR)$d9rQ&vu*dV-+0k;>8&i6MWGA`LYfR`PRUx5J z2M`-|YG_UO#|Pj4HG8L+C9#C9k1vR0JBi=K>IieH@6rOOt<^o>&;-hj^&wVi=nw2 zYnv_2hz9ptL&^ZX8z^MRER%I{TcEuR;f@JHt`3^u4SsGbLU}Q24Pt^%_9EYD7h?;r z!xgOJFRywl9Ji`Kf&luujtcs=q@@ydc{mIBB@Bx{yp@;$;C>S2BLWTx@BvQDgoVDW z)qP)^!_AltT3{)%hVMIeYao!~{CA!K)R$=TgV@U7WB`8rTR|*5-&7)iV`vBP7Qg<=w4I%o!0XX>2v6?Z{u~;6X4(a z2^nN8gByM(^YiJ3CRRy{7?c3pCKOL@*PnQ?brby#Yf}CWK z{%&63;E)r+Kc)L`*2qYiUvAAn^6qH48`ong(aTwS*I>vO8BEVG-ZI$p^WgA{F6lcL z3LO+Z4YLw%>$dyA$CEHmy`XARrHr@#D0Iqa$`F=cV7>u^LvS{1SAyK!K4d z`Q@Te0^P-bqj+FX|E6!4S+{0qr%)$wGvP%dCRGB0-iRhCwj(;8>2Q^m{3~bQE&28z z*GbCMNjqud&c9pV&VYxXUNy=i+J#rHqWRC!w21TSqT% z{GHq`ilB1~ucC4<7A29&6@2IEt2Hw(aO=(=^`DS~J5-S>A~KV%sUS+Kc=RWh(v?za z;9!6(*W%2LL34s-5o!7*-TEj0^jX>11UtmcUv=={Q5V5vXhNUT#@jmY9{|}lpl)o; zvo~+eQ@8)(%lOy0L)(Uv`?4e}8*W@*ZN$B|mH!6a9*u^c1!5SC3zV)TM4%5;vydXW z3r8l)k~!7pjxLFon7?VedF2o-aR!{>?cYU!i>f1J{y^DbzEtJA&VW?fo( zudi?>fRpa{sXnHSsVrNACkx^+JF*vLF!CY_;nB|u2Pcjz6uo0V) zOAN!)QJNtQ8LTcy1l zhABNFaj$;Fm6~cSk^xueb7aVHOQE6)Zk_Xv{w_z_#BjvL0 zT_PdmKd1+y^9#MXa^&3k79TG3^FAV%RNPE%vaW%vk``89(O)Hg`09M!m-z3fLn1t1 z60DB%?MICZ66G-ZmNk2uF9RY@I)~h)TNmh^e`E(2LsLI_Oc2;6()Q-{hCX~%#06~~ zD)ko^fNnuN5K8J&Cd?hFZqa^vDbjoL5cLBQiLeTK%qD{qF{_fRx4pge3bGL*A?Se` zM+qZI0a_EGO<3k4JtW|0VZ#$v)PIis+PPv0KbgYR92NGVyI&}TcVSJtJ>#Z z#*&~3F7f}(nJ8nY(u$N+w{ZUiz+EIs3PL8y*cCOn;MNaIfVWTB54F*9F2wA?mGcDV z{lt7gUjFVQMyZ%aSj^I(Fa~op3K!l?P%{bKu?x7{9YFD8QJ8k^V*x}9o%$yqE>m30 z1UDInpyPn-3DMDi%~`pY^;sIjGaHSvXVC}4)yJnwYo;bs+C)UW+FZ}B%;e#-++8Q9 zciK)R-0@NZy-2N5oQ^!;E3P-*dlYDH^64&xq~iJ;uOujfG29I2x=V|`b_K+RWFgi( z2hcGWPwrd4AD)!Zgs%z;ZWVvK5v0coZb-&*d?oWZ9MmD%Q$L1__aaT0aQTJUC%ee^ ztv!Y~_ey{${xHUwb|c;Ua~2*uM}5;)1>nOh%RKs+uJ5Z+Ob zlX>_UpF@au=0kLFh0{^^JS@@CuK-E_cz=!9ZZ$~uPe8}BSj`AXC(?gdsDAsoJH=~z zesHac@=uX$k!RztquEawe=%}99M-$F8Z-+roo#&~j|W)2)~)V6{*a>IA$3Ekc~}cm zD`5EKy$&v&u+3!^4=;X->#O=;qj{CdIYlv}nzGyD(3kqr!2q7wk|W&x@2v_@519~k z3{Ap>$0Op<85K!cz%cOlhkpEB6HsBwXGVXD0*HqIVu6Ki&$4HftLJKW6>F@t^oH8Y zL0rOV|Lt(`gqS21We@cB-ar0oxhMma!veKu^YR!8F#g@6t5XG%Op>Xkzy11*yTsR_ z!8eU0G(FY?)S(Ne@F-zpkwp`fI>$g)A!~gdnK)5%hWO(oAt(EJ&=mm?U#(2sE`5iF zxg7t!00IK(K7O9X32BG+$N}LSxZFbvZ44i)j6oqR zCZK4VLNRky!Irb)B3UuK?JbPS=+!G7Akb)OrrQ;D$--6$7Xu|Bm;93QQN{)iD>O)(v3w|gEWv@58q-szkV2~>sh5(@WVFU1hec{y;D)Nz579uXaz#@i$f`gp;k0>0e6{s8Ew=wR z?ggFow|PF6-*}sL^#6asYY^wT^aKODlsP#(SIxJbn#{DeyMBAmUuS{;_1)Xq4glTd zkn(e##NI0Y55T*IzE;h(*>_!ob%yNk_$Bl1F+$Q`gX=7&DUwSW_SEJVR2*^mGxame zEvukK z)K>9Nux847m6EvN^2-I^{8G=_x6HJk^#`mXLdB$`Fv6U*qf?RpJFCPuE#v>2CM4CL z`E#%-`M567h}eHVJ?cjz1VfJgog7m4k&BmyH#q+P1mIFM_YQjp;EDeX-R7(n@%F3= zz;XK1YwPyBzrW;1@z($5h1K9Rp%WJ;mhAAJv9M5YvvK`?tIzIRAwG2NJFdZMz}fwu z-vE;HHnapW2tTUt*zgQo#we^RnCuwOAiKl!fMC$A-+m9nm_T0Y*e8-;!1D2bNY8!2 zWQpwp2Y_M@Uk+|%cpv4#81bjS>*MVtlZW5HO~{USA_*sem72GqRN-yV+zEq=IdC{L zc>+^L_P_mW?c~5g&`}g|=O^$ywPs*Vzn^_OH^{^Tml|9D-cE{HbTjntpV$0`pV==m zoCA8c;X)9@yJz8w$GDT8bUze*yhp-bXfgM84v3zoT@v-WZibrCe|~&lyhB$(s$=FX zCx0%Wc@N^4fmccZ0mu=+UL}|WCvVW9K_GAdOoHTLE API + +

The TLE API provides up to date two line element set records, the data is updated daily from CelesTrak + and served in JSON format. + A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a + given point in time. For more information on TLE data format visit Definition + of Two-line Element Set Coordinate System. +

+ +

Further documentation and response examples are available at: + http://data.ivanstanojevic.me/ + + api/tle/docs +

+ +

Available endpoints

+

+ The TLE API consists of two endpoints + + GET http://data.ivanstanojevic.me + +

+ + + + + + + + + + + + + + + + + + +
EndpointDescription
GET /api/tle?search={q}Performing a search by satellite name
GET /api/tle/{q}Retrieving a single TLE record where query is satellite number
+ +

Example query

+

+ + + http://data.ivanstanojevic.me/ + + api/tle + + +

diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index 80f2ad9..af187a7 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/api/{name}/json", name="app_api_docs_json") + * @Route("/api/{name}.json", name="app_api_docs_json") */ public function getJson(string $name): JsonResponse { diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index c8c999e..d2aaf3e 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -8,7 +8,7 @@ final class DocumentationTest extends AbstractWebTestCase { public function testDocumentationIsCorrect(): void { - $response = $this->get('/api/tle/json'); + $response = $this->get('/api/tle.json'); self::assertEquals(200, $response->getStatusCode(), 'Assert json documentation is available'); From 1f7841894f6296608e4a2d432fc63c05a45ccf50 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:14:21 +0100 Subject: [PATCH 030/221] update documentation --- README.md | 2 ++ docs/logo192.png | Bin 0 -> 12929 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/logo192.png diff --git a/README.md b/README.md index b3efc73..e3f8d21 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) +![logo](https://github.com/ivanstan/tle-api/blob/master/docs/logo512.png?raw=true) + Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ diff --git a/docs/logo192.png b/docs/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..027c5f3301ecd3a9cbbc63ed5f71c47895c445bf GIT binary patch literal 12929 zcmch;XH=72(1vwe zzLD2&A_Cl}`Jx{o?u$4;*De?UAiZ(@1_BC-7y$tMLmx}q5L+Wdc{iB9u&X=lu7_}h ze*g{|08mtk2yk`t^$3C7_3-k6Dsdil_HaUc+?6Mz30yI3leRQLOJS?J&E#0Dg z-Q?UkRg@u$5%M?!{vIK&kO+T2Xs~>Q66arZ<#E^7w?#N1e}RPfDsie^4+ya}GKFZs zf;=En!qP%+VvDAdiwof(gn}cXA+8ZZ&|t2A zQ_%DXb_?H7r@Ba^UaEQ6b|K|5U5)QVE4Db*!_XviC2Dy3Qz`6cCRB(t^7>>oih5a8OYlV40 zL;gW`cl!r7AT-GDFEzQliFo*V_~XEWaZ-u>!)JguECd$p4f}7D@XzCaR1qMr5#-?- z0t>Q)!TkO`%clRP0@2X8o>e&rpN$XH9TpyZ`&y>IaXd6#Lp+o?#YM$Mg+#@KM5Qdn z#pJ~#koX&j-gF&M)L$-L8EZCy*v;Pvb{tb?cgx8ns%!WsL)QWIh^QqTRC$@B42#tvD9k`l{s|H3xd;=t3$; zD(L^9!&E~Tp-NN5QI^zUszbBeT}Gk)d-N!>=P3Nwj;>CuAY2!Yo89BB@wKchjW97xJI0K6=&Co)*le~zX`Pt=QMm7Uo1 z0RScdykv1%X%$M6hCbqyX`{0LPOHnt#^AFz%@~~q(WC-(S%ES61U=~{V7X4PS>JDY zeG~sOM}@k{)STFL3eKvYm5y(o)Szr^FtC;iWyFgtz0=!sH-~+x-P%C1MmZ+6sxzjb z_JifrlY@p|hpD9N8+0G)T5J=ExZw~0J*ev;*!KCEP0dLqrro}v@Ye25UfJ{qy{K6Q zohFkfSM_j+g7aAa@RAp*ljPDGpu?y5fg-0MUgmFj&dUC%LzC zTVLH~-YG2czDInA9X`Zm2)2lQEmFs z$F$_XZ`>%W^L=tx#Ad4FcV@HC6nC@%1VInF4sy86a~$pJ%6oku7kD4Fc6kLS50DT6--m-SH@HnCfvCkcQD z_Myx-ZxMu<3< zRpQ>HdA@#Ku>FGa#>Y`5-8*rNz!sc5ssQiHA;3lwxfvN2aHTFExJFT9hIHu&Zp4yR69p2kA-*Fuh{JH3yVo=u>On_n zSqn67nm)CZr2YY*?kQjbdxIGpaHmh5&fF{IL-NDPtUKH2GWS*@VPUmqGyJBpRIsse z+^@OH*M^C_sbHdv3lZA+MK;9!p|NVqyx%E@&uBJ09$5sQfWOh+U{%b}tUb0yy#d@I zLU$0k1V;ld!)-8Tn8E0xzWsxu3bu_kLnWT+Uv^BaA?pF+c03!5F9bsdPz=x(2T>VPS zJcu)?i;2ek34m#{(RjQHpQuc>nB{!VL;(mh6Q%(lJ%EJI)cTS|2w+-hw+#8hb?xGu zxdqBo=y1Np2EslJi_X|0#PkC$hX&qv5nT0wW^Q@GC8>j&I=0ts@|$BdUK%~+8hr;l zBIh?RxVof4wb{jq_mee;QMqbPZdEB>Fad#`fnQd0T0p68`GkYJpaKNuoD%>#Zaz|-0IoL8uUF8D4SlQic( z{U3DcY;}AD>K#>u!4Y;~j0Sg12T_Y_024o{`cJJ~1mEc1-mU=~{E)Hly_ z1TN&lR7In=zgx;jDn8SzhdRpoFECdxmWsXM%L~*6w5!>@*4PKF+6fLeXmeMC_tg;$ zdH}MDUyM)_$@r4wLm&crZFO7U_F79}c1 zr-#O3c{4SXrEMU(0hhLT_CO%AG&(x5l@EFTmh}4;LIA(oeTUiKywP4&1dOQ#BQ}o+ z>zfyXUErKoPb7KXC-*T-7A8}0TSVOxxBWQ8l@l>ctV!-H1 zW$!o;rb_*ooO)v;YnMoF(qaCsYDE8IYGJXXnH~Yp+a1|-EW#?JGw%E0JK%YDa{^O6=5|9jQdwFIv&CAOhp)bO zPl!|BaQukUVW%!3CJ&d(cl>qc<%2c!EduR3a#5{{JOHR8Hi!UdN*7sHlwDb~V21=S z7C=77hWWkZFCjg#;Tis=;YHiWZ&Cx=-~qx}4C;Ut`hkM){vcyPk6#0P+!}SlmylC~ zNK+}k=*aj}K#o3|4IG@n?skjWGX=j+6*6?Lq`rSF(J~&Ssyxz?1U=LY4W{(? z78p$OZyO{ylTMbt-_p+}T{qd2(G18a3h7Q$#v->t9_sv~>2t1M*(5OsQ#DHm5?I4@ zofMMeKidYs4NIID^7F#J=cwEO5doXAw&&R4;jX4NP_bhEpnYt8dhX~kUWnreCz7>S zM6$IP|BI@|H)&L1^jCY0{X<&W;U9aph#F)^0GGtec!z%Oj)6N|>Invz;0$X=XosQ7 z)C=ktbG2O|84@}XDx|pncT zM4*e<#|L4Av~OEqqv(`lJXZG`wS;Yn$a;_-@pS5f2*}N&VD481j$-b)^CjZ;uLZ`v z$C1H~?;J)C^E}>TirQ7x0odd-8P9-Wr0Uc8RTFa`eIKI&?p?q9$TzR>F=o^s8UFyvF*!m^yY^&Ys*nWx@g^9SZ#Dz)f`Z!4H0ZE>Kn5le~+LGJrjQP{(}UVFJyIGz9Onuru5CH8R zmjQzOj|rAml3oHqKrHt=lXh0-DVGTHFk-EwoQ9jh7xqF2^PxG`wLiD4$?nsemnkc+ z8YUK`QVX|pT*!Hk(I2~9D7?2ump)U^qe9v30(#2a+p=75QcE*ws+L?~evt9s-v9nt zf9-M9GNyG5d=-U%**u_JSW1a_F~jTpPAZ9xXp8@7hWBSX$)lb+GpNbKNi3izt&xf- z!sczeDu)_((a3-|_hfx>jYWvmt0apTka*sddXB7*TQw=D>J(Er{PVA~!2@d0{Zs3d z9v>Rl34L(8e1KNQQL;d}luCyfC z${y>9x}D=CEoQE1c8GJA&FrHbik4gj0=yRKNs+97HvPm1yBXu-783fHeqwv$2FZTK zl~jxNE?OsxUb^l6XZqkmJABFXz0U)Cx;-vB+3S%Nj+U-j1?1W)-9 z>yt#yHL9L-Iqn|NjSWZ&sg|53bp4hWy?E1atNTsN=5;n;& zGT^FL{$WMmX6h0hqI3Mqf&@l@p-$ZLYza=KRaOBU9nh(z;9ZS|#V= zwz$?;2#lrT=B<7jPV9qLsG%qqF?nTX6fJUwzm+vr;4;Q%C)k@_`V-dsW-yAIGCQ%5 zE{Fp`eB1Ri$^PdPI4p= z^&jI4S8tAg^xLvZW5)Uxt8Zf-TJlFvs8xirTFxzMc!{`Ab{=8AX#ZZ`{8*7pA=pcJ z+%#s^?BhDLEs}V>KCM^IlRSrCVe>g#LGttyD8k!-*k-u|zTxj&Hl_K?#^)!FTRvi+ zDZDuWvk>)-ZVuz*c%mi$CYE2D?xP9p$gp7IvIHHd8Pwxu&LXVxb2-5Xzt8jCX*QB{ z{xZ6wKT}D+GYh~MVYx2sDm{M`OpcE;&D2>M{5v0mjnx4h$RHa3N8(9SJhpKQNpz}) zrdEnWfxUGnygv$pi+2@+aZx>;=7{QGuc+*1U}&?K2@B=QY>JC@%y_X_3Swr{Gn^5c zo(zn&sW?+P`$boDr(-urxgF-j+H(3N(1DuOLc0fBO_~apHkhbcZ_9rB z#m2A5nlNbJ)KW>6>FhwUW2c!XWsii1_&!c60G*#t@vTuI)HadTsh)Jyp4pown@9aC zL!zJZr{oqb5}6X{9TIl(U*r$X^2+xMQKk@ve8L0S(Y8<5rM;AJ_Bs}9usUYP$i_i8 zq)hLQ;dNx0Yh*s8qYdvYn2*x-@%GCl(5|GRt1AO-2Tv6oLmWzJ zIDt%2ix&vYDdL_y1^{}RCb7C@){>7*-HvW;{nJ2?@hJe(@>U^n;ds!i zEz;;u5Xw1#ug*0!*$FMc+4X2hz-)cemuc1bENRosUQc51m371BxPT1O*dqD8B1lN1JcZe?E_ws(NAe#7c&ge?``zG0VONEX$pplAj8-VVVR`AMDDV)qu}$IiVKWxGc2(C$dS-?<*2yYEIFr- zwIKV`ma-5YNFh|fAj5gC5(z~(8w8GO@LSYA?vua=Z+;PpJ^XaE`Un-KBj_88hmEm( zoiag)res1T?}0y+390#i67^rCH5xNkgGmzOV$+qrdj?N0&*2S{EsIJ<+k9BS9X4#< zX>lY7{VebU5fg`mNc!oeNuJHbE!7jA{UD~_%AEWb5aD-M69kt9*5H<@5UeFn_wgrE zX`A)$AAFFB$nZA#ssUI&+V)sOU8ihB&; zJ@Y3NrD}Jw&{Q1>j?MXFUI5Qc_tQ+wN3Adp-nh3L1GQKF-ou{{CeC0D3Z*DBun~Ce z=ANsEu;lRyA$Ya(bxzR!thN*wThZMnfPN+;8y3Ca3$Ggss7UoCsM4Z-rAbYCMZYBl zMCwMZ?N@Z-mFEw~ZJDzsIa_*|0U$9l*5 z8Uo`&cNmK**3R*oJ?==pdo4Sl9$$PN56yqNISLWjLKyAUDi{i1NlY!YpB?at%8?L;)z7zW;B$^D(HNN6U&}Buj$d*wSJ|Tvoc1FdF>?ZAm z1qwKJI~pm3J9ALBr7h~aW}$emN0Fe81Mbp%zEh#{N3>+7)K(H+CYN<4cyzwfqL4V! zQ0SXtma}Qe+o<&7c#h2%**Sa=S-x1Z>e1``MO6PsJ|&-c!=o%x=AA#q_VZ1r%tM?! zK+v_WDnF)&FuZ;*mBiR9-d_lN;u>3cinWo)XlJAvKF&N~+VC4+66g9RC%TV3a7Bx} zIAixl&scmN74Imp))3RP%66R6yUcvBe#rcW*p%&SEjG zKaX-W3nDL9BA=9=iXz#4U&^nZ1hfuKU;*%>=Vd!JD0m0X?saG}Iy=_JFD9`Yq{!0j zm0?u!$;@qM?(^$f&gOQ>`~eWNYOLngMrPQwDdL6}IXZa`^Y%eg-b9T)u%vSKcOUg8(@oG-L1(W6&z z`(azX?4?#ZuLq5O{m8s?f`VE6G%1y^!Y*7-S2#$eQNj$BE-DfQH%_LYaIrDq#3Xij!3kQ2(=P+65<^7%NMizBMTLK_yyl#<=f!FOJG_VD9 z)gReL2syeEhMGL--mI&%B!H(9UwR*$%J7{njQ@bi`Z8dTu4}jwt=Lz1PTsM!?@4la zWRP`>C4?)32VzoiV>~VHToIhxo;i}C?;sYAS>~^{X-K;|oF53>0!JJZn?ACSduAis zT`3vhYNgV`hu+E&DL&X?iwHy86rh|@CwVB9a%9i+?L2|6?QjI0U_j^Rq;_7` zS3n~d*il*+-T0(sxGrw$Y>h8#lu-?_F|-@mAr?dExA@q!CZ&10HxXz-s7ZeobUgC~ z4@NApM>;X==)L~4y5;X5C8@rE(cirwy|Iqf$a{Itth(hQ%H1!P`=?D3TZG^y*JQ(} z8IBIsK2&-ln9pBrJ00{7Leq(3sXzym6lo5>tK zNu7p5xAH`FG*}bh)xcO=fZr#i6iZQ}7HNtPJ_RXmL3#q#YGm^^*hi~T8e1Ln8SzP; zC>Po8<75thd#0019+6&!U?6P+#EPVg{`^H&S)NM4oL^L4@IjfmDDUM!HnV*X?_HmhlDZQR>~nZndcgAxus zS)zAZTHB%iP_XoM{VJFP02(-P)~y-S=&?cwy|mBKvSI70&ZQIcp2AM zxPH@zFAK`Z-pf$+y3fxVw-OS~Z`9`H+FA)!Yt>0$hniU4$G^eFSyr@m^wm7nt&Ve% z@i(Q(G3v6oh{wKVf<{u{$IuV8C#;L{n^IRw-$SyUSRdBRdzsML*8sxkFJi89VLf#4 zLQ^VU7wzoCX~MVUdT{^usjflScZzVP`CDjuxzpD&^HJdsR^U_+5m36!>W=QOD9u z*5F;64rZ9BbuS-$Wr>rse#H46`WTf)62EeVB6!#Npx_qz1*J;6@u*Vz>(=1-A%N*!45D`r_e}#kZCN-sRP=0dP8*0gv2}iS7>S5=xZn9emUh4>5_s zLS!3XEZaCK>U+GA_N0a~RpZwS@O{d2OOYahRVDpgTh!@w{yFSy+nZjjJOiCJ4_={V zm5q2h{Z^d7*}9Glg%|Z<`#Y^ovJ~c%9}4E#Mu=?dP|^|95~he+>fdg1d!22yq&6e5 z$Hy}VxGG+wcmrj7(J22Sr(AuIh6ve!Anj>9E{Lor^qu?h+1D{)`>qRj=vQhHlCTiP zmt8JNZt({rcQJW78reluxESEKP$?FQk9Na!`v)XdcHLWG`=WDx!+UfDu+U227cF1~ zz$czy@xto?@h-CAVWmR2n#PDCgbG$Br$67qU?Z4Cmbpd@PxO^Gx{zQ#DKqkZlO;42J(n6BrN-Rp%cC-JG> z@ooHm)BEtq6{@>r_l1#gsUOOnj>^m0QW1}j@&By5kVsik=WHsk9z+c9qhw{@B7R4t z5WpLP(wX^l&Tp80oW47?$+z&%#_Jh`C)eXQ$(T$Ht}wpYFmam4Cw-}0XAj1-iDNFdpQc+}w_W(tJl{>8KW+pKANdL(1oA!3rliqa(n#jB z;k1zlAWY8Y5RcM*PqSF|x}1S9#kXlceh{}wk4Y(0QYQjn6u=2u>Atv^Heh@$hN&7X zLB(Kom8o6ay|4uOEP($PTj$vc2{naqM=42OWA=A9e}k@4K!5f>S@H~R8j&uRs5ouP zT{f&zFx^6=(b1UcKlCAAe>MCdN%ppdc)8?e_}6ThVW0W1)LP=Jbs}DP$7w8D{-~7I?0&n!^2GP$sLSN zb!lfkG(An3`S4wiEPSW&0x@=kV}$~=|BX;=B8!UojyjWv{|E>H{-DM9`C!xPx4F?d zqa%?Z%I^_AHcE%Gk@p+VHZa3ws^zS8ylGUQ)8xqXaH~$3=a>&QY30835#P4NTTO98sb+jwS$sr7VVIG1ksPri7}C#w_8U4O14C|VgM5K zCadtEi3(09y_8*{*q;1TMD1d2dB4t6ImdTCm!e@`Xqq~Ddo?+%IDv4tkH6!MKP`xjilKlv!)(yCHV1s>2keXFA z0euy}ETBRiRDnD1sj&G|$vz23PZ-H>6l!_l1#M$?$mr0_r1xZk#rEzT(Z$f8y@UEC z-2A=~oY~uH24w0N+&+$@3$R?rNxY5;R3TrFi>P)98!y@WYN{|Y)I)BwwKEf}O@|2# zSbv)SRF-d(+UzK8y-D~p^Nk21;Btx6bEOVe(0fUcoqHH2yiL?i?4XOi=(G`;zAG#) zCG%ZgZhNpabM9={mZDP8Y}=j$tF?PR`c2cUEEFqYZ}I*9*UbKpmd+B!-}?u`pLWiB z(h~Eq#={4|S6^Q2kj1`_L9OX*88iHJRbL8wOwxf9beG^_Wq3f4`m_B;qTOIj!@Ij)= zHbCrwNH*s7JGVb)f%?lfKM6%JO|fMPra%XqQ;2@obgx!*)}kK&c=wHyZudLAoUw#_XGWv+rCALp+dT^H)tbDXqhVbCeEI#-a}kYLD835z#P`c+QQOvs z7P9_I9Uv)6XPS7__x2AZOE-HUK~L1^?>uWBVsT|z#&+vCMc$@_rQ(I#LLq1ynU5dk zQhL%)1FfB3umxZZJg9@Bef&%>*bAhE{n!+8)dZ~bPRASq9M*F|my(svM+FaLXi=@t zFYY>GvXZ;6%OS54c@39`KDEAIgx;Q!Hj#}|&>%^&^R1En64}X1=`mt3e8A<+27j_x za3!BTa6O-?=044vp6IdM5kn)~hM}Q&0=qSk-t}=Xq*IUg{m9G7@>uz3`Q+ZZrIHH( zeD!nuJYGujmgbF;L6Wcb66)85(9{|k0fnTrc}{>c8Cu2Z>p&7#In|DZ)GzgJ-^(i7 z=WTj%&OWhJc*lSeCs&eLj_jP}4?2L(`B!s2Iv*FYzt$p)))8+)fRu6Z!qk{LlrpATl&TIdXf<>Msc;X4^ z%ZMMbrEGeY(PtKmVXIYWfk&#SRw~);rv`VY6spk74agf|3KTI#BQ6Oa zrs=_1nbUn23MP0x#-V+nN0ijXm-5Ng0|1ppzRz^X5thqaMls8RbX$sn7(>+p`n-&p&g6A#Z(YCa{$~V;-ZFpkMsX za5-EPKOtry6cOxoI5}c<>GweO%~EIWk9x)7jZJz@8xbi9F;@RP)j}zPAk%7qk6?_t z)AigpHM_PkHFW`h4SI#MSVwXc?RG7W#L72I!XhM2@2^ECQ*sA(9J?N|7`<_6>+uz% zmc(S9s=!Z#Z6eHs2+EZIKr)3sH;hX}+Oox+_2PY040nOy)0536E_xlLqZZBiu&=39 ziO_O8&+_hA{&2CkinE+kXBk3^NU|0wAu_@D!Tm5G{F(P<#-)DY__ELhYG{q`bc z*PZ?xU4{Pn1A1!ul!!Pxq$yLV_o>*6I8BkqAzRYw}#) zdc$9^F*8d7Bf&P98DW_bE0c^{LO!@`qK%Hd|MA03{eZr26mFH3OfIhm!f)aWADK>L zs%OBacke5mp97>NqXJ{uixo3Jb}M6|+qI!kj%H8tptFbks!)%Eqpd<%aP&k_oRT_G zZ72Z=fDri9N^xzFJko42HAZSa1z$Del|Hz86nh*Y96c(6D_HN}IV1OTnZ0*-Jk%uu zc!(00d!O8*jHGNMM0L|xi~?aMLu8#&+pB6S<6PX__!l83h7=4wN_P=H-wiTY%3O0sZ6tEu9P31)2h9Tpbs|W>*)Co@nO_ zaD6DGnzT=bO!qU|-{3#ldu%wq9uIoP0|G5JW+jJghCDey6247qBaR)QI6ql@Uex@B zyUF<2`gyX-O~)#z{=y3>1*tOJ2A<2IP9xc;Xgvko87M7X?lx^c=c|57nuyb?Hgaq% zS*-Wvvhh$178C2W*ZgHxTEo&xdcc>Z;atZgk0V#N=i3nd2eZ}Dd-#udx^(9|&pXTn zY^%yL6l?1j02MruMdT7iod<>nrMYs96g(icBL1Yp` z!AieGUc!vR$AngC0-`7DXT?2Uts;#1Wt~hf?n@D%U~dWtdmKyPM{O}-*L!_hBR$qZ zAN9d6rN2xfB)5KuOuZ|0?o_&IcT6cPpWWNkwL2a`X$yR$_@_i@BQ@Bqf)!J0ar_q} z7O^jHjnH$|`_lHhJ(kx=kI`n*!!uwTnZjjzOmEI3(7}v;dR_AkmeKtsTQSzxqj`+5 z+Y80Nry)jpz9MU^{_b6isBCX!pQ50hr*+L>8_alIa&RFGO}`FqZ#GJ|N2mGBfdk%U zNP^_b8WXaUI(Gp?>FS9W?Yq{P@V{KN>)u)CtfqgnCE>)67js?6kuNUfL;wL(GtrMr z&zFyNem3tv35iN8$l3)H9Wydbq~e_5qdOxra&eRz${j$E?g(| zxY})wg;3A~KV$b%nvWRXGX7JC(oe-MxbuyI?2UA@w1ZIcSHt_bo^i3aZ_@bDMmOZ! z*=vVX+>x)HpW)dddsYJNdnW# NPs>=dR^283e*vEsT>k(7 literal 0 HcmV?d00001 From 707bf259aadc30da7dec7c7d41b29a24c9ce631e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:17:14 +0100 Subject: [PATCH 031/221] update documentation --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3f8d21..c3ffde0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -![logo](https://github.com/ivanstan/tle-api/blob/master/docs/logo512.png?raw=true) +

+ +

Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ From 1e5f3ac1c56405750649a9ca712ea716399f6f97 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 17:34:31 +0100 Subject: [PATCH 032/221] add dependency ivanstan/tle-php --- .github/workflows/php.yml | 26 - README.md | 5 +- composer.json | 1 + composer.lock | 830 ++++++++++++++++++++++---- public/favicon.ico | Bin 0 -> 1150 bytes src/Command/DoctrineReloadCommand.php | 2 +- symfony.lock | 15 + 7 files changed, 734 insertions(+), 145 deletions(-) delete mode 100644 .github/workflows/php.yml create mode 100644 public/favicon.ico diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml deleted file mode 100644 index 8962a94..0000000 --- a/.github/workflows/php.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: PHP Composer - -on: - push: - branches: - - production - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest - - # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" - # Docs: https://getcomposer.org/doc/articles/scripts.md - - # - name: Run test suite - # run: composer run-script test diff --git a/README.md b/README.md index c3ffde0..f4f03f1 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,8 @@ Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/si Further documentation and response examples are available at: http://data.ivanstanojevic.me/api/tle/docs - -Available endpoints -The TLE API consists of two endpoints GET http://data.ivanstanojevic.me +###Available endpoints +The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| diff --git a/composer.json b/composer.json index e5e6959..4ac57ef 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", + "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", "symfony/asset": "5.0.*", diff --git a/composer.lock b/composer.lock index 7625623..b2a1e5b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "757b98014fe5c4a0788a2cbb83297329", + "content-hash": "e147328d3b45617aa4be85dc153b6b38", "packages": [ { "name": "doctrine/annotations", @@ -1144,6 +1144,236 @@ ], "time": "2018-06-14T14:45:07+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-12-23T11:57:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "ivanstan/tle-php", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/ivanstan/tle-php.git", + "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/5bd7487aa242248ad255b041f5fe99a8f5daca33", + "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5", + "myclabs/php-enum": "^1.7" + }, + "require-dev": { + "phpunit/phpunit": "^8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ivanstan\\Tle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivan Stanojevic", + "email": "ivan.stanojevic@protonmail.com" + } + ], + "description": "TLE Framework written in PHP and client to NASA TLE API.", + "time": "2020-01-08T10:08:36+00:00" + }, { "name": "jdorn/sql-formatter", "version": "v1.2.17", @@ -1194,6 +1424,177 @@ ], "time": "2014-01-12T16:20:24+00:00" }, + { + "name": "laminas/laminas-code", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", + "shasum": "" + }, + "require": { + "laminas/laminas-eventmanager": "^2.6 || ^3.0", + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.1" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" + }, + "require-dev": { + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^1.0", + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "phpunit/phpunit": "^7.5.16 || ^8.4" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas" + ], + "time": "2019-12-31T16:28:24+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^5.6 || ^7.0" + }, + "replace": { + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "time": "2019-12-31T16:44:52+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/0fb9675b84a1666ab45182b6c5b29956921e818d", + "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev", + "dev-develop": "1.1.x-dev" + }, + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": [ + "ZendFramework", + "autoloading", + "laminas", + "zf" + ], + "time": "2020-01-07T22:58:31+00:00" + }, { "name": "myclabs/php-enum", "version": "1.7.2", @@ -1506,6 +1907,56 @@ ], "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.1.2", @@ -1553,6 +2004,46 @@ ], "time": "2019-11-01T11:05:21+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3594,119 +4085,6 @@ "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "time": "2019-12-10T11:06:55+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "require-dev": { - "doctrine/annotations": "^1.7", - "ext-phar": "*", - "phpunit/phpunit": "^7.5.16 || ^8.4", - "zendframework/zend-coding-standard": "^1.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "zendframework/zend-stdlib": "Zend\\Stdlib component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "keywords": [ - "ZendFramework", - "code", - "zf" - ], - "abandoned": "laminas/laminas-code", - "time": "2019-12-10T19:21:15+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "abandoned": "laminas/laminas-eventmanager", - "time": "2018-04-25T15:33:34+00:00" } ], "packages-dev": [ @@ -3840,6 +4218,226 @@ ], "time": "2019-11-13T15:46:58+00:00" }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "drupal/drupal": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "endroid/qr-code-bundle": "<3.4.2", + "erusev/parsedown": "<1.7.2", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "onelogin/php-saml": "<2.10.4", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", + "phpoffice/phpexcel": "<=1.8.1", + "phpoffice/phpspreadsheet": "<=1.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.48", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2020-01-06T19:16:46+00:00" + }, { "name": "symfony/phpunit-bridge", "version": "v5.0.2", @@ -3908,7 +4506,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..33601c5d3a953ee7707a2ed598f1beeed7d40588 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYI*xFHzK9|FXbun>j?Nl6S# z)6)g#Cnhk@j*TJO)g{)J3tX#?f3R7$V6lM$J z`|KA2)6AN}LOi-5QuAVC8UBCx%CH}3#-(K|b{^>J4g;CFBqfEQ zUYLSuK|u_2qN14Q#l~=TIM_4R7~yj@OxM8DKraHr4v71KxE+X@85n-RFh2vs2OvIR T55)Bh3=e?#BTy{}!}I|F>1*+$ literal 0 HcmV?d00001 diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 95ea3bc..056abd8 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -48,7 +48,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $question = new ChoiceQuestion('All data will be lost. Do you wish to continue?', self::$choices, false); if (!\in_array($this->env, self::$envs, true)) { - $io->warning('This is intended only for use in dev environment.'); + $io->warning('This is intended only for use in dev or test environment.'); return 1; } diff --git a/symfony.lock b/symfony.lock index 412623f..8950aaf 100644 --- a/symfony.lock +++ b/symfony.lock @@ -90,6 +90,15 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "guzzlehttp/guzzle": { + "version": "6.5.2" + }, + "guzzlehttp/promises": { + "version": "v1.3.1" + }, + "guzzlehttp/psr7": { + "version": "1.6.1" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, @@ -114,9 +123,15 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-message": { + "version": "1.0.1" + }, "psr/log": { "version": "1.1.2" }, + "ralouphie/getallheaders": { + "version": "3.0.3" + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From 840a78d0cabc5a2dfecf714c02f83ca96a1bae78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 18:15:07 +0100 Subject: [PATCH 033/221] add test for not found tle record --- src/Command/ImportTleCommand.php | 4 +- src/Kernel.php | 3 + src/Migrations/Version20191217203053.php | 3 + src/Serializer/TleModelNormalizer.php | 2 +- src/Service/TleFile.php | 44 ----- src/ViewModel/Model/TleModel.php | 218 ----------------------- tests/DocumentationTest.php | 3 +- tests/ErrorPageTest.php | 8 +- tests/TleModelTest.php | 64 ------- tests/TleTest.php | 15 +- 10 files changed, 29 insertions(+), 335 deletions(-) delete mode 100644 src/Service/TleFile.php delete mode 100644 src/ViewModel/Model/TleModel.php delete mode 100644 tests/TleModelTest.php diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 4d099ff..4c5a1fc 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -4,10 +4,10 @@ use App\Entity\Tle; use App\Repository\TleRepository; -use App\Service\TleFile; use App\Service\Traits\FileSystemAwareTrait; -use App\ViewModel\Model\TleModel; +use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; +use Ivanstan\Tle\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; diff --git a/src/Kernel.php b/src/Kernel.php index 65c5230..509a308 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -9,6 +9,9 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\RouteCollectionBuilder; +/** + * @codeCoverageIgnore + */ class Kernel extends BaseKernel { use MicroKernelTrait; diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index db9f18d..4fb03c7 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; +/** + * @codeCoverageIgnore + */ final class Version20191217203053 extends AbstractMigration { /** @throws \Exception */ diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 57201d0..b07e6fc 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -3,7 +3,7 @@ namespace App\Serializer; use App\Entity\Tle; -use App\ViewModel\Model\TleModel; +use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; diff --git a/src/Service/TleFile.php b/src/Service/TleFile.php deleted file mode 100644 index 37c917e..0000000 --- a/src/Service/TleFile.php +++ /dev/null @@ -1,44 +0,0 @@ -content = $content; - } - - /** - * @return TleModel[] - */ - public function parse(): array - { - $data = explode("\n", $this->content); - $data = array_filter($data); - $raw = array_chunk($data, 3); - - $result = []; - foreach ($raw as $key => $item) { - if (!isset($item[0], $item[1], $item[2])) { - $result[$key] = null; - continue; - } - - $result[$key] = new TleModel($this->trim($item[1]), $this->trim($item[2]), $this->trim($item[0])); - } - - return $result; - } - - protected function trim(string $string): string - { - $string = str_replace(["/\r\n/", "/\r/", "/\n/"], '', $string); - - return trim($string); - } -} \ No newline at end of file diff --git a/src/ViewModel/Model/TleModel.php b/src/ViewModel/Model/TleModel.php deleted file mode 100644 index 4bbeda8..0000000 --- a/src/ViewModel/Model/TleModel.php +++ /dev/null @@ -1,218 +0,0 @@ -line1 = $line1; - $this->line2 = $line2; - $this->name = $name; - } - - public function getId(): int - { - return (int)substr($this->line1, 2, 6); - } - - public function getClassification(): string - { - return $this->line1[7]; - } - - public function getName(): string - { - return $this->name; - } - - public function launchYear(?bool $fourDigits = null): int - { - $year = (int)trim(substr($this->line1, 9, 2)); - - if ($fourDigits ?? true) { - $this->formatYear($year); - } - - return $year; - } - - public function launchNumberOfYear(): int - { - return (int)trim(substr($this->line1, 12, 2)); - } - - public function epoch(): string - { - return trim(substr($this->line1, 18, 14)); - } - - public function launchPiece(): string - { - return trim(substr($this->line1, 14, 2)); - } - - public function bstar(): string - { - return trim(substr($this->line1, 53, 8)); - } - - public function elementNumber(): int - { - return (int)trim(substr($this->line1, 64, 4)); - } - - public function inclination(): float - { - return (float)trim(substr($this->line2, 8, 8)); - } - - public function raan(): float - { - return (float)trim(substr($this->line2, 17, 8)); - } - - public function eccentricity(): float - { - return (float)('.' . trim(substr($this->line2, 26, 7))); - } - - public function meanAnomaly(): float - { - return (float)trim(substr($this->line2, 43, 8)); - } - - public function argumentOfPerigee(): float - { - return (float)trim(substr($this->line2, 34, 8)); - } - - public function meanMotion(): float - { - return (float)trim(substr($this->line2, 52, 11)); - } - - public function getDate(): string - { - $year = (int)trim(substr($this->line1, 18, 2)); - $year = $this->formatYear($year); - - $date = new \DateTime(); - $timezone = new \DateTimeZone('UTC'); - - $epoch = (float)trim(substr($this->line1, 20, 12)); - $days = (int)$epoch; - - $date - ->setTimezone($timezone) - ->setDate($year, 1, $days); - - $faction = round($epoch - $days, 8); - - $faction *= 24; // hours - $hours = round($faction); - $faction -= $hours; - - $faction *= 60; // minutes - $minutes = round($faction); - $faction -= $minutes; - - $faction *= 60; // seconds - $seconds = round($faction); - $faction -= $seconds; - - $faction *= 1000; // milliseconds - $milliseconds = round($faction); - - $date->setTime($hours, $minutes, $seconds, $milliseconds); - - return $date->format('c'); - } - - public function getChecksum(int $lineNumber): int - { - $line = $this->getLineByNumber($lineNumber); - - return (int)trim(substr($line, 68)); - } - - public function calculateChecksum(int $lineNumber): int - { - $line = $this->getLineByNumber($lineNumber); - - return $this->checksum($line); - } - - public function verify(): bool - { - if (self::LINE1 !== (int)$this->line1[0] || self::LINE2 !== (int)$this->line2[0]) { - return false; - } - - if ($this->getChecksum(self::LINE1) !== $this->calculateChecksum(self::LINE1)) { - return false; - } - - if ($this->getChecksum(self::LINE2) !== $this->calculateChecksum(self::LINE2)) { - return false; - } - - return true; - } - - private function formatYear(int $twoDigitYear): int - { - if ($twoDigitYear < 57) { - $twoDigitYear += 2000; - } else { - $twoDigitYear += 1900; - } - - return $twoDigitYear; - } - - private function getLineByNumber(int $lineNumber): string - { - if (self::LINE1 === $lineNumber) { - return $this->line1; - } - - if (self::LINE2 === $lineNumber) { - return $this->line2; - } - - throw new \InvalidArgumentException(\sprintf('Invalid line number %d', $lineNumber)); - } - - // refactor: TleValidator - private function checksum(string $line): int - { - $line = substr($line, 0, -1); // remove checksum - $length = \strlen($line); - $sum = 0; - for ($i = 0; $i < $length; $i++) { - if ($line[$i] === '-') { - ++$sum; - continue; - } - - if (is_numeric($line[$i])) { - $sum += $line[$i]; - } - } - return $sum % 10; - } -} diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index d2aaf3e..7ea6b5f 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -3,6 +3,7 @@ namespace App\Tests; use App\DataFixtures\TleFixtures; +use Symfony\Component\HttpFoundation\Response; final class DocumentationTest extends AbstractWebTestCase { @@ -10,7 +11,7 @@ public function testDocumentationIsCorrect(): void { $response = $this->get('/api/tle.json'); - self::assertEquals(200, $response->getStatusCode(), 'Assert json documentation is available'); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); $response = $this->toArray($response); diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index fc7d0de..6a6f186 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -2,13 +2,19 @@ namespace App\Tests; +use Symfony\Component\HttpFoundation\Response; + class ErrorPageTest extends AbstractWebTestCase { public function test404(): void { $response = $this->get('/noop'); - self::assertEquals($response->getStatusCode(), 404, 'Assert page not found returns HTTP 404'); + self::assertEquals( + $response->getStatusCode(), + Response::HTTP_NOT_FOUND, + 'Assert page not found returns HTTP 404' + ); $response = $this->toArray($response); diff --git a/tests/TleModelTest.php b/tests/TleModelTest.php deleted file mode 100644 index de2a94b..0000000 --- a/tests/TleModelTest.php +++ /dev/null @@ -1,64 +0,0 @@ -getLine1(), $entity->getLine2(), $entity->getName()); - - static::assertEquals( - TleFixtures::$date, - $tle->getDate(), - 'Failed asserting TLE returned correct date' - ); - - static::assertEquals( - 0, - $tle->getChecksum(TleModel::LINE1), - 'Failed asserting TLE checksum for line1 is correct' - ); - - static::assertEquals( - 4, - $tle->getChecksum(TleModel::LINE2), - 'Failed asserting TLE checksum for line2 is correct' - ); - - static::assertEquals( - 0, - $tle->calculateChecksum(TleModel::LINE1), - 'Failed asserting TLE calculated checksum for line1 is correct' - ); - - static::assertEquals( - 4, - $tle->calculateChecksum(TleModel::LINE2), - 'Failed asserting TLE calculated checksum for line2 is correct' - ); - - static::assertEquals( - true, - $tle->verify(), - 'Failed asserting that TLE is correct' - ); - - static::assertEquals( - 43550, - $tle->getId(), - 'Failed asserting that TLE Satellite/Catalog number is correct' - ); - - static::assertEquals( - 'U', - $tle->getClassification(), - 'Failed asserting that TLE classification is correct' - ); - } -} diff --git a/tests/TleTest.php b/tests/TleTest.php index 062b163..a557992 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -3,6 +3,7 @@ namespace App\Tests; use App\DataFixtures\TleFixtures; +use Symfony\Component\HttpFoundation\Response; final class TleTest extends AbstractWebTestCase { @@ -10,9 +11,9 @@ public function testTleSingleRecord(): void { $tle = TleFixtures::create(); - $response = $this->get('/api/tle/'.$tle->getId()); + $response = $this->get('/api/tle/' . $tle->getId()); - self::assertEquals(200, $response->getStatusCode()); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response = $this->toArray($response); @@ -23,7 +24,7 @@ public function testTleSingleRecord(): void self::assertArrayHasKey('line1', $response); self::assertArrayHasKey('line2', $response); - self::assertEquals('http://localhost/api/tle/'.$tle->getId(), $response['@id']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); self::assertEquals('TleModel', $response['@type']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals(TleFixtures::$date, $response['date']); @@ -31,6 +32,12 @@ public function testTleSingleRecord(): void self::assertEquals($tle->getLine2(), $response['line2']); } + public function testTleRecordNotFound(): void + { + $response = $this->get('/api/tle/0'); + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + } + public function testTleCollectionRecord(): void { $pageSize = 2; @@ -42,7 +49,7 @@ public function testTleCollectionRecord(): void ] ); - self::assertEquals(200, $response->getStatusCode()); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response = $this->toArray($response); From e7e627cb38fdee1a71b105e1d02cf3f0042771b4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 19:43:43 +0100 Subject: [PATCH 034/221] add client libraries section --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f4f03f1..b0613c4 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,9 @@ The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` Example query http://data.ivanstanojevic.me/api/tle + +# Client libraries + +* JavaScript https://github.com/ivanstan/tle.js +* PHP https://github.com/ivanstan/tle-php +* C# https://github.com/nichols-t/TLE.NET \ No newline at end of file From 8581362279180c7131b813e82e36e80921ea02ee Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 21:53:48 +0100 Subject: [PATCH 035/221] add coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b0613c4..150ab31 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) From 34bcef1caaae6d2cd98187b4aa9d5fea80273146 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 21:55:07 +0100 Subject: [PATCH 036/221] add coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 150ab31..874f46b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) ![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) +![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) From f7832b8de794ccb373a77637dbbb0d316eb5f3d7 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 21 Jan 2020 18:30:22 +0100 Subject: [PATCH 037/221] updated symfony 5.0.3 --- .coveralls.yml | 6 +- .travis.yml | 62 +-- README.md | 84 ++-- composer.json | 152 +++--- composer.lock | 440 ++++++++++-------- config/custom/source.yaml | 92 ++-- src/Controller/AbstractApiController.php | 260 +++++------ src/Controller/TleController.php | 168 +++---- src/Service/Validator/RequestValidator.php | 160 +++---- src/ViewModel/SortDirectionEnum.php | 20 +- .../TleCollectionSortableFieldsEnum.php | 20 +- symfony.lock | 3 + tests/CollectionTest.php | 244 +++++----- tests/DocumentationTest.php | 72 +-- tests/ErrorPageTest.php | 52 +-- 15 files changed, 946 insertions(+), 889 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index 93f2685..c443d85 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,4 +1,4 @@ -repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo -coverage_clover: tests/logs/clover.xml -json_path: tests/logs/coveralls-upload.json +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b7cf21c..603c2b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,31 @@ -language: php - -services: - - mysql - -cache: - directories: - - $HOME/.composer/cache - -branches: - only: - - master - -matrix: - include: - - php: 7.4 - -before_install: - - composer require satooshi/php-coveralls - -install: - - composer install - -script: - - php bin/phpunit --coverage-clover ./tests/logs/clover.xml - -after_script: - - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" - - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" - - export CI_BRANCH="$TRAVIS_BRANCH" - - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml +language: php + +services: + - mysql + +cache: + directories: + - $HOME/.composer/cache + +branches: + only: + - master + +matrix: + include: + - php: 7.4 + +before_install: + - composer require satooshi/php-coveralls + +install: + - composer install + +script: + - php bin/phpunit --coverage-clover ./tests/logs/clover.xml + +after_script: + - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" + - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" + - export CI_BRANCH="$TRAVIS_BRANCH" + - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml diff --git a/README.md b/README.md index 874f46b..c398e5c 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,43 @@ -# TLE API - -[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) -![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) -![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) -![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) -![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) -![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) - -

- -

- -Code repository that powers TLE API backend, listed on NASA API catalog -https://api.nasa.gov/ - -API provides up to date two line element set records, the data is updated -daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) -is a data format encoding a list of orbital elements of an -Earth-orbiting object for a given point in time. -For more information on TLE data format visit [Definition of -Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). - -## Usage -Further documentation and response examples are available at: -http://data.ivanstanojevic.me/api/tle/docs - -###Available endpoints -The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` - -| Endpoint | Description | -|----------|:------:| -| `GET /api/tle?search={q}` | Perform search by satellite name | -| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | - -Example query -http://data.ivanstanojevic.me/api/tle - -# Client libraries - -* JavaScript https://github.com/ivanstan/tle.js -* PHP https://github.com/ivanstan/tle-php +# TLE API + +[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) +![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) +![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) +![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) +![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) + +

+ +

+ +Code repository that powers TLE API backend, listed on NASA API catalog +https://api.nasa.gov/ + +API provides up to date two line element set records, the data is updated +daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) +is a data format encoding a list of orbital elements of an +Earth-orbiting object for a given point in time. +For more information on TLE data format visit [Definition of +Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). + +## Usage +Further documentation and response examples are available at: +http://data.ivanstanojevic.me/api/tle/docs + +###Available endpoints +The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` + +| Endpoint | Description | +|----------|:------:| +| `GET /api/tle?search={q}` | Perform search by satellite name | +| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | + +Example query +http://data.ivanstanojevic.me/api/tle + +# Client libraries + +* JavaScript https://github.com/ivanstan/tle.js +* PHP https://github.com/ivanstan/tle-php * C# https://github.com/nichols-t/TLE.NET \ No newline at end of file diff --git a/composer.json b/composer.json index 4ac57ef..58f4eb1 100644 --- a/composer.json +++ b/composer.json @@ -1,76 +1,76 @@ -{ - "type": "project", - "license": "proprietary", - "require": { - "php": "^7.4", - "ext-ctype": "*", - "ext-iconv": "*", - "ext-json": "*", - "ivanstan/tle-php": "^1.0", - "myclabs/php-enum": "^1.7", - "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", - "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", - "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.0.*", - "symfony/yaml": "5.0.*" - }, - "require-dev": { - "roave/security-advisories": "dev-master", - "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" - }, - "config": { - "preferred-install": { - "*": "dist" - }, - "sort-packages": true, - "optimize-autoloader": true - }, - "autoload": { - "psr-4": { - "App\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Tests\\": "tests/" - } - }, - "replace": { - "paragonie/random_compat": "2.*", - "symfony/polyfill-ctype": "*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-php72": "*", - "symfony/polyfill-php71": "*", - "symfony/polyfill-php70": "*", - "symfony/polyfill-php56": "*" - }, - "scripts": { - "auto-scripts": { - "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd" - }, - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ], - "test": "@php bin/phpunit --coverage-text" - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "public-dir": "./public", - "symfony": { - "allow-contrib": false, - "require": "5.0.*" - } - } -} +{ + "type": "project", + "license": "proprietary", + "require": { + "php": "^7.4", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-json": "*", + "ivanstan/tle-php": "^1.0", + "myclabs/php-enum": "^1.7", + "symfony/apache-pack": "^1.0", + "symfony/asset": "5.0.*", + "symfony/browser-kit": "5.0.*", + "symfony/console": "5.0.*", + "symfony/dotenv": "5.0.*", + "symfony/flex": "^1.3.1", + "symfony/framework-bundle": "5.0.*", + "symfony/orm-pack": "^1.0", + "symfony/serializer": "5.0.*", + "symfony/yaml": "5.0.*" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "doctrine/doctrine-fixtures-bundle": "^3.1", + "symfony/phpunit-bridge": "^5.0" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true, + "optimize-autoloader": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "paragonie/random_compat": "2.*", + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "cache:warmup": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ], + "test": "@php bin/phpunit --coverage-text" + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "public-dir": "./public", + "symfony": { + "allow-contrib": false, + "require": "5.0.*" + } + } +} diff --git a/composer.lock b/composer.lock index b2a1e5b..49a4264 100644 --- a/composer.lock +++ b/composer.lock @@ -228,16 +228,16 @@ }, { "name": "doctrine/common", - "version": "v2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff" + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", - "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", "shasum": "" }, "require": { @@ -307,20 +307,20 @@ "doctrine", "php" ], - "time": "2019-09-10T10:10:14+00:00" + "time": "2020-01-10T15:49:25+00:00" }, { "name": "doctrine/dbal", - "version": "v2.10.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934" + "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/0c9a646775ef549eb0a213a4f9bd4381d9b4d934", - "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", + "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", "shasum": "" }, "require": { @@ -399,20 +399,20 @@ "sqlserver", "sqlsrv" ], - "time": "2019-11-03T16:50:43+00:00" + "time": "2020-01-04T12:56:21+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.0.6", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "0ef972d3b730f975c80db9fffa4b2a0258c91442" + "reference": "6926771140ee87a823c3b2c72602de9dda4490d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ef972d3b730f975c80db9fffa4b2a0258c91442", - "reference": "0ef972d3b730f975c80db9fffa4b2a0258c91442", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6926771140ee87a823c3b2c72602de9dda4490d3", + "reference": "6926771140ee87a823c3b2c72602de9dda4490d3", "shasum": "" }, "require": { @@ -439,6 +439,7 @@ "phpunit/phpunit": "^7.5", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", @@ -490,7 +491,7 @@ "orm", "persistence" ], - "time": "2019-12-19T13:47:07+00:00" + "time": "2020-01-18T11:56:15+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -823,16 +824,16 @@ }, { "name": "doctrine/migrations", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "8e124252d2f6be1124017d746d5994dd4095d66f" + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/8e124252d2f6be1124017d746d5994dd4095d66f", - "reference": "8e124252d2f6be1124017d746d5994dd4095d66f", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", "shasum": "" }, "require": { @@ -901,7 +902,7 @@ "migrations", "php" ], - "time": "2019-11-13T11:06:31+00:00" + "time": "2019-12-04T06:09:14+00:00" }, { "name": "doctrine/orm", @@ -988,16 +989,16 @@ }, { "name": "doctrine/persistence", - "version": "1.3.3", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "99b196bbd4715a94fa100fac664a351ffa46d6a5" + "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/99b196bbd4715a94fa100fac664a351ffa46d6a5", - "reference": "99b196bbd4715a94fa100fac664a351ffa46d6a5", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", "shasum": "" }, "require": { @@ -1005,7 +1006,7 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.0", + "doctrine/reflection": "^1.1", "php": "^7.1" }, "conflict": { @@ -1067,20 +1068,20 @@ "orm", "persistence" ], - "time": "2019-12-13T10:43:02+00:00" + "time": "2020-01-16T22:06:23+00:00" }, { "name": "doctrine/reflection", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", "shasum": "" }, "require": { @@ -1088,13 +1089,15 @@ "ext-tokenizer": "*", "php": "^7.1" }, + "conflict": { + "doctrine/common": "<2.9" + }, "require-dev": { - "doctrine/coding-standard": "^4.0", - "doctrine/common": "^2.8", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-phpunit": "^0.9.4", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0" + "doctrine/coding-standard": "^5.0", + "doctrine/common": "^2.10", + "phpstan/phpstan": "^0.11.0", + "phpstan/phpstan-phpunit": "^0.11.0", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { @@ -1112,6 +1115,10 @@ "MIT" ], "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -1120,10 +1127,6 @@ "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" @@ -1137,12 +1140,13 @@ "email": "ocramius@gmail.com" } ], - "description": "Doctrine Reflection component", + "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", "homepage": "https://www.doctrine-project.org/projects/reflection.html", "keywords": [ - "reflection" + "reflection", + "static" ], - "time": "2018-06-14T14:45:07+00:00" + "time": "2020-01-08T19:53:19+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1693,45 +1697,46 @@ }, { "name": "ocramius/proxy-manager", - "version": "2.5.1", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "b7bac968eef945322d1e28d7e833b6a549a6da27" + "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/b7bac968eef945322d1e28d7e833b6a549a6da27", - "reference": "b7bac968eef945322d1e28d7e833b6a549a6da27", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/406ca12cabfb43e3b11c994bcbeea8e358c65af9", + "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9", "shasum": "" }, "require": { + "laminas/laminas-code": "^3.4.1", "ocramius/package-versions": "^1.5.1", - "php": "^7.4.0", - "zendframework/zend-code": "^3.3.1" + "php": "7.4.*", + "webimpress/safe-writer": "^2.0" }, "conflict": { "doctrine/annotations": "<1.6.1", + "laminas/laminas-stdlib": "<3.2.1", "zendframework/zend-stdlib": "<3.2.1" }, "require-dev": { - "couscous/couscous": "^1.7.2", "doctrine/coding-standard": "^6.0.0", "ext-phar": "*", - "infection/infection": "^0.13.4", - "nikic/php-parser": "^4.2.2", - "phpbench/phpbench": "^0.16.9", - "phpunit/phpunit": "^8.3.3", + "infection/infection": "^0.15.0", + "nikic/php-parser": "^4.3.0", + "phpbench/phpbench": "^0.16.10", + "phpunit/phpunit": "^8.5.1", "slevomat/coding-standard": "^5.0.4", - "squizlabs/php_codesniffer": "^3.4.2", - "symfony/console": "^4.3.3", - "vimeo/psalm": "3.4.11" + "squizlabs/php_codesniffer": "^3.5.3", + "symfony/console": "^4.4.2", + "vimeo/psalm": "3.7.0" }, "suggest": { - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", - "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", - "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", - "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" + "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", + "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", + "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" }, "type": "library", "extra": { @@ -1764,7 +1769,7 @@ "proxy pattern", "service proxies" ], - "time": "2019-12-17T09:22:43+00:00" + "time": "2020-01-07T08:10:36+00:00" }, { "name": "psr/cache", @@ -2068,16 +2073,16 @@ }, { "name": "symfony/asset", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "6b66969b9f5cd53c1ce69bdc651aa962f211b6b6" + "reference": "447190a24309da88f816313824d85c303035f86b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/6b66969b9f5cd53c1ce69bdc651aa962f211b6b6", - "reference": "6b66969b9f5cd53c1ce69bdc651aa962f211b6b6", + "url": "https://api.github.com/repos/symfony/asset/zipball/447190a24309da88f816313824d85c303035f86b", + "reference": "447190a24309da88f816313824d85c303035f86b", "shasum": "" }, "require": { @@ -2120,20 +2125,20 @@ ], "description": "Symfony Asset Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "a195f83b0ba20e622a5baa726af96826b8f5616b" + "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a195f83b0ba20e622a5baa726af96826b8f5616b", - "reference": "a195f83b0ba20e622a5baa726af96826b8f5616b", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b0294489a7fbb4f3f39c39efe6f0328cb09731b9", + "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9", "shasum": "" }, "require": { @@ -2179,20 +2184,20 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/cache", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "6e8d978878ae5de705ec9fabbb6011cc18776bc9" + "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6e8d978878ae5de705ec9fabbb6011cc18776bc9", - "reference": "6e8d978878ae5de705ec9fabbb6011cc18776bc9", + "url": "https://api.github.com/repos/symfony/cache/zipball/b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", + "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", "shasum": "" }, "require": { @@ -2258,7 +2263,7 @@ "caching", "psr6" ], - "time": "2019-12-12T13:03:32+00:00" + "time": "2020-01-10T21:57:37+00:00" }, { "name": "symfony/cache-contracts", @@ -2320,16 +2325,16 @@ }, { "name": "symfony/config", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7f930484966350906185ba0a604728f7898b7ba0" + "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7f930484966350906185ba0a604728f7898b7ba0", - "reference": "7f930484966350906185ba0a604728f7898b7ba0", + "url": "https://api.github.com/repos/symfony/config/zipball/7640c6704f56bf64045066bc5d93fd9d664baa63", + "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63", "shasum": "" }, "require": { @@ -2380,20 +2385,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-12-18T13:50:31+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/console", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47" + "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fe6e3cd889ca64172d7a742a2eb058541404ef47", - "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47", + "url": "https://api.github.com/repos/symfony/console/zipball/345ab6ecb456b5147ea3b3271d7f1f00aadfd257", + "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257", "shasum": "" }, "require": { @@ -2456,20 +2461,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-12-17T13:20:22+00:00" + "time": "2020-01-19T11:13:19+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2" + "reference": "5a56807650c7258bbcc4a15a020904958c70247e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f9dbfbf487d08f60b1c83220edcd16559d1e40a2", - "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a56807650c7258bbcc4a15a020904958c70247e", + "reference": "5a56807650c7258bbcc4a15a020904958c70247e", "shasum": "" }, "require": { @@ -2529,20 +2534,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "0bdb2d31741cacacb95130d28fbac939c4d574f2" + "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/0bdb2d31741cacacb95130d28fbac939c4d574f2", - "reference": "0bdb2d31741cacacb95130d28fbac939c4d574f2", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/1eda484039e4460101f945470d28ae6e8bdcf0e5", + "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5", "shasum": "" }, "require": { @@ -2625,20 +2630,20 @@ ], "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", - "time": "2019-12-19T12:10:29+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "0a0a73a0836926898b6fcd6817fe697487a73d97" + "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0a0a73a0836926898b6fcd6817fe697487a73d97", - "reference": "0a0a73a0836926898b6fcd6817fe697487a73d97", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/439c3c7be4daa569deef0dd1e30cf3562108d062", + "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062", "shasum": "" }, "require": { @@ -2686,20 +2691,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/dotenv", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "7e1bc9024edd9157264e388080df2533306894d3" + "reference": "8331da80cc35fe903db0ff142376d518804ff1b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/7e1bc9024edd9157264e388080df2533306894d3", - "reference": "7e1bc9024edd9157264e388080df2533306894d3", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/8331da80cc35fe903db0ff142376d518804ff1b1", + "reference": "8331da80cc35fe903db0ff142376d518804ff1b1", "shasum": "" }, "require": { @@ -2743,20 +2748,20 @@ "env", "environment" ], - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/error-handler", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "460863313bd3212d7c38e1b40602cbcfeeeea4a5" + "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/460863313bd3212d7c38e1b40602cbcfeeeea4a5", - "reference": "460863313bd3212d7c38e1b40602cbcfeeeea4a5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/95f64c1d7dfb86a722dc9d278d0edf5176eff16e", + "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e", "shasum": "" }, "require": { @@ -2798,20 +2803,20 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2019-12-16T14:48:47+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7b738a51645e10f864cc25c24d232fb03f37b475" + "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7b738a51645e10f864cc25c24d232fb03f37b475", - "reference": "7b738a51645e10f864cc25c24d232fb03f37b475", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4a7a8cdca1120c091b4797f0e5bba69c1e783224", + "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224", "shasum": "" }, "require": { @@ -2868,7 +2873,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-10T21:57:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2930,16 +2935,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6" + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/1d71f670bc5a07b9ccc97dc44f932177a322d4e6", - "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", "shasum": "" }, "require": { @@ -2976,20 +2981,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-11-26T23:25:11+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/finder", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "17874dd8ab9a19422028ad56172fb294287a701b" + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/17874dd8ab9a19422028ad56172fb294287a701b", - "reference": "17874dd8ab9a19422028ad56172fb294287a701b", + "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", "shasum": "" }, "require": { @@ -3025,7 +3030,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/flex", @@ -3078,16 +3083,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "36e51776b231d8e224da4ce4c60079540acd1c55" + "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/36e51776b231d8e224da4ce4c60079540acd1c55", - "reference": "36e51776b231d8e224da4ce4c60079540acd1c55", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", + "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", "shasum": "" }, "require": { @@ -3204,20 +3209,20 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2019-12-17T10:33:13+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5dd7f6be6e62d86ba6f3154cf40e78936367978b" + "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dd7f6be6e62d86ba6f3154cf40e78936367978b", - "reference": "5dd7f6be6e62d86ba6f3154cf40e78936367978b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dc0db5026f2b611cb8910a1f465e95eafd84c2e", + "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e", "shasum": "" }, "require": { @@ -3259,20 +3264,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "00ce30602f3f690e66a63c327743d7b26c723b2e" + "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/00ce30602f3f690e66a63c327743d7b26c723b2e", - "reference": "00ce30602f3f690e66a63c327743d7b26c723b2e", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", + "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", "shasum": "" }, "require": { @@ -3355,20 +3360,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2019-12-19T18:35:03+00:00" + "time": "2020-01-21T13:29:58+00:00" }, { "name": "symfony/mime", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79" + "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e6a4ced216e49d457eddcefb61132173a876d79", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79", + "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", "shasum": "" }, "require": { @@ -3417,7 +3422,7 @@ "mime", "mime-type" ], - "time": "2019-11-30T14:12:50+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/orm-pack", @@ -3628,16 +3633,16 @@ }, { "name": "symfony/routing", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "120c5fa4f4ef5466cbb510ece8126e0007285301" + "reference": "7da33371d8ecfed6c9d93d87c73749661606f803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/120c5fa4f4ef5466cbb510ece8126e0007285301", - "reference": "120c5fa4f4ef5466cbb510ece8126e0007285301", + "url": "https://api.github.com/repos/symfony/routing/zipball/7da33371d8ecfed6c9d93d87c73749661606f803", + "reference": "7da33371d8ecfed6c9d93d87c73749661606f803", "shasum": "" }, "require": { @@ -3700,20 +3705,20 @@ "uri", "url" ], - "time": "2019-12-12T13:03:32+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "3cfc478c102f2d3bcf60edd339cd9c3cb446a576" + "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/3cfc478c102f2d3bcf60edd339cd9c3cb446a576", - "reference": "3cfc478c102f2d3bcf60edd339cd9c3cb446a576", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a76fc03e125719ef4ce18522b2347bf103b698d0", + "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0", "shasum": "" }, "require": { @@ -3782,7 +3787,7 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2019-12-16T11:08:25+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/service-contracts", @@ -3844,16 +3849,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "d410282956706e0b08681a5527447a8e6b6f421e" + "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/d410282956706e0b08681a5527447a8e6b6f421e", - "reference": "d410282956706e0b08681a5527447a8e6b6f421e", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", "shasum": "" }, "require": { @@ -3890,20 +3895,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a" + "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a", - "reference": "d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ccb1be566ae15f790020f917f06d1da0b04fe47b", + "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b", "shasum": "" }, "require": { @@ -3965,20 +3970,20 @@ "debug", "dump" ], - "time": "2019-12-18T13:50:31+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "1b9653e68d5b701bf6d9c91bdd3660078c9f4f28" + "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1b9653e68d5b701bf6d9c91bdd3660078c9f4f28", - "reference": "1b9653e68d5b701bf6d9c91bdd3660078c9f4f28", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/960f9ac0fdbd642461ed29d7717aeb2a94d428b9", + "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9", "shasum": "" }, "require": { @@ -4025,20 +4030,20 @@ "instantiate", "serialize" ], - "time": "2019-12-01T08:48:26+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0" + "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/847661e77afa48d99ecfa508e8b60f0b029a19c0", - "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", + "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", "shasum": "" }, "require": { @@ -4084,26 +4089,75 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" + "time": "2020-01-21T11:12:28+00:00" + }, + { + "name": "webimpress/safe-writer", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/webimpress/safe-writer.git", + "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.4.3", + "webimpress/coding-standard": "dev-develop" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev", + "dev-develop": "2.1.x-dev", + "dev-release-1.0": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Webimpress\\SafeWriter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "Tool to write files safely, to avoid race conditions", + "keywords": [ + "concurrent write", + "file writer", + "race condition", + "safe writer", + "webimpress" + ], + "time": "2019-11-27T19:40:53+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.0", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "608a35a3b5bcc4214d116603095f8b0c51091592" + "reference": "39e9777c9089351a468f780b01cffa3cb0a42907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/608a35a3b5bcc4214d116603095f8b0c51091592", - "reference": "608a35a3b5bcc4214d116603095f8b0c51091592", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/39e9777c9089351a468f780b01cffa3cb0a42907", + "reference": "39e9777c9089351a468f780b01cffa3cb0a42907", "shasum": "" }, "require": { "doctrine/common": "^2.11", + "doctrine/persistence": "^1.3.3", "php": "^7.2" }, "conflict": { @@ -4114,7 +4168,7 @@ "doctrine/coding-standard": "^6.0", "doctrine/dbal": "^2.5.4", "doctrine/mongodb-odm": "^1.3.0", - "doctrine/orm": "^2.5.4", + "doctrine/orm": "^2.7.0", "phpunit/phpunit": "^7.0" }, "suggest": { @@ -4149,7 +4203,7 @@ "keywords": [ "database" ], - "time": "2019-10-30T20:03:18+00:00" + "time": "2020-01-17T11:11:28+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -4224,12 +4278,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389" + "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", - "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", + "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", "shasum": "" }, "conflict": { @@ -4342,7 +4396,7 @@ "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.48", + "studio-42/elfinder": "<2.1.49", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", @@ -4436,20 +4490,20 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-01-06T19:16:46+00:00" + "time": "2020-01-20T14:23:18+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" + "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7f835941a01bea2d03776451c9e42c2a2da6c34c", + "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c", "shasum": "" }, "require": { @@ -4501,7 +4555,7 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2019-11-28T14:20:16+00:00" + "time": "2020-01-21T08:40:24+00:00" } ], "aliases": [], diff --git a/config/custom/source.yaml b/config/custom/source.yaml index c442556..085d101 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,47 +1,47 @@ -- https://www.celestrak.com/NORAD/elements/tle-new.txt -- https://www.celestrak.com/NORAD/elements/stations.txt -- https://www.celestrak.com/NORAD/elements/visual.txt -- https://www.celestrak.com/NORAD/elements/active.txt -- https://www.celestrak.com/NORAD/elements/analyst.txt -- https://www.celestrak.com/NORAD/elements/1999-025.txt -- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://www.celestrak.com/NORAD/elements/2012-044.txt -- https://www.celestrak.com/NORAD/elements/weather.txt -- https://www.celestrak.com/NORAD/elements/noaa.txt -- https://www.celestrak.com/NORAD/elements/goes.txt -- https://www.celestrak.com/NORAD/elements/resource.txt -- https://www.celestrak.com/NORAD/elements/sarsat.txt -- https://www.celestrak.com/NORAD/elements/dmc.txt -- https://www.celestrak.com/NORAD/elements/tdrss.txt -- https://www.celestrak.com/NORAD/elements/argos.txt -- https://www.celestrak.com/NORAD/elements/planet.txt -- https://www.celestrak.com/NORAD/elements/spire.txt -- https://www.celestrak.com/NORAD/elements/geo.txt -- https://www.celestrak.com/NORAD/elements/intelsat.txt -- https://www.celestrak.com/NORAD/elements/ses.txt -- https://www.celestrak.com/NORAD/elements/iridium.txt -- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://www.celestrak.com/NORAD/elements/orbcomm.txt -- https://www.celestrak.com/NORAD/elements/globalstar.txt -- https://www.celestrak.com/NORAD/elements/amateur.txt -- https://www.celestrak.com/NORAD/elements/x-comm.txt -- https://www.celestrak.com/NORAD/elements/other-comm.txt -- https://www.celestrak.com/NORAD/elements/gorizont.txt -- https://www.celestrak.com/NORAD/elements/raduga.txt -- https://www.celestrak.com/NORAD/elements/molniya.txt -- https://www.celestrak.com/NORAD/elements/gps-ops.txt -- https://www.celestrak.com/NORAD/elements/glo-ops.txt -- https://www.celestrak.com/NORAD/elements/galileo.txt -- https://www.celestrak.com/NORAD/elements/beidou.txt -- https://www.celestrak.com/NORAD/elements/sbas.txt -- https://www.celestrak.com/NORAD/elements/nnss.txt -- https://www.celestrak.com/NORAD/elements/musson.txt -- https://www.celestrak.com/NORAD/elements/science.txt -- https://www.celestrak.com/NORAD/elements/geodetic.txt -- https://www.celestrak.com/NORAD/elements/engineering.txt -- https://www.celestrak.com/NORAD/elements/education.txt -- https://www.celestrak.com/NORAD/elements/military.txt -- https://www.celestrak.com/NORAD/elements/radar.txt -- https://www.celestrak.com/NORAD/elements/cubesat.txt +- https://www.celestrak.com/NORAD/elements/tle-new.txt +- https://www.celestrak.com/NORAD/elements/stations.txt +- https://www.celestrak.com/NORAD/elements/visual.txt +- https://www.celestrak.com/NORAD/elements/active.txt +- https://www.celestrak.com/NORAD/elements/analyst.txt +- https://www.celestrak.com/NORAD/elements/1999-025.txt +- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt +- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt +- https://www.celestrak.com/NORAD/elements/2012-044.txt +- https://www.celestrak.com/NORAD/elements/weather.txt +- https://www.celestrak.com/NORAD/elements/noaa.txt +- https://www.celestrak.com/NORAD/elements/goes.txt +- https://www.celestrak.com/NORAD/elements/resource.txt +- https://www.celestrak.com/NORAD/elements/sarsat.txt +- https://www.celestrak.com/NORAD/elements/dmc.txt +- https://www.celestrak.com/NORAD/elements/tdrss.txt +- https://www.celestrak.com/NORAD/elements/argos.txt +- https://www.celestrak.com/NORAD/elements/planet.txt +- https://www.celestrak.com/NORAD/elements/spire.txt +- https://www.celestrak.com/NORAD/elements/geo.txt +- https://www.celestrak.com/NORAD/elements/intelsat.txt +- https://www.celestrak.com/NORAD/elements/ses.txt +- https://www.celestrak.com/NORAD/elements/iridium.txt +- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt +- https://www.celestrak.com/NORAD/elements/orbcomm.txt +- https://www.celestrak.com/NORAD/elements/globalstar.txt +- https://www.celestrak.com/NORAD/elements/amateur.txt +- https://www.celestrak.com/NORAD/elements/x-comm.txt +- https://www.celestrak.com/NORAD/elements/other-comm.txt +- https://www.celestrak.com/NORAD/elements/gorizont.txt +- https://www.celestrak.com/NORAD/elements/raduga.txt +- https://www.celestrak.com/NORAD/elements/molniya.txt +- https://www.celestrak.com/NORAD/elements/gps-ops.txt +- https://www.celestrak.com/NORAD/elements/glo-ops.txt +- https://www.celestrak.com/NORAD/elements/galileo.txt +- https://www.celestrak.com/NORAD/elements/beidou.txt +- https://www.celestrak.com/NORAD/elements/sbas.txt +- https://www.celestrak.com/NORAD/elements/nnss.txt +- https://www.celestrak.com/NORAD/elements/musson.txt +- https://www.celestrak.com/NORAD/elements/science.txt +- https://www.celestrak.com/NORAD/elements/geodetic.txt +- https://www.celestrak.com/NORAD/elements/engineering.txt +- https://www.celestrak.com/NORAD/elements/education.txt +- https://www.celestrak.com/NORAD/elements/military.txt +- https://www.celestrak.com/NORAD/elements/radar.txt +- https://www.celestrak.com/NORAD/elements/cubesat.txt - https://www.celestrak.com/NORAD/elements/other.txt \ No newline at end of file diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 1c29db5..7a269f6 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -1,130 +1,130 @@ -serializer = $serializer; - } - - /** - * @required - * - * @param RouterInterface $router - */ - public function setRouter(RouterInterface $router): void - { - $this->router = $router; - } - - public function getPage(Request $request): int - { - return (int)$request->get(self::PAGE_PARAM, 1); - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getPagination(Request $request, int $total, int $pageSize): array - { - $params = $request->query->all(); - - $page = $this->getPage($request); - $pages = max(1, ceil($total / $pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function response($response): Response - { - return new Response( - $this->serializer->serialize($response, 'json'), - Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - ] - ); - } -} +serializer = $serializer; + } + + /** + * @required + * + * @param RouterInterface $router + */ + public function setRouter(RouterInterface $router): void + { + $this->router = $router; + } + + public function getPage(Request $request): int + { + return (int)$request->get(self::PAGE_PARAM, 1); + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getPagination(Request $request, int $total, int $pageSize): array + { + $params = $request->query->all(); + + $page = $this->getPage($request); + $pages = max(1, ceil($total / $pageSize)); + + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; + } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function response($response): Response + { + return new Response( + $this->serializer->serialize($response, 'json'), + Response::HTTP_OK, + [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + ] + ); + } +} diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index d9baea1..f08d331 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -1,84 +1,84 @@ -findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $this->response($tle); - } - - /** - * @Route(name="tle_collection") - */ - public function collection(Request $request, TleRepository $repository): Response - { - $this - ->assertParamIsInteger($request, self::PAGE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) - ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) - ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) - ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) - ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); - - $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); - $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); - $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - - $collection = $repository->collection( - $search, - $sort, - $sortDir, - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) - ); - - return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] - ); - } -} +findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $this->response($tle); + } + + /** + * @Route(name="tle_collection") + */ + public function collection(Request $request, TleRepository $repository): Response + { + $this + ->assertParamIsInteger($request, self::PAGE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) + ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) + ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) + ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + + $search = $request->get(self::SEARCH_PARAM); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); + + $collection = $repository->collection( + $search, + $sort, + $sortDir, + $pageSize, + $this->getPageOffset($this->getPage($request), $pageSize) + ); + + return $this->response( + [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ], + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ] + ); + } +} diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index e99095b..b50bd63 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -1,81 +1,81 @@ -get($name); - - if ($param === null) { - return $this; - } - - if (!preg_match('/^\d+$/', $param)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be integer.', $name) - ); - } - - return $this; - } - - protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param > $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamIsLessThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param <= $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamInEnum(Request $request, string $name, array $values): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!\in_array($param, $values, true)) { - throw new BadRequestHttpException( - \sprintf( - 'Parameter \'%s\' must be one of the following: %s', - $name, - '\'' . implode('\', \'', $values) . '\'', - ) - ); - } - - return $this; - } +get($name); + + if ($param === null) { + return $this; + } + + if (!preg_match('/^\d+$/', $param)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be integer.', $name) + ); + } + + return $this; + } + + protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param > $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamIsLessThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param <= $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamInEnum(Request $request, string $name, array $values): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!\in_array($param, $values, true)) { + throw new BadRequestHttpException( + \sprintf( + 'Parameter \'%s\' must be one of the following: %s', + $name, + '\'' . implode('\', \'', $values) . '\'', + ) + ); + } + + return $this; + } } \ No newline at end of file diff --git a/src/ViewModel/SortDirectionEnum.php b/src/ViewModel/SortDirectionEnum.php index 9c18548..33b65d1 100644 --- a/src/ViewModel/SortDirectionEnum.php +++ b/src/ViewModel/SortDirectionEnum.php @@ -1,11 +1,11 @@ - 1, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=1&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'next' => 'http://localhost/api/tle?page=2&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 3, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=3&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=2&page-size=2', - 'next' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 5, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=5&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 7, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=7&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=6&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ] - ]; - - public function testPaginationWorks(): void - { - foreach (self::TEST as $test) { - $response = $this->getCollectionContent($test['page'], 2); - - self::assertArrayHasKey('view', $response); - - $this->assertViewIsCorrect( - $test['expected'], - $response['view'] - ); - } - } - - public function testPaginationError(): void - { - $response = $this->getCollection(-1, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page -1' - ); - - $response = $this->getCollection(0, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page 0' - ); - - $response = $this->getCollection(1, -1); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size -1' - ); - - $response = $this->getCollection(1, 0); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size 0' - ); - } - - private function assertViewIsCorrect($expected, $actual): void - { - foreach ($actual as $key => $value) { - self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); - self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); - } - } - - private function getCollectionContent(int $page, int $pageSize): array - { - return $this->toArray( - $this->getCollection($page, $pageSize) - ); - } - - private function getCollection(int $page, int $pageSize): Response - { - return $this->get( - '/api/tle', - [ - 'page' => $page, - 'page-size' => $pageSize, - ] - ); - } + 1, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=1&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'next' => 'http://localhost/api/tle?page=2&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 3, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=3&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=2&page-size=2', + 'next' => 'http://localhost/api/tle?page=4&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 5, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=5&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=4&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 7, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=7&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=6&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ] + ]; + + public function testPaginationWorks(): void + { + foreach (self::TEST as $test) { + $response = $this->getCollectionContent($test['page'], 2); + + self::assertArrayHasKey('view', $response); + + $this->assertViewIsCorrect( + $test['expected'], + $response['view'] + ); + } + } + + public function testPaginationError(): void + { + $response = $this->getCollection(-1, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page -1' + ); + + $response = $this->getCollection(0, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page 0' + ); + + $response = $this->getCollection(1, -1); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size -1' + ); + + $response = $this->getCollection(1, 0); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size 0' + ); + } + + private function assertViewIsCorrect($expected, $actual): void + { + foreach ($actual as $key => $value) { + self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); + self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); + } + } + + private function getCollectionContent(int $page, int $pageSize): array + { + return $this->toArray( + $this->getCollection($page, $pageSize) + ); + } + + private function getCollection(int $page, int $pageSize): Response + { + return $this->get( + '/api/tle', + [ + 'page' => $page, + 'page-size' => $pageSize, + ] + ); + } } \ No newline at end of file diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index 7ea6b5f..64be291 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -1,37 +1,37 @@ -get('/api/tle.json'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); - - $response = $this->toArray($response); - - $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; - $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; - - $tle = TleFixtures::create(); - - $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); - - self::assertCount(\count($tleSchema), $response); - self::assertEquals(array_keys($tleSchema), array_keys($response)); - - $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); - - self::assertCount(\count($paginationSchema), $response['view']); - self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); - - self::assertCount(\count($response), $collectionSchema); - self::assertEquals(array_keys($response), array_keys($collectionSchema)); - } +get('/api/tle.json'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); + + $response = $this->toArray($response); + + $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; + $paginationSchema = $response['components']['schemas']['Pagination']['properties']; + $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; + + $tle = TleFixtures::create(); + + $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); + + self::assertCount(\count($tleSchema), $response); + self::assertEquals(array_keys($tleSchema), array_keys($response)); + + $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); + + self::assertCount(\count($paginationSchema), $response['view']); + self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); + + self::assertCount(\count($response), $collectionSchema); + self::assertEquals(array_keys($response), array_keys($collectionSchema)); + } } \ No newline at end of file diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6a6f186..6e53d75 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -1,27 +1,27 @@ -get('/noop'); - - self::assertEquals( - $response->getStatusCode(), - Response::HTTP_NOT_FOUND, - 'Assert page not found returns HTTP 404' - ); - - $response = $this->toArray($response); - - self::assertEquals( - 'No route found for "GET /noop"', - $response['response']['message'], - 'Assert correct response message' - ); - } +get('/noop'); + + self::assertEquals( + $response->getStatusCode(), + Response::HTTP_NOT_FOUND, + 'Assert page not found returns HTTP 404' + ); + + $response = $this->toArray($response); + + self::assertEquals( + 'No route found for "GET /noop"', + $response['response']['message'], + 'Assert correct response message' + ); + } } \ No newline at end of file From 7d1aa25676e2d13cb9b133bf893375989c522214 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 16:04:12 +0100 Subject: [PATCH 038/221] add docs --- composer.json | 24 +- composer.lock | 3303 ++++++++++++++++++++++++------ config/bundles.php | 2 + config/custom/tle.json | 4 +- config/packages/test/twig.yaml | 2 + config/packages/twig.yaml | 2 + deploy.php | 3 +- docs/logo192.png | Bin 12929 -> 0 bytes docs/logo512.png | Bin 36838 -> 0 bytes src/Controller/ApiController.php | 8 + symfony.lock | 50 + templates/docs.html.twig | 36 + 12 files changed, 2737 insertions(+), 697 deletions(-) create mode 100644 config/packages/test/twig.yaml create mode 100644 config/packages/twig.yaml delete mode 100644 docs/logo192.png delete mode 100644 docs/logo512.png create mode 100644 templates/docs.html.twig diff --git a/composer.json b/composer.json index 58f4eb1..c6b4974 100644 --- a/composer.json +++ b/composer.json @@ -9,20 +9,23 @@ "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", + "symfony/asset": "5.1.*", + "symfony/browser-kit": "5.1.*", + "symfony/console": "5.1.*", + "symfony/dotenv": "5.1.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", + "symfony/framework-bundle": "5.1.*", "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.0.*", - "symfony/yaml": "5.0.*" + "symfony/serializer": "5.1.*", + "symfony/twig-bundle": "5.1.*", + "symfony/yaml": "5.1.*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" }, "require-dev": { "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.1" }, "config": { "preferred-install": { @@ -61,7 +64,8 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit --coverage-text" + "test": "@php bin/phpunit --coverage-text", + "deploy": "dep deploy" }, "conflict": { "symfony/symfony": "*" @@ -70,7 +74,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.0.*" + "require": "5.1.*" } } } diff --git a/composer.lock b/composer.lock index 49a4264..5e152cc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,34 +4,110 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e147328d3b45617aa4be85dc153b6b38", + "content-hash": "bf6c5c44873f54ab888176739539d99b", "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/master" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-08-25T05:50:16+00:00" + }, { "name": "doctrine/annotations", - "version": "v1.8.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/88fb6fb1dae011de24dd6b632811c1ff5c2928f5", + "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": "^7.1" + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -66,30 +142,34 @@ } ], "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ "annotations", "docblock", "parser" ], - "time": "2019-10-01T18:55:10+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.11.0" + }, + "time": "2020-10-17T22:05:33+00:00" }, { "name": "doctrine/cache", - "version": "1.10.0", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + "reference": "13e3381b25847283a91948d04640543941309727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", "shasum": "" }, "require": { - "php": "~7.1" + "php": "~7.1 || ^8.0" }, "conflict": { "doctrine/common": ">2.2,<2.4" @@ -154,37 +234,50 @@ "redis", "xcache" ], - "time": "2019-11-29T15:36:20+00:00" + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/1.10.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" }, { "name": "doctrine/collections", - "version": "1.6.4", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7" + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan-shim": "^0.9.2", "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.2.2" + "vimeo/psalm": "^3.8.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" @@ -224,20 +317,24 @@ "iterators", "php" ], - "time": "2019-11-13T13:07:11+00:00" + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.7" + }, + "time": "2020-07-27T17:53:49+00:00" }, { "name": "doctrine/common", - "version": "2.12.0", + "version": "2.13.3", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", "shasum": "" }, "require": { @@ -247,9 +344,9 @@ "doctrine/event-manager": "^1.0", "doctrine/inflector": "^1.0", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.1", + "doctrine/persistence": "^1.3.3", "doctrine/reflection": "^1.0", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^1.0", @@ -307,34 +404,54 @@ "doctrine", "php" ], - "time": "2020-01-10T15:49:25+00:00" + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/2.13.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2020-06-05T16:46:05+00:00" }, { "name": "doctrine/dbal", - "version": "v2.10.1", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8" + "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6d37b4c42aaa3c3ee175f05eca68056f4185646", + "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646", "shasum": "" }, "require": { "doctrine/cache": "^1.0", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.2" + "php": "^7.3 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.1", "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.11.3", - "phpunit/phpunit": "^8.4.1", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0" + "phpstan/phpstan": "^0.12.40", + "phpunit/phpunit": "^9.4", + "psalm/plugin-phpunit": "^0.10.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "^3.17.2" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -345,8 +462,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -399,27 +515,45 @@ "sqlserver", "sqlsrv" ], - "time": "2020-01-04T12:56:21+00:00" + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.12.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2020-10-22T17:26:24+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.0.7", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "6926771140ee87a823c3b2c72602de9dda4490d3" + "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6926771140ee87a823c3b2c72602de9dda4490d3", - "reference": "6926771140ee87a823c3b2c72602de9dda4490d3", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f5153089993e1230f5d8acbd8e126014d5a63e17", + "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17", "shasum": "" }, "require": { - "doctrine/dbal": "^2.9.0", - "doctrine/persistence": "^1.3.3", - "jdorn/sql-formatter": "^1.2.16", - "php": "^7.1", + "doctrine/dbal": "^2.9.0|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", "symfony/cache": "^4.3.3|^5.0", "symfony/config": "^4.3.3|^5.0", "symfony/console": "^3.4.30|^4.3.3|^5.0", @@ -453,7 +587,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -491,20 +625,38 @@ "orm", "persistence" ], - "time": "2020-01-18T11:56:15+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.1.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2020-08-25T10:57:15+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.1.2", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d" + "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/856437e8de96a70233e1f0cc2352fc8dd15a899d", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5efa29df768abaafe29b34e73dac68efbedcaa4d", + "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d", "shasum": "" }, "require": { @@ -559,24 +711,42 @@ "migrations", "schema" ], - "time": "2019-11-13T12:57:41+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2020-06-25T19:36:08+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "629572819973f13486371cb611386eb17851e85c" + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", - "reference": "629572819973f13486371cb611386eb17851e85c", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9@dev" @@ -635,37 +805,60 @@ "event system", "events" ], - "time": "2019-11-10T09:48:07+00:00" + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" }, { "name": "doctrine/inflector", - "version": "1.3.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -694,32 +887,56 @@ "email": "schmittjoh@gmail.com" } ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ "inflection", - "pluralize", - "singularize", - "string" + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/1.4.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } ], - "time": "2019-10-30T19:59:35+00:00" + "time": "2020-05-29T07:19:59+00:00" }, { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -758,24 +975,42 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -820,7 +1055,25 @@ "parser", "php" ], - "time": "2019-10-30T14:39:59+00:00" + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" }, { "name": "doctrine/migrations", @@ -902,39 +1155,48 @@ "migrations", "php" ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/2.2.x" + }, "time": "2019-12-04T06:09:14+00:00" }, { "name": "doctrine/orm", - "version": "v2.7.0", + "version": "2.7.4", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "4d763ca4c925f647b248b9fa01b5f47aa3685d62" + "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/4d763ca4c925f647b248b9fa01b5f47aa3685d62", - "reference": "4d763ca4c925f647b248b9fa01b5f47aa3685d62", + "url": "https://api.github.com/repos/doctrine/orm/zipball/7d84a4998091ece4d645253ac65de9f879eeed2f", + "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f", "shasum": "" }, "require": { + "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.8", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^2.11", + "doctrine/common": "^2.11 || ^3.0", "doctrine/dbal": "^2.9.3", "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.0", "doctrine/instantiator": "^1.3", - "doctrine/persistence": "^1.2", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.3.3 || ^2.0", "ext-pdo": "*", "php": "^7.1", "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.12.18", "phpunit/phpunit": "^7.5", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^3.4|^4.0|^5.0", + "vimeo/psalm": "^3.11" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -985,20 +1247,24 @@ "database", "orm" ], - "time": "2019-11-19T08:38:05+00:00" + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.7.4" + }, + "time": "2020-10-10T17:11:26+00:00" }, { "name": "doctrine/persistence", - "version": "1.3.6", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288", + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288", "shasum": "" }, "require": { @@ -1006,8 +1272,8 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.1", - "php": "^7.1" + "doctrine/reflection": "^1.2", + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.10@dev" @@ -1015,7 +1281,8 @@ "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^3.11" }, "type": "library", "extra": { @@ -1068,20 +1335,38 @@ "orm", "persistence" ], - "time": "2020-01-16T22:06:23+00:00" + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/1.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2020-06-20T12:56:16+00:00" }, { "name": "doctrine/reflection", - "version": "v1.1.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", "shasum": "" }, "require": { @@ -1102,7 +1387,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -1146,27 +1431,89 @@ "reflection", "static" ], - "time": "2020-01-08T19:53:19+00:00" + "support": { + "issues": "https://github.com/doctrine/reflection/issues", + "source": "https://github.com/doctrine/reflection/tree/1.2.x" + }, + "time": "2020-03-27T11:06:43+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "56070bebac6e77230ed7d306ad13528e60732871" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", + "reference": "56070bebac6e77230ed7d306ad13528e60732871", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + }, + "time": "2020-07-30T16:57:33+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.5.2", + "version": "6.5.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", @@ -1174,7 +1521,6 @@ "psr/log": "^1.1" }, "suggest": { - "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", @@ -1213,27 +1559,31 @@ "rest", "web service" ], - "time": "2019-12-23T11:57:10+00:00" + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "60d379c243457e073cff02bc323a2a86cb355631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -1264,20 +1614,24 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, + "time": "2020-09-30T07:37:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", "shasum": "" }, "require": { @@ -1290,15 +1644,15 @@ }, "require-dev": { "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -1335,7 +1689,11 @@ "uri", "url" ], - "time": "2019-07-01T23:21:34+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, + "time": "2020-09-30T07:37:11+00:00" }, { "name": "ivanstan/tle-php", @@ -1376,57 +1734,11 @@ } ], "description": "TLE Framework written in PHP and client to NASA TLE API.", - "time": "2020-01-08T10:08:36+00:00" - }, - { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" + "support": { + "issues": "https://github.com/ivanstan/tle-php/issues", + "source": "https://github.com/ivanstan/tle-php/tree/1.0" }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2014-01-12T16:20:24+00:00" + "time": "2020-01-08T10:08:36+00:00" }, { "name": "laminas/laminas-code", @@ -1487,45 +1799,53 @@ "code", "laminas" ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, "time": "2019-12-31T16:28:24+00:00" }, { "name": "laminas/laminas-eventmanager", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748" + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", - "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", "shasum": "" }, "require": { "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" + "php": "^7.3 || ^8.0" }, "replace": { - "zendframework/zend-eventmanager": "self.version" + "zendframework/zend-eventmanager": "^3.2.1" }, "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", + "container-interop/container-interop": "^1.1", "laminas/laminas-coding-standard": "~1.0.0", "laminas/laminas-stdlib": "^2.7.3 || ^3.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^8.5.8" }, "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "container-interop/container-interop": "^1.1, to use the lazy listeners feature", "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" + "dev-master": "3.3.x-dev", + "dev-develop": "3.4.x-dev" } }, "autoload": { @@ -1545,35 +1865,45 @@ "events", "laminas" ], - "time": "2019-12-31T16:44:52+00:00" - }, + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-08-25T11:10:44+00:00" + }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.0.1", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d" + "reference": "6ede70583e101030bcace4dcddd648f760ddf642" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/0fb9675b84a1666ab45182b6c5b29956921e818d", - "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev", - "dev-develop": "1.1.x-dev" - }, "laminas": { "module": "Laminas\\ZendFrameworkBridge" } @@ -1597,20 +1927,32 @@ "laminas", "zf" ], - "time": "2020-01-07T22:58:31+00:00" + "support": { + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-09-14T14:23:00+00:00" }, { "name": "myclabs/php-enum", - "version": "1.7.2", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "45f01adf6922df6082bcda36619deb466e826acf" + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/45f01adf6922df6082bcda36619deb466e826acf", - "reference": "45f01adf6922df6082bcda36619deb466e826acf", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c", "shasum": "" }, "require": { @@ -1618,8 +1960,9 @@ "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "squizlabs/php_codesniffer": "1.*" + "phpunit/phpunit": "^7", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^3.8" }, "type": "library", "autoload": { @@ -1642,78 +1985,31 @@ "keywords": [ "enum" ], - "time": "2019-08-19T13:53:00+00:00" - }, - { - "name": "ocramius/package-versions", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/1d32342b8c1eb27353c8887c366147b4c2da673c", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0", - "php": "^7.3.0" - }, - "require-dev": { - "composer/composer": "^1.8.6", - "doctrine/coding-standard": "^6.0.0", - "ext-zip": "*", - "infection/infection": "^0.13.4", - "phpunit/phpunit": "^8.2.5", - "vimeo/psalm": "^3.4.9" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/master" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-07-17T15:49:50+00:00" + "time": "2020-02-14T08:15:52+00:00" }, { "name": "ocramius/proxy-manager", - "version": "2.6.0", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9" + "reference": "7452942d38ae36223b0f8408619181f69799eb5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/406ca12cabfb43e3b11c994bcbeea8e358c65af9", - "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/7452942d38ae36223b0f8408619181f69799eb5c", + "reference": "7452942d38ae36223b0f8408619181f69799eb5c", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0.0", "laminas/laminas-code": "^3.4.1", - "ocramius/package-versions": "^1.5.1", - "php": "7.4.*", - "webimpress/safe-writer": "^2.0" + "php": "~7.4.1", + "webimpress/safe-writer": "^2.0.1" }, "conflict": { "doctrine/annotations": "<1.6.1", @@ -1721,16 +2017,16 @@ "zendframework/zend-stdlib": "<3.2.1" }, "require-dev": { - "doctrine/coding-standard": "^6.0.0", + "codelicia/xulieta": "^0.1.2", + "doctrine/coding-standard": "^8.1.0", "ext-phar": "*", - "infection/infection": "^0.15.0", - "nikic/php-parser": "^4.3.0", - "phpbench/phpbench": "^0.16.10", - "phpunit/phpunit": "^8.5.1", - "slevomat/coding-standard": "^5.0.4", - "squizlabs/php_codesniffer": "^3.5.3", - "symfony/console": "^4.4.2", - "vimeo/psalm": "3.7.0" + "infection/infection": "^0.16.4", + "nikic/php-parser": "^4.6.0", + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^9.2.5", + "slevomat/coding-standard": "^6.3.10", + "squizlabs/php_codesniffer": "^3.5.5", + "vimeo/psalm": "^3.12.2" }, "suggest": { "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", @@ -1769,7 +2065,21 @@ "proxy pattern", "service proxies" ], - "time": "2020-01-07T08:10:36+00:00" + "support": { + "issues": "https://github.com/Ocramius/ProxyManager/issues", + "source": "https://github.com/Ocramius/ProxyManager/tree/2.9.1" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2020-08-26T16:19:12+00:00" }, { "name": "psr/cache", @@ -1815,6 +2125,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -1864,6 +2177,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -1910,6 +2227,10 @@ "psr", "psr-14" ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -1960,20 +2281,23 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -2007,7 +2331,10 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" }, { "name": "ralouphie/getallheaders", @@ -2047,6 +2374,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -2069,26 +2400,31 @@ "MIT" ], "description": "A pack for Apache support in Symfony", + "support": { + "issues": "https://github.com/symfony/apache-pack/issues", + "source": "https://github.com/symfony/apache-pack/tree/master" + }, "time": "2017-12-12T01:46:35+00:00" }, { "name": "symfony/asset", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "447190a24309da88f816313824d85c303035f86b" + "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/447190a24309da88f816313824d85c303035f86b", - "reference": "447190a24309da88f816313824d85c303035f86b", + "url": "https://api.github.com/repos/symfony/asset/zipball/ef0bcafce1c14bbf49838b01e990a8bfafd071eb", + "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "require-dev": { + "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2098,7 +2434,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2125,24 +2461,41 @@ ], "description": "Symfony Asset Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/asset/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9" + "reference": "8944cc83bb18f83f577225c695d999044e7c62b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b0294489a7fbb4f3f39c39efe6f0328cb09731b9", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8944cc83bb18f83f577225c695d999044e7c62b0", + "reference": "8944cc83bb18f83f577225c695d999044e7c62b0", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/dom-crawler": "^4.4|^5.0" }, "require-dev": { @@ -2157,7 +2510,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2184,27 +2537,45 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T08:49:02+00:00" }, { "name": "symfony/cache", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a" + "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", - "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", + "url": "https://api.github.com/repos/symfony/cache/zipball/292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", + "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/cache": "~1.0", "psr/log": "~1.0", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -2221,9 +2592,9 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/dbal": "~2.5", - "predis/predis": "~1.1", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.5|^3.0", + "predis/predis": "^1.1", "psr/simple-cache": "^1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -2232,7 +2603,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2263,24 +2634,41 @@ "caching", "psr6" ], - "time": "2020-01-10T21:57:37+00:00" + "support": { + "source": "https://github.com/symfony/cache/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:02:37+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.0.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16" + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/cache": "^1.0" }, "suggest": { @@ -2289,7 +2677,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2321,26 +2713,45 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/config", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63" + "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7640c6704f56bf64045066bc5d93fd9d664baa63", - "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63", + "url": "https://api.github.com/repos/symfony/config/zipball/6ad8be6e1280f6734150d8a04a9160dd34ceb191", + "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/finder": "<4.4" @@ -2358,7 +2769,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2385,30 +2796,50 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/config/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/console", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257" + "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/345ab6ecb456b5147ea3b3271d7f1f00aadfd257", - "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257", + "url": "https://api.github.com/repos/symfony/console/zipball/ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", + "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/service-contracts": "^1.1|^2" + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2434,7 +2865,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2461,29 +2892,48 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-19T11:13:19+00:00" + "support": { + "source": "https://github.com/symfony/console/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-07T15:23:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5a56807650c7258bbcc4a15a020904958c70247e" + "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a56807650c7258bbcc4a15a020904958c70247e", - "reference": "5a56807650c7258bbcc4a15a020904958c70247e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2dea4a3ef2eb79138354c1d49e9372cc921af20b", + "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.0", + "symfony/config": "<5.1", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2493,7 +2943,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.0", + "symfony/config": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2507,7 +2957,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2534,34 +2984,119 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-01T12:14:45+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5" + "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/1eda484039e4460101f945470d28ae6e8bdcf0e5", - "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b7369a435a64d06e9036e69ed1cd6ce240338583", + "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3", - "php": "^7.2.5", + "doctrine/persistence": "^1.3|^2", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5", + "symfony/form": "<5.1", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", @@ -2570,17 +3105,20 @@ "symfony/validator": "<5.0.2" }, "require-dev": { + "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "~1.7", "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "~2.4|^3.0", "doctrine/orm": "^2.6.3", "doctrine/reflection": "~1.0", + "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.3", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -2603,7 +3141,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2630,26 +3168,44 @@ ], "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:14:57+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062" + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/439c3c7be4daa569deef0dd1e30cf3562108d062", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "masterminds/html5": "<2.6" @@ -2664,7 +3220,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2691,24 +3247,42 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/dotenv", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "8331da80cc35fe903db0ff142376d518804ff1b1" + "reference": "f406eaad1231415bf753fbef5aef267a787af4e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/8331da80cc35fe903db0ff142376d518804ff1b1", - "reference": "8331da80cc35fe903db0ff142376d518804ff1b1", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f406eaad1231415bf753fbef5aef267a787af4e5", + "reference": "f406eaad1231415bf753fbef5aef267a787af4e5", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" }, "require-dev": { "symfony/process": "^4.4|^5.0" @@ -2716,7 +3290,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2748,35 +3322,54 @@ "env", "environment" ], - "time": "2020-01-08T17:33:29+00:00" + "support": { + "source": "https://github.com/symfony/dotenv/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/error-handler", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e" + "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/95f64c1d7dfb86a722dc9d278d0edf5176eff16e", - "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/5e4d8ef8d71822922d1eebd130219ae3491a5ca9", + "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2803,25 +3396,44 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2020-01-08T17:33:29+00:00" + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T08:49:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224" + "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4a7a8cdca1120c091b4797f0e5bba69c1e783224", - "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d5de97d6af175a9e8131c546db054ca32842dd0f", + "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/event-dispatcher-contracts": "^2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -2834,6 +3446,7 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -2846,7 +3459,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2873,24 +3486,41 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-10T21:57:37+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:27:32+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.0.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "af23c2584d4577d54661c434446fb8fbed6025dd" + "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/af23c2584d4577d54661c434446fb8fbed6025dd", - "reference": "af23c2584d4577d54661c434446fb8fbed6025dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", + "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/event-dispatcher": "^1" }, "suggest": { @@ -2899,7 +3529,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2931,30 +3565,47 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/filesystem", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" + "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/1a8697545a8d87b9f2f6b1d32414199cc5e20aae", + "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2981,29 +3632,46 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:02:37+00:00" }, { "name": "symfony/finder", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3030,36 +3698,53 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/finder/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/flex", - "version": "v1.6.0", + "version": "v1.9.10", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "952f45d1c5077e658cb16a61d11603bee873f968" + "reference": "7335ec033995aa34133e621627333368f260b626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/952f45d1c5077e658cb16a61d11603bee873f968", - "reference": "952f45d1c5077e658cb16a61d11603bee873f968", + "url": "https://api.github.com/repos/symfony/flex/zipball/7335ec033995aa34133e621627333368f260b626", + "reference": "7335ec033995aa34133e621627333368f260b626", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0", - "php": "^7.0" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.1" }, "require-dev": { - "composer/composer": "^1.0.2", - "symfony/dotenv": "^3.4|^4.0|^5.0", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0", - "symfony/process": "^2.7|^3.0|^4.0|^5.0" + "composer/composer": "^1.0.2|^2.0", + "symfony/dotenv": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/process": "^3.4|^4.4|^5.0" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-main": "1.9-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -3079,46 +3764,66 @@ } ], "description": "Composer plugin for Symfony", - "time": "2019-12-13T18:05:11+00:00" + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v1.9.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-14T17:41:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63" + "reference": "023ca658526278c0e74542079f1984e042aa6c1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", - "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/023ca658526278c0e74542079f1984e042aa6c1d", + "reference": "023ca658526278c0e74542079f1984e042aa6c1d", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/cache": "^4.4|^5.0", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.0.1", + "symfony/dependency-injection": "^5.1", "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^5.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.0" + "symfony/polyfill-php80": "^1.15", + "symfony/routing": "^5.1" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.0", "phpdocumentor/type-resolver": "<0.2.1", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<4.4", + "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", "symfony/console": "<4.4", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<4.4", + "symfony/dotenv": "<5.1", "symfony/form": "<4.4", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", @@ -3140,12 +3845,12 @@ "doctrine/cache": "~1.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^4.4|^5.0", + "symfony/asset": "^5.1", "symfony/browser-kit": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^4.4|^5.0", + "symfony/dotenv": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", @@ -3156,11 +3861,12 @@ "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "~5.0.0", + "symfony/string": "^5.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", "symfony/validator": "^4.4|^5.0", @@ -3182,7 +3888,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3209,35 +3915,137 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.0.3", - "source": { - "type": "git", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-30T05:27:28+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-version": "2.3", + "branch-alias": { + "dev-main": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-14T17:08:19+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.7", + "source": { + "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e" + "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dc0db5026f2b611cb8910a1f465e95eafd84c2e", - "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/353b42e7b4fd1c898aab09a059466c9cea74039b", + "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3264,35 +4072,56 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:14:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259" + "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", - "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1764b87d2f10d5c9ce6e4850fe27934116d89708", + "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/browser-kit": "<4.4", "symfony/cache": "<5.0", "symfony/config": "<5.0", + "symfony/console": "<4.4", "symfony/dependency-injection": "<4.4", "symfony/doctrine-bridge": "<5.0", "symfony/form": "<5.0", @@ -3333,7 +4162,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3360,46 +4189,108 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-21T13:29:58+00:00" + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-04T07:57:28+00:00" }, { - "name": "symfony/mime", - "version": "v5.0.3", + "name": "symfony/orm-pack", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" + "url": "https://github.com/symfony/orm-pack.git", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "composer/package-versions-deprecated": "*", + "doctrine/common": "^2", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2" }, - "conflict": { - "symfony/mailer": "<4.4" + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "support": { + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-31T10:20:18+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3408,68 +4299,146 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ - "mime", - "mime-type" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.0.7", + "name": "symfony/polyfill-intl-idn", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c57f5e05232ca40626eb9fa52a32bc8565e9231c", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^1.6.10|^2.0", - "doctrine/doctrine-migrations-bundle": "^1.3|^2.0", - "doctrine/orm": "^2.5.11", - "php": "^7.0" + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Doctrine ORM", - "time": "2019-10-18T05:41:09+00:00" + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "727d1096295d807c309fb01a851577302394c897" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", + "reference": "727d1096295d807c309fb01a851577302394c897", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" @@ -3477,15 +4446,22 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "files": [ "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3494,42 +4470,59 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "idn", "intl", + "normalizer", "polyfill", "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -3537,7 +4530,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -3571,29 +4568,50 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.13.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -3629,34 +4647,136 @@ "portable", "shim" ], - "time": "2019-11-27T16:25:15+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/routing", - "version": "v5.0.3", + "name": "symfony/polyfill-php80", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7da33371d8ecfed6c9d93d87c73749661606f803", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", "shasum": "" }, "require": { - "php": "^7.2.5" - }, - "conflict": { - "symfony/config": "<5.0", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "php": ">=7.1" }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^5.0", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/720348c2ae011f8c56964c0fc3e992840cb60ccf", + "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", @@ -3672,7 +4792,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3705,25 +4825,43 @@ "uri", "url" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/routing/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T13:05:43+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0" + "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a76fc03e125719ef4ce18522b2347bf103b698d0", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6b673b802dabd2bcf7cab05d04d2d8ef8891b952", + "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", @@ -3760,7 +4898,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3781,45 +4919,426 @@ "email": "fabien@symfony.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Serializer Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-03T13:58:17+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/string", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", + "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-15T12:23:47+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Serializer Component", - "homepage": "https://symfony.com", - "time": "2020-01-08T17:33:29+00:00" + "time": "2020-09-28T13:05:58+00:00" }, { - "name": "symfony/service-contracts", - "version": "v2.0.1", + "name": "symfony/twig-bridge", + "version": "v5.1.7", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "144c5e51266b281231e947b51223ba14acf1a749" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", - "reference": "144c5e51266b281231e947b51223ba14acf1a749", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ad3c3e89353749dcead9ee25388177ebbb4569a1", + "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1", "shasum": "" }, "require": { - "php": "^7.2.5", - "psr/container": "^1.0" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/form": "<5.1", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.0", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.1", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12", + "twig/inky-extra": "^2.12", + "twig/markdown-extra": "^2.12" }, "suggest": { - "symfony/service-implementation": "" + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" }, - "type": "library", + "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3827,53 +5346,87 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-09-02T16:23:27+00:00" }, { - "name": "symfony/stopwatch", - "version": "v5.0.3", + "name": "symfony/twig-bundle", + "version": "v5.1.7", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/service-contracts": "^1.0|^2" + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.10|^3.0" }, - "type": "library", + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Bundle\\TwigBundle\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3893,27 +5446,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Symfony TwigBundle", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b" + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ccb1be566ae15f790020f917f06d1da0b04fe47b", - "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -3936,7 +5507,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3970,32 +5541,50 @@ "debug", "dump" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:27:32+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9" + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/960f9ac0fdbd642461ed29d7717aeb2a94d428b9", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -4030,24 +5619,42 @@ "instantiate", "serialize" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/var-exporter/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-08T14:19:54+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a" + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", - "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -4059,10 +5666,13 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -4089,34 +5699,200 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-21T11:12:28+00:00" + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T03:44:28+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a7c5799cf742ab0827f5d32df37528ee8bf5a233", + "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233", + "shasum": "" + }, + "require": { + "php": "^7.1.3|^8.0", + "symfony/framework-bundle": "^4.3|^5.0", + "symfony/twig-bundle": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2020-05-21T09:56:39+00:00" + }, + { + "name": "twig/twig", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2020-10-21T12:45:34+00:00" }, { "name": "webimpress/safe-writer", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/webimpress/safe-writer.git", - "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4" + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/d03bea3b98abe1d4c8b24cbebf524361ffaafee4", - "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.4.3", - "webimpress/coding-standard": "dev-develop" + "phpunit/phpunit": "^8.5.8 || ^9.3.7", + "vimeo/psalm": "^3.14.2", + "webimpress/coding-standard": "^1.1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev", - "dev-develop": "2.1.x-dev", + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", "dev-release-1.0": "1.0.x-dev" } }, @@ -4137,42 +5913,51 @@ "safe writer", "webimpress" ], - "time": "2019-11-27T19:40:53+00:00" + "support": { + "issues": "https://github.com/webimpress/safe-writer/issues", + "source": "https://github.com/webimpress/safe-writer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" + } + ], + "time": "2020-08-25T07:21:11+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.2", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907" + "reference": "16a03fadb5473f49aad70384002dfd5012fe680e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/39e9777c9089351a468f780b01cffa3cb0a42907", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/16a03fadb5473f49aad70384002dfd5012fe680e", + "reference": "16a03fadb5473f49aad70384002dfd5012fe680e", "shasum": "" }, "require": { - "doctrine/common": "^2.11", - "doctrine/persistence": "^1.3.3", - "php": "^7.2" + "doctrine/common": "^2.13|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "php": "^7.2 || ^8.0" }, "conflict": { "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", "doctrine/coding-standard": "^6.0", "doctrine/dbal": "^2.5.4", - "doctrine/mongodb-odm": "^1.3.0", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", "phpunit/phpunit": "^7.0" }, "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", "doctrine/orm": "For loading ORM fixtures", "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" @@ -4203,27 +5988,46 @@ "keywords": [ "database" ], - "time": "2020-01-17T11:11:28+00:00" + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.4.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2020-09-01T07:13:28+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.3.0", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70" + "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/a2179f447425d9e784fb9bc224e533a0ab083b98", + "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98", "shasum": "" }, "require": { "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.6.0", - "php": "^7.1", + "doctrine/persistence": "^1.3|^2.0", + "php": "^7.1 || ^8.0", "symfony/config": "^3.4|^4.3|^5.0", "symfony/console": "^3.4|^4.3|^5.0", "symfony/dependency-injection": "^3.4|^4.3|^5.0", @@ -4232,7 +6036,7 @@ }, "require-dev": { "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4", + "phpunit/phpunit": "^7.4 || ^9.2", "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", @@ -4270,7 +6074,25 @@ "Fixture", "persistence" ], - "time": "2019-11-13T15:46:58+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2020-09-01T07:06:14+00:00" }, { "name": "roave/security-advisories", @@ -4278,12 +6100,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e" + "reference": "327370943772f9917bc2dc2aa4263db2d572a112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", - "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/327370943772f9917bc2dc2aa4263db2d572a112", + "reference": "327370943772f9917bc2dc2aa4263db2d572a112", "shasum": "" }, "conflict": { @@ -4292,22 +6114,32 @@ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": ">=4,<=4.3.6", + "bolt/bolt": "<3.7.1", "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeigniter/framework": "<=3.0.6", "composer/composer": "<=1-alpha.11", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -4317,46 +6149,78 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", - "drupal/drupal": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "drupal/core": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", + "drupal/drupal": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", "firebase/php-jwt": "<2", "fooman/tcpdf": "<6.2.22", "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mediawiki/core": ">=1.31,<1.31.4|>=1.32,<1.32.4|>=1.33,<1.33.1", + "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", "namshi/jose": "<2.2", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": ">=1.0.319,<1.0.467", + "october/cms": ">=1.0.319,<1.0.466", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": ">=1.0.319,<1.0.468", "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.6|>=20,<20.0.2", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", @@ -4364,50 +6228,77 @@ "paragonie/random_compat": "<2", "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.4", - "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", - "phpoffice/phpexcel": "<=1.8.1", - "phpoffice/phpspreadsheet": "<=1.5", + "personnummer/personnummer": "<3.0.2", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.2", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.8", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.3", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", - "robrichards/xmlseclibs": ">=1,<3.0.4", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.3.1", + "shopware/platform": "<=6.3.1", "shopware/shopware": "<5.3.7", - "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", "simple-updates/phpwhois": "<=1", "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp": "<1.18.6", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.33", "socalnick/scn-social-auth": "<1.15.2", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.49", + "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -4415,19 +6306,20 @@ "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", @@ -4435,22 +6327,27 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3fluid/fluid": ">=2,<2.0.5|>=2.1,<2.1.4|>=2.2,<2.2.1|>=2.3,<2.3.5|>=2.4,<2.4.1|>=2.5,<2.5.5|>=2.6,<2.6.1", "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "wallabag/tcpdf": "<6.2.22", "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.15", "yiisoft/yii2-elasticsearch": "<2.0.5", "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -4487,30 +6384,52 @@ "name": "Marco Pivetta", "email": "ocramius@gmail.com", "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-01-20T14:23:18+00:00" + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2020-10-19T07:02:45+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c" + "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7f835941a01bea2d03776451c9e42c2a2da6c34c", - "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/150aeb91dd9dafe13ec8416abd62e435330ca12d", + "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<5.4.3" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -4521,7 +6440,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" }, "thanks": { "name": "phpunit/phpunit", @@ -4555,7 +6474,24 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T12:57:56+00:00" } ], "aliases": [], @@ -4571,5 +6507,6 @@ "ext-iconv": "*", "ext-json": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..a8152b0 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,6 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], ]; diff --git a/config/custom/tle.json b/config/custom/tle.json index fe47e27..b58e6bb 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -89,7 +89,7 @@ }, "@id": { "type": "string", - "example": "https://ivanstanojevic.me/api/tle" + "example": "https://tle.ivanstanojevic.me/api/tle" }, "@type": { "type": "string", @@ -188,7 +188,7 @@ "properties": { "@id": { "type": "string", - "example": "https://ivanstanojevic.me/api/tle/43630" + "example": "https://tle.ivanstanojevic.me/api/tle/43630" }, "@type": { "type": "string", diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml new file mode 100644 index 0000000..8c6e0b4 --- /dev/null +++ b/config/packages/test/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 0000000..b3cdf30 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,2 @@ +twig: + default_path: '%kernel.project_dir%/templates' diff --git a/deploy.php b/deploy.php index 2e0c7f2..0b65a08 100644 --- a/deploy.php +++ b/deploy.php @@ -9,7 +9,7 @@ set('bin_dir', 'bin'); set('http_user', 'glutenfr'); set('writable_mode', 'chmod'); - +set('default_stage', 'production'); add('shared_files', ['.env']); add('shared_dirs', ['var']); add('writable_dirs', []); @@ -25,7 +25,6 @@ runLocally('bin/phpunit'); }); - task('dump-autoload', function () { run('composer dump-env prod'); }); diff --git a/docs/logo192.png b/docs/logo192.png deleted file mode 100644 index 027c5f3301ecd3a9cbbc63ed5f71c47895c445bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12929 zcmch;XH=72(1vwe zzLD2&A_Cl}`Jx{o?u$4;*De?UAiZ(@1_BC-7y$tMLmx}q5L+Wdc{iB9u&X=lu7_}h ze*g{|08mtk2yk`t^$3C7_3-k6Dsdil_HaUc+?6Mz30yI3leRQLOJS?J&E#0Dg z-Q?UkRg@u$5%M?!{vIK&kO+T2Xs~>Q66arZ<#E^7w?#N1e}RPfDsie^4+ya}GKFZs zf;=En!qP%+VvDAdiwof(gn}cXA+8ZZ&|t2A zQ_%DXb_?H7r@Ba^UaEQ6b|K|5U5)QVE4Db*!_XviC2Dy3Qz`6cCRB(t^7>>oih5a8OYlV40 zL;gW`cl!r7AT-GDFEzQliFo*V_~XEWaZ-u>!)JguECd$p4f}7D@XzCaR1qMr5#-?- z0t>Q)!TkO`%clRP0@2X8o>e&rpN$XH9TpyZ`&y>IaXd6#Lp+o?#YM$Mg+#@KM5Qdn z#pJ~#koX&j-gF&M)L$-L8EZCy*v;Pvb{tb?cgx8ns%!WsL)QWIh^QqTRC$@B42#tvD9k`l{s|H3xd;=t3$; zD(L^9!&E~Tp-NN5QI^zUszbBeT}Gk)d-N!>=P3Nwj;>CuAY2!Yo89BB@wKchjW97xJI0K6=&Co)*le~zX`Pt=QMm7Uo1 z0RScdykv1%X%$M6hCbqyX`{0LPOHnt#^AFz%@~~q(WC-(S%ES61U=~{V7X4PS>JDY zeG~sOM}@k{)STFL3eKvYm5y(o)Szr^FtC;iWyFgtz0=!sH-~+x-P%C1MmZ+6sxzjb z_JifrlY@p|hpD9N8+0G)T5J=ExZw~0J*ev;*!KCEP0dLqrro}v@Ye25UfJ{qy{K6Q zohFkfSM_j+g7aAa@RAp*ljPDGpu?y5fg-0MUgmFj&dUC%LzC zTVLH~-YG2czDInA9X`Zm2)2lQEmFs z$F$_XZ`>%W^L=tx#Ad4FcV@HC6nC@%1VInF4sy86a~$pJ%6oku7kD4Fc6kLS50DT6--m-SH@HnCfvCkcQD z_Myx-ZxMu<3< zRpQ>HdA@#Ku>FGa#>Y`5-8*rNz!sc5ssQiHA;3lwxfvN2aHTFExJFT9hIHu&Zp4yR69p2kA-*Fuh{JH3yVo=u>On_n zSqn67nm)CZr2YY*?kQjbdxIGpaHmh5&fF{IL-NDPtUKH2GWS*@VPUmqGyJBpRIsse z+^@OH*M^C_sbHdv3lZA+MK;9!p|NVqyx%E@&uBJ09$5sQfWOh+U{%b}tUb0yy#d@I zLU$0k1V;ld!)-8Tn8E0xzWsxu3bu_kLnWT+Uv^BaA?pF+c03!5F9bsdPz=x(2T>VPS zJcu)?i;2ek34m#{(RjQHpQuc>nB{!VL;(mh6Q%(lJ%EJI)cTS|2w+-hw+#8hb?xGu zxdqBo=y1Np2EslJi_X|0#PkC$hX&qv5nT0wW^Q@GC8>j&I=0ts@|$BdUK%~+8hr;l zBIh?RxVof4wb{jq_mee;QMqbPZdEB>Fad#`fnQd0T0p68`GkYJpaKNuoD%>#Zaz|-0IoL8uUF8D4SlQic( z{U3DcY;}AD>K#>u!4Y;~j0Sg12T_Y_024o{`cJJ~1mEc1-mU=~{E)Hly_ z1TN&lR7In=zgx;jDn8SzhdRpoFECdxmWsXM%L~*6w5!>@*4PKF+6fLeXmeMC_tg;$ zdH}MDUyM)_$@r4wLm&crZFO7U_F79}c1 zr-#O3c{4SXrEMU(0hhLT_CO%AG&(x5l@EFTmh}4;LIA(oeTUiKywP4&1dOQ#BQ}o+ z>zfyXUErKoPb7KXC-*T-7A8}0TSVOxxBWQ8l@l>ctV!-H1 zW$!o;rb_*ooO)v;YnMoF(qaCsYDE8IYGJXXnH~Yp+a1|-EW#?JGw%E0JK%YDa{^O6=5|9jQdwFIv&CAOhp)bO zPl!|BaQukUVW%!3CJ&d(cl>qc<%2c!EduR3a#5{{JOHR8Hi!UdN*7sHlwDb~V21=S z7C=77hWWkZFCjg#;Tis=;YHiWZ&Cx=-~qx}4C;Ut`hkM){vcyPk6#0P+!}SlmylC~ zNK+}k=*aj}K#o3|4IG@n?skjWGX=j+6*6?Lq`rSF(J~&Ssyxz?1U=LY4W{(? z78p$OZyO{ylTMbt-_p+}T{qd2(G18a3h7Q$#v->t9_sv~>2t1M*(5OsQ#DHm5?I4@ zofMMeKidYs4NIID^7F#J=cwEO5doXAw&&R4;jX4NP_bhEpnYt8dhX~kUWnreCz7>S zM6$IP|BI@|H)&L1^jCY0{X<&W;U9aph#F)^0GGtec!z%Oj)6N|>Invz;0$X=XosQ7 z)C=ktbG2O|84@}XDx|pncT zM4*e<#|L4Av~OEqqv(`lJXZG`wS;Yn$a;_-@pS5f2*}N&VD481j$-b)^CjZ;uLZ`v z$C1H~?;J)C^E}>TirQ7x0odd-8P9-Wr0Uc8RTFa`eIKI&?p?q9$TzR>F=o^s8UFyvF*!m^yY^&Ys*nWx@g^9SZ#Dz)f`Z!4H0ZE>Kn5le~+LGJrjQP{(}UVFJyIGz9Onuru5CH8R zmjQzOj|rAml3oHqKrHt=lXh0-DVGTHFk-EwoQ9jh7xqF2^PxG`wLiD4$?nsemnkc+ z8YUK`QVX|pT*!Hk(I2~9D7?2ump)U^qe9v30(#2a+p=75QcE*ws+L?~evt9s-v9nt zf9-M9GNyG5d=-U%**u_JSW1a_F~jTpPAZ9xXp8@7hWBSX$)lb+GpNbKNi3izt&xf- z!sczeDu)_((a3-|_hfx>jYWvmt0apTka*sddXB7*TQw=D>J(Er{PVA~!2@d0{Zs3d z9v>Rl34L(8e1KNQQL;d}luCyfC z${y>9x}D=CEoQE1c8GJA&FrHbik4gj0=yRKNs+97HvPm1yBXu-783fHeqwv$2FZTK zl~jxNE?OsxUb^l6XZqkmJABFXz0U)Cx;-vB+3S%Nj+U-j1?1W)-9 z>yt#yHL9L-Iqn|NjSWZ&sg|53bp4hWy?E1atNTsN=5;n;& zGT^FL{$WMmX6h0hqI3Mqf&@l@p-$ZLYza=KRaOBU9nh(z;9ZS|#V= zwz$?;2#lrT=B<7jPV9qLsG%qqF?nTX6fJUwzm+vr;4;Q%C)k@_`V-dsW-yAIGCQ%5 zE{Fp`eB1Ri$^PdPI4p= z^&jI4S8tAg^xLvZW5)Uxt8Zf-TJlFvs8xirTFxzMc!{`Ab{=8AX#ZZ`{8*7pA=pcJ z+%#s^?BhDLEs}V>KCM^IlRSrCVe>g#LGttyD8k!-*k-u|zTxj&Hl_K?#^)!FTRvi+ zDZDuWvk>)-ZVuz*c%mi$CYE2D?xP9p$gp7IvIHHd8Pwxu&LXVxb2-5Xzt8jCX*QB{ z{xZ6wKT}D+GYh~MVYx2sDm{M`OpcE;&D2>M{5v0mjnx4h$RHa3N8(9SJhpKQNpz}) zrdEnWfxUGnygv$pi+2@+aZx>;=7{QGuc+*1U}&?K2@B=QY>JC@%y_X_3Swr{Gn^5c zo(zn&sW?+P`$boDr(-urxgF-j+H(3N(1DuOLc0fBO_~apHkhbcZ_9rB z#m2A5nlNbJ)KW>6>FhwUW2c!XWsii1_&!c60G*#t@vTuI)HadTsh)Jyp4pown@9aC zL!zJZr{oqb5}6X{9TIl(U*r$X^2+xMQKk@ve8L0S(Y8<5rM;AJ_Bs}9usUYP$i_i8 zq)hLQ;dNx0Yh*s8qYdvYn2*x-@%GCl(5|GRt1AO-2Tv6oLmWzJ zIDt%2ix&vYDdL_y1^{}RCb7C@){>7*-HvW;{nJ2?@hJe(@>U^n;ds!i zEz;;u5Xw1#ug*0!*$FMc+4X2hz-)cemuc1bENRosUQc51m371BxPT1O*dqD8B1lN1JcZe?E_ws(NAe#7c&ge?``zG0VONEX$pplAj8-VVVR`AMDDV)qu}$IiVKWxGc2(C$dS-?<*2yYEIFr- zwIKV`ma-5YNFh|fAj5gC5(z~(8w8GO@LSYA?vua=Z+;PpJ^XaE`Un-KBj_88hmEm( zoiag)res1T?}0y+390#i67^rCH5xNkgGmzOV$+qrdj?N0&*2S{EsIJ<+k9BS9X4#< zX>lY7{VebU5fg`mNc!oeNuJHbE!7jA{UD~_%AEWb5aD-M69kt9*5H<@5UeFn_wgrE zX`A)$AAFFB$nZA#ssUI&+V)sOU8ihB&; zJ@Y3NrD}Jw&{Q1>j?MXFUI5Qc_tQ+wN3Adp-nh3L1GQKF-ou{{CeC0D3Z*DBun~Ce z=ANsEu;lRyA$Ya(bxzR!thN*wThZMnfPN+;8y3Ca3$Ggss7UoCsM4Z-rAbYCMZYBl zMCwMZ?N@Z-mFEw~ZJDzsIa_*|0U$9l*5 z8Uo`&cNmK**3R*oJ?==pdo4Sl9$$PN56yqNISLWjLKyAUDi{i1NlY!YpB?at%8?L;)z7zW;B$^D(HNN6U&}Buj$d*wSJ|Tvoc1FdF>?ZAm z1qwKJI~pm3J9ALBr7h~aW}$emN0Fe81Mbp%zEh#{N3>+7)K(H+CYN<4cyzwfqL4V! zQ0SXtma}Qe+o<&7c#h2%**Sa=S-x1Z>e1``MO6PsJ|&-c!=o%x=AA#q_VZ1r%tM?! zK+v_WDnF)&FuZ;*mBiR9-d_lN;u>3cinWo)XlJAvKF&N~+VC4+66g9RC%TV3a7Bx} zIAixl&scmN74Imp))3RP%66R6yUcvBe#rcW*p%&SEjG zKaX-W3nDL9BA=9=iXz#4U&^nZ1hfuKU;*%>=Vd!JD0m0X?saG}Iy=_JFD9`Yq{!0j zm0?u!$;@qM?(^$f&gOQ>`~eWNYOLngMrPQwDdL6}IXZa`^Y%eg-b9T)u%vSKcOUg8(@oG-L1(W6&z z`(azX?4?#ZuLq5O{m8s?f`VE6G%1y^!Y*7-S2#$eQNj$BE-DfQH%_LYaIrDq#3Xij!3kQ2(=P+65<^7%NMizBMTLK_yyl#<=f!FOJG_VD9 z)gReL2syeEhMGL--mI&%B!H(9UwR*$%J7{njQ@bi`Z8dTu4}jwt=Lz1PTsM!?@4la zWRP`>C4?)32VzoiV>~VHToIhxo;i}C?;sYAS>~^{X-K;|oF53>0!JJZn?ACSduAis zT`3vhYNgV`hu+E&DL&X?iwHy86rh|@CwVB9a%9i+?L2|6?QjI0U_j^Rq;_7` zS3n~d*il*+-T0(sxGrw$Y>h8#lu-?_F|-@mAr?dExA@q!CZ&10HxXz-s7ZeobUgC~ z4@NApM>;X==)L~4y5;X5C8@rE(cirwy|Iqf$a{Itth(hQ%H1!P`=?D3TZG^y*JQ(} z8IBIsK2&-ln9pBrJ00{7Leq(3sXzym6lo5>tK zNu7p5xAH`FG*}bh)xcO=fZr#i6iZQ}7HNtPJ_RXmL3#q#YGm^^*hi~T8e1Ln8SzP; zC>Po8<75thd#0019+6&!U?6P+#EPVg{`^H&S)NM4oL^L4@IjfmDDUM!HnV*X?_HmhlDZQR>~nZndcgAxus zS)zAZTHB%iP_XoM{VJFP02(-P)~y-S=&?cwy|mBKvSI70&ZQIcp2AM zxPH@zFAK`Z-pf$+y3fxVw-OS~Z`9`H+FA)!Yt>0$hniU4$G^eFSyr@m^wm7nt&Ve% z@i(Q(G3v6oh{wKVf<{u{$IuV8C#;L{n^IRw-$SyUSRdBRdzsML*8sxkFJi89VLf#4 zLQ^VU7wzoCX~MVUdT{^usjflScZzVP`CDjuxzpD&^HJdsR^U_+5m36!>W=QOD9u z*5F;64rZ9BbuS-$Wr>rse#H46`WTf)62EeVB6!#Npx_qz1*J;6@u*Vz>(=1-A%N*!45D`r_e}#kZCN-sRP=0dP8*0gv2}iS7>S5=xZn9emUh4>5_s zLS!3XEZaCK>U+GA_N0a~RpZwS@O{d2OOYahRVDpgTh!@w{yFSy+nZjjJOiCJ4_={V zm5q2h{Z^d7*}9Glg%|Z<`#Y^ovJ~c%9}4E#Mu=?dP|^|95~he+>fdg1d!22yq&6e5 z$Hy}VxGG+wcmrj7(J22Sr(AuIh6ve!Anj>9E{Lor^qu?h+1D{)`>qRj=vQhHlCTiP zmt8JNZt({rcQJW78reluxESEKP$?FQk9Na!`v)XdcHLWG`=WDx!+UfDu+U227cF1~ zz$czy@xto?@h-CAVWmR2n#PDCgbG$Br$67qU?Z4Cmbpd@PxO^Gx{zQ#DKqkZlO;42J(n6BrN-Rp%cC-JG> z@ooHm)BEtq6{@>r_l1#gsUOOnj>^m0QW1}j@&By5kVsik=WHsk9z+c9qhw{@B7R4t z5WpLP(wX^l&Tp80oW47?$+z&%#_Jh`C)eXQ$(T$Ht}wpYFmam4Cw-}0XAj1-iDNFdpQc+}w_W(tJl{>8KW+pKANdL(1oA!3rliqa(n#jB z;k1zlAWY8Y5RcM*PqSF|x}1S9#kXlceh{}wk4Y(0QYQjn6u=2u>Atv^Heh@$hN&7X zLB(Kom8o6ay|4uOEP($PTj$vc2{naqM=42OWA=A9e}k@4K!5f>S@H~R8j&uRs5ouP zT{f&zFx^6=(b1UcKlCAAe>MCdN%ppdc)8?e_}6ThVW0W1)LP=Jbs}DP$7w8D{-~7I?0&n!^2GP$sLSN zb!lfkG(An3`S4wiEPSW&0x@=kV}$~=|BX;=B8!UojyjWv{|E>H{-DM9`C!xPx4F?d zqa%?Z%I^_AHcE%Gk@p+VHZa3ws^zS8ylGUQ)8xqXaH~$3=a>&QY30835#P4NTTO98sb+jwS$sr7VVIG1ksPri7}C#w_8U4O14C|VgM5K zCadtEi3(09y_8*{*q;1TMD1d2dB4t6ImdTCm!e@`Xqq~Ddo?+%IDv4tkH6!MKP`xjilKlv!)(yCHV1s>2keXFA z0euy}ETBRiRDnD1sj&G|$vz23PZ-H>6l!_l1#M$?$mr0_r1xZk#rEzT(Z$f8y@UEC z-2A=~oY~uH24w0N+&+$@3$R?rNxY5;R3TrFi>P)98!y@WYN{|Y)I)BwwKEf}O@|2# zSbv)SRF-d(+UzK8y-D~p^Nk21;Btx6bEOVe(0fUcoqHH2yiL?i?4XOi=(G`;zAG#) zCG%ZgZhNpabM9={mZDP8Y}=j$tF?PR`c2cUEEFqYZ}I*9*UbKpmd+B!-}?u`pLWiB z(h~Eq#={4|S6^Q2kj1`_L9OX*88iHJRbL8wOwxf9beG^_Wq3f4`m_B;qTOIj!@Ij)= zHbCrwNH*s7JGVb)f%?lfKM6%JO|fMPra%XqQ;2@obgx!*)}kK&c=wHyZudLAoUw#_XGWv+rCALp+dT^H)tbDXqhVbCeEI#-a}kYLD835z#P`c+QQOvs z7P9_I9Uv)6XPS7__x2AZOE-HUK~L1^?>uWBVsT|z#&+vCMc$@_rQ(I#LLq1ynU5dk zQhL%)1FfB3umxZZJg9@Bef&%>*bAhE{n!+8)dZ~bPRASq9M*F|my(svM+FaLXi=@t zFYY>GvXZ;6%OS54c@39`KDEAIgx;Q!Hj#}|&>%^&^R1En64}X1=`mt3e8A<+27j_x za3!BTa6O-?=044vp6IdM5kn)~hM}Q&0=qSk-t}=Xq*IUg{m9G7@>uz3`Q+ZZrIHH( zeD!nuJYGujmgbF;L6Wcb66)85(9{|k0fnTrc}{>c8Cu2Z>p&7#In|DZ)GzgJ-^(i7 z=WTj%&OWhJc*lSeCs&eLj_jP}4?2L(`B!s2Iv*FYzt$p)))8+)fRu6Z!qk{LlrpATl&TIdXf<>Msc;X4^ z%ZMMbrEGeY(PtKmVXIYWfk&#SRw~);rv`VY6spk74agf|3KTI#BQ6Oa zrs=_1nbUn23MP0x#-V+nN0ijXm-5Ng0|1ppzRz^X5thqaMls8RbX$sn7(>+p`n-&p&g6A#Z(YCa{$~V;-ZFpkMsX za5-EPKOtry6cOxoI5}c<>GweO%~EIWk9x)7jZJz@8xbi9F;@RP)j}zPAk%7qk6?_t z)AigpHM_PkHFW`h4SI#MSVwXc?RG7W#L72I!XhM2@2^ECQ*sA(9J?N|7`<_6>+uz% zmc(S9s=!Z#Z6eHs2+EZIKr)3sH;hX}+Oox+_2PY040nOy)0536E_xlLqZZBiu&=39 ziO_O8&+_hA{&2CkinE+kXBk3^NU|0wAu_@D!Tm5G{F(P<#-)DY__ELhYG{q`bc z*PZ?xU4{Pn1A1!ul!!Pxq$yLV_o>*6I8BkqAzRYw}#) zdc$9^F*8d7Bf&P98DW_bE0c^{LO!@`qK%Hd|MA03{eZr26mFH3OfIhm!f)aWADK>L zs%OBacke5mp97>NqXJ{uixo3Jb}M6|+qI!kj%H8tptFbks!)%Eqpd<%aP&k_oRT_G zZ72Z=fDri9N^xzFJko42HAZSa1z$Del|Hz86nh*Y96c(6D_HN}IV1OTnZ0*-Jk%uu zc!(00d!O8*jHGNMM0L|xi~?aMLu8#&+pB6S<6PX__!l83h7=4wN_P=H-wiTY%3O0sZ6tEu9P31)2h9Tpbs|W>*)Co@nO_ zaD6DGnzT=bO!qU|-{3#ldu%wq9uIoP0|G5JW+jJghCDey6247qBaR)QI6ql@Uex@B zyUF<2`gyX-O~)#z{=y3>1*tOJ2A<2IP9xc;Xgvko87M7X?lx^c=c|57nuyb?Hgaq% zS*-Wvvhh$178C2W*ZgHxTEo&xdcc>Z;atZgk0V#N=i3nd2eZ}Dd-#udx^(9|&pXTn zY^%yL6l?1j02MruMdT7iod<>nrMYs96g(icBL1Yp` z!AieGUc!vR$AngC0-`7DXT?2Uts;#1Wt~hf?n@D%U~dWtdmKyPM{O}-*L!_hBR$qZ zAN9d6rN2xfB)5KuOuZ|0?o_&IcT6cPpWWNkwL2a`X$yR$_@_i@BQ@Bqf)!J0ar_q} z7O^jHjnH$|`_lHhJ(kx=kI`n*!!uwTnZjjzOmEI3(7}v;dR_AkmeKtsTQSzxqj`+5 z+Y80Nry)jpz9MU^{_b6isBCX!pQ50hr*+L>8_alIa&RFGO}`FqZ#GJ|N2mGBfdk%U zNP^_b8WXaUI(Gp?>FS9W?Yq{P@V{KN>)u)CtfqgnCE>)67js?6kuNUfL;wL(GtrMr z&zFyNem3tv35iN8$l3)H9Wydbq~e_5qdOxra&eRz${j$E?g(| zxY})wg;3A~KV$b%nvWRXGX7JC(oe-MxbuyI?2UA@w1ZIcSHt_bo^i3aZ_@bDMmOZ! z*=vVX+>x)HpW)dddsYJNdnW# NPs>=dR^283e*vEsT>k(7 diff --git a/docs/logo512.png b/docs/logo512.png deleted file mode 100644 index 2a06d5e7e8ba9f7eb8bbec665675b07c115fceac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36838 zcmce-cQo8z*Ec){A(4d9OO%*|h~A@RMlgDaUW4debb=YFdN0vMFF~|O2qTFa(Fq|+ z1`#bX2!k=-_bb2ay6^X1>%HDTp7lHrYmJ%lJ?HGR&pu~=_Gj-Ct$$nn!a4SH5D4Ug zriQ8k1Of%$LLt;=z(0Gz6Gz}5Hh(oUe?xC4{~$YGM~Je6_dQ1*O;0;#M*~MYhmiaI zj*1WnIiIVMnZKE?j=a6Mr-;;x|Oa zZitFY3X99gONq%#NbvmYhZh{p*TG5NKo#|`vA|DCye|I!KJucXK|w(xL6RcgzRsfJ za&mH_ViKYf62jmU!hRuM{&vB_UViX@_n_+NXYcFkGNORdiniJO`yU=gYA4o#YMzUr}Xa!b#?#$ANBP7uc!U|4IKYl-v7^z{ft6<97PQr z{k#Kw?ZJg}f}alMBd_A?Xy@Iy?g!S)h=igVz>Gp>}#Qwfw z{yqdb|M!FK-`D@;CY}E@|3B6J|Cq%8e(C>5_y0pj|67#vpS%AbOYnbnxfbb9SL}aT zmD9-FHxwKL40>U-EbqBo6-k)h-e4m<^>2bR7rMLn(KFgiYD`X!X!x4S8)|SAAr%Ru zf**JomqPHBECf3DS!^%%cW{O}YbNNTHi3tfwv7?8Kr!3elqd}S;(4!g2$3NXy?mcF zlLi8@g>()kMx9WF5ZP#h(t6W>6XINLl9j@-v1+Q^BL%!z*xPS~tp;n%>uZU>5A zOZd^ND4xfObf-&)^hgG0-S$n0p~->znHp3163#ZyD%E zb=vX6lX{ovPLH}X5F|0a4{KsdSGMYS z0VnxDBJ@zWYvJeB#YPF?6iUJY!R_xXXVdAqY?kUR56(7pENt%@M!|tJMt&Nfu?q^p z>Q{Eq{ZYgdlD-i>GmpCTj{Zr4aM0i~HqY8_v;3uN*QIsnqr}qrI)-b(NJg zL(IdM)JS(w=Ves!7>qR@2o-|WM*Z4+nJBM7<>KO!Vj;3WR=c&*gtiebEe+{grO_9A zKJ6MwiATT9O2~Utk#WK%2>HT{Hoq7=FdsV8(VYG5Hvgni#+{AQ+s2)&j-|*F=EY3H zCkP~o3?i$LvJad|q?&?vrrgS;KH6DPmOs*>2|sQV9UrK(vK7C0RSN!!^-wm45Y~PNlf09wJDIN3SrI;FQD}NZFCDB@$LHX+n-N-r`X66T`5{ysn$yE z2locIFO`~3Q&W7gqga-c&;#gW0sNG77lP4%GP32@Tr&^p#mJ5l*%iUdchH*mFR!dR z*&J*OzDe(8`7I5Fc%Z~6Aw_B=n<*wVj7asF5AhM6>c3;8AZ`8Ac+C$MWDVz0VT-I) zX6MSsP5pc^ry%GGkl3|!?^oYb&Z|6K>r%C7?C>q(igfqAiAf`alh^Xb&2KW^Jey8) zaCRE0-3r(n!>6YG(6!!hlne=r>ovs(Ku`BvP9(iTGM0KD+(jc>EuN(lMzkv{j{0}* z$ZXA8s(9yh=nQ<*(e>PXiPHt}ga2}kf${49GZ-fqg zlj_jM+L&#w!8udD$2P6+F4wldd}Y%c%(H<{)R*&(tFdfx4YIJ6s=|@ zTO5&cjucO)sdYx*I>|uWuCH~HEPU};%?Arp^Dc&U9J<7h+Fig138nQXxTza)YveOj z8yv!-QgaWO+hIikvr`EF!ko^!Fq=ga<^I*?mCdgFr$2!AlU} zu#>?aWU*INT`zpF?OLc8K@^$6miGwpO$<}3R>RHM54jofdgfSyXs(Jz17xkq&;7#S zp!y)x;WvT0BNPI0fON)xK)vU#e7mo)%&mvFaiyRzhU;IIhO$jeo7Jq7m)MSMXNrVh ztcmMf$LVPiY3J@49rtPzjhT6x-tZ#fG(I$TYT&%tAU=b;qGKMKw;SCYhndQ` zHE96%8TLBr>ity~{-7#zQ`%OYs3|;LU3uMjgBah0<~^^Ic`X6!4<7# zQB~JzJUCBhWiQEnd48sTQi3LFXi4QCcio9nC0T5RJ0^sOh9-C^ z>8n$Df4wCj@QZ_wGyp#oI|UA+?cYkyM{<&jZSUS0f3p90poaDQvyaN9YKPZpZ12x` z!HY#fQNS~cLzHA_xZC9IEj$;nDv};SOYu;aq@A6snmJQ9Dw;1>+6sJ?p;bin@>f)s z>s2o;hEi8_K(dPhi5v>a zXjNiqY3)l-z29kXGYBm~R>kE74ETZsO(M&aEEkV314ptHhFr>|3ABmR8PB?ElRR4C z1_&UUi2ZTrNuAKCJYA1OcZ2JO$V*#*_m(XqDhIL#`B7*ezbN1;Gf>z`ZR=UulS9B@*l!J_ghpBLTkhhE{A zq2Y0I@QO(2;pZ#%WO%oCQ)m@GTLvRYNPy=6D}*kV0KCrQ?|UlWkToP*pr{4xe_WEf zA*C!*4*$;k)}*9EY!xAHFF?8#pmuidH8wIPcBitc=rb?PVlj*dD(|-a19y^@310-%eppx9hwf)ut>DQg3?|QdKMt(0pWhVWV&_AH;(2fop_DI%m0*^-uKjUCC%St(dGMy`qjV#S~4pg6Bo{ zbp>Vh^_n-IP4A1CbyN4P99yRm?m$TQKkHJfM3= zmaDEl!Eu*{0%Czr$4yEq=&GE33!a%N-~+AZ{H0``7(>w`Lh z-DJi;euc(~mb($c5{PYC9XN*lFWBuudpZbMxN2T3_3iQ~Z(AsWQCG$x2cFzL`Vw@v zh#T0vz|Lh}083g8u=-W*oUfp3za*KFMG3q8)$3rfV=iqS|8i#5hQita-*9HZ&X`6_ zTr+QOV*q-C^I~>>){CimMeRA$qe(f{HZBsz|C~mMpqY58StNX$&h%11RDGff1(bvITv zF~`WkY4oj)=^F`p^#pDf{A%BV7BRd70-~pp2qr{oviKqC=O}qfa*Bp`S^sC z&v6)?3w_KVZC3Ekica?*Kp-!D!tk*+UB=VM{Lrcp6%ZkqbYY+V!nP#)`i=K*1>P}t z6`7ne)ep5e7ayln5Bptt=$5B(mkWN2|DNbWzV<`4&XSwRuE7o6`rP9LMxxTmrmH7@ zc<57M&_YK+gQP^$*nWe6UiOpfpQ|3 z9MaM)HqCzk?`cQgY_Fd6>HPWgIu%>7_I(w73`aFLIVFe0 zAnak2354xA!|E;szk+UaMY_iLnob!ABGWT|=!2vMNmlg21-;6?o6I0glvb2iTg`dk z5*++69(5*mb{)k-e~2jkLHrYXEQm*R;R>=|2#@)ONys94e>esEdrbPJ6!cH@El)^I znq*d1g)89D-)aed%h=K~jb^HhVddLb?-_MbZ+;s>b#j-ye}DE|w-d!D?;&@Ih$C+D22(-1X9^ zUe)TS1|;VREIH-!Lq1SqMa|Xh*2#jWu-`)O5)^As8eoU~2E@#B&9c%@X4*oF9mqTuCGhTG&)SsQ^nby+BfxoV; zu13S2m+;t3El*28LBa}$zr)2fPW^f5A_WNH&Mf|rgxE|n18fCa$FT&CwxcISW$(c= zWCD37(vG5`@mo{jk9EHrt9 zV(!!ggPA*x5CcZJ-o(lpkwl9d*LoEPacEv%k|sN@U;qd7MO3ZyAy}!^q;cI`(F~Vgf?&i|)b8D%(GhtKhs}tJ z`@SV}XWpA$9ibN{K~6L|fZ4qrI1@Gk5itu{*g>dwbT_Rue0m zj@&f%Z^c|b_~KpuG|$r5w96$KO&g0&c|sVNxD}DFN_tA5f?l>>#~`YZ9aE-ry0C-NV{vJV7!uVM%wf5l6BaKM_3PSC|;Z^9Q#K0qsB z6(uiq>ay9N8+Jbo#WBG8G~zq2#ZJE)t`jB&bt@C$z2ALrxCTb#KNV_#H12j7H$q@| z#1L))H14mrh>y~Gae!GI4l4xj?8WH@jK3BxZSu6NJo4bOQU{!<_F_px+~#{#GzJ6-+G4APlRGk>bk;RQAkzOd(Z{u9{V5KHNDm!(lkC(4Ub? zZlRrCDwm_puKG^GfR`^p%W*yxYW3b8Wrfkeei3K6)UIp0f5_Lp$JDP%PHZ0Rex}FU z9G`S;YP?^tSHJii$89wgq8dZF!p_X>P&sURGxou+DpNyBiFO9~q$25I+$0n`{PBt9 z#nZ) zKJ?Ww&R4ZnVS~JgW_8T4`c_`M6vEp-#7~ntW15=v^gT zfZLV;k`e}M)-BtG!(lr&TaV}3jGo$Zg1p~l51o3mx$8yx$O3%!|*XX86{5tuod~g}^aqM7Zc29M!pTXZ)r(Z&sP!;y(Fe z9=SZ3mxyX!N0A`OprR$*Qs5L%e(KjWeBvDaaxIR!@e_4$d>ry5!Pm_liz>ezG_tt( zM(fWk3tIDdyIANdDOw?-AL>zAYa5Auw@!S^D1UV0XnXyaVa|p2kXB75qWNGm6>}E= znKWXm+V6<2t%(m~zDFT3*8YiFN@ijt%P)^;-ZZ|v{O!a2*@}giABCw;*#_}~C#s}^ z$&gns88Q7lUq7RSf0|jf<(I@^gg9R=7}r{mb1Otdo;kzs@s7E2p7ixB zGg{86WkAhx{d#4)Vbz*xVp?fX=kzk8((Z?9x5L78!oY^cc(LXF6yBYsG4l5~O5~-v z6NQAq&mo1tk@=qM^5L&j=jHvf;yYhvw~lnh&eCCmEr`{bTF3yl}GtJUjn?6qfH z3ZIkFrK+Te*3tM})lGHv^0jA(@Vr_pPGjN6Te#ihwXqd0;~SYjg)mm4=A*Ct+;t~} zkW#nG2n!*{7h4~}(P$oIPU(vbtDA|vnl+wNKUekgij-v>xLQ_pY*-QzE29aP^rur3 zCpNz(97ByPa#gmI`>^Xhr6;B_0BbCeXhy7SASk4yUNbpiCKr=bXt@k)7+5P=k1=T0 z!&rZ3#;Hl`#l zyw|-<0;$9IdbjmKj`>S2_T|SG`hD$8*;;0#2}N2abIQl>6A=lQu>K$$`laSNd2!pF zv7Q*fvg)FW3Q?i|n*7OCFU?b?q(^^n$;5i}G6`+$c-he@)HUL!E$IU`8CT%(`4CtR zXbtt8@XgB2eI#`#7q-orW?x@ju*o#?C7&RKVa@2TWRnkht)@UuCznrC)4n&zZ&Nam zNB$$`Szia0tUl3vQ}ng9u^)+CWvMDU`6&UuMSE%mw%3D~zeaD)-w25&;W@BHOZ*n* zZ=B3kQ@x^ovf>bxUD)lJsC^nv;y^ z;yyKt_ZqC+O}iA$9CH(wPIkI?_u{?VHR{^us{+esHQA<@X;!!ZBWwIa7|j*Zu?zE-{w?WRxHjuBz;9mk?| zBP+FJ0iPvOQW?A{n7goZbin2IChTd(2OBj@2Zpk*@b7w-O3m_r8qJOkjn++5hn?hz zUW3~@P-q0z1bN_ww-qGh9aTx;@PWVqOKqZGgT&geSx4=K&rhNj*8Io5v|gW-x@N(Q zlvz%;zyyDhkGeK|Oz!_;OTyY?J1#(Q&Nv=9oPJpb+PjtmlCplf)=~4hHv@~HM6q8L|dhYiqcAY*s$-p63|{fE29Tp>a9E7 z>|bjINbr<>#EYtvnl2mOlg-WZt+Cw*LHom8EYTWdY+POM*nlds^4Pvp$3%N#ghOnX zXT)ay+&eU>sf_LW^`P~kP$G5)Q5N&N1HZ+xCd3i>*1X^-MDdiIhijiaeag2Lh2TYl zL~!Q?)v6)XDSgWQ`)Bl@C%Lz&bca7z$92kfbfXrVW2J81RJkm9p?#ibiVhGsdarjE zWV@I@GqyaN51)-_en0F6y>5=#VmF6WQa;bmvkYRky+c$mBZ|63V=v`wzT{7AcBbGJ zyi#VQJddb{-3aPPbpn$yl~b09Fta$~G2u^hH+GH@D1P$?0vU+tMgMo~Ah%;$NuIQZ zLF2^x?FAF#`nE&cc=_GOWlyCWaZ_--I-wutsC{pv51WWpDR*%(vm~M!aI`WC z>IoA|yq%DD#pjU}S@gkKy)A<_(<_QGUmPjq!K9W0yp#9(09EO3-p8jfGo53Ot?;~7 z9NGnu&d6fck$9bFnd%Si#p?Vc_vrPmWybWKjncA`Y48}#+Lh%6B(;deHd_7JC5;5^ z#{QOD-+FAG!l#Pb*JhsQrNqUn6?KJBwt-*tYFLhqX68NF$(~(+^Yqs8qGjkMy2Yf5 zu97l&NZP+T<7Pz{&4eUi=Vn2MGMYj^X^O6gp_d_vzs#+ zFK!{Mel8B&fi|Tla_b2H*}%!b!y|I>xK1#tl2(&akR0xHWVA+Q2(Gh5mQaF_SGvZt z4A%F%${joA!G_y5bJ>Bn9V-*bPQ$O@2OOAE)S{phibn*6jX($&3SdOL#m>iH$B)R^ArXu zU$;g%m4)|6=)`nWU)c@eKq0^E4Dj8|BF^-e!Sr#%1@G0sY~!nl8DN(V4LU+wh*t#p zD+!RyN5)X@_WzjZ1gVLUtNqkXe=2XaefF=TFX)y7U{@7QKCIz`e~K^z5;@7h4t3@r z6^%8}InxZ;X-!QXH!?9{l&0Ys{!`tD{fJr?J%bATW0}9-!h4TmJ;=DCoy^Ipi~4ir zd2JySQUWT>q63<9L2_~xFOV=mUNwUbcFVIUT4@1<<#pgnN3a;~<2V+iMnq+iJK4GCF_2S&?L5ZCfX8e`b8H83{$BY(d-pMDB zUh=uIneNSMc+T$Auy*;UPtf&k?&AD;J5GFN={ddM1omHIK9W17qT$pmWM?2}c+S9o z_bRgAlZGaj$;uD9WvG#~h#wgfw}(pyl=gbo_|8#4-5tn2xW(L(VN6k?G&u(bCpnf^ zcf2PPiQCi4Eeo&bzD;_cu!ggwOrFu~O|U5(xYT|;ZPw*P!P`db=18wfL>KfT7Jos- zAe~>fg{>auWN+`@=v-P-yuI_BKd0>{>n_l5fh#ELLfcq%+f-BvmB#HgNvn-bKjv3m zwVch|n$K+VAF^qgu~8%8nb1qkA3baz8W}xT;|>G1_M#IP)Mi^UzoQ4N2ry>|MMU(FO#Wc%2Zp8XPo zU>DF(MtGJ^Sh(-34ulnS9nMY^ zR|@#LZHqUIIkJim-YEUZMH9Qx;xziGEM{{|QWhm0F%qM745rabu59$#uphsRg#!u~ zYrKbSfL1nCVac_en|qP7YpL8|!VMYyiMmhj40J;RYX8p&X7L5P!Owf`e=OKbKpV6= zb5e?A_M?Ml(33))U)-9BViwGWE#AmK7hSwOW#Qj~g0>ZR)6Bq=6S>&|)(Rg3d!arj~^;9d)+p|X&;8|bWQCA z0mg)o5qH02`z@e^kA{K#s)YsT_8x=8SOzSqM}CRH@VaAuRQOiiF!aj!uPw`BC$i<$ zamhvtKhlnT+lHVy@jztnH#WIXI&C2M&kSpx(v;fxxL?MA$Q1G%(DATN`gBcy?!;ul zf<+SxQtoKH=DVGlYB3`+PFQyMtg!P{O$O*6?oV*L@zPZ2v9WCX)4BA$pWjcK*i2eK zi4TZhxTrfKIh=RrOy@>G-RjlSr3KUEvk=fJKol-X>UI{OB*}P>Qpd+9=KPF}zgeoy z;gP(=IfeC!GjjDhazZg^CZ(OQ6^wlcP=eCnV#03mv3>~4rI(h0~fLRabISJ z{F?|%^Xs6>nvhhPYc%=>R$y++{B?ltc@?m%08~>GTeg*O6u=V;G?uT0`L($HaSw1Y zU@r_I7D(zsemR~R*N9U>FJkw3LN?{|?6RTx>Z-Y4C`U5(ATN00Y^gAAN9^l2mxX+b z(7oSejV|{Y)JVgPgqA&hRA|+TTr{C=uHU00w@Ug|*;#^u!#}cJL=P_gsW68y?>`$moDHq$uXh{od$d*Iw?Hl*vLF{gM(c^`+!l!HSkJ9Bo4+$11ebUk85*Rw>+arA_wESMWQ&|}tK`?EewV-A?c4=$-+JzU?S_E^N;dTCy9x zC3Svuz~SZX;QTn@m{Z4Yo4VVg$UgN6O8vt2xk#YDL7<6z$TS_r(sRnFD0I-av3&TK z4uWVl=1Oz;ug@cE(oosiB-xXifNTg=qTVh68_c+21?39LT9QfxI+w0_2}5M~E65;V zCCzG)5;A6U28?y4yBw?r1~X!?{)fAiQwzZwahTpEg8_)%yNKit{Ia(H-U{FP7N=9> zAN<=J_dGu^SQDR}5`B8(Z_7k#+|V$8kT_|txixqgOAz%OWfU_6+72?STOo(Nn7g_d z9jdTyM!Z?y3f`K_W}Fd7-(11NC0@V$o1xJiT1ZlxF=>Dp&|UKk;Jj}Jqk{pUuQoL! zp1il6C{x)nD?k+Hg(qdE@S-ZsZ`8(h#(tvS+dD4+UksG{(%zsv^nOL`2Urr9lieyH z`O%&2aNu2s?4;VUIWb7)6=9fQx;0!;6rrB-iQ*aqolHcT-3MN6iY=!jEnSs2^SU#Q zy5y0A^JF0O%E{$kcOVn#7NB`0u|w+uR;t7{Z@$XJ-LG~-&lz=mqJ9$}*ICUEhEJ;% z5>PO+|KrCr^&3ucw(M>jEGabK1QpI4FF<)mlpDj9z-R`SH zAIpS55>bfFZ>N)5i5%;Klk#BI5(}8?ow)tL&yPfzJjLMgOahu`{b<7f zg}P_xm8ZAds3rp2?b`Vi2eOGmpARiri2XAWw6VaKr}S0dvh_%ZJaW>XpI!26fJcA2 z?t4wTTQ^+Eewmgczzw>OPrCKcrf)zsBsc5_(6{vJPyOQwe8uq9{syH+A+|K=_+7zA zXXmpn$r&WZf>@0F)!8@59+MBv?h&qLFHxwTiiV=cV`B!M9GECGRbG%qp_9JA4Fgb< zvuN(vCUxV3?QeH_&U7jJ2`$!hMAC6YUUu{PWsE}VV0757!IAD9k)^s3`4RJGs|A%H zR(wVetZzM$lKj}qMVEJ;$6d^C2ZD zBq;alT|{|T`NxqW9bkN;y~T3bQb-$hYv}U1N{5$Ml71N0-8nyNNDh``pUSV<0O38; z{e)8J=8-wXcy1US_-AiakpIfg6bqn!QPk@N2ldl5!qgY$dRT?N-|yWH2&Gw^gO?4L z^8)pGeM9ZKYzsODo^j|?n1+Qhanb+*19pW-S*^*~N3W&WaR`L7(ec1|7lnquC?&d@ za-5gso1k|1HEpO&yVl$|AYVRXC_%Y{Ylg4z9uvbNZ?WxfzdOYd9Y1*YLMXGE8tYSD zZ(T3msZtCOS}GoQvrt*e*5>0u_VgHmR4a(*AZKhDoX8TAM)w?zmorJff3g~9r0ciJ z8Y?)8?2HKDfYvg?t{*!`TzvR>Jgw+qkiFNp6)l;#&VAnm4Nk32$B3{%5gE8oRy@*A z8?1oJb?e6H$W_>{97usBbiesegCG{X|AXA7n)Q_Tyo-cciz_nq*3UsI~4n%m%ij(Oj@DPORiVd@3NVp2A)phwcFLqjc?8!`@px{ zUKW1NmAWqUxy(}`{w`&>68!1eS9h)N*B#FP_p~JJ(kbcg&?$=uGz>w7R7vem3EDFY zFD{cBstY{U+Q768A}|_O0fXz8@w%epP@RtKkqJX&Zmw&_hUa(q3{;=52UPEO4BsqA ztcnWwiPHxBQ8Q|(cF7{tNs&dMH5@N}6ZuFHMHtxmaE}@AU`A){CMrf$o~66OP$>fI9blc^Smtf>xBBjB0X{iGz(S zq96o~Y%d3Mi5u&Ctoq_$Faem+%-R8YdfAp zJ8aVqq|)?-@ihFErD!i1xLSx1$vhTJPT^q;`qm8MWGY%o(mEKa@FQ!k7Q-|qXvz-l zPQ_OP)dR(*oCd#fm#1|f$J|+EV)+ECb|#grH#m%i<5rIC?pJP0N|N>3LTyiR$@$J7 z_rAqVj1{Z3yzq(A`cgp&!UXkfBH=`clu!X?jOxqlXEcu8V}Ny3r>5ol6}Y|~d!+4W z6f)sZYk@lNre79Hy`0&C#xfe4t8*b1c&$|GH2H4wIGX;cv0dKB?SL`lFoE#ZXxJRayQ~c9&dB>wjXd?KX*+~F#V`5 zVRSQ2PnXKf>W2m&gb&;h9%4VqAw_t5F5NrEkKq&h1463aGL$ zUhgg=P-u=U-}-D$9DnC3ROoe;G^%Pu@{ABEqyXlrf~qd}4d2_Us9+a4d}ySftM+WZ zJ+Hxc%xuJz1^t$>;qmwY-<9!=l4rErg}n>d#D)e#W6me2kiG&uf#H_BFIe}8JY#Ek zS)pxCZ`6&<$e~S<2K0$Tzix&e{%JAmDvCurOd-MVkFs5uS2XcEUORp#EF9oGU0k3&yaiYD~rz&}5W5>qdNlC66PW3GLnq@=a42xot zWc^iQViH&HSrS*lfEMV0Kd30;vr*fv&KKm)d91s*V+2Hh|gX@sK)4CB>%mo~8qPm8&8ZzXpdQBw_!Vrgk*uCH_Oft~n%h^{v z`b~Btr2s=4-fYj#rcb3GfGZU`+9qY z>K5;BWI?T3fuh5TKH^@@tIH+&0}>2U{i-BL@B{Bxx<0m4bF#2v z7&CCp?OLLhKr9#TLO4eg>J-P-7?SQyQK+6Hw*&VM5~_RwGV-0@p}wZNWI}E4nR;(! zarM;C-{k@%>B%R1^Su|V9@eXRjJGlG+#QS73%u|S=$PB`o6H2)=VfbyOH+0E}(45-p_yFy<6z;@&29H5xSk|6@0J59#}MWg_>~=Vol;m zRB`Z6v9wkV&Q%=OQGwgLz0FN0Xs@?}?94on|0peM#keQ{E*6K3>i(=o`>id*x1>#jk;sqnM6JfJK8)U-a0*s>xN7>h|OIHos5Sfe2bkm z#_QXNW4xu*rz!Oe5eo+>=`(S6ID~Nj7|hH<-rUb!zOOh#UQ$2Y9CW^7!s$yraD>4)=Ii>o}V0X5EXL-{{T*7`%Pe!$ZKlM-Z0hBtSe zHLGLL?gP?Ccx+ygV7omtPVXs!#Q`i9etiLNBSyCL^lb2E`|&k}-Y@GI#4Wy4`}bKo zq~TH;<>IM^qy%(fW4ZyQ76X&OnKC*c>iMUJo(}ioz2bs*x50}2uT_OC!WrzCJ*JY5>yrjfNg0tsMJa^iKhxH|Q0H#h!oCoA-&b)k2*X50@D5bs{APhzK9U z80_Y+gFQcQHV&do(;=wYx`5HN=a5E&h;|&h{Ves!UYNcbP$O(=4l0EeR_6-skw649qulXkT6$oE!*hoaB@;!H>g^2t89Ge@C-cwD5KOuDGtSEgB5k|jE%VkKxp=-f1bZ!#aW)RWA&+T-=I^}{bLnj--d}(LeKNySXj!O{NwWI9RN{ndd6kpQoy;e>ZH>*iVF(fIPRR%5BKeJhre0c^*uVa1^Ap*$89F?S~l zdLY1x9gJgTTU=rR!0IvyMvCwC-g*8i)MjmTVM;*gI&D;>F$Hst?fVXIZnH zzGvtl^G7K(B^eg=UD4(A082qL%i%)Z7>RO}hNMaypIg=qsMRCtk{1e+1|-SeF0X9A zA6YD!d4{ab>gGC=tb=K)%Kzxi>hKS$>k&ht&MD?R+Y6oa682;zTYU&~>F`l2jVKL& z^&C<+)jnc_$j2eT+W?cKP@HI9AZg~-DMX81gM6fjOVAk=qY1umF5>8>L&b^{O$IRZ zfO3S_Q>SG#00*m(F2T^xLI(q)5!f#;jgCPjmGTun)O9`s6#s2xL6H(w|A=~<9a0sX6rJPxs1{17KJ`Ms{86MpQxA7Uv1*(T&jK0*C=pgm;)VEuZLKEvNEgDpgc&h;Q5*)WAR8}K!XIQM1Kiy{!WN%(I$@T4 zg^H$s)XiL>CMc2$n3z+(!#r2sg|N{hUftrhz!HX!wNVVm=PtMNWOoL+OfVK>zrB9FgOKamXimaTq%aD=mr{h1z-; ztJQP%zJWn~raz;92{Ju)-3SXA9ndZ?&xCa`<5FagVx`Hx`)Du`0|NKPV~2BPyAX!h z_PQuw85M&q=mudS;!OnJCe+j68OpTk(WPHkvRU&=zq)cu{A=JvzCr3P@Qw<6WKzjR zCRMX+b5p9h$hH&~<-f>)NAvNL?j{b+o?v>tyYa+7l4LN3&RaGn`Ra0ST_+;&*VRe; zT?m6MZe3!YX7WY!eMaCu+NvAgKi5oeP_Nxzrb_h&t zlvSXPU%pFRYW{rgC%%he;iH;Z31$fD0(uCzsNJuUH z3-^T2P4moz>P_-xK{FD}U2 z=rSPh6wj36MB9$kn1J8s@U*>_#H9z3s>D^6(|dOXVROymI>=T#=AOm=Iq-@F+UL=*u}kF?}Aw-ehyBO(K7d&`yeD~%+L8_7;*oM z<4U=pAN>k3aOXE}9}3#Ww@au+cd#-)2u!qcX}<+?Y7yXVl1ZIT=U}V&t2=eC+;$ke z@db&hq!*8)fLsuo#=Oi(`hYZ7hB-Q`!O*l`f~UndgC8eS;*ed`gnMB%8q1;)MHm?$e(UJJ2Qcs_2th{-gOs5?7 z;*ZbNVb^-%K(va$Mt3bJ_v|#$n#BOQqq6`>eXtMB8$;mF!WH1mY?{$yMTA5?Eu#6m zNAGzq#B1q23$etBuCDCgaP{!d?s?|SJfvjN0BM2!?RS_u?0FohHt9G_6d>B?veTH= z1)SvqJ`#_!aoduodF$$ct_9t-yQ>d1dW1-t(JTN2`>V6>xfZ}b%ZS#CG4%8f`@YB2 z!MAHN>@AK}_>0L?;Y@pIy@6Ot@;hBNW278MPJ#ixC62f|SsQ_Rzwk5$D~dn$TN4v6 z4?9A)VKBgz8OTU&m-2Ufn9?V4giuE@pM|`l*aNSeQo(t`DN0_990yM%iL(hkMb31R z5VFMtFmpU@by^yng=Yrvs^urWt|{FMRjcpUaR@zK{<;y{1(5a8X}F1URaSa9O9{fq z-}_QfuwI;#OF@U6r~9F^%&2$_0eHZLcKw5Ny)TpuoT%>`sOffO5S+V|iKTPDJRB-* zpj`|7I8o0>ROZC;d-Ukc7-G)t{SmNqU~ExCh3J^xo%2TR)Cj%3%VgF>k2RLP1xSsO zyJ@MJ$_I#@eR}jW&?Rm#0!~*+OQ>U;c6%ZN7v~#k$Q!N+@U~@es%O?di-TOQ?3_x_ zd`oK8`nh=!ky6(a61%eZZQ_Vjo6*2j2$9uB`Sfb$BI=tB7Ob&#ygfO-(UFey z0pp;Yvj=ilt!juACc-ixQ?}Y}F~wCPqdc-xe9aT#xAjr5f|Wt|k7Qh?uLgc{UV)Ly zWMQuE=dx1$3>M&}Boy*7I+t-inzktm5TAYrQxF1^L~z)Ohu6;Pg~0ew4o&biF*;_VEaFHk7k zAD%Z->E?ftwm71?BsgZBf#As9i-Nf&!i{}U%RwpgHs{mf`q-ORrBC?wkXF5fkWicj zXPZuRv|#GR;O3(+@)pY02}cTGObKwlz0wL^{MiT0zR%l=IgfPMQX~o{+0Kb}cU4|C z*cag@nZ&{O3#AGAwkCu4a8UuQM@roh|triMW(4pe2}43B^Yh01`vV5$cm z;@lY)7hpVi2B}0O4vK=;%+bNCOE4oesilj2C<&wvd;rJUD#}?nvT3+v?7B!s*ehCGG;N=@i(? z(f$PQ9gvz&{!5GD00GcNJE19BVm;qlD*@09D&#WS3emjC{&z;gw2ljrz0V9!jEB#k z_by9<){T(?a8xhM(Pv9Zio?4ZritH3eu_W5mw=nS4iDQ4>kd|xmo3Og`1_|_Vdds& zqRVLH^gTc`J|18L25KVmum{SVRy$loc)H4}u+3K;A+=3FyKo$!!j~S{H%W&j!8A9? z7p4t*;ljaaf2Cyu4zbzf!DV$^wZO*PCefr%jV4xFFY5f#nzRMfbk#f|Fu2t>!VO?O zUrlcu8R-X~)|L_|yuvz}TbO{D<@jVZ<#fa$=QKNO{YQz7m+3L99*$QpdPV|YQHvX> z!u{1r!vF$yyq~ICHTqvOt1E03WJxn0v6i~GL!ilnTnI?Xp?+HgZe=+AwT@}CD+dlSRn_?sR^C8@X zyxq>|hc-NY4(s^lm^nZbf#SyR2_Gu-F1y~sXKLdbH-TVSFt2=gK_n}ss%a*N4Z@&F zg@uMY>8~n?B0$0MjaYNGHg0OFbNf8u=HS@(58Am^Pi+$iw5GOZI+Z& z{Y=5WX6}Q-YBF0lNFS`^90_#S6yW&!gz+1$#e``RG_6en9BquIt$mj$sUkNnz@18i zbXQo@5$IuVlHoAye5G^i2_8Q1=KJs^4 zdc(@8c#p4Pd&5E;5#?478cG*^pdf&*4pdRXozU0miK6Rw5^E{ea7 zjmwnng}+J!nk9mAufyp_ek7U?#gY$J^6vXedO>#c5$8|u<84Hdj7O@xd*i6m^nYdm zc)~pr=2lRe+IIbvP68kaV1D~UJ3oE~YrS?9x8o6k z_+X4%4Gp9L`pMGT>Ku%d*)E!j0f7xJBv2T{RLK`x$!Je_z?s5S1t+-q}J4ws&K>iH=4_UgqrH-2=OlW8V)g9cflHuOY#}9vA+1m<5?bgEZv8esSlO@byQ6#i2FX{!Nl?D&idF ziQ@QG)#)vXe<=T83>*8asP7JoDL%WrU6;*$Fv0BLW$TAqZ8blix@J{XZT$RrKT0Wj z!b%>z5R&yHPBq$4jQJP~WZ$16kJy+5R_txk;mtR(ngAyw)nThYKihh5<8})-<<%wm ztEkE9fhRo!_sF3>GAutDI~w+Co~TykgB`;MUEC!A6pH#B#7@|5x`SVt;dr0mFF*If zXP;3FOAHw{$n?Gby#Tx0_yjMfr}k@6e6FxS{VqIydpmKHh^sq>BB@DFO)j-zYI}*D z7lj1WYwp(Z1mi@?qqh|wdbV#@GOeTr{Qp$IczN}FJRue8`^^^O6H_pyjt`oMdUBvg z9u8zC+#2W*jT!7nPB+jG2aulmd#>n)isu=+6eQ}kE8|rp!K!1rh@j&m&2`-6vzPI3$6^$haXP`w%YWNKP$YIh z@$k&}^1TLNz!RHeb}=HAK)z|`49NfruZg$tI)&s~^yPU7T2UErjys(cIBw7qT9$uW zx-kf(+YT?p&<@&n?P;=^tlYqXfHTY0LD7E%Lm+=9;iwq6b++u4X7rJU`G`${9y&sr z(cZp}+TT(id90P@JnWG?)`;zbZz~C@eZlPhRzIQKtd@sax5w-oahmmdo=-dyu=L2@ zf1|5rcPr}P&9%Kekmv4^oOJN@CPsMavcLI-!Y}QMhEd31BI3N*#$4s>hL$|)vUU2u zv!R1S>dUu}LK#-1D2N=Cf)h&c*m(iRd%dt${2hSG)e)QhN&9{VE0G9qO9bvOf~x?c z!60N=s1VFmSsj*z8ELlOiE^vjsHys_<_bxk23rfLofBnQUy5gy(2#_+1&we%`3}@@ zX5G2#z`{C7?{ooo0z6p@+kf{?0{q$KrvC(S=lQ2R#FJUQYg##KpAYp~F{%CKE8~pt zYG4i5D~wf=kOfCAbcDW*jQM3pKYLdChopVybnaDArXvC?FSydb_E7OJ{yCAgmjup@ z(hEOiW%?(XDYMeJ6FMvU57ka_wdfC^sQ-m#gr>_4Lbd?++$}k}Ax`2cm-ULA4^zb9Wn1cZG1h{W}OdYQIBhP8;A;$^cA+ z;uigAsq1dg-JBOi{n%g=G`5iVn91;|nA@B>t zCpcieC!rU8-rNV=i#xRM><`@e@z^{0!b{=<+b;ALN}T84Ipt~_LDoLM7t$-y8(!zbU46ApX6XD&jJO%~S_}A`uB^2b4 z-v)L97JDbUGxa&oMgI&K%}hvm$a=G|BF)OkUlVuFZT_lZx1pDibI8&Q^SlelF9;tz zA?ly?5I>1=^Kt&=iNm(m??ZoRWji%AWU%c()1MI=R&*DS@i;h17kNUpu1KOOcb4mqB za0EGH%xRB5VyfLMeyGH;)dbr}WoNlg+0p(q33KJtv&sjh-s^keU$R-YD$!)<=*0Xb zG?8#$7sbVdwjhD03&1A&9LPx3vrN+T!yfei3o-Ay%uR&b>*pjU0y-sa21&&sfgXP+ z2xbfFQ}tcpWU6l_y7^nV{`$S&Av$`M)^%LEX&4E9C7Bn&{tY&tU#tjMpfS{(&{i>^ zAsocUi+`YqD(y$Xm;b1kc2wrA-$~5<+L-Z)T^`(FCgAAxRgr<)_r-Y0ZiUOIByJd7 zMZobcPO#d;G66Qn1fO0Y*dizXq`q!Aa!4Fmt?2$vzwO5++rE4!^MnV^M0iKFUw}fk zlasyog8bbwHjz?Qyf=xZF8i(NzJ5=&y4#zm|9cdA(LId1@mA^dtM_t$_4Jy< zLvN%m547;z+1q#`p{ok8wO!813Koj@X>93L~C01ztxn5$oMJE)0 zSLSf}%_QDCfgsJWq96k<5Ky~60;uc#H|RK`*4e2o^FVKgQg7jTKgPpg=97O_ICyJU z4C2iIqZ8tnn_q9{(@08#4{ZcFQOMAL73ajGn6I*uw*ljnL4s|=yqzQy+M(c@yKOebT#IB;&rIrDP;C#Xj{jLL?GIs3jjau23f7e^$$wSXx zNOPp=WE$xr=+gyj$Ue6u>Gd>v7b4;@saL*pcX7p{r%QYHg3@EGKW{wU9>XF>SF4J7sAH0%0P2et2 zP<1>e&&!*T2CEdul5ZjvKaUc>9n30)$$z9l=MEAkC7X+O%{Zv~s5~C04{#lZDx_8i z=^~c7Uay;|$Sx|?^e+E-{Hs0MyX$itEE8zZ4aZuH1%0ecEuv8YEZokF02_@5K@wJo z8R{X(;F;QQm!g!SenFvYyh<$5Ut}Q!H4U`z6%P4T_I$t{PU6?y2oGWBta5osZ4?w24V&BVcA>)c;KdG!9CBih|5hg4NR zac-Menp)rMl*lS}#dT<*cO^wPcSY|}i&eIddk3s{6#{ZL_O({NC0qRvQ60%cmE$wD6_k!jL za!qtV$zP}Z(M4aK@b)Y{!HS8{4kVXP_x);xCH@%Iexmm_c)&L?SM@mth=0s*m+Y_k z0!)M|^Jyb#jfzmSU>Y3I(Zcz4j~WPqmTaEa2}2&VbXH?f-Rfo- z_1AXHoXS3vZ*o>Km#P@-?O8yx*b{43{O{rnPT#hZ0=)pxjW>0;!aPK(O(8-u%y?0F z;W4hyO@_g7oLC5LAax}_J2huR!A4Ny=~q17yLUl{SX`5Lgji+hqV~!gS1{@IAIt#0 zd}QV$bk98ZUBhFebbr=of?+tsz>C(gtE*&|SBD@x%ed_rzbGo7ZF6L%sWkmpke$b& zrvX|1N?%|FJVmT)T?nF&uj}FsT5leal~UBH@$}nEzMo;WC*et`G66aSJDgwPEM&l} z`9PHtg9C>HOn$z&D}-UMUtEVb-=#;E9doCNBBto0 z8W4?Q%*;6w{RTJ=QJk;vd1@xmEeP2cbm>Dp0*pxaXs#v`ho7~9YHFAZ-x#ct?_PQS zSf@aqQ}Kf%WcZ0$DX6ZCi0A8{Kt+#7js*q3cgsJfd%mZBnK3$uEaW9rWp+iXg74wp zw*h8*MkxcY@I>M*PXK#2~wDVaBMp41F<2{h|+g-h+m+Wxr+I~$M+fZ zfDb9xmn*{uP<+Ln^*z~uoLa)yPw!$riyS7|P=Fp7W}q0!?Puj%d6p-M`D%34uBRLu zd?Md;WsrO$-)*H+$b*7c+EL(rk_gPQeefD`jF2ZI>9BIQgDXVbu<;JZ2f)07N8JRl zt0WXC0;W=>g>Txofqm+rk_3;nc5acK%tem;dojJn513XQx;&hU+w-aJjKw4+>}>Cu zOd!YiQ-$$|mt^RW`e^q%Q5d2SLtj1mu~7`5QQBWak1I!yu14c1fT+7toX7~0*Dw*v zFZ@2LZ|1$4tKq_9t--`iFHlyZEpjNUr}haTe+Cu0W63Rr@nadM2JbKp--w&u0bQ!` z1d(wClZd(~G$1bA>4QCgM7(V#h7j~}Kz#XQ)GjaChOL&UKk%a zy3mq6;iBnRei`AtrIN~CMhicnsjU|-+alq0Oj71d&HNZ?C=EILV{x^E_hla~!2@Ii zu9uIFo`~BV3O?!iq>1Z2rXr|BxBNf_A?DbF-jnHF4*U*#XoKUmLICVbvv3d4 zAnW0oR71+gg9ln^9HLgK^z;pYTT!2hpvn2$AV0rm`0d{{*U6H8ukif{nn_L71M%AH zypk%+b@XY;J;;Ka&mzzwfGi9VLh&%?OwD+*_Bj+HB_mUvlQp;Gp`pZZ@WZdRUc^{w z=YdMEmVl#U;`ids*PO48IU+~5@}aU49fw_WI`6A5OsT(-Ccw6n z>k!tDf~iVXRB42@*vJ{t7`ac|5y33!1$Aa_>Mr#JqqyUS+a6m7;UP7xW1I~D#=J(Q= zfjd3a^{Fa{(){bLp9b|4R7oo{^MQ)34JFc6xO=Q9E-X()by!U;;D0A!XFhHtHk>=_ z<=1uJY^~1=Nm@5<-!@wDh#%je(Yw4A?;J~oUT*8kdiD4(pehVpBE9>EE*-{bxFMne zuv*2!!$&pMA$j^GUe%vpdH)T(GxYu}Uo(yMndaax+SRk6O>rR=5(q{Pd`17uQPQ21 zzNrl7C*nr_c=Acc)Rc*quTN}iKWQu~=sbny#?77k1%XA<>l+YRr9B&r)u(mVu&QZB zLhkj)#RCBOVEUTtqb!)cuN%GnKry5?vwxr}r80U5=%UcH0T|R3`v?@$qx-ojvMaVd zy#BFl*ZFZ0&d1rSpgp|dFv2WvO3bLYG_|9_!2#C?`bUR`b(W6bGJBsDAKcZ;J}9;J ziGJ|AKA@-5Q~~7cW0|>|#u2c##m^~fim6Iri`xC9R?fuTB)kWwL?*x~Pc}UrdyqoG zzt*myZ5F*XjMQOr^obM}_ip7Si7?(gMNPSTI{TPgbTa#U9mze4f9zFN!vMwW=poDp z)D)6tMvs-Lsb3Y^(VX-;0L7(2*c70ydFxP+TPyOeo#?t;^JlhnEGu)U5iV{MQz+jH zx2ciZ@V|whjWQUsgZ7ch{V81oNo0ki-gl88L;NYPP#X`%U*wtx`;dPe_nsoNbXp^#lgZT;CR0P zVW>drp%)(d{$f+pOm>?im*laNtzBy&3LbIY(F2094@~wo^%11RR{`~;%J27Z*^CIv z{h4%~Y9_=@V-rM~rYt4ef9G#Lyi)nyP!k3o&>@N`{2>0TF}a7rlQ?i|7TIJoL-uZr zUPEoMnyy4aUym67Dr<_1HVMtAstVkY@ou*T{eLnr;Xmx|an2OScng#nhB)dXdGiqC@lhUt*MOb@XxW1&9Wge2_`i!^MsC38R}A`%I|PoQy{R?`BJp<||B+ z=dFoggx|cd7@E2~rocCCNC=ObyAWQc^%71u*mE@;jai=Y&D*x;lw3}7p3mo==?Owq z#f6(rn}#Zm$5!}@N)yo47_w)8lehJs%-!K*x4*XcXP-VnR8i^UGpV2d4eXJ8dU`A( z7L2{O{E|K`y~{4)GBw(=G9LNlZpO?`MG!_Qfcf8LnHPj++y>{GS!yhGM4O6{5iRPA z!7^?HZ3SCqK|%Xuc>x+dO&AM6OvgTX1HKlaH*t7l==c|JVfL?OF0utZb1z~@BE4mf zR%NH`LFLl%$;O$9rx8s`s@|YI@vWYkp8X7CS+c7c)UMC?tz7uP%_Dif;9`x+&LZt6 z?a?24iRO?qLwA3e9x2Xv(dzGpsL)hzsXLx4pNU{3)h*T!&l}jO=Ubzz$P7XMZX{nJ zdKrE56J{fD*MaqOKH(iB_pN7#GxY+6b}*9G;BR^i&k)v+Ju_3Df3HRP%h18w8el5< z(U)5n9@tNOZ6vbS57tuaG#s&qd`^C!wuW9TY*jLIR%Lu;Ka6oB{?vz&R#m?mta)hC zd_dP67GsGh*lvIHvBCcF{X)V^ZIi_lZ4K#XnOYElK8ANmk4j3OnQWBV8r>3+UT6^GXiBe_F(j^ zG2->}$iO?t<5n!}oK^kn^4RW>x8A^Bb{GX5{oE8>-&+g7xjdWhBMh2#wUeu(&INu;Q04{alu1=2a(^FE_VOj4zvmh3C>;Y9|td zo!QUAHl*a&8NR}JVoGTb|3DNt6$&rjqD+f#pb1Z=K^~pF{ZJ{Iw84A+N)v>$5cSu`WJ7#&Si!wRfDO{>Sht^AP8w(C@XEgAkDM zG(s}fY1Pp+zHvxIN9Q2slC(?_fcoxI#3)YCuZUOrN6>Q_ddjz+2D za>ZEDT%2xbq?$!-VRp_$IhW55ykjzPoJQbOsFa(eyege(8&;Z@zb#(m(?#Q zL*)0vp_+ik+P7F))%}B3S+FP$48=*g&0n1V%qPIDoX_$?#Bt?Ld@^#CC7%_}l7ITO zm_)eKHYa>Ry=!&_>*uJV0nlPO%+%DR??52)u zKD#GKq9%4#A~2#HZ^f=;idF2U&+?m#Wue^ec27VLX;P*fmj~a~Lk=x1RF@1i>Z*1~ zBezEhC5-S_i+1AGKD*y+paYSsQys#71{PjkDp`Fb&xR7{4Zs=KQJzuuG-k8yVwIq} zmz%K5-tP~1@i_mq5KvJ=&=fZ5-w;OxV?8a1b-Dxy85_3!}yB-q4nI~xy|=vTH2 z<3ryoT5oS0FOTtiFpE26iiM?E|NFl4!dPXprS?45XY-Ny;2rsf2LEacdziYQf!T;( zgmPxdfb|8g580XXioJtpzvg$&11LV2%~$-l)`9}_L~Zhotn4=9J7B5Xw3!LVRKS7x z@Jp|!<)^IUtreB?<%&v+gEIvn0>^LvzW8kXr(YTC&VI@4Z*5RBG<0`0ib+z{Gu2?t zB_O4js<5wg;Ue1Hh`)O_ZLNXpNYBuH15}KE7i+H)l%{VO3tabJVvc%Wh7ONS7=YP>ubC~s&2=YwsYK$4-cReglo&F(bar_UfAk6J zB(+8pYiIYuG`hPa`moU?2=nIX=M-BQucQesm9xVKXuax%i=IcOSk+BJl}1b{5ZzZp zxUZtTgngM+a)B!kh9-}XQAe~=|7%E}EIBJ-B;;A43>t%t9N!10`O!B_dR`4@(pdRMSxf&RW{K8S2&a8e5{cT+8A_2X`MxDLJcrOf}?#}DR?8u=@JHK&1rbrVs0a^TDL_DZ#uPV{# z{PPfuX%FouSoOKGvPcTz-9m01K53LZ@=n)S$%u=_ne>qzOoAwbZtEuV;K9OmZ{P3^ zG|*iLcj&Lyc%mhM{i2=t=whcQ`Qm+-!(9H&tis0m&Ep=;bcks52WmQyw+6zS2yc~~ z+BazUAW{&zLFU8g(#BHvbKvNCK$q}&q~rJlso}m&`fnn!aPr^0CaCcPRzMfE&^HP% zrpp~FtNwu=N-ToN%D0$khS1*GpmWKGP(`?kf!Ih3$Cv^gKyx!8LCN29>|W!)+yy?J z8lbp~+KKeqhcs$%Yp_1UN6SN~O>JfYs18V~IM_T~HEJ0T4DGLl@c+FT5f<}leSF+$ zcJBGG`Z#&-`fFP&F zQ)gUJ*3_Bp_IQ>~6gwsE?K$}N*MjQkJ>$M6%o9_9@u$BLpATE+?BexkW_0w`&ne1& zf>X{FI@&#%r&d_2AIdO#Dij5_9My=yl;U!dVoTtvfOUw&`V zSQII5Ir%y-25Oz%ZCjFRxco~!K)>4P|F^NIm5gNaf*M?;A1T8RoSyNWkp*qapK<{% z2E9-XlMl`nW$Szlj5dJ|pF%yN}$(qvJ{ zprkJq{ck?|bu$4G_ZwH8dHiR9xu!)TGzG{oO=RpM=c+^lOFRC#G&Dx= zS?A`8DLHOeTu*RT9>{&cmE9M&x0dVBZ)d5diYa4N0E^zhGegHRsQTdQ@#xQ!U(@;= z=*3=#<|b)Gx%`|`pljlSjlaAgC3UR~SC1_6i+W~$AUKQb&`U(#izj5ZxZ%Gv8Q4Um zriK^;$n?tp<>h^5YMSt&oi!K1QD#cvI1VVew&n)NuEDdi&^JojZg5bG9{w*E1>e2j z-1+AtDQf(0gPk6&Hkx+ta>YAPkzLw%Yj*~+jLd?`0- zH=k0cPO;1C3cn*}lcRM5g~eRt(-S(w5(%S>+%Sd0#T2pdW)QhEjug7!afz9*Qg#IF zV;r*y(0(qK@n6-CsF1!IyD%=ayCv>AY846-Tqu)3?3s(H(Pc_*o4MgR?3RXo7Ck=m z)f4hx^ve)dG}NqEwe%BnJ$o!lA`m6f&djd$+Rd%9WupgeJ^qg#C2wypY7ET5+GX)ZH*NwrC?O#NS zqtC+H=A=(s=DuD;12?XIlq$<#B1+z`F(85hG1O9 z)TFCHnO{sm^(1M6B>K98;o!D)czwqFnkrld#ie6VbAkKDkN=Xa_F58BL>756LOYr1 zu=w!i7W7t#Oy@n^6Z5GTXTH=ryKp7j+n~XrA#seJ*OgUp&X==|ITsq@}i~z zCnNC2)_t`In6oK*Sz-J+>>Fdxezn=n5znqR#uaaj(SMW5ywv_$v^Rz~OjX)kqJTDp zg8KrpSpibsX{ZmFsuuiiR6YM^Tz7XI1zVOQ7^Z+6xX!4B#N2ofxK;R5)Dr*Y^e>dg zQG>V^8~x8d#}`QPljNBiBjl{IL;;q^H*ZyIi*ltmmEr2wgkwyT=N;igJTl6t%9&IB zJF6x8=r%XERv+2c{FIVED?7DEvOpah`DuDw3&#=M#)Q13{t-ESGtyX{-FLpJV5VV2 zRt$x^E;wC$t@9+%3v5qZ4HB8kooc_@0HuO!vbq350mWbco`^30O~kIQyu)UF^`Zk_ zanb{-X6*d@AJe@?F~98RNRC^+CrQLUph%Qlpwh~d4X=}ey+v#@3W@*XbSV3qYJ`5s z%>+?2o$uAsUj{|!=z(o9>Hkd_ElgmIxVMeOlxz$^SG+zG%xY7{i0}rrLR9RlnR;~J zaJ-s@o&92J9x~W{O-D#b0GZjot$rg|pLnyYnXI&f?p0`)>5eC#AI`f}gl(aoNKWN8$Ixga{5L(Fgv9m# zHnIQ-nKflkqx(P5uOC5~q;VQN;>w?xdMbZHdi(C&6ACVTeR-k%H@!o@I*L9X*$O<_ z%Box(bncVlQ_a4;YxfYWQ8Tl|$M7;n3yj%ZpU%J86tHA{xV2A)d0qhN{i8_%lrZTy zA~l9@?%xeiEH+*KrCYqzl{52xqY&~~tf!*VWDnA`|BUArerIScQ1m)lur?&*M+a9? zE)+4xKz(8i(0Jgm=&$OX%#mV|4tJ72?l5yJnlTtAazTM2liKlPt>nWMs2Y`C@Q`TSHno*D%bG`}wfcch=8+28ecyP)ueyaccO;WAnwFEH z>plC3RIGi<7@?>S=E1SLOs^(MICS03&TSas=YFw2FhElMXMp_bcc`@Xh0gj=ti-R3 zWF{vdI;&b(j?noG%P`b{7xn@TOb~s^SG4^4X@y^5=QB&DR>8FrHjDb;CN6POo z#9VmT)?$c8{cQzD4ZWoy@{}6Rw|5FksECX){tnd#p7__00D@NVK{E%dO z<`sT&;$muVWN>-;?eIgP)=jV;ZmDw}j_G`WUe-@YAV1_&tM6P+E9KSANnk81=YO{k zpwlGa`)a)p4+Jw&aP4HSM5$OV{;S0dssg#TLlH2we^utJEUYv(6lE2Z3_;tr{LN2K zUsf(7s;orIUfi=+3`Ple1#Yr%zye~zFJ96g7!-K%`sm>vCK8n5Qrz*@g)7N7MmEd4 zlqxXZ&f|m*QMnij`E{LpbfP3HycymqV^e#v-)`Y;BMhIu&-re{Kwy&U7SZ61lf+2< zH}mckWe$`pkJG9@X3s0Of8{9?#fv(Y+O_I(*r^v}v8*dTtMX%vf zi{)9SMNLbHmU-*=*;CyCd`a*v{Dxiv%wc@^*wuL*Y0{6EaX&v~j}2wM@oqfZQ|$vI zqM@y&^a9c}$n@n89bshpsWEPEy$@-XynO3Lea2Ps{{tqhn92)mDeM1J!DzW>rPCM$ zRaD>A&oBF}s->mEFX?X|uLmdwYzv>9S}8yx^#aETL<}EcP`ziCIIj5) zJF-aiA9E^5&fF1bDnTzfRYn*5OD!e?(tGHA<1E!%Nw{HVP^<(nLw86*(?>sIy7oEO zA^K*B6BxVl!fTQE17n+T|E2R^5(bWc_n8k2h9UAyLL$@=vS^r{J#=9{;~{#PU`W3A zyD|u~YPB<8L^W^w$(;52`yPY3q84ZER?e~$H!iyxzbdI^;>t?C!72rf>HPvsq4kkP zpF`56dp&mNOJhL&vA^d|Q6m9TSSq#Ls%s3Ss$yM3xOt4~OnAZOE><`!N?=FA5=StT zM8mEy=3OlSEEpx`%}*6pm`sc{j#U-z{ro-c3nejhCV+}R@!{`ZJIw{adawpUSy|{i zG!x<9c`T&TT8%J{32ihKPCztksfkmY{+#gkXRpqzu5(QR`9~Fr0NG9bSspXo*d5N>$sHivTu%Tm8&S}j^o^`LBUvdF$JaP z6`+r@>qq1+au0R_XY;PZ|9!CB@vCUOVRon@1;tZW^y0a8RLICdz{9j^L8}a_8yZlx zk+IN*@j3<99G&I=J|WydTCF)n&oi?#&fF^%tBA5ZZfjfYV#=SWRb}~c1%BI>JOJxzbdnQ&neI6&G*%y zpF50~9sz2|c$19Gs}Q&r+>I^L9h_y|_{-?ntV{nq|5kTDr#@IYqzYu+41cdVii@FN zjqs8>9VmbS&}@ZsRZi;F4!O%av7B0Om7h~el67M5^?XGl+TTqE?E>0rFGWnuUSJZJ z1kot7Co!tHDN0AR>#F<3mL+M_tR)$d9rQ&vu*dV-+0k;>8&i6MWGA`LYfR`PRUx5J z2M`-|YG_UO#|Pj4HG8L+C9#C9k1vR0JBi=K>IieH@6rOOt<^o>&;-hj^&wVi=nw2 zYnv_2hz9ptL&^ZX8z^MRER%I{TcEuR;f@JHt`3^u4SsGbLU}Q24Pt^%_9EYD7h?;r z!xgOJFRywl9Ji`Kf&luujtcs=q@@ydc{mIBB@Bx{yp@;$;C>S2BLWTx@BvQDgoVDW z)qP)^!_AltT3{)%hVMIeYao!~{CA!K)R$=TgV@U7WB`8rTR|*5-&7)iV`vBP7Qg<=w4I%o!0XX>2v6?Z{u~;6X4(a z2^nN8gByM(^YiJ3CRRy{7?c3pCKOL@*PnQ?brby#Yf}CWK z{%&63;E)r+Kc)L`*2qYiUvAAn^6qH48`ong(aTwS*I>vO8BEVG-ZI$p^WgA{F6lcL z3LO+Z4YLw%>$dyA$CEHmy`XARrHr@#D0Iqa$`F=cV7>u^LvS{1SAyK!K4d z`Q@Te0^P-bqj+FX|E6!4S+{0qr%)$wGvP%dCRGB0-iRhCwj(;8>2Q^m{3~bQE&28z z*GbCMNjqud&c9pV&VYxXUNy=i+J#rHqWRC!w21TSqT% z{GHq`ilB1~ucC4<7A29&6@2IEt2Hw(aO=(=^`DS~J5-S>A~KV%sUS+Kc=RWh(v?za z;9!6(*W%2LL34s-5o!7*-TEj0^jX>11UtmcUv=={Q5V5vXhNUT#@jmY9{|}lpl)o; zvo~+eQ@8)(%lOy0L)(Uv`?4e}8*W@*ZN$B|mH!6a9*u^c1!5SC3zV)TM4%5;vydXW z3r8l)k~!7pjxLFon7?VedF2o-aR!{>?cYU!i>f1J{y^DbzEtJA&VW?fo( zudi?>fRpa{sXnHSsVrNACkx^+JF*vLF!CY_;nB|u2Pcjz6uo0V) zOAN!)QJNtQ8LTcy1l zhABNFaj$;Fm6~cSk^xueb7aVHOQE6)Zk_Xv{w_z_#BjvL0 zT_PdmKd1+y^9#MXa^&3k79TG3^FAV%RNPE%vaW%vk``89(O)Hg`09M!m-z3fLn1t1 z60DB%?MICZ66G-ZmNk2uF9RY@I)~h)TNmh^e`E(2LsLI_Oc2;6()Q-{hCX~%#06~~ zD)ko^fNnuN5K8J&Cd?hFZqa^vDbjoL5cLBQiLeTK%qD{qF{_fRx4pge3bGL*A?Se` zM+qZI0a_EGO<3k4JtW|0VZ#$v)PIis+PPv0KbgYR92NGVyI&}TcVSJtJ>#Z z#*&~3F7f}(nJ8nY(u$N+w{ZUiz+EIs3PL8y*cCOn;MNaIfVWTB54F*9F2wA?mGcDV z{lt7gUjFVQMyZ%aSj^I(Fa~op3K!l?P%{bKu?x7{9YFD8QJ8k^V*x}9o%$yqE>m30 z1UDInpyPn-3DMDi%~`pY^;sIjGaHSvXVC}4)yJnwYo;bs+C)UW+FZ}B%;e#-++8Q9 zciK)R-0@NZy-2N5oQ^!;E3P-*dlYDH^64&xq~iJ;uOujfG29I2x=V|`b_K+RWFgi( z2hcGWPwrd4AD)!Zgs%z;ZWVvK5v0coZb-&*d?oWZ9MmD%Q$L1__aaT0aQTJUC%ee^ ztv!Y~_ey{${xHUwb|c;Ua~2*uM}5;)1>nOh%RKs+uJ5Z+Ob zlX>_UpF@au=0kLFh0{^^JS@@CuK-E_cz=!9ZZ$~uPe8}BSj`AXC(?gdsDAsoJH=~z zesHac@=uX$k!RztquEawe=%}99M-$F8Z-+roo#&~j|W)2)~)V6{*a>IA$3Ekc~}cm zD`5EKy$&v&u+3!^4=;X->#O=;qj{CdIYlv}nzGyD(3kqr!2q7wk|W&x@2v_@519~k z3{Ap>$0Op<85K!cz%cOlhkpEB6HsBwXGVXD0*HqIVu6Ki&$4HftLJKW6>F@t^oH8Y zL0rOV|Lt(`gqS21We@cB-ar0oxhMma!veKu^YR!8F#g@6t5XG%Op>Xkzy11*yTsR_ z!8eU0G(FY?)S(Ne@F-zpkwp`fI>$g)A!~gdnK)5%hWO(oAt(EJ&=mm?U#(2sE`5iF zxg7t!00IK(K7O9X32BG+$N}LSxZFbvZ44i)j6oqR zCZK4VLNRky!Irb)B3UuK?JbPS=+!G7Akb)OrrQ;D$--6$7Xu|Bm;93QQN{)iD>O)(v3w|gEWv@58q-szkV2~>sh5(@WVFU1hec{y;D)Nz579uXaz#@i$f`gp;k0>0e6{s8Ew=wR z?ggFow|PF6-*}sL^#6asYY^wT^aKODlsP#(SIxJbn#{DeyMBAmUuS{;_1)Xq4glTd zkn(e##NI0Y55T*IzE;h(*>_!ob%yNk_$Bl1F+$Q`gX=7&DUwSW_SEJVR2*^mGxame zEvukK z)K>9Nux847m6EvN^2-I^{8G=_x6HJk^#`mXLdB$`Fv6U*qf?RpJFCPuE#v>2CM4CL z`E#%-`M567h}eHVJ?cjz1VfJgog7m4k&BmyH#q+P1mIFM_YQjp;EDeX-R7(n@%F3= zz;XK1YwPyBzrW;1@z($5h1K9Rp%WJ;mhAAJv9M5YvvK`?tIzIRAwG2NJFdZMz}fwu z-vE;HHnapW2tTUt*zgQo#we^RnCuwOAiKl!fMC$A-+m9nm_T0Y*e8-;!1D2bNY8!2 zWQpwp2Y_M@Uk+|%cpv4#81bjS>*MVtlZW5HO~{USA_*sem72GqRN-yV+zEq=IdC{L zc>+^L_P_mW?c~5g&`}g|=O^$ywPs*Vzn^_OH^{^Tml|9D-cE{HbTjntpV$0`pV==m zoCA8c;X)9@yJz8w$GDT8bUze*yhp-bXfgM84v3zoT@v-WZibrCe|~&lyhB$(s$=FX zCx0%Wc@N^4fmccZ0mu=+UL}|WCvVW9K_GAdOoHrender('docs.html.twig'); + } + /** * @Route("/api/{name}.json", name="app_api_docs_json") */ diff --git a/symfony.lock b/symfony.lock index 0704968..a2954bc 100644 --- a/symfony.lock +++ b/symfony.lock @@ -90,6 +90,9 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "doctrine/sql-formatter": { + "version": "1.1.1" + }, "guzzlehttp/guzzle": { "version": "6.5.2" }, @@ -175,6 +178,9 @@ "symfony/dependency-injection": { "version": "v5.0.1" }, + "symfony/deprecation-contracts": { + "version": "v2.2.0" + }, "symfony/doctrine-bridge": { "version": "v5.0.1" }, @@ -231,6 +237,9 @@ "src/Kernel.php" ] }, + "symfony/http-client-contracts": { + "version": "v2.3.1" + }, "symfony/http-foundation": { "version": "v5.0.1" }, @@ -259,15 +268,24 @@ "tests/.gitignore" ] }, + "symfony/polyfill-intl-grapheme": { + "version": "v1.20.0" + }, "symfony/polyfill-intl-idn": { "version": "v1.13.1" }, + "symfony/polyfill-intl-normalizer": { + "version": "v1.20.0" + }, "symfony/polyfill-mbstring": { "version": "v1.13.1" }, "symfony/polyfill-php73": { "version": "v1.13.1" }, + "symfony/polyfill-php80": { + "version": "v1.20.0" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -291,6 +309,32 @@ "symfony/stopwatch": { "version": "v5.0.1" }, + "symfony/string": { + "version": "v5.1.7" + }, + "symfony/translation-contracts": { + "version": "v2.3.0" + }, + "symfony/twig-bridge": { + "version": "v5.1.7" + }, + "symfony/twig-bundle": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" + }, + "files": [ + "config/packages/test/twig.yaml", + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + }, + "symfony/twig-pack": { + "version": "v1.0.2" + }, "symfony/var-dumper": { "version": "v5.0.1" }, @@ -300,6 +344,12 @@ "symfony/yaml": { "version": "v5.0.1" }, + "twig/extra-bundle": { + "version": "v3.1.0" + }, + "twig/twig": { + "version": "v3.1.0" + }, "webimpress/safe-writer": { "version": "2.0.0" }, diff --git a/templates/docs.html.twig b/templates/docs.html.twig new file mode 100644 index 0000000..7addae3 --- /dev/null +++ b/templates/docs.html.twig @@ -0,0 +1,36 @@ + + + + + + API Documentation | TLE API + + +
+ + + + + + + + From d7203fc6c3edefbb1321a601c21c0f6b99018888 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 16:55:27 +0100 Subject: [PATCH 039/221] add coverage badge --- config/bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/bootstrap.php b/config/bootstrap.php index d40335e..452a4fb 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -19,7 +19,7 @@ } } elseif (class_exists(Dotenv::class)) { // load all the .env files - (new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env'); + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); } else { throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); } From c7a996cfec7305b447f36135d96bb1f8f1f492aa Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 17:06:29 +0100 Subject: [PATCH 040/221] no message --- src/Controller/ApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index d8e47c1..b42abf8 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/", name="app_api_docs") + * @Route("/api/tle/docs", name="app_api_docs") */ public function docs(): Response { From 8cd09654381d30862321dac2f77462bf2ce76ce5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:38:37 +0100 Subject: [PATCH 041/221] composer install --- composer.lock | 12 ++++++------ symfony.lock | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 5e152cc..28f2c63 100644 --- a/composer.lock +++ b/composer.lock @@ -81,16 +81,16 @@ }, { "name": "doctrine/annotations", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5" + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/88fb6fb1dae011de24dd6b632811c1ff5c2928f5", - "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", "shasum": "" }, "require": { @@ -150,9 +150,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.0" + "source": "https://github.com/doctrine/annotations/tree/1.11.1" }, - "time": "2020-10-17T22:05:33+00:00" + "time": "2020-10-26T10:28:16+00:00" }, { "name": "doctrine/cache", diff --git a/symfony.lock b/symfony.lock index a2954bc..54a84ad 100644 --- a/symfony.lock +++ b/symfony.lock @@ -102,9 +102,21 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "ivanstan/tle-php": { + "version": "1.0" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, + "laminas/laminas-code": { + "version": "3.4.1" + }, + "laminas/laminas-eventmanager": { + "version": "3.3.0" + }, + "laminas/laminas-zendframework-bridge": { + "version": "1.1.1" + }, "myclabs/php-enum": { "version": "1.7.2" }, @@ -135,6 +147,9 @@ "ralouphie/getallheaders": { "version": "3.0.3" }, + "roave/security-advisories": { + "version": "dev-master" + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From ef057ac65de2af1c7342445df49078b20d4a7dd3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:43:10 +0100 Subject: [PATCH 042/221] no message --- composer.json | 21 +- composer.lock | 1107 ++++++++++++------------------------------------- 2 files changed, 269 insertions(+), 859 deletions(-) diff --git a/composer.json b/composer.json index c6b4974..fadc745 100644 --- a/composer.json +++ b/composer.json @@ -9,23 +9,22 @@ "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.1.*", - "symfony/browser-kit": "5.1.*", - "symfony/console": "5.1.*", - "symfony/dotenv": "5.1.*", + "symfony/asset": "5.0.*", + "symfony/browser-kit": "5.0.*", + "symfony/console": "5.0.*", + "symfony/dotenv": "5.0.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.1.*", + "symfony/framework-bundle": "5.0.*", "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.1.*", - "symfony/twig-bundle": "5.1.*", - "symfony/yaml": "5.1.*", + "symfony/serializer": "5.0.*", + "symfony/twig-bundle": "5.0.*", + "symfony/yaml": "5.0.*", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, "require-dev": { - "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.1" + "symfony/phpunit-bridge": "^5.0" }, "config": { "preferred-install": { @@ -74,7 +73,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.1.*" + "require": "5.0.*" } } } diff --git a/composer.lock b/composer.lock index 28f2c63..6cc702f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bf6c5c44873f54ab888176739539d99b", + "content-hash": "6fe69db5c92e38f91a659fedc9bd30c6", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2408,23 +2408,22 @@ }, { "name": "symfony/asset", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb" + "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/ef0bcafce1c14bbf49838b01e990a8bfafd071eb", - "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb", + "url": "https://api.github.com/repos/symfony/asset/zipball/aaf4ba865c02f6df999166a0148d56f2b11b11fb", + "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb", "shasum": "" }, "require": { "php": ">=7.2.5" }, "require-dev": { - "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2434,7 +2433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2462,7 +2461,7 @@ "description": "Symfony Asset Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.1.7" + "source": "https://github.com/symfony/asset/tree/5.0" }, "funding": [ { @@ -2478,20 +2477,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-30T20:12:43+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "8944cc83bb18f83f577225c695d999044e7c62b0" + "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8944cc83bb18f83f577225c695d999044e7c62b0", - "reference": "8944cc83bb18f83f577225c695d999044e7c62b0", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c46b676a993cc437bafe6fe0f30f074857cde2a6", + "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6", "shasum": "" }, "require": { @@ -2510,7 +2509,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2538,7 +2537,7 @@ "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.1.7" + "source": "https://github.com/symfony/browser-kit/tree/v5.0.11" }, "funding": [ { @@ -2554,20 +2553,20 @@ "type": "tidelift" } ], - "time": "2020-10-02T08:49:02+00:00" + "time": "2020-06-12T09:22:24+00:00" }, { "name": "symfony/cache", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd" + "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", - "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", + "url": "https://api.github.com/repos/symfony/cache/zipball/5da40a385c8182d18f4cca960bce7191c8f24e07", + "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07", "shasum": "" }, "require": { @@ -2575,7 +2574,6 @@ "psr/cache": "~1.0", "psr/log": "~1.0", "symfony/cache-contracts": "^1.1.7|^2", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -2603,7 +2601,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2635,7 +2633,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.1.7" + "source": "https://github.com/symfony/cache/tree/v5.0.11" }, "funding": [ { @@ -2651,7 +2649,7 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:02:37+00:00" + "time": "2020-07-23T17:20:42+00:00" }, { "name": "symfony/cache-contracts", @@ -2734,24 +2732,22 @@ }, { "name": "symfony/config", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191" + "reference": "2306321ef6a21a0de51a139774b6b7b38804815b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ad8be6e1280f6734150d8a04a9160dd34ceb191", - "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191", + "url": "https://api.github.com/repos/symfony/config/zipball/2306321ef6a21a0de51a139774b6b7b38804815b", + "reference": "2306321ef6a21a0de51a139774b6b7b38804815b", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/finder": "<4.4" @@ -2769,7 +2765,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2797,7 +2793,7 @@ "description": "Symfony Config Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.1.7" + "source": "https://github.com/symfony/config/tree/v5.0.11" }, "funding": [ { @@ -2813,20 +2809,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-07-15T10:53:08+00:00" }, { "name": "symfony/console", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8" + "reference": "95794074741645473221fb126d5cb4057ad25bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", - "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", + "url": "https://api.github.com/repos/symfony/console/zipball/95794074741645473221fb126d5cb4057ad25bf1", + "reference": "95794074741645473221fb126d5cb4057ad25bf1", "shasum": "" }, "require": { @@ -2834,12 +2830,10 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2865,7 +2859,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2893,7 +2887,7 @@ "description": "Symfony Console Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v5.1.7" + "source": "https://github.com/symfony/console/tree/v5.0.11" }, "funding": [ { @@ -2909,31 +2903,29 @@ "type": "tidelift" } ], - "time": "2020-10-07T15:23:00+00:00" + "time": "2020-07-06T13:22:03+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b" + "reference": "9263d52372205c57823bf983bc4f413378830757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2dea4a3ef2eb79138354c1d49e9372cc921af20b", - "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9263d52372205c57823bf983bc4f413378830757", + "reference": "9263d52372205c57823bf983bc4f413378830757", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.1", + "symfony/config": "<5.0", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2943,7 +2935,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.1", + "symfony/config": "^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2957,7 +2949,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2985,7 +2977,7 @@ "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.1.7" + "source": "https://github.com/symfony/dependency-injection/tree/5.0" }, "funding": [ { @@ -3001,87 +2993,20 @@ "type": "tidelift" } ], - "time": "2020-10-01T12:14:45+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583" + "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b7369a435a64d06e9036e69ed1cd6ce240338583", - "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e2ab3fe26133c5d997684f1b961acbd6b04e2805", + "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805", "shasum": "" }, "require": { @@ -3090,13 +3015,12 @@ "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5.1", + "symfony/form": "<5", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", @@ -3110,15 +3034,13 @@ "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "~2.4|^3.0", + "doctrine/dbal": "~2.4", "doctrine/orm": "^2.6.3", "doctrine/reflection": "~1.0", - "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", - "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.1.3", + "symfony/form": "^5.0", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -3141,7 +3063,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3169,7 +3091,7 @@ "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.1.7" + "source": "https://github.com/symfony/doctrine-bridge/tree/5.0" }, "funding": [ { @@ -3185,27 +3107,26 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:14:57+00:00" + "time": "2020-07-23T16:54:02+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" + "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bbc756c0895d08a1e69a59d8541a647b47f5a732", + "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "masterminds/html5": "<2.6" @@ -3220,7 +3141,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3248,7 +3169,7 @@ "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.1.7" + "source": "https://github.com/symfony/dom-crawler/tree/5.0" }, "funding": [ { @@ -3264,25 +3185,24 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/dotenv", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "f406eaad1231415bf753fbef5aef267a787af4e5" + "reference": "efd887f012127acad22325d109fe8ddf635f1f97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/f406eaad1231415bf753fbef5aef267a787af4e5", - "reference": "f406eaad1231415bf753fbef5aef267a787af4e5", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/efd887f012127acad22325d109fe8ddf635f1f97", + "reference": "efd887f012127acad22325d109fe8ddf635f1f97", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "php": ">=7.2.5" }, "require-dev": { "symfony/process": "^4.4|^5.0" @@ -3290,7 +3210,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3323,7 +3243,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/5.1" + "source": "https://github.com/symfony/dotenv/tree/5.0" }, "funding": [ { @@ -3339,20 +3259,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-28T08:20:26+00:00" }, { "name": "symfony/error-handler", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9" + "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/5e4d8ef8d71822922d1eebd130219ae3491a5ca9", - "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d01fba9a55614a1addb0d52d6a9566560b2a2af8", + "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8", "shasum": "" }, "require": { @@ -3362,14 +3282,13 @@ "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3397,7 +3316,7 @@ "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.1.7" + "source": "https://github.com/symfony/error-handler/tree/5.0" }, "funding": [ { @@ -3413,27 +3332,25 @@ "type": "tidelift" } ], - "time": "2020-10-02T08:49:02+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f" + "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d5de97d6af175a9e8131c546db054ca32842dd0f", - "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", + "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/event-dispatcher-contracts": "^2" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -3446,7 +3363,6 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -3459,7 +3375,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3487,7 +3403,7 @@ "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.1.7" + "source": "https://github.com/symfony/event-dispatcher/tree/5.0" }, "funding": [ { @@ -3503,7 +3419,7 @@ "type": "tidelift" } ], - "time": "2020-09-18T14:27:32+00:00" + "time": "2020-06-18T18:18:56+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3586,16 +3502,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae" + "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/1a8697545a8d87b9f2f6b1d32414199cc5e20aae", - "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", + "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", "shasum": "" }, "require": { @@ -3605,7 +3521,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3633,7 +3549,7 @@ "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.1.7" + "source": "https://github.com/symfony/filesystem/tree/v5.0.9" }, "funding": [ { @@ -3649,20 +3565,20 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:02:37+00:00" + "time": "2020-05-30T20:12:43+00:00" }, { "name": "symfony/finder", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" + "reference": "127bccabf3c854625af9c0162779cf06bc1dd352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "url": "https://api.github.com/repos/symfony/finder/zipball/127bccabf3c854625af9c0162779cf06bc1dd352", + "reference": "127bccabf3c854625af9c0162779cf06bc1dd352", "shasum": "" }, "require": { @@ -3671,7 +3587,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3699,7 +3615,7 @@ "description": "Symfony Finder Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.1.7" + "source": "https://github.com/symfony/finder/tree/5.0" }, "funding": [ { @@ -3715,7 +3631,7 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/flex", @@ -3786,16 +3702,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "023ca658526278c0e74542079f1984e042aa6c1d" + "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/023ca658526278c0e74542079f1984e042aa6c1d", - "reference": "023ca658526278c0e74542079f1984e042aa6c1d", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0fc0a93f8bbe465d0b483e21b087d432baa92c16", + "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16", "shasum": "" }, "require": { @@ -3803,27 +3719,25 @@ "php": ">=7.2.5", "symfony/cache": "^4.4|^5.0", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.1", + "symfony/dependency-injection": "^5.0.1", "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^5.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/routing": "^5.1" + "symfony/routing": "^5.0" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.0", "phpdocumentor/type-resolver": "<0.2.1", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.1", + "symfony/asset": "<4.4", "symfony/browser-kit": "<4.4", "symfony/console": "<4.4", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", + "symfony/dotenv": "<4.4", "symfony/form": "<4.4", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", @@ -3845,12 +3759,12 @@ "doctrine/cache": "~1.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^5.1", + "symfony/asset": "^4.4|^5.0", "symfony/browser-kit": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^5.1", + "symfony/dotenv": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", @@ -3861,12 +3775,11 @@ "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", - "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "^5.0", + "symfony/string": "~5.0.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", "symfony/validator": "^4.4|^5.0", @@ -3888,7 +3801,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3916,7 +3829,7 @@ "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.1.7" + "source": "https://github.com/symfony/framework-bundle/tree/v5.0.11" }, "funding": [ { @@ -3932,120 +3845,35 @@ "type": "tidelift" } ], - "time": "2020-09-30T05:27:28+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-version": "2.3", - "branch-alias": { - "dev-main": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b" + "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/353b42e7b4fd1c898aab09a059466c9cea74039b", - "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", + "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "symfony/expression-language": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4073,7 +3901,7 @@ "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.1.7" + "source": "https://github.com/symfony/http-foundation/tree/v5.0.11" }, "funding": [ { @@ -4089,29 +3917,27 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:14:57+00:00" + "time": "2020-07-23T10:04:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708" + "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1764b87d2f10d5c9ce6e4850fe27934116d89708", - "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", + "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "~1.0", - "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", @@ -4162,7 +3988,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4190,7 +4016,7 @@ "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.1.7" + "source": "https://github.com/symfony/http-kernel/tree/v5.0.11" }, "funding": [ { @@ -4206,38 +4032,70 @@ "type": "tidelift" } ], - "time": "2020-10-04T07:57:28+00:00" + "time": "2020-07-24T04:14:59+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.2.0", + "name": "symfony/mime", + "version": "v5.0.11", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" + "url": "https://github.com/symfony/mime.git", + "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", + "url": "https://api.github.com/repos/symfony/mime/zipball/aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", + "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "*", - "doctrine/common": "^2", - "doctrine/doctrine-bundle": "^2", - "doctrine/doctrine-migrations-bundle": "^2", - "doctrine/orm": "^2" + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Doctrine ORM", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "support": { - "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" + "source": "https://github.com/symfony/mime/tree/5.0" }, "funding": [ { @@ -4253,72 +4111,38 @@ "type": "tidelift" } ], - "time": "2020-08-31T10:20:18+00:00" + "time": "2020-07-23T10:04:24+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.20.0", + "name": "symfony/orm-pack", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" + "url": "https://github.com/symfony/orm-pack.git", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] + "composer/package-versions-deprecated": "*", + "doctrine/common": "^2", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2" }, + "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "A pack for the Doctrine ORM", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" }, "funding": [ { @@ -4334,7 +4158,7 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2020-08-31T10:20:18+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4751,22 +4575,20 @@ }, { "name": "symfony/routing", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf" + "reference": "1369ee6823074c406815b65a40d47fd5ee48e517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/720348c2ae011f8c56964c0fc3e992840cb60ccf", - "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf", + "url": "https://api.github.com/repos/symfony/routing/zipball/1369ee6823074c406815b65a40d47fd5ee48e517", + "reference": "1369ee6823074c406815b65a40d47fd5ee48e517", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "php": ">=7.2.5" }, "conflict": { "symfony/config": "<5.0", @@ -4792,7 +4614,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4826,7 +4648,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.1.7" + "source": "https://github.com/symfony/routing/tree/v5.0.11" }, "funding": [ { @@ -4842,26 +4664,25 @@ "type": "tidelift" } ], - "time": "2020-10-02T13:05:43+00:00" + "time": "2020-06-18T18:18:56+00:00" }, { "name": "symfony/serializer", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952" + "reference": "825b66f545da95e9bb1626d5655be6693376d52a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/6b673b802dabd2bcf7cab05d04d2d8ef8891b952", - "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952", + "url": "https://api.github.com/repos/symfony/serializer/zipball/825b66f545da95e9bb1626d5655be6693376d52a", + "reference": "825b66f545da95e9bb1626d5655be6693376d52a", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", @@ -4898,7 +4719,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4926,7 +4747,7 @@ "description": "Symfony Serializer Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.1.7" + "source": "https://github.com/symfony/serializer/tree/5.0" }, "funding": [ { @@ -4942,7 +4763,7 @@ "type": "tidelift" } ], - "time": "2020-10-03T13:58:17+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/service-contracts", @@ -5025,16 +4846,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fbc3084469450c6f6616f5436a00e180ea9ff118", + "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118", "shasum": "" }, "require": { @@ -5044,7 +4865,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5072,95 +4893,7 @@ "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.1.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/string", - "version": "v5.1.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", - "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony String component", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.1.7" + "source": "https://github.com/symfony/stopwatch/tree/5.0" }, "funding": [ { @@ -5176,7 +4909,7 @@ "type": "tidelift" } ], - "time": "2020-09-15T12:23:47+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/translation-contracts", @@ -5258,27 +4991,26 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1" + "reference": "293e5f04eee4da963686beab20960b45e4db68ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ad3c3e89353749dcead9ee25388177ebbb4569a1", - "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/293e5f04eee4da963686beab20960b45e4db68ad", + "reference": "293e5f04eee4da963686beab20960b45e4db68ad", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15", "symfony/translation-contracts": "^1.1|^2", "twig/twig": "^2.10|^3.0" }, "conflict": { "symfony/console": "<4.4", - "symfony/form": "<5.1", + "symfony/form": "<5.0", "symfony/http-foundation": "<4.4", "symfony/http-kernel": "<4.4", "symfony/translation": "<5.0", @@ -5291,7 +5023,7 @@ "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.1", + "symfony/form": "^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", @@ -5329,7 +5061,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5357,7 +5089,7 @@ "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/5.1" + "source": "https://github.com/symfony/twig-bridge/tree/5.0" }, "funding": [ { @@ -5373,20 +5105,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-06-30T17:59:45+00:00" }, { "name": "symfony/twig-bundle", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1" + "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8898ef8aea8fa48638e15ce00c7c6318ce570ce1", - "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/348863cd784b10ea7e1485dc3003c738c6cdf547", + "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547", "shasum": "" }, "require": { @@ -5421,7 +5153,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5449,7 +5181,7 @@ "description": "Symfony TwigBundle", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.1.7" + "source": "https://github.com/symfony/twig-bundle/tree/v5.0.9" }, "funding": [ { @@ -5465,20 +5197,20 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:43:50+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" + "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/36d19dbb4b377273dddb820adcdf0cc9dcf57731", + "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731", "shasum": "" }, "require": { @@ -5507,7 +5239,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5542,7 +5274,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.1.7" + "source": "https://github.com/symfony/var-dumper/tree/5.0" }, "funding": [ { @@ -5558,25 +5290,24 @@ "type": "tidelift" } ], - "time": "2020-09-18T14:27:32+00:00" + "time": "2020-06-24T13:36:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" + "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b87e3aeedb74ee2694932d04153df9d804954cc3", + "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "php": ">=7.2.5" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" @@ -5584,7 +5315,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5620,7 +5351,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/5.1" + "source": "https://github.com/symfony/var-exporter/tree/5.0" }, "funding": [ { @@ -5636,25 +5367,24 @@ "type": "tidelift" } ], - "time": "2020-09-08T14:19:54+00:00" + "time": "2020-06-07T15:38:39+00:00" }, { "name": "symfony/yaml", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" + "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/29b60e88ff11a45b708115004fdeacab1ee3dd5d", + "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5666,13 +5396,10 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5700,7 +5427,7 @@ "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.1.7" + "source": "https://github.com/symfony/yaml/tree/5.0" }, "funding": [ { @@ -5716,7 +5443,7 @@ "type": "tidelift" } ], - "time": "2020-09-27T03:44:28+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "twig/extra-bundle", @@ -6094,320 +5821,6 @@ ], "time": "2020-09-01T07:06:14+00:00" }, - { - "name": "roave/security-advisories", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "327370943772f9917bc2dc2aa4263db2d572a112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/327370943772f9917bc2dc2aa4263db2d572a112", - "reference": "327370943772f9917bc2dc2aa4263db2d572a112", - "shasum": "" - }, - "conflict": { - "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<1.0.1", - "amphp/http-client": ">=4,<4.4", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", - "aws/aws-sdk-php": ">=3,<3.2.1", - "bagisto/bagisto": "<0.1.5", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": ">=4,<=4.3.6", - "bolt/bolt": "<3.7.1", - "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", - "contao/listing-bundle": ">=4,<4.4.8", - "datadog/dd-trace": ">=0.30,<0.30.2", - "david-garcia/phpwhois": "<=4.3.1", - "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<11.0.4", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", - "drupal/drupal": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", - "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", - "erusev/parsedown": "<1.7.2", - "ezsystems/demobundle": ">=5.4,<5.4.6.1", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", - "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", - "ezyang/htmlpurifier": "<4.1.1", - "firebase/php-jwt": "<2", - "fooman/tcpdf": "<6.2.22", - "fossar/tcpdf-parser": "<6.2.22", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", - "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", - "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", - "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<=2.2", - "gregwar/rst": "<1.0.3", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/session": "<1.3.1", - "jsmitty12/phpwhois": "<5.1", - "kazist/phpwhois": "<=4.2.6", - "kitodo/presentation": "<3.1.2", - "kreait/firebase-php": ">=3.2,<3.8.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", - "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", - "livewire/livewire": ">2.2.4,<2.2.6", - "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", - "magento/magento1ce": "<1.9.4.3", - "magento/magento1ee": ">=1,<1.14.4.3", - "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", - "marcwillmann/turn": "<0.3.3", - "mediawiki/core": ">=1.31,<1.31.4|>=1.32,<1.32.4|>=1.33,<1.33.1", - "mittwald/typo3_forum": "<1.2.1", - "monolog/monolog": ">=1.8,<1.12", - "namshi/jose": "<2.2", - "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", - "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nystudio107/craft-seomatic": "<3.3", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": ">=1.0.319,<1.0.467", - "october/cms": ">=1.0.319,<1.0.466", - "october/october": ">=1.0.319,<1.0.466", - "october/rain": ">=1.0.319,<1.0.468", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.6|>=20,<20.0.2", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": ">=0,<3", - "paragonie/random_compat": "<2", - "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.4", - "personnummer/personnummer": "<3.0.2", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", - "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.2", - "phpoffice/phpexcel": "<1.8.2", - "phpoffice/phpspreadsheet": "<1.8", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.3", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/contactform": ">1.0.1,<4.3", - "prestashop/gamification": "<2.3.2", - "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", - "propel/propel": ">=2-alpha.1,<=2-alpha.7", - "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", - "pusher/pusher-php-server": "<2.2.1", - "rainlab/debugbar-plugin": "<3.1", - "robrichards/xmlseclibs": "<3.0.4", - "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.1", - "shopware/platform": "<=6.3.1", - "shopware/shopware": "<5.3.7", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", - "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", - "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", - "silverstripe/subsites": ">=2,<2.1.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplito/elliptic-php": "<1.0.6", - "slim/slim": "<2.6", - "smarty/smarty": "<3.1.33", - "socalnick/scn-social-auth": "<1.15.2", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", - "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", - "swiftmailer/swiftmailer": ">=4,<5.4.5", - "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", - "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", - "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", - "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", - "t3g/svg-sanitizer": "<1.0.3", - "tecnickcom/tcpdf": "<6.2.22", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1-beta.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "titon/framework": ">=0,<9.9.99", - "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "typo3fluid/fluid": ">=2,<2.0.5|>=2.1,<2.1.4|>=2.2,<2.2.1|>=2.3,<2.3.5|>=2.4,<2.4.1|>=2.5,<2.5.5|>=2.6,<2.6.1", - "ua-parser/uap-php": "<3.8", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "wallabag/tcpdf": "<6.2.22", - "willdurand/js-translation-bundle": "<2.1.1", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.38", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<2.0.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yourls/yourls": "<1.7.4", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" - }, - { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" - } - ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", - "type": "tidelift" - } - ], - "time": "2020-10-19T07:02:45+00:00" - }, { "name": "symfony/phpunit-bridge", "version": "v5.1.7", @@ -6496,9 +5909,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "roave/security-advisories": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From d3d306926d1505e3e832a0f99fdf78b12f30d23e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:44:36 +0100 Subject: [PATCH 043/221] no message --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index fadc745..f06f81d 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ }, "config": { "preferred-install": { - "*": "dist" + "*": "auto" }, "sort-packages": true, "optimize-autoloader": true From 7797934b5cfcbf02b24c5d3750cb2bd7bf94addf Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:46:35 +0100 Subject: [PATCH 044/221] no message --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f06f81d..2022977 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "symfony/dotenv": "5.0.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.0.*", - "symfony/orm-pack": "^1.0", + "symfony/orm-pack": "^1.1", "symfony/serializer": "5.0.*", "symfony/twig-bundle": "5.0.*", "symfony/yaml": "5.0.*", diff --git a/composer.lock b/composer.lock index 6cc702f..3842608 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6fe69db5c92e38f91a659fedc9bd30c6", + "content-hash": "4a238766474d3b61207b60a7715b673b", "packages": [ { "name": "composer/package-versions-deprecated", From 7336542269b4164951d96eecd97f3b647a3dd516 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 12:42:46 +0100 Subject: [PATCH 045/221] add coverage badge --- deploy.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/deploy.php b/deploy.php index 0b65a08..7bf727f 100644 --- a/deploy.php +++ b/deploy.php @@ -10,6 +10,7 @@ set('http_user', 'glutenfr'); set('writable_mode', 'chmod'); set('default_stage', 'production'); +set('bin/composer', '~/bin/composer.phar'); add('shared_files', ['.env']); add('shared_dirs', ['var']); add('writable_dirs', []); @@ -39,16 +40,16 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', +// 'deploy:vendors', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'dump-autoload', 'deploy:writable', - 'database:migrate', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', ]); -before('deploy', 'test'); +//before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); From dcaabed22f6227d32a5387c1f31cdbe011b494f6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 09:37:22 +0100 Subject: [PATCH 046/221] add coverage badge --- .../{ApiController.php => DocsController.php} | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) rename src/Controller/{ApiController.php => DocsController.php} (91%) diff --git a/src/Controller/ApiController.php b/src/Controller/DocsController.php similarity index 91% rename from src/Controller/ApiController.php rename to src/Controller/DocsController.php index b42abf8..81780a9 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/DocsController.php @@ -1,34 +1,35 @@ -render('docs.html.twig'); - } - - /** - * @Route("/api/{name}.json", name="app_api_docs_json") - */ - public function getJson(string $name): JsonResponse - { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); - } -} +render('docs.html.twig'); + } + + /** + * @Route("/api/{name}.json", name="app_api_docs_json") + */ + public function getJson(string $name): JsonResponse + { + $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + + $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + + return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + } +} From a4c1910e534fb110431481a92930472e7bd69150 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 09:42:10 +0100 Subject: [PATCH 047/221] add coverage badge --- deploy.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/deploy.php b/deploy.php index 7bf727f..cf2b70e 100644 --- a/deploy.php +++ b/deploy.php @@ -15,7 +15,7 @@ add('shared_dirs', ['var']); add('writable_dirs', []); -host('data.ivanstanojevic.me') +host('ivanstanojevic.me') ->user('glutenfr') ->port(2233) ->stage('production') @@ -40,12 +40,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'dump-autoload', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', -// 'database:migrate', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 0137d02a72a4e9f6aa1371c586a66a6fc38b010d Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 10:11:30 +0100 Subject: [PATCH 048/221] update ivanstan/tle-php --- composer.lock | 15 ++++++++------- src/Command/ImportTleCommand.php | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 3842608..bf11778 100644 --- a/composer.lock +++ b/composer.lock @@ -1697,22 +1697,23 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33" + "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/5bd7487aa242248ad255b041f5fe99a8f5daca33", - "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/15c7e46644237df8c5997a6d7875b0f2b9a62cd1", + "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5", - "myclabs/php-enum": "^1.7" + "myclabs/php-enum": "^1.7", + "php": "^7.4" }, "require-dev": { "phpunit/phpunit": "^8" @@ -1736,9 +1737,9 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0" + "source": "https://github.com/ivanstan/tle-php/tree/1.0.1" }, - "time": "2020-01-08T10:08:36+00:00" + "time": "2020-12-09T09:04:57+00:00" }, { "name": "laminas/laminas-code", diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 4c5a1fc..1f241c6 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -7,7 +7,7 @@ use App\Service\Traits\FileSystemAwareTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; -use Ivanstan\Tle\TleFile; +use Ivanstan\Tle\Model\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; From 270a7fb2db4e2d6ac0755954545359999e152524 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 15:59:30 +0100 Subject: [PATCH 049/221] upgrade --- composer.lock | 299 ++++++++++++++++--------------- deploy.php | 47 ++--- src/Command/ImportTleCommand.php | 23 ++- 3 files changed, 199 insertions(+), 170 deletions(-) diff --git a/composer.lock b/composer.lock index bf11778..6d2b426 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "composer/package-versions-deprecated", - "version": "1.11.99", + "version": "1.11.99.1", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855" + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", - "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", "shasum": "" }, "require": { @@ -61,7 +61,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/master" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" }, "funding": [ { @@ -77,7 +77,7 @@ "type": "tidelift" } ], - "time": "2020-08-25T05:50:16+00:00" + "time": "2020-11-11T10:22:58+00:00" }, { "name": "doctrine/annotations", @@ -426,16 +426,16 @@ }, { "name": "doctrine/dbal", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646" + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6d37b4c42aaa3c3ee175f05eca68056f4185646", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", "shasum": "" }, "require": { @@ -517,7 +517,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.12.0" + "source": "https://github.com/doctrine/dbal/tree/2.12.1" }, "funding": [ { @@ -533,20 +533,20 @@ "type": "tidelift" } ], - "time": "2020-10-22T17:26:24+00:00" + "time": "2020-11-14T20:26:58+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.1.2", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17" + "reference": "044d33eeffdb236d5013b6b4af99f87519e10751" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f5153089993e1230f5d8acbd8e126014d5a63e17", - "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/044d33eeffdb236d5013b6b4af99f87519e10751", + "reference": "044d33eeffdb236d5013b6b4af99f87519e10751", "shasum": "" }, "require": { @@ -567,10 +567,10 @@ "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", "ocramius/proxy-manager": "^2.1", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", @@ -578,7 +578,7 @@ "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12" + "twig/twig": "^1.34|^2.12|^3.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -587,7 +587,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { @@ -627,7 +627,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.1.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.2" }, "funding": [ { @@ -643,20 +643,20 @@ "type": "tidelift" } ], - "time": "2020-08-25T10:57:15+00:00" + "time": "2020-12-05T15:07:10+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d" + "reference": "955077b68c377310cf9538fc982be11d36ab75d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5efa29df768abaafe29b34e73dac68efbedcaa4d", - "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/955077b68c377310cf9538fc982be11d36ab75d4", + "reference": "955077b68c377310cf9538fc982be11d36ab75d4", "shasum": "" }, "require": { @@ -713,7 +713,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.0" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.1" }, "funding": [ { @@ -729,7 +729,7 @@ "type": "tidelift" } ], - "time": "2020-06-25T19:36:08+00:00" + "time": "2020-11-11T09:59:06+00:00" }, { "name": "doctrine/event-manager", @@ -923,36 +923,31 @@ }, { "name": "doctrine/instantiator", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -966,7 +961,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -977,7 +972,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.3.x" + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" }, "funding": [ { @@ -993,7 +988,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T17:27:14+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "doctrine/lexer", @@ -1077,24 +1072,24 @@ }, { "name": "doctrine/migrations", - "version": "2.2.1", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" + "reference": "af915024d41669600354efe78664ee86dfca62e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/af915024d41669600354efe78664ee86dfca62e1", + "reference": "af915024d41669600354efe78664ee86dfca62e1", "shasum": "" }, "require": { + "composer/package-versions-deprecated": "^1.8", "doctrine/dbal": "^2.9", - "ocramius/package-versions": "^1.3", "ocramius/proxy-manager": "^2.0.2", "php": "^7.1", - "symfony/console": "^3.4||^4.0||^5.0", + "symfony/console": "^3.4||^4.4.16||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { @@ -1107,7 +1102,7 @@ "phpstan/phpstan-deprecation-rules": "^0.10", "phpstan/phpstan-phpunit": "^0.10", "phpstan/phpstan-strict-rules": "^0.10", - "phpunit/phpunit": "^7.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" }, @@ -1157,27 +1152,41 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.2.x" + "source": "https://github.com/doctrine/migrations/tree/2.3.1" }, - "time": "2019-12-04T06:09:14+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2020-12-05T19:13:58+00:00" }, { "name": "doctrine/orm", - "version": "2.7.4", + "version": "2.7.5", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f" + "reference": "01187c9260cd085529ddd1273665217cae659640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/7d84a4998091ece4d645253ac65de9f879eeed2f", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f", + "url": "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640", + "reference": "01187c9260cd085529ddd1273665217cae659640", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.8", + "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", "doctrine/common": "^2.11 || ^3.0", @@ -1192,9 +1201,9 @@ "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^6.0", "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^8.0", "symfony/yaml": "^3.4|^4.0|^5.0", "vimeo/psalm": "^3.11" }, @@ -1249,9 +1258,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.7.4" + "source": "https://github.com/doctrine/orm/tree/2.7.5" }, - "time": "2020-10-10T17:11:26+00:00" + "time": "2020-12-03T08:52:14+00:00" }, { "name": "doctrine/persistence", @@ -1357,32 +1366,32 @@ }, { "name": "doctrine/reflection", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/fa587178be682efe90d005e3a322590d6ebb59a5", + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^6.0 || ^8.2.0", "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0", - "phpstan/phpstan-phpunit": "^0.11.0", - "phpunit/phpunit": "^7.0" + "phpstan/phpstan": "^0.11.0 || ^0.12.20", + "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { @@ -1433,9 +1442,10 @@ ], "support": { "issues": "https://github.com/doctrine/reflection/issues", - "source": "https://github.com/doctrine/reflection/tree/1.2.x" + "source": "https://github.com/doctrine/reflection/tree/1.2.2" }, - "time": "2020-03-27T11:06:43+00:00" + "abandoned": "roave/better-reflection", + "time": "2020-10-27T21:46:55+00:00" }, { "name": "doctrine/sql-formatter", @@ -1743,48 +1753,41 @@ }, { "name": "laminas/laminas-code", - "version": "3.4.1", + "version": "3.5.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" + "reference": "b549b70c0bb6e935d497f84f750c82653326ac77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/b549b70c0bb6e935d497f84f750c82653326ac77", + "reference": "b549b70c0bb6e935d497f84f750c82653326ac77", "shasum": "" }, "require": { - "laminas/laminas-eventmanager": "^2.6 || ^3.0", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.1" + "laminas/laminas-eventmanager": "^3.3", + "laminas/laminas-zendframework-bridge": "^1.1", + "php": "^7.3 || ~8.0.0" }, "conflict": { "phpspec/prophecy": "<1.9.0" }, "replace": { - "zendframework/zend-code": "self.version" + "zendframework/zend-code": "^3.4.1" }, "require-dev": { - "doctrine/annotations": "^1.7", + "doctrine/annotations": "^1.10.4", "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0", - "laminas/laminas-stdlib": "^2.7 || ^3.0", - "phpunit/phpunit": "^7.5.16 || ^8.4" + "laminas/laminas-coding-standard": "^1.0.0", + "laminas/laminas-stdlib": "^3.3.0", + "phpunit/phpunit": "^9.4.2" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, "autoload": { "psr-4": { "Laminas\\Code\\": "src/" @@ -1808,7 +1811,13 @@ "rss": "https://github.com/laminas/laminas-code/releases.atom", "source": "https://github.com/laminas/laminas-code" }, - "time": "2019-12-31T16:28:24+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-11-30T20:16:31+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -1944,16 +1953,16 @@ }, { "name": "myclabs/php-enum", - "version": "1.7.6", + "version": "1.7.7", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c" + "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c", - "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", + "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", "shasum": "" }, "require": { @@ -1988,22 +1997,32 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/master" + "source": "https://github.com/myclabs/php-enum/tree/1.7.7" }, - "time": "2020-02-14T08:15:52+00:00" + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2020-11-14T18:14:52+00:00" }, { "name": "ocramius/proxy-manager", - "version": "2.9.1", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "7452942d38ae36223b0f8408619181f69799eb5c" + "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/7452942d38ae36223b0f8408619181f69799eb5c", - "reference": "7452942d38ae36223b0f8408619181f69799eb5c", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", + "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", "shasum": "" }, "require": { @@ -2068,7 +2087,7 @@ ], "support": { "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.9.1" + "source": "https://github.com/Ocramius/ProxyManager/tree/2.10.0" }, "funding": [ { @@ -2080,7 +2099,7 @@ "type": "tidelift" } ], - "time": "2020-08-26T16:19:12+00:00" + "time": "2020-11-12T17:04:46+00:00" }, { "name": "psr/cache", @@ -3636,16 +3655,16 @@ }, { "name": "symfony/flex", - "version": "v1.9.10", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "7335ec033995aa34133e621627333368f260b626" + "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/7335ec033995aa34133e621627333368f260b626", - "reference": "7335ec033995aa34133e621627333368f260b626", + "url": "https://api.github.com/repos/symfony/flex/zipball/ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", + "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", "shasum": "" }, "require": { @@ -3655,6 +3674,7 @@ "require-dev": { "composer/composer": "^1.0.2|^2.0", "symfony/dotenv": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", "symfony/phpunit-bridge": "^4.4|^5.0", "symfony/process": "^3.4|^4.4|^5.0" }, @@ -3683,7 +3703,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.9.10" + "source": "https://github.com/symfony/flex/tree/v1.11.0" }, "funding": [ { @@ -3699,7 +3719,7 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:41:54+00:00" + "time": "2020-12-03T10:57:35+00:00" }, { "name": "symfony/framework-bundle", @@ -5448,7 +5468,7 @@ }, { "name": "twig/extra-bundle", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", @@ -5504,7 +5524,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.1" }, "funding": [ { @@ -5520,16 +5540,16 @@ }, { "name": "twig/twig", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7" + "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9a29e1fa7b5431969f96878b8662e3fcb18601b7", - "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/b02fa41f3783a2616eccef7b92fbc2343ffed737", + "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737", "shasum": "" }, "require": { @@ -5580,7 +5600,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.1.0" + "source": "https://github.com/twigphp/Twig/tree/v3.1.1" }, "funding": [ { @@ -5592,7 +5612,7 @@ "type": "tidelift" } ], - "time": "2020-10-21T12:45:34+00:00" + "time": "2020-10-27T19:28:23+00:00" }, { "name": "webimpress/safe-writer", @@ -5738,23 +5758,23 @@ }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98" + "reference": "870189619a7770f468ffb0b80925302e065a3b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/a2179f447425d9e784fb9bc224e533a0ab083b98", - "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", + "reference": "870189619a7770f468ffb0b80925302e065a3b34", "shasum": "" }, "require": { "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.6.0", - "doctrine/persistence": "^1.3|^2.0", + "doctrine/persistence": "^1.3.7|^2.0", "php": "^7.1 || ^8.0", "symfony/config": "^3.4|^4.3|^5.0", "symfony/console": "^3.4|^4.3|^5.0", @@ -5764,15 +5784,10 @@ }, "require-dev": { "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4 || ^9.2", + "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\FixturesBundle\\": "" @@ -5804,7 +5819,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.3.x" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" }, "funding": [ { @@ -5820,20 +5835,20 @@ "type": "tidelift" } ], - "time": "2020-09-01T07:06:14+00:00" + "time": "2020-11-14T09:36:49+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.1.7", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d" + "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/150aeb91dd9dafe13ec8416abd62e435330ca12d", - "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/92a76ca5e64effd41ce111b8f476144dfa29f1f0", + "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0", "shasum": "" }, "require": { @@ -5843,7 +5858,8 @@ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -5853,9 +5869,6 @@ ], "type": "symfony-bridge", "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - }, "thanks": { "name": "phpunit/phpunit", "url": "https://github.com/sebastianbergmann/phpunit" @@ -5889,7 +5902,7 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.1.7" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.0" }, "funding": [ { @@ -5905,7 +5918,7 @@ "type": "tidelift" } ], - "time": "2020-10-02T12:57:56+00:00" + "time": "2020-11-27T00:39:34+00:00" } ], "aliases": [], diff --git a/deploy.php b/deploy.php index cf2b70e..4a9663a 100644 --- a/deploy.php +++ b/deploy.php @@ -13,7 +13,7 @@ set('bin/composer', '~/bin/composer.phar'); add('shared_files', ['.env']); add('shared_dirs', ['var']); -add('writable_dirs', []); +add('writable_dirs', ['var']); host('ivanstanojevic.me') ->user('glutenfr') @@ -27,29 +27,32 @@ }); task('dump-autoload', function () { - run('composer dump-env prod'); + run('{{bin/composer}} dump-env prod'); }); -task('deploy', [ - 'deploy:info', - 'deploy:prepare', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:clear_paths', - 'deploy:create_cache_dir', - 'deploy:shared', - 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', - 'deploy:writable', - 'database:migrate', - 'deploy:symlink', - 'deploy:unlock', - 'cleanup', -]); +task( + 'deploy', + [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', + ] +); //before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 1f241c6..c573872 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -24,7 +24,6 @@ final class ImportTleCommand extends Command private EntityManagerInterface $em; private TleRepository $repository; - private OutputInterface $output; private array $satellites = []; @@ -44,7 +43,6 @@ protected function configure(): void /** @noinspection PhpMissingParentCallCommonInspection */ protected function execute(InputInterface $input, OutputInterface $output): int { - $this->output = $output; $this->satellites = $this->repository->fetchAllIndexed(); $totalInsert = 0; @@ -72,7 +70,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($file->parse() as $tle) { if (\array_key_exists($tle->getId(), $this->satellites)) { - $update[$tle->getId()] = $tle; + $existing = new \Ivanstan\Tle\Model\Tle( + $this->satellites[$tle->getId()]->getLine1(), + $this->satellites[$tle->getId()]->getLine2(), + $this->satellites[$tle->getId()]->getName(), + ); + + if ($tle->getDate() > $existing->getDate()) { + $update[$tle->getId()] = $tle; + } } else { $insert[$tle->getId()] = $tle; } @@ -127,11 +133,18 @@ protected function toPersistent(TleModel $model): Tle protected function flush(array $queue, $persistNew = null): void { $counter = 0; + /** @var TleModel $model */ foreach ($queue as $model) { - $tle = $this->toPersistent($model); - $this->satellites[$model->getId()] = $tle; + /** @var Tle $existing */ + $existing = $this->satellites[$model->getId()]; + $existing->setName($model->getName()); + $existing->setId($model->getId()); + $existing->setLine1($model->getLine1()); + $existing->setLine2($model->getLine2()); if ($persistNew) { + $tle = $this->toPersistent($model); + $this->satellites[$model->getId()] = $tle; $this->em->persist($tle); } From 11cfe1cd6bd3420d8a6f5122e6bec1962b9f10bb Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 18 Dec 2020 09:30:02 +0100 Subject: [PATCH 050/221] fix bug with guzzle --- composer.json | 2 +- composer.lock | 804 +++++++++++++----------------- deploy.php | 10 +- src/Command/ImportTleCommand.php | 34 +- src/Controller/DocsController.php | 70 +-- symfony.lock | 6 - 6 files changed, 419 insertions(+), 507 deletions(-) diff --git a/composer.json b/composer.json index 2022977..e6fca39 100644 --- a/composer.json +++ b/composer.json @@ -73,7 +73,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.0.*" + "require": "5.2.*" } } } diff --git a/composer.lock b/composer.lock index 6d2b426..b996145 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4a238766474d3b61207b60a7715b673b", + "content-hash": "623796bd13aa29d141dca80c543db4c9", "packages": [ { "name": "composer/package-versions-deprecated", @@ -325,43 +325,31 @@ }, { "name": "doctrine/common", - "version": "2.13.3", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" + "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", - "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", + "url": "https://api.github.com/repos/doctrine/common/zipball/9f3e3f3cc5399604c0325d5ffa92609d694d950d", + "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/inflector": "^1.0", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.3.3", - "doctrine/reflection": "^1.0", + "doctrine/persistence": "^2.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", + "doctrine/coding-standard": "^6.0 || ^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", "symfony/phpunit-bridge": "^4.0.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common" @@ -397,7 +385,7 @@ "email": "ocramius@gmail.com" } ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", "homepage": "https://www.doctrine-project.org/projects/common.html", "keywords": [ "common", @@ -406,7 +394,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/2.13.x" + "source": "https://github.com/doctrine/common/tree/3.1.0" }, "funding": [ { @@ -422,7 +410,7 @@ "type": "tidelift" } ], - "time": "2020-06-05T16:46:05+00:00" + "time": "2020-12-03T21:02:31+00:00" }, { "name": "doctrine/dbal", @@ -827,16 +815,16 @@ }, { "name": "doctrine/inflector", - "version": "1.4.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "shasum": "" }, "require": { @@ -857,7 +845,6 @@ }, "autoload": { "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, @@ -903,7 +890,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/1.4.x" + "source": "https://github.com/doctrine/inflector/tree/2.0.x" }, "funding": [ { @@ -919,7 +906,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T07:19:59+00:00" + "time": "2020-05-29T15:13:26+00:00" }, { "name": "doctrine/instantiator", @@ -1172,16 +1159,16 @@ }, { "name": "doctrine/orm", - "version": "2.7.5", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "01187c9260cd085529ddd1273665217cae659640" + "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640", - "reference": "01187c9260cd085529ddd1273665217cae659640", + "url": "https://api.github.com/repos/doctrine/orm/zipball/242cf1a33df1b8bc5e1b86c3ebd01db07851c833", + "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833", "shasum": "" }, "require": { @@ -1189,23 +1176,23 @@ "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^2.11 || ^3.0", - "doctrine/dbal": "^2.9.3", + "doctrine/common": "^3.0", + "doctrine/dbal": "^2.10.0", "doctrine/event-manager": "^1.1", - "doctrine/inflector": "^1.0", + "doctrine/inflector": "^1.4|^2.0", "doctrine/instantiator": "^1.3", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.3.3 || ^2.0", + "doctrine/persistence": "^2.0", "ext-pdo": "*", - "php": "^7.1", + "php": "^7.2|^8.0", "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^8.0", + "phpunit/phpunit": "^8.5|^9.4", "symfony/yaml": "^3.4|^4.0|^5.0", - "vimeo/psalm": "^3.11" + "vimeo/psalm": "4.1.1" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -1258,22 +1245,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.7.5" + "source": "https://github.com/doctrine/orm/tree/2.8.1" }, - "time": "2020-12-03T08:52:14+00:00" + "time": "2020-12-04T19:53:07+00:00" }, { "name": "doctrine/persistence", - "version": "1.3.8", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288" + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288", - "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", "shasum": "" }, "require": { @@ -1281,24 +1268,20 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.2", "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.10@dev" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/common": "^3.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", "vimeo/psalm": "^3.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common", @@ -1346,106 +1329,9 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/1.3.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", - "type": "tidelift" - } - ], - "time": "2020-06-20T12:56:16+00:00" - }, - { - "name": "doctrine/reflection", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/reflection.git", - "reference": "fa587178be682efe90d005e3a322590d6ebb59a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/fa587178be682efe90d005e3a322590d6ebb59a5", - "reference": "fa587178be682efe90d005e3a322590d6ebb59a5", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0 || ^8.2.0", - "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0 || ^0.12.20", - "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } + "source": "https://github.com/doctrine/persistence/tree/2.1.0" }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", - "homepage": "https://www.doctrine-project.org/projects/reflection.html", - "keywords": [ - "reflection", - "static" - ], - "support": { - "issues": "https://github.com/doctrine/reflection/issues", - "source": "https://github.com/doctrine/reflection/tree/1.2.2" - }, - "abandoned": "roave/better-reflection", - "time": "2020-10-27T21:46:55+00:00" + "time": "2020-10-24T22:13:54+00:00" }, { "name": "doctrine/sql-formatter", @@ -2577,28 +2463,29 @@ }, { "name": "symfony/cache", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07" + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5da40a385c8182d18f4cca960bce7191c8f24e07", - "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07", + "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/cache": "~1.0", - "psr/log": "~1.0", + "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, "conflict": { - "doctrine/dbal": "<2.5", + "doctrine/dbal": "<2.10", "symfony/dependency-injection": "<4.4", "symfony/http-kernel": "<4.4", "symfony/var-dumper": "<4.4" @@ -2611,19 +2498,17 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.5|^3.0", + "doctrine/dbal": "^2.10|^3.0", "predis/predis": "^1.1", "psr/simple-cache": "^1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/var-dumper": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" @@ -2653,7 +2538,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.0.11" + "source": "https://github.com/symfony/cache/tree/v5.2.0" }, "funding": [ { @@ -2669,7 +2554,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T17:20:42+00:00" + "time": "2020-11-21T09:39:55+00:00" }, { "name": "symfony/cache-contracts", @@ -2752,22 +2637,24 @@ }, { "name": "symfony/config", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "2306321ef6a21a0de51a139774b6b7b38804815b" + "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2306321ef6a21a0de51a139774b6b7b38804815b", - "reference": "2306321ef6a21a0de51a139774b6b7b38804815b", + "url": "https://api.github.com/repos/symfony/config/zipball/fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", + "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/finder": "<4.4" @@ -2783,11 +2670,6 @@ "symfony/yaml": "To use the yaml reference dumper" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" @@ -2813,7 +2695,7 @@ "description": "Symfony Config Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.0.11" + "source": "https://github.com/symfony/config/tree/v5.2.0" }, "funding": [ { @@ -2829,7 +2711,7 @@ "type": "tidelift" } ], - "time": "2020-07-15T10:53:08+00:00" + "time": "2020-11-16T18:02:40+00:00" }, { "name": "symfony/console", @@ -2927,25 +2809,27 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "9263d52372205c57823bf983bc4f413378830757" + "reference": "98cec9b9f410a4832e239949a41d47182862c3a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9263d52372205c57823bf983bc4f413378830757", - "reference": "9263d52372205c57823bf983bc4f413378830757", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98cec9b9f410a4832e239949a41d47182862c3a4", + "reference": "98cec9b9f410a4832e239949a41d47182862c3a4", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.0", + "symfony/config": "<5.1", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2955,7 +2839,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.0", + "symfony/config": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2967,11 +2851,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" @@ -2997,7 +2876,7 @@ "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/5.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.0" }, "funding": [ { @@ -3013,40 +2892,109 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-11-28T11:24:18+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805" + "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e2ab3fe26133c5d997684f1b961acbd6b04e2805", - "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b3ea1749ef47c3d2ad6018d05837758bae91f5cf", + "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3|^2", + "doctrine/persistence": "^2", "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { + "doctrine/dbal": "<2.10", "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5", + "symfony/form": "<5.1", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", "symfony/security-bundle": "<5", "symfony/security-core": "<5", - "symfony/validator": "<5.0.2" + "symfony/validator": "<5.2" }, "require-dev": { "composer/package-versions-deprecated": "^1.8", @@ -3054,13 +3002,14 @@ "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "~2.4", - "doctrine/orm": "^2.6.3", - "doctrine/reflection": "~1.0", + "doctrine/dbal": "^2.10|^3.0", + "doctrine/orm": "^2.7.3", + "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.3", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -3069,7 +3018,8 @@ "symfony/security-core": "^5.0", "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.0.2", + "symfony/uid": "^5.1", + "symfony/validator": "^5.2", "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { @@ -3081,11 +3031,6 @@ "symfony/validator": "" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Doctrine\\": "" @@ -3111,7 +3056,7 @@ "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/5.0" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.0" }, "funding": [ { @@ -3127,26 +3072,27 @@ "type": "tidelift" } ], - "time": "2020-07-23T16:54:02+00:00" + "time": "2020-11-28T13:40:09+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732" + "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bbc756c0895d08a1e69a59d8541a647b47f5a732", - "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0969122fe144dd8ab2e8c98c7e03eedc621b368c", + "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "masterminds/html5": "<2.6" @@ -3159,11 +3105,6 @@ "symfony/css-selector": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DomCrawler\\": "" @@ -3189,7 +3130,7 @@ "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/5.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.2.0" }, "funding": [ { @@ -3205,7 +3146,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-10-24T12:01:57+00:00" }, { "name": "symfony/dotenv", @@ -3283,16 +3224,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8" + "reference": "289008c5be039e39908d33ae0a8ac99be1210bba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d01fba9a55614a1addb0d52d6a9566560b2a2af8", - "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/289008c5be039e39908d33ae0a8ac99be1210bba", + "reference": "289008c5be039e39908d33ae0a8ac99be1210bba", "shasum": "" }, "require": { @@ -3302,15 +3243,11 @@ "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" @@ -3336,7 +3273,7 @@ "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/5.0" + "source": "https://github.com/symfony/error-handler/tree/v5.2.0" }, "funding": [ { @@ -3352,25 +3289,27 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-10-28T21:46:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d" + "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", - "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", + "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/event-dispatcher-contracts": "^2" + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -3383,6 +3322,7 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -3393,11 +3333,6 @@ "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -3423,7 +3358,7 @@ "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/5.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.0" }, "funding": [ { @@ -3439,7 +3374,7 @@ "type": "tidelift" } ], - "time": "2020-06-18T18:18:56+00:00" + "time": "2020-11-01T16:14:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3522,16 +3457,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214" + "reference": "bb92ba7f38b037e531908590a858a04d85c0e238" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", - "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/bb92ba7f38b037e531908590a858a04d85c0e238", + "reference": "bb92ba7f38b037e531908590a858a04d85c0e238", "shasum": "" }, "require": { @@ -3539,11 +3474,6 @@ "symfony/polyfill-ctype": "~1.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" @@ -3569,7 +3499,7 @@ "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.0.9" + "source": "https://github.com/symfony/filesystem/tree/v5.2.0" }, "funding": [ { @@ -3585,31 +3515,26 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:12:43+00:00" + "time": "2020-11-12T09:58:18+00:00" }, { "name": "symfony/finder", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "127bccabf3c854625af9c0162779cf06bc1dd352" + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/127bccabf3c854625af9c0162779cf06bc1dd352", - "reference": "127bccabf3c854625af9c0162779cf06bc1dd352", + "url": "https://api.github.com/repos/symfony/finder/zipball/fd8305521692f27eae3263895d1ef1571c71a78d", + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d", "shasum": "" }, "require": { "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -3635,7 +3560,7 @@ "description": "Symfony Finder Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/5.0" + "source": "https://github.com/symfony/finder/tree/v5.2.0" }, "funding": [ { @@ -3651,7 +3576,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2020-11-18T09:42:36+00:00" }, { "name": "symfony/flex", @@ -3869,41 +3794,40 @@ "time": "2020-07-23T08:36:09+00:00" }, { - "name": "symfony/http-foundation", - "version": "v5.0.11", + "name": "symfony/http-client-contracts", + "version": "v2.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", - "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5" }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "suggest": { + "symfony/http-client-implementation": "" }, "type": "library", "extra": { + "branch-version": "2.3", "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Contracts\\HttpClient\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3911,18 +3835,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.0.11" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" }, "funding": [ { @@ -3938,83 +3870,41 @@ "type": "tidelift" } ], - "time": "2020-07-23T10:04:24+00:00" + "time": "2020-10-14T17:08:19+00:00" }, { - "name": "symfony/http-kernel", - "version": "v5.0.11", + "name": "symfony/http-foundation", + "version": "v5.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", - "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.15" }, - "conflict": { - "symfony/browser-kit": "<4.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<4.4", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" + "symfony/mime": "^4.4|^5.0" }, "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "symfony/mime": "To use the file extension guesser" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4034,10 +3924,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.0.11" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.0" }, "funding": [ { @@ -4053,43 +3943,80 @@ "type": "tidelift" } ], - "time": "2020-07-24T04:14:59+00:00" + "time": "2020-11-27T06:13:25+00:00" }, { - "name": "symfony/mime", - "version": "v5.0.11", + "name": "symfony/http-kernel", + "version": "v5.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "38907e5ccb2d9d371191a946734afc83c7a03160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", - "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/38907e5ccb2d9d371191a946734afc83c7a03160", + "reference": "38907e5ccb2d9d371191a946734afc83c7a03160", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "symfony/mailer": "<4.4" + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.1.8", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.1.8", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.4|^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\HttpKernel\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4109,14 +4036,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], "support": { - "source": "https://github.com/symfony/mime/tree/5.0" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.0" }, "funding": [ { @@ -4132,25 +4055,24 @@ "type": "tidelift" } ], - "time": "2020-07-23T10:04:24+00:00" + "time": "2020-11-30T05:54:18+00:00" }, { "name": "symfony/orm-pack", - "version": "v1.2.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/orm-pack.git", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" + "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/7dd2ed9ba6d7af79f90bdc77522605d40463e533", + "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533", "shasum": "" }, "require": { "composer/package-versions-deprecated": "*", - "doctrine/common": "^2", "doctrine/doctrine-bundle": "^2", "doctrine/doctrine-migrations-bundle": "^2", "doctrine/orm": "^2" @@ -4163,7 +4085,7 @@ "description": "A pack for the Doctrine ORM", "support": { "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" + "source": "https://github.com/symfony/orm-pack/tree/master" }, "funding": [ { @@ -4179,7 +4101,7 @@ "type": "tidelift" } ], - "time": "2020-08-31T10:20:18+00:00" + "time": "2020-07-08T14:31:54+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4596,20 +4518,22 @@ }, { "name": "symfony/routing", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1369ee6823074c406815b65a40d47fd5ee48e517" + "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1369ee6823074c406815b65a40d47fd5ee48e517", - "reference": "1369ee6823074c406815b65a40d47fd5ee48e517", + "url": "https://api.github.com/repos/symfony/routing/zipball/130ac5175ad2fd417978baebd8062e2e6b2bc28b", + "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/config": "<5.0", @@ -4617,7 +4541,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "~1.2", + "doctrine/annotations": "^1.7", "psr/log": "~1.0", "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -4633,11 +4557,6 @@ "symfony/yaml": "For using the YAML loader" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" @@ -4669,7 +4588,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.0.11" + "source": "https://github.com/symfony/routing/tree/v5.2.0" }, "funding": [ { @@ -4685,7 +4604,7 @@ "type": "tidelift" } ], - "time": "2020-06-18T18:18:56+00:00" + "time": "2020-11-27T00:39:34+00:00" }, { "name": "symfony/serializer", @@ -4867,16 +4786,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118" + "reference": "2b105c0354f39a63038a1d8bf776ee92852813af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fbc3084469450c6f6616f5436a00e180ea9ff118", - "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2b105c0354f39a63038a1d8bf776ee92852813af", + "reference": "2b105c0354f39a63038a1d8bf776ee92852813af", "shasum": "" }, "require": { @@ -4884,11 +4803,6 @@ "symfony/service-contracts": "^1.0|^2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" @@ -4914,7 +4828,7 @@ "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/5.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.0" }, "funding": [ { @@ -4930,7 +4844,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2020-11-01T16:14:45+00:00" }, { "name": "symfony/translation-contracts", @@ -5012,52 +4926,56 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "293e5f04eee4da963686beab20960b45e4db68ad" + "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/293e5f04eee4da963686beab20960b45e4db68ad", - "reference": "293e5f04eee4da963686beab20960b45e4db68ad", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/909d736d0413a072ebd5db8e0f87b8808efd4849", + "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", "symfony/translation-contracts": "^1.1|^2", "twig/twig": "^2.10|^3.0" }, "conflict": { "symfony/console": "<4.4", - "symfony/form": "<5.0", + "symfony/form": "<5.1", "symfony/http-foundation": "<4.4", "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" }, "require-dev": { "egulias/email-validator": "^2.1.10", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.9", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", + "symfony/mime": "^5.2", "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1", "symfony/routing": "^4.4|^5.0", "symfony/security-acl": "^2.8|^3.0", "symfony/security-core": "^4.4|^5.0", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^5.2", "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", + "symfony/translation": "^5.2", "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", + "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", "twig/cssinliner-extra": "^2.12", "twig/inky-extra": "^2.12", @@ -5080,11 +4998,6 @@ "symfony/yaml": "For using the YamlExtension" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Twig\\": "" @@ -5110,7 +5023,7 @@ "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/5.0" + "source": "https://github.com/symfony/twig-bridge/tree/v5.2.0" }, "funding": [ { @@ -5126,7 +5039,7 @@ "type": "tidelift" } ], - "time": "2020-06-30T17:59:45+00:00" + "time": "2020-11-28T11:24:18+00:00" }, { "name": "symfony/twig-bundle", @@ -5222,16 +5135,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731" + "reference": "173a79c462b1c81e1fa26129f71e41333d846b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/36d19dbb4b377273dddb820adcdf0cc9dcf57731", - "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/173a79c462b1c81e1fa26129f71e41333d846b26", + "reference": "173a79c462b1c81e1fa26129f71e41333d846b26", "shasum": "" }, "require": { @@ -5258,11 +5171,6 @@ "Resources/bin/var-dump-server" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "files": [ "Resources/functions/dump.php" @@ -5295,7 +5203,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/5.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.0" }, "funding": [ { @@ -5311,34 +5219,30 @@ "type": "tidelift" } ], - "time": "2020-06-24T13:36:01+00:00" + "time": "2020-11-27T00:39:34+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3" + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b87e3aeedb74ee2694932d04153df9d804954cc3", - "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" @@ -5372,7 +5276,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/5.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" }, "funding": [ { @@ -5388,7 +5292,7 @@ "type": "tidelift" } ], - "time": "2020-06-07T15:38:39+00:00" + "time": "2020-10-28T21:31:18+00:00" }, { "name": "symfony/yaml", diff --git a/deploy.php b/deploy.php index 4a9663a..ff5f6ae 100644 --- a/deploy.php +++ b/deploy.php @@ -42,12 +42,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', +// 'deploy:vendors', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'dump-autoload', 'deploy:writable', - 'database:migrate', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index c573872..13319c7 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -5,8 +5,9 @@ use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\FileSystemAwareTrait; -use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; +use GuzzleHttp\Client; +use Ivanstan\Tle\Model\Tle as TleModel; use Ivanstan\Tle\Model\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; @@ -57,13 +58,24 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** @noinspection DisconnectedForeachInstructionInspection */ $progressBar->advance(); - $content = file_get_contents($uri); + try { + $response = (new Client())->request('GET', $uri); + } catch (\Exception $exception) { + $output->writeln( + \sprintf( + 'Unable to fetch resource "%s" with exception message "%s"', + $uri, + $exception->getMessage() + ) + ); + continue; + } - if (!$content) { + if (!$response->getBody()) { continue; } - $file = new TleFile($content); + $file = new TleFile($response->getBody()); $insert = []; $update = []; @@ -135,12 +147,14 @@ protected function flush(array $queue, $persistNew = null): void $counter = 0; /** @var TleModel $model */ foreach ($queue as $model) { - /** @var Tle $existing */ - $existing = $this->satellites[$model->getId()]; - $existing->setName($model->getName()); - $existing->setId($model->getId()); - $existing->setLine1($model->getLine1()); - $existing->setLine2($model->getLine2()); + if (!$persistNew) { + /** @var Tle $existing */ + $existing = $this->satellites[$model->getId()]; + $existing->setName($model->getName()); + $existing->setId($model->getId()); + $existing->setLine1($model->getLine1()); + $existing->setLine2($model->getLine2()); + } if ($persistNew) { $tle = $this->toPersistent($model); diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 81780a9..8c97f70 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -1,35 +1,35 @@ -render('docs.html.twig'); - } - - /** - * @Route("/api/{name}.json", name="app_api_docs_json") - */ - public function getJson(string $name): JsonResponse - { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); - } -} +render('docs.html.twig'); + } + + /** + * @Route("/api/{name}.json", name="app_api_docs_json") + */ + public function getJson(string $name): JsonResponse + { + $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + + $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + + return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + } +} diff --git a/symfony.lock b/symfony.lock index 54a84ad..2be3183 100644 --- a/symfony.lock +++ b/symfony.lock @@ -87,9 +87,6 @@ "doctrine/persistence": { "version": "1.3.3" }, - "doctrine/reflection": { - "version": "v1.0.0" - }, "doctrine/sql-formatter": { "version": "1.1.1" }, @@ -261,9 +258,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/mime": { - "version": "v5.0.1" - }, "symfony/orm-pack": { "version": "v1.0.7" }, From 73dde3d4fb24fef6eef41298b3a67718dad4db3e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 20 Dec 2020 19:11:32 +0100 Subject: [PATCH 051/221] add satelliteId field --- src/Command/ImportTleCommand.php | 10 +--------- src/Serializer/TleModelNormalizer.php | 1 + 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 13319c7..c8ad83d 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -82,15 +82,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($file->parse() as $tle) { if (\array_key_exists($tle->getId(), $this->satellites)) { - $existing = new \Ivanstan\Tle\Model\Tle( - $this->satellites[$tle->getId()]->getLine1(), - $this->satellites[$tle->getId()]->getLine2(), - $this->satellites[$tle->getId()]->getName(), - ); - - if ($tle->getDate() > $existing->getDate()) { - $update[$tle->getId()] = $tle; - } + $update[$tle->getId()] = $tle; } else { $insert[$tle->getId()] = $tle; } diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index b07e6fc..6cb79c1 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -32,6 +32,7 @@ public function normalize($entity, string $format = null, array $context = []) return [ '@id' => $id, '@type' => 'TleModel', + 'satelliteId' => $model->getId(), 'name' => $model->getName(), 'date' => $model->getDate(), 'line1' => $model->getLine1(), From 912c7eb51328c3efd813adb50b35bde72eabe5d0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 27 Dec 2020 19:15:15 +0100 Subject: [PATCH 052/221] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index c398e5c..eadcee5 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,6 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -

- -

- Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ @@ -40,4 +36,4 @@ http://data.ivanstanojevic.me/api/tle * JavaScript https://github.com/ivanstan/tle.js * PHP https://github.com/ivanstan/tle-php -* C# https://github.com/nichols-t/TLE.NET \ No newline at end of file +* C# https://github.com/nichols-t/TLE.NET From ec817823b3094cebb1d7d842fbc14087896fe0d8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 27 Dec 2020 20:05:24 +0100 Subject: [PATCH 053/221] add suplemental source --- config/custom/source.yaml | 106 +++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/config/custom/source.yaml b/config/custom/source.yaml index 085d101..0f3b493 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,47 +1,59 @@ -- https://www.celestrak.com/NORAD/elements/tle-new.txt -- https://www.celestrak.com/NORAD/elements/stations.txt -- https://www.celestrak.com/NORAD/elements/visual.txt -- https://www.celestrak.com/NORAD/elements/active.txt -- https://www.celestrak.com/NORAD/elements/analyst.txt -- https://www.celestrak.com/NORAD/elements/1999-025.txt -- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://www.celestrak.com/NORAD/elements/2012-044.txt -- https://www.celestrak.com/NORAD/elements/weather.txt -- https://www.celestrak.com/NORAD/elements/noaa.txt -- https://www.celestrak.com/NORAD/elements/goes.txt -- https://www.celestrak.com/NORAD/elements/resource.txt -- https://www.celestrak.com/NORAD/elements/sarsat.txt -- https://www.celestrak.com/NORAD/elements/dmc.txt -- https://www.celestrak.com/NORAD/elements/tdrss.txt -- https://www.celestrak.com/NORAD/elements/argos.txt -- https://www.celestrak.com/NORAD/elements/planet.txt -- https://www.celestrak.com/NORAD/elements/spire.txt -- https://www.celestrak.com/NORAD/elements/geo.txt -- https://www.celestrak.com/NORAD/elements/intelsat.txt -- https://www.celestrak.com/NORAD/elements/ses.txt -- https://www.celestrak.com/NORAD/elements/iridium.txt -- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://www.celestrak.com/NORAD/elements/orbcomm.txt -- https://www.celestrak.com/NORAD/elements/globalstar.txt -- https://www.celestrak.com/NORAD/elements/amateur.txt -- https://www.celestrak.com/NORAD/elements/x-comm.txt -- https://www.celestrak.com/NORAD/elements/other-comm.txt -- https://www.celestrak.com/NORAD/elements/gorizont.txt -- https://www.celestrak.com/NORAD/elements/raduga.txt -- https://www.celestrak.com/NORAD/elements/molniya.txt -- https://www.celestrak.com/NORAD/elements/gps-ops.txt -- https://www.celestrak.com/NORAD/elements/glo-ops.txt -- https://www.celestrak.com/NORAD/elements/galileo.txt -- https://www.celestrak.com/NORAD/elements/beidou.txt -- https://www.celestrak.com/NORAD/elements/sbas.txt -- https://www.celestrak.com/NORAD/elements/nnss.txt -- https://www.celestrak.com/NORAD/elements/musson.txt -- https://www.celestrak.com/NORAD/elements/science.txt -- https://www.celestrak.com/NORAD/elements/geodetic.txt -- https://www.celestrak.com/NORAD/elements/engineering.txt -- https://www.celestrak.com/NORAD/elements/education.txt -- https://www.celestrak.com/NORAD/elements/military.txt -- https://www.celestrak.com/NORAD/elements/radar.txt -- https://www.celestrak.com/NORAD/elements/cubesat.txt -- https://www.celestrak.com/NORAD/elements/other.txt \ No newline at end of file +- https://celestrak.com/NORAD/elements/tle-new.txt +- https://celestrak.com/NORAD/elements/stations.txt +- https://celestrak.com/NORAD/elements/visual.txt +- https://celestrak.com/NORAD/elements/active.txt +- https://celestrak.com/NORAD/elements/analyst.txt +- https://celestrak.com/NORAD/elements/1999-025.txt +- https://celestrak.com/NORAD/elements/iridium-33-debris.txt +- https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt +- https://celestrak.com/NORAD/elements/2012-044.txt +- https://celestrak.com/NORAD/elements/weather.txt +- https://celestrak.com/NORAD/elements/noaa.txt +- https://celestrak.com/NORAD/elements/goes.txt +- https://celestrak.com/NORAD/elements/resource.txt +- https://celestrak.com/NORAD/elements/sarsat.txt +- https://celestrak.com/NORAD/elements/dmc.txt +- https://celestrak.com/NORAD/elements/tdrss.txt +- https://celestrak.com/NORAD/elements/argos.txt +- https://celestrak.com/NORAD/elements/planet.txt +- https://celestrak.com/NORAD/elements/spire.txt +- https://celestrak.com/NORAD/elements/geo.txt +- https://celestrak.com/NORAD/elements/intelsat.txt +- https://celestrak.com/NORAD/elements/ses.txt +- https://celestrak.com/NORAD/elements/iridium.txt +- https://celestrak.com/NORAD/elements/iridium-NEXT.txt +- https://celestrak.com/NORAD/elements/orbcomm.txt +- https://celestrak.com/NORAD/elements/globalstar.txt +- https://celestrak.com/NORAD/elements/amateur.txt +- https://celestrak.com/NORAD/elements/x-comm.txt +- https://celestrak.com/NORAD/elements/other-comm.txt +- https://celestrak.com/NORAD/elements/gorizont.txt +- https://celestrak.com/NORAD/elements/raduga.txt +- https://celestrak.com/NORAD/elements/molniya.txt +- https://celestrak.com/NORAD/elements/gps-ops.txt +- https://celestrak.com/NORAD/elements/glo-ops.txt +- https://celestrak.com/NORAD/elements/galileo.txt +- https://celestrak.com/NORAD/elements/beidou.txt +- https://celestrak.com/NORAD/elements/sbas.txt +- https://celestrak.com/NORAD/elements/nnss.txt +- https://celestrak.com/NORAD/elements/musson.txt +- https://celestrak.com/NORAD/elements/science.txt +- https://celestrak.com/NORAD/elements/geodetic.txt +- https://celestrak.com/NORAD/elements/engineering.txt +- https://celestrak.com/NORAD/elements/education.txt +- https://celestrak.com/NORAD/elements/military.txt +- https://celestrak.com/NORAD/elements/radar.txt +- https://celestrak.com/NORAD/elements/cubesat.txt +- https://celestrak.com/NORAD/elements/other.txt +- https://celestrak.com/NORAD/elements/supplemental/starlink.txt +- https://celestrak.com/NORAD/elements/supplemental/oneweb.txt +- https://celestrak.com/NORAD/elements/supplemental/gps.txt +- https://celestrak.com/NORAD/elements/supplemental/glonass.txt +- https://celestrak.com/NORAD/elements/supplemental/meteosat.txt +- https://celestrak.com/NORAD/elements/supplemental/intelsat.txt +- https://celestrak.com/NORAD/elements/supplemental/ses.txt +- https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt +- https://celestrak.com/NORAD/elements/supplemental/cpf.txt +- https://celestrak.com/NORAD/elements/swarm.txt +- https://celestrak.com/satcat/gpz.php +- https://celestrak.com/NORAD/elements/supplemental/planet.txt \ No newline at end of file From fc06e2742976f13f84e30eb72d02bd9d2e4771b2 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 12:04:14 +0100 Subject: [PATCH 054/221] upgrade --- config/custom/tle.json | 12 ++++++------ deploy.php | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index b58e6bb..f84e61f 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -188,7 +188,7 @@ "properties": { "@id": { "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/43630" + "example": "https://tle.ivanstanojevic.me/api/tle/43638" }, "@type": { "type": "string", @@ -196,19 +196,19 @@ }, "name": { "type": "string", - "example": "HTV-7 (KOUNOTORI 7)" + "example": "1998-067PN" }, "date": { "type": "string", - "example": "2018-10-21T11:40:23+00:00" + "example": "2021-02-16T06:41:41+00:00" }, "line1": { "type": "string", - "example": "1 43630U 18073A 18285.64337553 .00002296 00000-0 42374-4 0 9998" + "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" }, "line2": { "type": "string", - "example": "2 43630 51.6412 153.3949 0003517 275.8456 137.9883 15.53813372136786" + "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" } }, "type": "object" @@ -294,4 +294,4 @@ } } } -} \ No newline at end of file +} diff --git a/deploy.php b/deploy.php index ff5f6ae..fde8dbd 100644 --- a/deploy.php +++ b/deploy.php @@ -11,8 +11,19 @@ set('writable_mode', 'chmod'); set('default_stage', 'production'); set('bin/composer', '~/bin/composer.phar'); -add('shared_files', ['.env']); -add('shared_dirs', ['var']); +add('shared_files', [ + '.env', + 'public/robots.txt', + 'public/manifest.json', + 'public/asset-manifest.json', + 'public/favicon.ico', + 'public/index.html', +]); +add('shared_dirs', [ + 'var', + 'public/static', + 'public/images', +]); add('writable_dirs', ['var']); host('ivanstanojevic.me') From b9b028181058e6aee6b0e8a625fef88619035416 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 12:19:02 +0100 Subject: [PATCH 055/221] upgrade --- composer.json | 22 +- composer.lock | 1094 ++++++++++++++++++++++++++----------------------- deploy.php | 10 +- symfony.lock | 4 +- 4 files changed, 607 insertions(+), 523 deletions(-) diff --git a/composer.json b/composer.json index e6fca39..ad831ef 100644 --- a/composer.json +++ b/composer.json @@ -2,29 +2,29 @@ "type": "project", "license": "proprietary", "require": { - "php": "^7.4", + "php": "^8.0", "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", - "ivanstan/tle-php": "^1.0", + "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", + "symfony/asset": "5.2.*", + "symfony/browser-kit": "5.2.*", + "symfony/console": "5.2.*", + "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", + "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", - "symfony/serializer": "5.0.*", - "symfony/twig-bundle": "5.0.*", - "symfony/yaml": "5.0.*", + "symfony/serializer": "5.2.*", + "symfony/twig-bundle": "5.2.*", + "symfony/yaml": "5.2.*", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.2" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index b996145..775e5f3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "623796bd13aa29d141dca80c543db4c9", + "content-hash": "86856225c36f705ce4978b2de2e986f2", "packages": [ { "name": "composer/package-versions-deprecated", @@ -81,16 +81,16 @@ }, { "name": "doctrine/annotations", - "version": "1.11.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", "shasum": "" }, "require": { @@ -105,11 +105,6 @@ "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -150,9 +145,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.1" + "source": "https://github.com/doctrine/annotations/tree/1.12.1" }, - "time": "2020-10-26T10:28:16+00:00" + "time": "2021-02-21T21:00:45+00:00" }, { "name": "doctrine/cache", @@ -325,16 +320,16 @@ }, { "name": "doctrine/common", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d" + "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/9f3e3f3cc5399604c0325d5ffa92609d694d950d", - "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d", + "url": "https://api.github.com/repos/doctrine/common/zipball/2afde5a9844126bc311cd5f548b5475e75f800d3", + "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3", "shasum": "" }, "require": { @@ -394,7 +389,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.0" + "source": "https://github.com/doctrine/common/tree/3.1.1" }, "funding": [ { @@ -410,7 +405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T21:02:31+00:00" + "time": "2021-01-20T19:58:05+00:00" }, { "name": "doctrine/dbal", @@ -525,16 +520,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.2.2", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "044d33eeffdb236d5013b6b4af99f87519e10751" + "reference": "015fdd490074d4daa891e2d1df998dc35ba54924" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/044d33eeffdb236d5013b6b4af99f87519e10751", - "reference": "044d33eeffdb236d5013b6b4af99f87519e10751", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/015fdd490074d4daa891e2d1df998dc35ba54924", + "reference": "015fdd490074d4daa891e2d1df998dc35ba54924", "shasum": "" }, "require": { @@ -557,7 +552,7 @@ "require-dev": { "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", - "ocramius/proxy-manager": "^2.1", + "friendsofphp/proxy-manager-lts": "^1.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", @@ -615,7 +610,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.3" }, "funding": [ { @@ -631,34 +626,34 @@ "type": "tidelift" } ], - "time": "2020-12-05T15:07:10+00:00" + "time": "2021-01-19T20:29:53+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "955077b68c377310cf9538fc982be11d36ab75d4" + "reference": "85f0b847174daf243362c7da80efe1539be64f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/955077b68c377310cf9538fc982be11d36ab75d4", - "reference": "955077b68c377310cf9538fc982be11d36ab75d4", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/85f0b847174daf243362c7da80efe1539be64f47", + "reference": "85f0b847174daf243362c7da80efe1539be64f47", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "~1.0|~2.0", "doctrine/migrations": "^2.2", - "php": "^7.1", + "php": "^7.1|^8.0", "symfony/framework-bundle": "~3.4|~4.0|~5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^8.0", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-strict-rules": "^0.9", - "phpunit/phpunit": "^6.4|^7.0" + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "symfony-bundle", "extra": { @@ -701,7 +696,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.2" }, "funding": [ { @@ -717,7 +712,7 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:59:06+00:00" + "time": "2020-12-23T15:06:17+00:00" }, { "name": "doctrine/event-manager", @@ -1059,36 +1054,36 @@ }, { "name": "doctrine/migrations", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "af915024d41669600354efe78664ee86dfca62e1" + "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/af915024d41669600354efe78664ee86dfca62e1", - "reference": "af915024d41669600354efe78664ee86dfca62e1", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/39520699043d9bfaaebeb81fa026bf2b02a8f735", + "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", "doctrine/dbal": "^2.9", - "ocramius/proxy-manager": "^2.0.2", - "php": "^7.1", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.1 || ^8.0", "symfony/console": "^3.4||^4.4.16||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/orm": "^2.6", "ext-pdo_sqlite": "*", "jdorn/sql-formatter": "^1.1", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.10", - "phpstan/phpstan-deprecation-rules": "^0.10", - "phpstan/phpstan-phpunit": "^0.10", - "phpstan/phpstan-strict-rules": "^0.10", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" @@ -1139,7 +1134,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.3.1" + "source": "https://github.com/doctrine/migrations/tree/2.3.2" }, "funding": [ { @@ -1155,20 +1150,20 @@ "type": "tidelift" } ], - "time": "2020-12-05T19:13:58+00:00" + "time": "2020-12-23T14:06:04+00:00" }, { "name": "doctrine/orm", - "version": "2.8.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833" + "reference": "ebae57eb9637acd8252b398df3121b120688ed5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/242cf1a33df1b8bc5e1b86c3ebd01db07851c833", - "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833", + "url": "https://api.github.com/repos/doctrine/orm/zipball/ebae57eb9637acd8252b398df3121b120688ed5c", + "reference": "ebae57eb9637acd8252b398df3121b120688ed5c", "shasum": "" }, "require": { @@ -1176,7 +1171,7 @@ "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^3.0", + "doctrine/common": "^3.0.3", "doctrine/dbal": "^2.10.0", "doctrine/event-manager": "^1.1", "doctrine/inflector": "^1.4|^2.0", @@ -1245,9 +1240,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.8.1" + "source": "https://github.com/doctrine/orm/tree/2.8.2" }, - "time": "2020-12-04T19:53:07+00:00" + "time": "2021-02-16T22:10:18+00:00" }, { "name": "doctrine/persistence", @@ -1390,6 +1385,88 @@ }, "time": "2020-07-30T16:57:33+00:00" }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2021-01-14T21:52:44+00:00" + }, { "name": "guzzlehttp/guzzle", "version": "6.5.5", @@ -1593,23 +1670,23 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1" + "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/15c7e46644237df8c5997a6d7875b0f2b9a62cd1", - "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/4ae1dbd53cba8de3d89328b8d20c701ee96558c0", + "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5", "myclabs/php-enum": "^1.7", - "php": "^7.4" + "php": "^7.4|^8.0" }, "require-dev": { "phpunit/phpunit": "^8" @@ -1633,45 +1710,47 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0.1" + "source": "https://github.com/ivanstan/tle-php/tree/1.0.3" }, - "time": "2020-12-09T09:04:57+00:00" + "time": "2021-02-25T11:17:02+00:00" }, { "name": "laminas/laminas-code", - "version": "3.5.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "b549b70c0bb6e935d497f84f750c82653326ac77" + "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/b549b70c0bb6e935d497f84f750c82653326ac77", - "reference": "b549b70c0bb6e935d497f84f750c82653326ac77", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/28a6d70ea8b8bca687d7163300e611ae33baf82a", + "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a", "shasum": "" }, "require": { "laminas/laminas-eventmanager": "^3.3", - "laminas/laminas-zendframework-bridge": "^1.1", - "php": "^7.3 || ~8.0.0" + "php": "^7.4 || ~8.0.0" }, "conflict": { "phpspec/prophecy": "<1.9.0" }, "replace": { - "zendframework/zend-code": "^3.4.1" + "zendframework/zend-code": "self.version" }, "require-dev": { "doctrine/annotations": "^1.10.4", "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0.0", + "laminas/laminas-coding-standard": "^2.1.4", "laminas/laminas-stdlib": "^3.3.0", - "phpunit/phpunit": "^9.4.2" + "phpunit/phpunit": "^9.4.2", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3.1" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" + "laminas/laminas-stdlib": "Laminas\\Stdlib component", + "laminas/laminas-zendframework-bridge": "A bridge with Zend Framework" }, "type": "library", "autoload": { @@ -1687,7 +1766,8 @@ "homepage": "https://laminas.dev", "keywords": [ "code", - "laminas" + "laminas", + "laminasframework" ], "support": { "chat": "https://laminas.dev/chat", @@ -1703,7 +1783,7 @@ "type": "community_bridge" } ], - "time": "2020-11-30T20:16:31+00:00" + "time": "2020-12-30T16:16:14+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -1839,26 +1919,26 @@ }, { "name": "myclabs/php-enum", - "version": "1.7.7", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" + "reference": "46cf3d8498b095bd33727b13fd5707263af99421" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/46cf3d8498b095bd33727b13fd5707263af99421", + "reference": "46cf3d8498b095bd33727b13fd5707263af99421", "shasum": "" }, "require": { "ext-json": "*", - "php": ">=7.1" + "php": "^7.3 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7", + "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^3.8" + "vimeo/psalm": "^4.5.1" }, "type": "library", "autoload": { @@ -1883,7 +1963,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.7.7" + "source": "https://github.com/myclabs/php-enum/tree/1.8.0" }, "funding": [ { @@ -1895,97 +1975,7 @@ "type": "tidelift" } ], - "time": "2020-11-14T18:14:52+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.10.0", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "laminas/laminas-code": "^3.4.1", - "php": "~7.4.1", - "webimpress/safe-writer": "^2.0.1" - }, - "conflict": { - "doctrine/annotations": "<1.6.1", - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "require-dev": { - "codelicia/xulieta": "^0.1.2", - "doctrine/coding-standard": "^8.1.0", - "ext-phar": "*", - "infection/infection": "^0.16.4", - "nikic/php-parser": "^4.6.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^9.2.5", - "slevomat/coding-standard": "^6.3.10", - "squizlabs/php_codesniffer": "^3.5.5", - "vimeo/psalm": "^3.12.2" - }, - "suggest": { - "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", - "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", - "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.10.0" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2020-11-12T17:04:46+00:00" + "time": "2021-02-15T16:11:48+00:00" }, { "name": "psr/cache", @@ -2314,22 +2304,23 @@ }, { "name": "symfony/asset", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb" + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/aaf4ba865c02f6df999166a0148d56f2b11b11fb", - "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb", + "url": "https://api.github.com/repos/symfony/asset/zipball/54a42aa50f9359d1184bf7e954521b45ca3d5828", + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828", "shasum": "" }, "require": { "php": ">=7.2.5" }, "require-dev": { + "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2337,11 +2328,6 @@ "symfony/http-foundation": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Asset\\": "" @@ -2364,10 +2350,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Asset Component", + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/5.0" + "source": "https://github.com/symfony/asset/tree/v5.2.3" }, "funding": [ { @@ -2383,20 +2369,20 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:12:43+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6" + "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c46b676a993cc437bafe6fe0f30f074857cde2a6", - "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", + "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", "shasum": "" }, "require": { @@ -2413,11 +2399,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\BrowserKit\\": "" @@ -2440,10 +2421,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony BrowserKit Component", + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.0.11" + "source": "https://github.com/symfony/browser-kit/tree/v5.2.3" }, "funding": [ { @@ -2459,20 +2440,20 @@ "type": "tidelift" } ], - "time": "2020-06-12T09:22:24+00:00" + "time": "2021-01-27T12:56:27+00:00" }, { "name": "symfony/cache", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "url": "https://api.github.com/repos/symfony/cache/zipball/d6aed6c1bbf6f59e521f46437475a0ff4878d388", + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388", "shasum": "" }, "require": { @@ -2531,14 +2512,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", "homepage": "https://symfony.com", "keywords": [ "caching", "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.0" + "source": "https://github.com/symfony/cache/tree/v5.2.3" }, "funding": [ { @@ -2554,7 +2535,7 @@ "type": "tidelift" } ], - "time": "2020-11-21T09:39:55+00:00" + "time": "2021-01-27T11:24:50+00:00" }, { "name": "symfony/cache-contracts", @@ -2637,16 +2618,16 @@ }, { "name": "symfony/config", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea" + "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", - "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", + "url": "https://api.github.com/repos/symfony/config/zipball/50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", + "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", "shasum": "" }, "require": { @@ -2692,10 +2673,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.0" + "source": "https://github.com/symfony/config/tree/v5.2.3" }, "funding": [ { @@ -2711,20 +2692,20 @@ "type": "tidelift" } ], - "time": "2020-11-16T18:02:40+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/console", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "95794074741645473221fb126d5cb4057ad25bf1" + "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/95794074741645473221fb126d5cb4057ad25bf1", - "reference": "95794074741645473221fb126d5cb4057ad25bf1", + "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a", + "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a", "shasum": "" }, "require": { @@ -2732,10 +2713,12 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2759,11 +2742,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" @@ -2786,10 +2764,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v5.0.11" + "source": "https://github.com/symfony/console/tree/v5.2.3" }, "funding": [ { @@ -2805,20 +2789,20 @@ "type": "tidelift" } ], - "time": "2020-07-06T13:22:03+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "98cec9b9f410a4832e239949a41d47182862c3a4" + "reference": "62f72187be689540385dce6c68a5d4c16f034139" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98cec9b9f410a4832e239949a41d47182862c3a4", - "reference": "98cec9b9f410a4832e239949a41d47182862c3a4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/62f72187be689540385dce6c68a5d4c16f034139", + "reference": "62f72187be689540385dce6c68a5d4c16f034139", "shasum": "" }, "require": { @@ -2873,10 +2857,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DependencyInjection Component", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.3" }, "funding": [ { @@ -2892,7 +2876,7 @@ "type": "tidelift" } ], - "time": "2020-11-28T11:24:18+00:00" + "time": "2021-01-27T12:56:27+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2963,22 +2947,23 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf" + "reference": "c348e596f49df406a7c0a51443864038b3137cac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b3ea1749ef47c3d2ad6018d05837758bae91f5cf", - "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c348e596f49df406a7c0a51443864038b3137cac", + "reference": "c348e596f49df406a7c0a51443864038b3137cac", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", "doctrine/persistence": "^2", "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15", @@ -2998,7 +2983,7 @@ }, "require-dev": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", @@ -3053,10 +3038,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Doctrine Bridge", + "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.0" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.3" }, "funding": [ { @@ -3072,7 +3057,7 @@ "type": "tidelift" } ], - "time": "2020-11-28T13:40:09+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/dom-crawler", @@ -3150,30 +3135,26 @@ }, { "name": "symfony/dotenv", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "efd887f012127acad22325d109fe8ddf635f1f97" + "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/efd887f012127acad22325d109fe8ddf635f1f97", - "reference": "efd887f012127acad22325d109fe8ddf635f1f97", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/783f12027c6b40ab0e93d6136d9f642d1d67cd6b", + "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" }, "require-dev": { "symfony/process": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Dotenv\\": "" @@ -3204,7 +3185,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/5.0" + "source": "https://github.com/symfony/dotenv/tree/v5.2.3" }, "funding": [ { @@ -3220,20 +3201,20 @@ "type": "tidelift" } ], - "time": "2020-05-28T08:20:26+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/error-handler", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "289008c5be039e39908d33ae0a8ac99be1210bba" + "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/289008c5be039e39908d33ae0a8ac99be1210bba", - "reference": "289008c5be039e39908d33ae0a8ac99be1210bba", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48f18b3609e120ea66d59142c23dc53e9562c26d", + "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d", "shasum": "" }, "require": { @@ -3270,10 +3251,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ErrorHandler Component", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.0" + "source": "https://github.com/symfony/error-handler/tree/v5.2.3" }, "funding": [ { @@ -3289,20 +3270,20 @@ "type": "tidelift" } ], - "time": "2020-10-28T21:46:03+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c" + "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", - "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367", + "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367", "shasum": "" }, "require": { @@ -3355,10 +3336,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.3" }, "funding": [ { @@ -3374,7 +3355,7 @@ "type": "tidelift" } ], - "time": "2020-11-01T16:14:45+00:00" + "time": "2021-01-27T10:36:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3457,16 +3438,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "bb92ba7f38b037e531908590a858a04d85c0e238" + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/bb92ba7f38b037e531908590a858a04d85c0e238", - "reference": "bb92ba7f38b037e531908590a858a04d85c0e238", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", "shasum": "" }, "require": { @@ -3496,10 +3477,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.0" + "source": "https://github.com/symfony/filesystem/tree/v5.2.3" }, "funding": [ { @@ -3515,20 +3496,20 @@ "type": "tidelift" } ], - "time": "2020-11-12T09:58:18+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/finder", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "fd8305521692f27eae3263895d1ef1571c71a78d" + "reference": "4adc8d172d602008c204c2e16956f99257248e03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/fd8305521692f27eae3263895d1ef1571c71a78d", - "reference": "fd8305521692f27eae3263895d1ef1571c71a78d", + "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", + "reference": "4adc8d172d602008c204c2e16956f99257248e03", "shasum": "" }, "require": { @@ -3557,10 +3538,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.0" + "source": "https://github.com/symfony/finder/tree/v5.2.3" }, "funding": [ { @@ -3576,7 +3557,7 @@ "type": "tidelift" } ], - "time": "2020-11-18T09:42:36+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/flex", @@ -3648,89 +3629,95 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16" + "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0fc0a93f8bbe465d0b483e21b087d432baa92c16", - "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ff455b2afd3f98237d4131ffebe190e59cc0f011", + "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=7.2.5", - "symfony/cache": "^4.4|^5.0", + "symfony/cache": "^5.2", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.0.1", + "symfony/dependency-injection": "^5.2", + "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", + "symfony/http-foundation": "^5.2.1", + "symfony/http-kernel": "^5.2.1", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.0" + "symfony/polyfill-php80": "^1.15", + "symfony/routing": "^5.2" }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<4.4", + "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", - "symfony/console": "<4.4", + "symfony/console": "<5.2", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<4.4", - "symfony/form": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", + "symfony/mailer": "<5.2", "symfony/messenger": "<4.4", "symfony/mime": "<4.4", + "symfony/property-access": "<5.2", "symfony/property-info": "<4.4", - "symfony/serializer": "<4.4", + "symfony/serializer": "<5.2", "symfony/stopwatch": "<4.4", "symfony/translation": "<5.0", "symfony/twig-bridge": "<4.4", "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", + "symfony/validator": "<5.2", "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.4" + "symfony/workflow": "<5.2" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", + "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^4.4|^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.1", "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", + "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^4.4|^5.0", + "symfony/dotenv": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", + "symfony/form": "^5.2", "symfony/http-client": "^4.4|^5.0", "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", + "symfony/mailer": "^5.2", + "symfony/messenger": "^5.2", "symfony/mime": "^4.4|^5.0", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0", + "symfony/serializer": "^5.2", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "~5.0.0", + "symfony/string": "^5.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", + "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", + "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", "twig/twig": "^2.10|^3.0" }, @@ -3745,11 +3732,6 @@ "symfony/yaml": "For using the debug:config and lint:yaml commands" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" @@ -3772,10 +3754,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony FrameworkBundle", + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.0.11" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.3" }, "funding": [ { @@ -3791,7 +3773,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2021-01-27T11:19:04+00:00" }, { "name": "symfony/http-client-contracts", @@ -3874,16 +3856,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", "shasum": "" }, "require": { @@ -3924,10 +3906,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.0" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.3" }, "funding": [ { @@ -3943,20 +3925,20 @@ "type": "tidelift" } ], - "time": "2020-11-27T06:13:25+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "38907e5ccb2d9d371191a946734afc83c7a03160" + "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/38907e5ccb2d9d371191a946734afc83c7a03160", - "reference": "38907e5ccb2d9d371191a946734afc83c7a03160", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", + "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", "shasum": "" }, "require": { @@ -3985,7 +3967,7 @@ "symfony/translation": "<5.0", "symfony/twig-bridge": "<5.0", "symfony/validator": "<5.0", - "twig/twig": "<2.4" + "twig/twig": "<2.13" }, "provide": { "psr/log-implementation": "1.0" @@ -4005,7 +3987,7 @@ "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -4036,10 +4018,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.0" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.3" }, "funding": [ { @@ -4055,7 +4037,7 @@ "type": "tidelift" } ], - "time": "2020-11-30T05:54:18+00:00" + "time": "2021-02-03T04:51:58+00:00" }, { "name": "symfony/orm-pack", @@ -4103,18 +4085,99 @@ ], "time": "2020-07-08T14:31:54+00:00" }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", "shasum": "" }, "require": { @@ -4128,7 +4191,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4172,7 +4235,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" }, "funding": [ { @@ -4188,20 +4251,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "727d1096295d807c309fb01a851577302394c897" + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", - "reference": "727d1096295d807c309fb01a851577302394c897", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", "shasum": "" }, "require": { @@ -4213,7 +4276,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4256,7 +4319,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" }, "funding": [ { @@ -4272,20 +4335,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", "shasum": "" }, "require": { @@ -4297,7 +4360,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4336,7 +4399,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" }, "funding": [ { @@ -4352,20 +4415,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", "shasum": "" }, "require": { @@ -4374,7 +4437,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4415,7 +4478,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" }, "funding": [ { @@ -4431,20 +4494,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", "shasum": "" }, "require": { @@ -4453,7 +4516,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4498,7 +4561,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" }, "funding": [ { @@ -4514,20 +4577,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/routing", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b" + "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/130ac5175ad2fd417978baebd8062e2e6b2bc28b", - "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b", + "url": "https://api.github.com/repos/symfony/routing/zipball/348b5917e56546c6d96adbf21d7f92c9ef563661", + "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661", "shasum": "" }, "require": { @@ -4541,7 +4604,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.7", + "doctrine/annotations": "^1.10.4", "psr/log": "~1.0", "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -4579,7 +4642,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -4588,7 +4651,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.0" + "source": "https://github.com/symfony/routing/tree/v5.2.3" }, "funding": [ { @@ -4604,46 +4667,53 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "825b66f545da95e9bb1626d5655be6693376d52a" + "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/825b66f545da95e9bb1626d5655be6693376d52a", - "reference": "825b66f545da95e9bb1626d5655be6693376d52a", + "url": "https://api.github.com/repos/symfony/serializer/zipball/70c5aa59ab0642033391a5591c9771ee417e7cef", + "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<4.4", "symfony/property-access": "<4.4", "symfony/property-info": "<4.4", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "~1.0", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^4.4|^5.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", + "symfony/property-access": "^4.4.9|^5.0.9", "symfony/property-info": "^4.4|^5.0", + "symfony/uid": "^5.1", "symfony/validator": "^4.4|^5.0", + "symfony/var-exporter": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { @@ -4654,14 +4724,10 @@ "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", "symfony/property-access": "For using the ObjectNormalizer.", "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", "symfony/yaml": "For using the default YAML mapping loader." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Serializer\\": "" @@ -4684,10 +4750,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Serializer Component", + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/5.0" + "source": "https://github.com/symfony/serializer/tree/v5.2.3" }, "funding": [ { @@ -4703,7 +4769,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/service-contracts", @@ -4786,16 +4852,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "2b105c0354f39a63038a1d8bf776ee92852813af" + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2b105c0354f39a63038a1d8bf776ee92852813af", - "reference": "2b105c0354f39a63038a1d8bf776ee92852813af", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", "shasum": "" }, "require": { @@ -4825,10 +4891,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.3" }, "funding": [ { @@ -4844,7 +4910,90 @@ "type": "tidelift" } ], - "time": "2020-11-01T16:14:45+00:00" + "time": "2021-01-27T10:15:41+00:00" + }, + { + "name": "symfony/string", + "version": "v5.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "c95468897f408dd0aca2ff582074423dd0455122" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", + "reference": "c95468897f408dd0aca2ff582074423dd0455122", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-25T15:14:59+00:00" }, { "name": "symfony/translation-contracts", @@ -5043,16 +5192,16 @@ }, { "name": "symfony/twig-bundle", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547" + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/348863cd784b10ea7e1485dc3003c738c6cdf547", - "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", "shasum": "" }, "require": { @@ -5062,18 +5211,18 @@ "symfony/http-kernel": "^5.0", "symfony/polyfill-ctype": "~1.8", "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/dependency-injection": "<4.4", + "symfony/dependency-injection": "<5.2", "symfony/framework-bundle": "<5.0", "symfony/translation": "<5.0" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dependency-injection": "^5.2", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", @@ -5085,11 +5234,6 @@ "symfony/yaml": "^4.4|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\TwigBundle\\": "" @@ -5112,10 +5256,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony TwigBundle", + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.0.9" + "source": "https://github.com/symfony/twig-bundle/tree/v5.2.3" }, "funding": [ { @@ -5131,20 +5275,20 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "173a79c462b1c81e1fa26129f71e41333d846b26" + "reference": "72ca213014a92223a5d18651ce79ef441c12b694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/173a79c462b1c81e1fa26129f71e41333d846b26", - "reference": "173a79c462b1c81e1fa26129f71e41333d846b26", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72ca213014a92223a5d18651ce79ef441c12b694", + "reference": "72ca213014a92223a5d18651ce79ef441c12b694", "shasum": "" }, "require": { @@ -5160,7 +5304,7 @@ "ext-iconv": "*", "symfony/console": "^4.4|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -5196,14 +5340,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony mechanism for exploring and dumping PHP variables", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.3" }, "funding": [ { @@ -5219,20 +5363,20 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" + "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5aed4875ab514c8cb9b6ff4772baa25fa4c10307", + "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307", "shasum": "" }, "require": { @@ -5265,7 +5409,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", "keywords": [ "clone", @@ -5276,7 +5420,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.3" }, "funding": [ { @@ -5292,24 +5436,25 @@ "type": "tidelift" } ], - "time": "2020-10-28T21:31:18+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d" + "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/29b60e88ff11a45b708115004fdeacab1ee3dd5d", - "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/338cddc6d74929f6adf19ca5682ac4b8e109cdb0", + "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5321,12 +5466,10 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" @@ -5349,10 +5492,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/5.0" + "source": "https://github.com/symfony/yaml/tree/v5.2.3" }, "funding": [ { @@ -5368,7 +5511,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "twig/extra-bundle", @@ -5517,65 +5660,6 @@ } ], "time": "2020-10-27T19:28:23+00:00" - }, - { - "name": "webimpress/safe-writer", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/webimpress/safe-writer.git", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.8 || ^9.3.7", - "vimeo/psalm": "^3.14.2", - "webimpress/coding-standard": "^1.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev", - "dev-develop": "2.2.x-dev", - "dev-release-1.0": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Webimpress\\SafeWriter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "Tool to write files safely, to avoid race conditions", - "keywords": [ - "concurrent write", - "file writer", - "race condition", - "safe writer", - "webimpress" - ], - "support": { - "issues": "https://github.com/webimpress/safe-writer/issues", - "source": "https://github.com/webimpress/safe-writer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2020-08-25T07:21:11+00:00" } ], "packages-dev": [ @@ -5831,7 +5915,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4", + "php": "^8.0", "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*" diff --git a/deploy.php b/deploy.php index fde8dbd..8c77b96 100644 --- a/deploy.php +++ b/deploy.php @@ -53,12 +53,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'dump-autoload', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', -// 'database:migrate', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', diff --git a/symfony.lock b/symfony.lock index 2be3183..c14ffcd 100644 --- a/symfony.lock +++ b/symfony.lock @@ -278,7 +278,7 @@ ] }, "symfony/polyfill-intl-grapheme": { - "version": "v1.20.0" + "version": "v1.22.1" }, "symfony/polyfill-intl-idn": { "version": "v1.13.1" @@ -319,7 +319,7 @@ "version": "v5.0.1" }, "symfony/string": { - "version": "v5.1.7" + "version": "v5.2.3" }, "symfony/translation-contracts": { "version": "v2.3.0" From 93cdda4f37b623428ed42e67c22adb759370b300 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 14:17:21 +0100 Subject: [PATCH 056/221] frontend integration --- composer.json | 6 +- composer.lock | 432 +----------------------------- config/bundles.php | 2 - config/packages/test/twig.yaml | 2 - config/packages/twig.yaml | 2 - deploy.php | 6 +- src/Controller/DocsController.php | 2 +- symfony.lock | 26 -- templates/docs.html.twig | 36 --- 9 files changed, 7 insertions(+), 507 deletions(-) delete mode 100644 config/packages/test/twig.yaml delete mode 100644 config/packages/twig.yaml delete mode 100644 templates/docs.html.twig diff --git a/composer.json b/composer.json index ad831ef..01d15b4 100644 --- a/composer.json +++ b/composer.json @@ -17,12 +17,10 @@ "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/twig-bundle": "5.2.*", - "symfony/yaml": "5.2.*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" + "symfony/yaml": "5.2.*" }, "require-dev": { + "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.2" }, diff --git a/composer.lock b/composer.lock index 775e5f3..d0b4f86 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "86856225c36f705ce4978b2de2e986f2", + "content-hash": "f9959688789889158a520e3f2d8b40bd", "packages": [ { "name": "composer/package-versions-deprecated", @@ -4995,288 +4995,6 @@ ], "time": "2021-01-25T15:14:59+00:00" }, - { - "name": "symfony/translation-contracts", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-28T13:05:58+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/909d736d0413a072ebd5db8e0f87b8808efd4849", - "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.1", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.2", - "symfony/workflow": "<5.2" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.1.9", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^5.2", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^4.4|^5.1", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/serializer": "^5.2", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.2", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^5.2", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-28T11:24:18+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.2.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", - "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.13|^3.0.4" - }, - "conflict": { - "symfony/dependency-injection": "<5.2", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^5.2", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a tight integration of Twig into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.2.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T10:15:41+00:00" - }, { "name": "symfony/var-dumper", "version": "v5.2.3", @@ -5512,154 +5230,6 @@ } ], "time": "2021-02-03T04:42:09+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "shasum": "" - }, - "require": { - "php": "^7.1.3|^8.0", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "require-dev": { - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-05-21T09:56:39+00:00" - }, - { - "name": "twig/twig", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/b02fa41f3783a2616eccef7b92fbc2343ffed737", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-10-27T19:28:23+00:00" } ], "packages-dev": [ diff --git a/config/bundles.php b/config/bundles.php index a8152b0..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,6 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], ]; diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml deleted file mode 100644 index 8c6e0b4..0000000 --- a/config/packages/test/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - strict_variables: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml deleted file mode 100644 index b3cdf30..0000000 --- a/config/packages/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - default_path: '%kernel.project_dir%/templates' diff --git a/deploy.php b/deploy.php index 8c77b96..debfba5 100644 --- a/deploy.php +++ b/deploy.php @@ -37,8 +37,8 @@ runLocally('bin/phpunit'); }); -task('dump-autoload', function () { - run('{{bin/composer}} dump-env prod'); +task('deploy:dump-env', function () { + run('cd {{release_path}} && {{bin/composer}} dump-env prod'); }); task( @@ -56,7 +56,7 @@ 'deploy:vendors', 'deploy:cache:clear', 'deploy:cache:warmup', - 'dump-autoload', + 'deploy:dump-env', 'deploy:writable', 'database:migrate', 'deploy:symlink', diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 8c97f70..4d4eed3 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -18,7 +18,7 @@ class DocsController extends AbstractController */ public function docs(): Response { - return $this->render('docs.html.twig'); + return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } /** diff --git a/symfony.lock b/symfony.lock index c14ffcd..7649aa8 100644 --- a/symfony.lock +++ b/symfony.lock @@ -321,26 +321,6 @@ "symfony/string": { "version": "v5.2.3" }, - "symfony/translation-contracts": { - "version": "v2.3.0" - }, - "symfony/twig-bridge": { - "version": "v5.1.7" - }, - "symfony/twig-bundle": { - "version": "5.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "5.0", - "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" - }, - "files": [ - "config/packages/test/twig.yaml", - "config/packages/twig.yaml", - "templates/base.html.twig" - ] - }, "symfony/twig-pack": { "version": "v1.0.2" }, @@ -353,12 +333,6 @@ "symfony/yaml": { "version": "v5.0.1" }, - "twig/extra-bundle": { - "version": "v3.1.0" - }, - "twig/twig": { - "version": "v3.1.0" - }, "webimpress/safe-writer": { "version": "2.0.0" }, diff --git a/templates/docs.html.twig b/templates/docs.html.twig deleted file mode 100644 index 7addae3..0000000 --- a/templates/docs.html.twig +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - API Documentation | TLE API - - -
- - - - - - - - From fff02ea2cab74445e77a3a10f3b5fe853c05890e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 8 Mar 2021 21:04:55 +0100 Subject: [PATCH 057/221] statistics --- src/Entity/Statistic.php | 48 +++++++++++++++++++++++ src/Event/StatisticSubscriber.php | 39 +++++++++++++++++++ src/Migrations/Version20191217203053.php | 5 +++ src/Migrations/Version20210308195105.php | 49 ++++++++++++++++++++++++ src/Repository/StatisticRepository.php | 40 +++++++++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 src/Entity/Statistic.php create mode 100644 src/Event/StatisticSubscriber.php create mode 100644 src/Migrations/Version20210308195105.php create mode 100644 src/Repository/StatisticRepository.php diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php new file mode 100644 index 0000000..ba4c3d5 --- /dev/null +++ b/src/Entity/Statistic.php @@ -0,0 +1,48 @@ +tle = $tle; + } + + public function getHits(): int + { + return $this->hits; + } + + public function setHits(int $hits): void + { + $this->hits = $hits; + } + + public function incrementHits(): void + { + $this->hits++; + } + + public function getTle(): Tle + { + return $this->tle; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php new file mode 100644 index 0000000..7b96450 --- /dev/null +++ b/src/Event/StatisticSubscriber.php @@ -0,0 +1,39 @@ + 'onKernelTerminate', + ]; + } + + public function onKernelTerminate($event): void + { + if ($event->getRequest()->get('_route') !== 'tle_record') { + return; + } + + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); + + if ($statistics === null) { + return; + } + + $statistics->incrementHits(); + + $this->em->flush(); + } +} diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index 4fb03c7..f68c4e8 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -12,6 +12,11 @@ */ final class Version20191217203053 extends AbstractMigration { + public function isTransactional(): bool + { + return false; + } + /** @throws \Exception */ public function up(Schema $schema): void { diff --git a/src/Migrations/Version20210308195105.php b/src/Migrations/Version20210308195105.php new file mode 100644 index 0000000..49feca7 --- /dev/null +++ b/src/Migrations/Version20210308195105.php @@ -0,0 +1,49 @@ +abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql('DROP TABLE statistic'); + } + + public function getDescription(): string + { + return ''; + } + + public function isTransactional(): bool + { + return false; + } + + public function up(Schema $schema): void + { + // this up() migration is auto-generated, please modify it to your needs + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql( + 'CREATE TABLE statistic (tle_id INT NOT NULL, hits BIGINT NOT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB' + ); + $this->addSql('ALTER TABLE statistic ADD CONSTRAINT FK_649B469CE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php new file mode 100644 index 0000000..4c39959 --- /dev/null +++ b/src/Repository/StatisticRepository.php @@ -0,0 +1,40 @@ +getEntityManager()->getRepository(Tle::class)->find($id); + + if ($tle === null) { + return null; + } + + $statistic = new Statistic($tle); + $statistic->setHits(1); + + $this->_em->persist($statistic); + + return $statistic; + } +} From 2bb9d4ab795784072cb6212b5c2a629a69a19c3c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 9 Mar 2021 19:43:38 +0100 Subject: [PATCH 058/221] sort by popularity --- src/Controller/TleController.php | 14 ++++---------- src/Event/StatisticSubscriber.php | 2 +- src/Repository/TleRepository.php | 11 ++++++++++- src/ViewModel/TleCollectionSortableFieldsEnum.php | 3 ++- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index f08d331..6ed6718 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -12,18 +12,14 @@ use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -/** - * @Route("/api/tle") - */ +#[Route("/api/tle")] class TleController extends AbstractApiController { protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; - /** - * @Route("/{id}", name="tle_record", requirements={"id"="\d+"}) - */ + #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record(int $id, TleRepository $repository): Response { /** @var Tle $tle */ @@ -36,9 +32,7 @@ public function record(int $id, TleRepository $repository): Response return $this->response($tle); } - /** - * @Route(name="tle_collection") - */ + #[Route("/", name: "tle_collection")] public function collection(Request $request, TleRepository $repository): Response { $this @@ -51,7 +45,7 @@ public function collection(Request $request, TleRepository $repository): Respons ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 7b96450..60aaf11 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -16,7 +16,7 @@ public function __construct(private StatisticRepository $statisticRepository, pr public static function getSubscribedEvents(): array { return [ - KernelEvents::RESPONSE => 'onKernelTerminate', + KernelEvents::TERMINATE => 'onKernelTerminate', ]; } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 478d10a..7dae0b2 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -2,10 +2,13 @@ namespace App\Repository; +use App\Entity\Statistic; use App\Entity\Tle; use App\ViewModel\Model\PaginationCollection; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; @@ -50,7 +53,12 @@ public function collection( $total = $this->getCount($builder); // sort - $builder->orderBy('tle.' . $sort, $sortDir); + if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { + $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); + $builder->addOrderBy('s.hits', $sortDir); + } else { + $builder->addOrderBy('tle.' . $sort, $sortDir); + } // limit $builder->setMaxResults($pageSize); @@ -69,6 +77,7 @@ private function getCount(QueryBuilder $builder): int $builder = clone $builder; $builder->select('count(tle.id)'); + return $builder->getQuery()->getSingleScalarResult(); } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 51a4f2b..6ba0f01 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -8,4 +8,5 @@ class TleCollectionSortableFieldsEnum extends Enum { public const ID = 'id'; public const NAME = 'name'; -} \ No newline at end of file + public const POPULARITY = 'popularity'; +} From 38a2b720870fa75e7d27876e41dce51c25a5a068 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 9 Mar 2021 19:58:43 +0100 Subject: [PATCH 059/221] sort by popularity --- src/Controller/TleController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 6ed6718..8890ad8 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -46,7 +46,7 @@ public function collection(Request $request, TleRepository $repository): Respons $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); - $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); $collection = $repository->collection( From a842aeda3febd2f7bfa7b5116b06fc81a4760e2b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 10 Mar 2021 19:53:18 +0100 Subject: [PATCH 060/221] cors headers --- src/Controller/AbstractApiController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 7a269f6..36f55de 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -124,6 +124,10 @@ public function response($response): Response [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', + 'Access-Control-Max-Age' => 1728000, ] ); } From 04e87c5ae056a227ed8ad484c3a3a644430375c8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 15:09:01 +0100 Subject: [PATCH 061/221] update sources command --- .env | 2 +- composer.json | 4 +- composer.lock | 401 +++++++++++++++++++++++++- config/custom/source.yaml | 129 +++++---- src/Command/DoctrineReloadCommand.php | 4 +- src/Command/ImportTleCommand.php | 4 +- src/Command/UpdateImportSources.php | 143 +++++++++ symfony.lock | 3 + 8 files changed, 623 insertions(+), 67 deletions(-) create mode 100644 src/Command/UpdateImportSources.php diff --git a/.env b/.env index 5582050..cf87e81 100644 --- a/.env +++ b/.env @@ -25,5 +25,5 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root@localhost:3306/tle?serverVersion=5.7 ###< doctrine/doctrine-bundle ### diff --git a/composer.json b/composer.json index 01d15b4..5711fe3 100644 --- a/composer.json +++ b/composer.json @@ -12,12 +12,14 @@ "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", "symfony/console": "5.2.*", + "symfony/css-selector": "5.2.*", "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*" + "symfony/yaml": "5.2.*", + "ext-dom": "*" }, "require-dev": { "roave/security-advisories": "dev-master", diff --git a/composer.lock b/composer.lock index d0b4f86..c5f3b9d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f9959688789889158a520e3f2d8b40bd", + "content-hash": "497fdffd9e1bb11b9dc94bcd04b9fbd5", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2791,6 +2791,71 @@ ], "time": "2021-01-28T22:06:19+00:00" }, + { + "name": "symfony/css-selector", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:01:46+00:00" + }, { "name": "symfony/dependency-injection", "version": "v5.2.3", @@ -5395,6 +5460,336 @@ ], "time": "2020-11-14T09:36:49+00:00" }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", + "bolt/bolt": "<3.7.1", + "bolt/core": "<4.1.13", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<=6.13.8|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<=7.5.15", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<=2.5.1,>=2.0|<=1.16.13", + "firebase/php-jwt": "<2", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "getkirby/cms": ">=3,<3.4.5", + "getkirby/panel": "<2.5.14", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mittwald/typo3_forum": "<1.2.1", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "orchid/platform": ">=9,<9.4.4", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.12", + "personnummer/personnummer": "<3.0.2", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.16", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.8.8", + "pocketmine/pocketmine-mp": "<3.15.4", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.3.4", + "shopware/platform": "<=6.3.5", + "shopware/shopware": "<5.6.9", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.39", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.49", + "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2021-03-11T18:09:51+00:00" + }, { "name": "symfony/phpunit-bridge", "version": "v5.2.0", @@ -5481,7 +5876,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/config/custom/source.yaml b/config/custom/source.yaml index 0f3b493..79c1987 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,59 +1,70 @@ -- https://celestrak.com/NORAD/elements/tle-new.txt -- https://celestrak.com/NORAD/elements/stations.txt -- https://celestrak.com/NORAD/elements/visual.txt -- https://celestrak.com/NORAD/elements/active.txt -- https://celestrak.com/NORAD/elements/analyst.txt -- https://celestrak.com/NORAD/elements/1999-025.txt -- https://celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://celestrak.com/NORAD/elements/2012-044.txt -- https://celestrak.com/NORAD/elements/weather.txt -- https://celestrak.com/NORAD/elements/noaa.txt -- https://celestrak.com/NORAD/elements/goes.txt -- https://celestrak.com/NORAD/elements/resource.txt -- https://celestrak.com/NORAD/elements/sarsat.txt -- https://celestrak.com/NORAD/elements/dmc.txt -- https://celestrak.com/NORAD/elements/tdrss.txt -- https://celestrak.com/NORAD/elements/argos.txt -- https://celestrak.com/NORAD/elements/planet.txt -- https://celestrak.com/NORAD/elements/spire.txt -- https://celestrak.com/NORAD/elements/geo.txt -- https://celestrak.com/NORAD/elements/intelsat.txt -- https://celestrak.com/NORAD/elements/ses.txt -- https://celestrak.com/NORAD/elements/iridium.txt -- https://celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://celestrak.com/NORAD/elements/orbcomm.txt -- https://celestrak.com/NORAD/elements/globalstar.txt -- https://celestrak.com/NORAD/elements/amateur.txt -- https://celestrak.com/NORAD/elements/x-comm.txt -- https://celestrak.com/NORAD/elements/other-comm.txt -- https://celestrak.com/NORAD/elements/gorizont.txt -- https://celestrak.com/NORAD/elements/raduga.txt -- https://celestrak.com/NORAD/elements/molniya.txt -- https://celestrak.com/NORAD/elements/gps-ops.txt -- https://celestrak.com/NORAD/elements/glo-ops.txt -- https://celestrak.com/NORAD/elements/galileo.txt -- https://celestrak.com/NORAD/elements/beidou.txt -- https://celestrak.com/NORAD/elements/sbas.txt -- https://celestrak.com/NORAD/elements/nnss.txt -- https://celestrak.com/NORAD/elements/musson.txt -- https://celestrak.com/NORAD/elements/science.txt -- https://celestrak.com/NORAD/elements/geodetic.txt -- https://celestrak.com/NORAD/elements/engineering.txt -- https://celestrak.com/NORAD/elements/education.txt -- https://celestrak.com/NORAD/elements/military.txt -- https://celestrak.com/NORAD/elements/radar.txt -- https://celestrak.com/NORAD/elements/cubesat.txt -- https://celestrak.com/NORAD/elements/other.txt -- https://celestrak.com/NORAD/elements/supplemental/starlink.txt -- https://celestrak.com/NORAD/elements/supplemental/oneweb.txt -- https://celestrak.com/NORAD/elements/supplemental/gps.txt -- https://celestrak.com/NORAD/elements/supplemental/glonass.txt -- https://celestrak.com/NORAD/elements/supplemental/meteosat.txt -- https://celestrak.com/NORAD/elements/supplemental/intelsat.txt -- https://celestrak.com/NORAD/elements/supplemental/ses.txt -- https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt -- https://celestrak.com/NORAD/elements/supplemental/cpf.txt -- https://celestrak.com/NORAD/elements/swarm.txt -- https://celestrak.com/satcat/gpz.php -- https://celestrak.com/NORAD/elements/supplemental/planet.txt \ No newline at end of file +- 'https://celestrak.com/NORAD/elements/1999-025.txt' +- 'https://celestrak.com/NORAD/elements/2012-044.txt' +- 'https://celestrak.com/NORAD/elements/2019-006.txt' +- 'https://celestrak.com/NORAD/elements/active.txt' +- 'https://celestrak.com/NORAD/elements/amateur.txt' +- 'https://celestrak.com/NORAD/elements/analyst.txt' +- 'https://celestrak.com/NORAD/elements/argos.txt' +- 'https://celestrak.com/NORAD/elements/beidou.txt' +- 'https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt' +- 'https://celestrak.com/NORAD/elements/cubesat.txt' +- 'https://celestrak.com/NORAD/elements/dmc.txt' +- 'https://celestrak.com/NORAD/elements/education.txt' +- 'https://celestrak.com/NORAD/elements/engineering.txt' +- 'https://celestrak.com/NORAD/elements/galileo.txt' +- 'https://celestrak.com/NORAD/elements/geo.txt' +- 'https://celestrak.com/NORAD/elements/geodetic.txt' +- 'https://celestrak.com/NORAD/elements/glo-ops.txt' +- 'https://celestrak.com/NORAD/elements/globalstar.txt' +- 'https://celestrak.com/NORAD/elements/gnss.txt' +- 'https://celestrak.com/NORAD/elements/goes.txt' +- 'https://celestrak.com/NORAD/elements/gorizont.txt' +- 'https://celestrak.com/NORAD/elements/gps-ops.txt' +- 'https://celestrak.com/NORAD/elements/intelsat.txt' +- 'https://celestrak.com/NORAD/elements/iridium-33-debris.txt' +- 'https://celestrak.com/NORAD/elements/iridium-NEXT.txt' +- 'https://celestrak.com/NORAD/elements/iridium.txt' +- 'https://celestrak.com/NORAD/elements/military.txt' +- 'https://celestrak.com/NORAD/elements/molniya.txt' +- 'https://celestrak.com/NORAD/elements/musson.txt' +- 'https://celestrak.com/NORAD/elements/nnss.txt' +- 'https://celestrak.com/NORAD/elements/noaa.txt' +- 'https://celestrak.com/NORAD/elements/oneweb.txt' +- 'https://celestrak.com/NORAD/elements/orbcomm.txt' +- 'https://celestrak.com/NORAD/elements/other-comm.txt' +- 'https://celestrak.com/NORAD/elements/other.txt' +- 'https://celestrak.com/NORAD/elements/planet.txt' +- 'https://celestrak.com/NORAD/elements/radar.txt' +- 'https://celestrak.com/NORAD/elements/raduga.txt' +- 'https://celestrak.com/NORAD/elements/resource.txt' +- 'https://celestrak.com/NORAD/elements/sarsat.txt' +- 'https://celestrak.com/NORAD/elements/satnogs.txt' +- 'https://celestrak.com/NORAD/elements/sbas.txt' +- 'https://celestrak.com/NORAD/elements/science.txt' +- 'https://celestrak.com/NORAD/elements/ses.txt' +- 'https://celestrak.com/NORAD/elements/spire.txt' +- 'https://celestrak.com/NORAD/elements/starlink.txt' +- 'https://celestrak.com/NORAD/elements/stations.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/cpf.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/glonass.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/gps.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/intelsat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/iss.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/meteosat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/oneweb.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/planet.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/ses.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/starlink-V1.0-20.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/starlink.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/telesat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/glonass.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/glonass_2008_01_25_1300.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/gps.txt' +- 'https://celestrak.com/NORAD/elements/swarm.txt' +- 'https://celestrak.com/NORAD/elements/tdrss.txt' +- 'https://celestrak.com/NORAD/elements/tle-new.txt' +- 'https://celestrak.com/NORAD/elements/visual.txt' +- 'https://celestrak.com/NORAD/elements/weather.txt' +- 'https://celestrak.com/NORAD/elements/x-comm.txt' +- 'https://celestrak.com/satcat/gpz.php' diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 056abd8..3529bfe 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -50,7 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (!\in_array($this->env, self::$envs, true)) { $io->warning('This is intended only for use in dev or test environment.'); - return 1; + return Command::FAILURE; } $application = $this->getApplication(); @@ -79,6 +79,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $application->run(new ArrayInput($options)); } - return 0; + return Command::SUCCESS; } } diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index c8ad83d..5ff15c0 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -21,7 +21,7 @@ final class ImportTleCommand extends Command use FileSystemAwareTrait; private const BATCH_SIZE = 50; - private const SOURCE = '/config/custom/source.yaml'; + public const SOURCE = '/config/custom/source.yaml'; private EntityManagerInterface $em; private TleRepository $repository; @@ -120,7 +120,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ); $table->render(); - return 0; + return Command::SUCCESS; } protected function toPersistent(TleModel $model): Tle diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php new file mode 100644 index 0000000..451b329 --- /dev/null +++ b/src/Command/UpdateImportSources.php @@ -0,0 +1,143 @@ +setName('tle:source'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->io = new SymfonyStyle($input, $output); + + $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; + + $this->sources = Yaml::parseFile($sourceFile); + + $newSources = $this->getSources(); + + $diff = array_diff($newSources, $this->sources); + + if (empty($diff)) { + $this->io->success('No new tle sources found'); + + return Command::SUCCESS; + } + + $this->io->writeln(""); + $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); + $this->io->writeln(""); + foreach ($diff as $url) { + $this->io->writeln($url); + } + + $this->io->writeln(""); + + $sources = array_merge($this->sources, $diff); + sort($sources); + + $yaml = Yaml::dump($sources); + + file_put_contents($sourceFile, $yaml); + + return Command::SUCCESS; + } + + protected function getSources(): array + { + $result = []; + + foreach (self::CATALOG as $catalog) { + $response = (new Client())->request('GET', $catalog); + + $crawler = new Crawler($response->getBody()->getContents()); + + /** @var DOMElement $anchor */ + foreach ($crawler->filter('a') as $anchor) { + $href = $anchor->getAttribute('href'); + $path = parse_url($href, PHP_URL_PATH); + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($extension === 'txt') { + if (parse_url($href, PHP_URL_HOST) === null) { + if ($path[0] === '/') { + $scheme = parse_url($catalog, PHP_URL_SCHEME); + $host = parse_url($catalog, PHP_URL_HOST); + $href = $scheme . '://' . $host . $href; + } else { + $href = $catalog . trim($href, '/'); + } + } + + if (!$this->isIgnored($href)) { + $this->io->writeln(\sprintf('Verifying url: %s', $href)); + if ($this->isHealthy($href)) { + $result[] = $href; + } + } + } + } + } + + return $result; + } + + protected function isIgnored(string $url): bool + { + return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); + } + + protected function isHealthy(string $url): bool + { + try { + $response = (new Client())->request('GET', $url); + + return $response->getStatusCode() === 200; + } catch (\Exception) { + return false; + } + } +} diff --git a/symfony.lock b/symfony.lock index 7649aa8..4aca444 100644 --- a/symfony.lock +++ b/symfony.lock @@ -187,6 +187,9 @@ "config/bootstrap.php" ] }, + "symfony/css-selector": { + "version": "v5.2.4" + }, "symfony/dependency-injection": { "version": "v5.0.1" }, From 584e33c84d3ecab78be2a15596e4840f894f241a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 15:47:11 +0100 Subject: [PATCH 062/221] update sources command --- .env | 2 +- .env.test | 2 +- .gitignore | 2 + README.md | 6 +- composer.json | 4 +- composer.lock | 433 +++++++++++------------ docs/tle.html | 56 --- phpunit.xml.dist | 33 -- public/index.html | 0 src/Controller/AbstractApiController.php | 18 +- src/Controller/TleController.php | 19 +- src/Serializer/TleModelNormalizer.php | 13 +- symfony.lock | 12 + tests/TleTest.php | 16 +- 14 files changed, 272 insertions(+), 344 deletions(-) delete mode 100644 docs/tle.html delete mode 100644 phpunit.xml.dist create mode 100644 public/index.html diff --git a/.env b/.env index cf87e81..5f55762 100644 --- a/.env +++ b/.env @@ -25,5 +25,5 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root@localhost:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### diff --git a/.env.test b/.env.test index 8f679b3..a68eadb 100644 --- a/.env.test +++ b/.env.test @@ -3,4 +3,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther -DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 \ No newline at end of file +DATABASE_URL=mysql://root:root@127.0.0.1:3306/tle?serverVersion=5.7 diff --git a/.gitignore b/.gitignore index e56d049..4ea500f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### + +public/index.html diff --git a/README.md b/README.md index eadcee5..7f82184 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/si ## Usage Further documentation and response examples are available at: -http://data.ivanstanojevic.me/api/tle/docs +http://tle.ivanstanojevic.me/api/tle/docs ###Available endpoints -The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` +The TLE API consists of two endpoints `GET http://tle.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| @@ -30,7 +30,7 @@ The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` | `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | Example query -http://data.ivanstanojevic.me/api/tle +http://tle.ivanstanojevic.me/api/tle # Client libraries diff --git a/composer.json b/composer.json index 5711fe3..325f044 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,7 @@ "require": { "php": "^8.0", "ext-ctype": "*", + "ext-dom": "*", "ext-iconv": "*", "ext-json": "*", "ivanstan/tle-php": "^1.0.2", @@ -18,8 +19,7 @@ "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*", - "ext-dom": "*" + "symfony/yaml": "5.2.*" }, "require-dev": { "roave/security-advisories": "dev-master", diff --git a/composer.lock b/composer.lock index c5f3b9d..314a685 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "497fdffd9e1bb11b9dc94bcd04b9fbd5", + "content-hash": "e6d04bc24eedc3ec7826c480308b3b26", "packages": [ { "name": "composer/package-versions-deprecated", @@ -520,16 +520,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.2.3", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "015fdd490074d4daa891e2d1df998dc35ba54924" + "reference": "8b922578bdee2243a26202b13df795e170efaef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/015fdd490074d4daa891e2d1df998dc35ba54924", - "reference": "015fdd490074d4daa891e2d1df998dc35ba54924", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/8b922578bdee2243a26202b13df795e170efaef8", + "reference": "8b922578bdee2243a26202b13df795e170efaef8", "shasum": "" }, "require": { @@ -610,7 +610,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.3" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.0" }, "funding": [ { @@ -626,7 +626,7 @@ "type": "tidelift" } ], - "time": "2021-01-19T20:29:53+00:00" + "time": "2021-03-16T16:24:04+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1054,16 +1054,16 @@ }, { "name": "doctrine/migrations", - "version": "2.3.2", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735" + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/39520699043d9bfaaebeb81fa026bf2b02a8f735", - "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/c4c46f7064f6e7795bd7f26549579918b46790fa", + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa", "shasum": "" }, "require": { @@ -1134,7 +1134,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.3.2" + "source": "https://github.com/doctrine/migrations/tree/2.3.3" }, "funding": [ { @@ -1150,7 +1150,7 @@ "type": "tidelift" } ], - "time": "2020-12-23T14:06:04+00:00" + "time": "2021-03-14T10:22:48+00:00" }, { "name": "doctrine/orm", @@ -1540,16 +1540,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { @@ -1589,22 +1589,22 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.0" + "source": "https://github.com/guzzle/promises/tree/1.4.1" }, - "time": "2020-09-30T07:37:28+00:00" + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", + "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", "shasum": "" }, "require": { @@ -1664,9 +1664,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.7.0" + "source": "https://github.com/guzzle/psr7/tree/1.8.1" }, - "time": "2020-09-30T07:37:11+00:00" + "time": "2021-03-21T16:25:00+00:00" }, { "name": "ivanstan/tle-php", @@ -1787,16 +1787,16 @@ }, { "name": "laminas/laminas-eventmanager", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/966c859b67867b179fde1eff0cd38df51472ce4a", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a", "shasum": "" }, "require": { @@ -1818,12 +1818,6 @@ "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev", - "dev-develop": "3.4.x-dev" - } - }, "autoload": { "psr-4": { "Laminas\\EventManager\\": "src/" @@ -1855,28 +1849,30 @@ "type": "community_bridge" } ], - "time": "2020-08-25T11:10:44+00:00" + "time": "2021-03-08T15:24:29+00:00" }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32", + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.3 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { @@ -1915,7 +1911,7 @@ "type": "community_bridge" } ], - "time": "2020-09-14T14:23:00+00:00" + "time": "2021-02-25T21:54:58+00:00" }, { "name": "myclabs/php-enum", @@ -2028,27 +2024,22 @@ }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -2061,7 +2052,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -2075,9 +2066,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/event-dispatcher", @@ -2304,7 +2295,7 @@ }, { "name": "symfony/asset", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", @@ -2353,7 +2344,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.2.3" + "source": "https://github.com/symfony/asset/tree/v5.2.4" }, "funding": [ { @@ -2373,16 +2364,16 @@ }, { "name": "symfony/browser-kit", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd" + "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", - "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3ca3a57ce9860318b20a924fec5daf5c6db44d93", + "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93", "shasum": "" }, "require": { @@ -2424,7 +2415,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.2.3" + "source": "https://github.com/symfony/browser-kit/tree/v5.2.4" }, "funding": [ { @@ -2440,25 +2431,25 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-02-22T06:48:33+00:00" }, { "name": "symfony/cache", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388" + "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d6aed6c1bbf6f59e521f46437475a0ff4878d388", - "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388", + "url": "https://api.github.com/repos/symfony/cache/zipball/d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", + "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0", "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", "symfony/polyfill-php80": "^1.15", @@ -2472,9 +2463,9 @@ "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "1.0", + "psr/cache-implementation": "1.0|2.0", "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", @@ -2519,7 +2510,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.3" + "source": "https://github.com/symfony/cache/tree/v5.2.4" }, "funding": [ { @@ -2535,7 +2526,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T11:24:50+00:00" + "time": "2021-02-25T23:54:56+00:00" }, { "name": "symfony/cache-contracts", @@ -2618,16 +2609,16 @@ }, { "name": "symfony/config", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab" + "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", - "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", + "url": "https://api.github.com/repos/symfony/config/zipball/212d54675bf203ff8aef7d8cee8eecfb72f4a263", + "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263", "shasum": "" }, "require": { @@ -2676,7 +2667,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.3" + "source": "https://github.com/symfony/config/tree/v5.2.4" }, "funding": [ { @@ -2692,20 +2683,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-02-23T23:58:19+00:00" }, { "name": "symfony/console", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a" + "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a", + "url": "https://api.github.com/repos/symfony/console/zipball/938ebbadae1b0a9c9d1ec313f87f9708609f1b79", + "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79", "shasum": "" }, "require": { @@ -2773,7 +2764,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.3" + "source": "https://github.com/symfony/console/tree/v5.2.5" }, "funding": [ { @@ -2789,7 +2780,7 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-03-06T13:42:15+00:00" }, { "name": "symfony/css-selector", @@ -2858,16 +2849,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "62f72187be689540385dce6c68a5d4c16f034139" + "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/62f72187be689540385dce6c68a5d4c16f034139", - "reference": "62f72187be689540385dce6c68a5d4c16f034139", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be0c7926f5729b15e4e79fd2bf917cac584b1970", + "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970", "shasum": "" }, "require": { @@ -2885,7 +2876,7 @@ }, "provide": { "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { "symfony/config": "^5.1", @@ -2925,7 +2916,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.3" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.5" }, "funding": [ { @@ -2941,7 +2932,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-03-05T20:13:41+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3012,16 +3003,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "c348e596f49df406a7c0a51443864038b3137cac" + "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c348e596f49df406a7c0a51443864038b3137cac", - "reference": "c348e596f49df406a7c0a51443864038b3137cac", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", + "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", "shasum": "" }, "require": { @@ -3106,7 +3097,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.3" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.5" }, "funding": [ { @@ -3122,20 +3113,20 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-06T13:35:24+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.2.0", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c" + "reference": "400e265163f65aceee7e904ef532e15228de674b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0969122fe144dd8ab2e8c98c7e03eedc621b368c", - "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/400e265163f65aceee7e904ef532e15228de674b", + "reference": "400e265163f65aceee7e904ef532e15228de674b", "shasum": "" }, "require": { @@ -3177,10 +3168,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.2.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.2.4" }, "funding": [ { @@ -3196,11 +3187,11 @@ "type": "tidelift" } ], - "time": "2020-10-24T12:01:57+00:00" + "time": "2021-02-15T18:55:04+00:00" }, { "name": "symfony/dotenv", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", @@ -3250,7 +3241,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.2.3" + "source": "https://github.com/symfony/dotenv/tree/v5.2.4" }, "funding": [ { @@ -3270,16 +3261,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d" + "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48f18b3609e120ea66d59142c23dc53e9562c26d", - "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/b547d3babcab5c31e01de59ee33e9d9c1421d7d0", + "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0", "shasum": "" }, "require": { @@ -3319,7 +3310,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.3" + "source": "https://github.com/symfony/error-handler/tree/v5.2.4" }, "funding": [ { @@ -3335,20 +3326,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-02-11T08:21:20+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367" + "reference": "d08d6ec121a425897951900ab692b612a61d6240" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d08d6ec121a425897951900ab692b612a61d6240", + "reference": "d08d6ec121a425897951900ab692b612a61d6240", "shasum": "" }, "require": { @@ -3404,7 +3395,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4" }, "funding": [ { @@ -3420,7 +3411,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:36:42+00:00" + "time": "2021-02-18T17:12:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3503,16 +3494,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" + "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/710d364200997a5afde34d9fe57bd52f3cc1e108", + "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108", "shasum": "" }, "require": { @@ -3545,7 +3536,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.3" + "source": "https://github.com/symfony/filesystem/tree/v5.2.4" }, "funding": [ { @@ -3561,20 +3552,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-02-12T10:38:38+00:00" }, { "name": "symfony/finder", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4adc8d172d602008c204c2e16956f99257248e03" + "reference": "0d639a0943822626290d169965804f79400e6a04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", - "reference": "4adc8d172d602008c204c2e16956f99257248e03", + "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", + "reference": "0d639a0943822626290d169965804f79400e6a04", "shasum": "" }, "require": { @@ -3606,7 +3597,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.3" + "source": "https://github.com/symfony/finder/tree/v5.2.4" }, "funding": [ { @@ -3622,20 +3613,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-02-15T18:55:04+00:00" }, { "name": "symfony/flex", - "version": "v1.11.0", + "version": "v1.12.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48" + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", - "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", + "url": "https://api.github.com/repos/symfony/flex/zipball/e472606b4b3173564f0edbca8f5d32b52fc4f2c9", + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9", "shasum": "" }, "require": { @@ -3652,7 +3643,7 @@ "type": "composer-plugin", "extra": { "branch-alias": { - "dev-main": "1.9-dev" + "dev-main": "1.12-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -3674,7 +3665,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.11.0" + "source": "https://github.com/symfony/flex/tree/v1.12.2" }, "funding": [ { @@ -3690,20 +3681,20 @@ "type": "tidelift" } ], - "time": "2020-12-03T10:57:35+00:00" + "time": "2021-02-16T14:05:05+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011" + "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ff455b2afd3f98237d4131ffebe190e59cc0f011", - "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4dae531503072a57cf26f7f4beb4c3ef8a061f8f", + "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f", "shasum": "" }, "require": { @@ -3730,7 +3721,7 @@ "phpunit/phpunit": "<5.4.3", "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", - "symfony/console": "<5.2", + "symfony/console": "<5.2.5", "symfony/dom-crawler": "<4.4", "symfony/dotenv": "<5.1", "symfony/form": "<5.2", @@ -3773,6 +3764,7 @@ "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", "symfony/security-bundle": "^5.1", + "symfony/security-core": "^4.4|^5.2", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^5.2", @@ -3822,7 +3814,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.3" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" }, "funding": [ { @@ -3838,7 +3830,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T11:19:04+00:00" + "time": "2021-03-09T08:47:49+00:00" }, { "name": "symfony/http-client-contracts", @@ -3921,16 +3913,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" + "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", - "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf", + "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf", "shasum": "" }, "require": { @@ -3974,7 +3966,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.3" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.4" }, "funding": [ { @@ -3990,20 +3982,20 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-02-25T17:16:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05" + "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", - "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", + "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", "shasum": "" }, "require": { @@ -4038,7 +4030,7 @@ "psr/log-implementation": "1.0" }, "require-dev": { - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^4.4|^5.0", "symfony/config": "^5.0", "symfony/console": "^4.4|^5.0", @@ -4086,7 +4078,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.3" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.5" }, "funding": [ { @@ -4102,7 +4094,7 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:51:58+00:00" + "time": "2021-03-10T17:07:35+00:00" }, { "name": "symfony/orm-pack", @@ -4646,16 +4638,16 @@ }, { "name": "symfony/routing", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661" + "reference": "cafa138128dfd6ab6be1abf6279169957b34f662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/348b5917e56546c6d96adbf21d7f92c9ef563661", - "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661", + "url": "https://api.github.com/repos/symfony/routing/zipball/cafa138128dfd6ab6be1abf6279169957b34f662", + "reference": "cafa138128dfd6ab6be1abf6279169957b34f662", "shasum": "" }, "require": { @@ -4716,7 +4708,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.3" + "source": "https://github.com/symfony/routing/tree/v5.2.4" }, "funding": [ { @@ -4732,20 +4724,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-02-22T15:48:39+00:00" }, { "name": "symfony/serializer", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef" + "reference": "a285f474a72397ccbd384900abc968ffcb511dda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/70c5aa59ab0642033391a5591c9771ee417e7cef", - "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a285f474a72397ccbd384900abc968ffcb511dda", + "reference": "a285f474a72397ccbd384900abc968ffcb511dda", "shasum": "" }, "require": { @@ -4818,7 +4810,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.2.3" + "source": "https://github.com/symfony/serializer/tree/v5.2.4" }, "funding": [ { @@ -4834,7 +4826,7 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-02T12:14:02+00:00" }, { "name": "symfony/service-contracts", @@ -4917,7 +4909,7 @@ }, { "name": "symfony/stopwatch", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -4959,7 +4951,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.3" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.4" }, "funding": [ { @@ -4979,16 +4971,16 @@ }, { "name": "symfony/string", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c95468897f408dd0aca2ff582074423dd0455122" + "reference": "4e78d7d47061fa183639927ec40d607973699609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", - "reference": "c95468897f408dd0aca2ff582074423dd0455122", + "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609", + "reference": "4e78d7d47061fa183639927ec40d607973699609", "shasum": "" }, "require": { @@ -5042,7 +5034,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.3" + "source": "https://github.com/symfony/string/tree/v5.2.4" }, "funding": [ { @@ -5058,20 +5050,20 @@ "type": "tidelift" } ], - "time": "2021-01-25T15:14:59+00:00" + "time": "2021-02-16T10:20:28+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "72ca213014a92223a5d18651ce79ef441c12b694" + "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72ca213014a92223a5d18651ce79ef441c12b694", - "reference": "72ca213014a92223a5d18651ce79ef441c12b694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/002ab5a36702adf0c9a11e6d8836623253e9045e", + "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e", "shasum": "" }, "require": { @@ -5130,7 +5122,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.5" }, "funding": [ { @@ -5146,11 +5138,11 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-03-06T07:59:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", @@ -5203,7 +5195,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.3" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.4" }, "funding": [ { @@ -5223,16 +5215,16 @@ }, { "name": "symfony/yaml", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0" + "reference": "298a08ddda623485208506fcee08817807a251dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/338cddc6d74929f6adf19ca5682ac4b8e109cdb0", - "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", + "reference": "298a08ddda623485208506fcee08817807a251dd", "shasum": "" }, "require": { @@ -5278,7 +5270,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.2.3" + "source": "https://github.com/symfony/yaml/tree/v5.2.5" }, "funding": [ { @@ -5294,22 +5286,22 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-06T07:59:01+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.4", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "16a03fadb5473f49aad70384002dfd5012fe680e" + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/16a03fadb5473f49aad70384002dfd5012fe680e", - "reference": "16a03fadb5473f49aad70384002dfd5012fe680e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", "shasum": "" }, "require": { @@ -5321,11 +5313,12 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/dbal": "^2.5.4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", - "phpunit/phpunit": "^7.0" + "ext-sqlite3": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -5334,11 +5327,6 @@ "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" @@ -5361,7 +5349,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.4.x" + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" }, "funding": [ { @@ -5377,7 +5365,7 @@ "type": "tidelift" } ], - "time": "2020-09-01T07:13:28+00:00" + "time": "2021-01-23T10:20:43+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -5466,12 +5454,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec" + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", - "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11b8a607a59818bb21fc9ffb334f03032a6ce5dc", + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc", "shasum": "" }, "conflict": { @@ -5530,10 +5518,10 @@ "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<=6.13.8|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<=7.5.15", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", @@ -5561,6 +5549,7 @@ "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", "joomla/archive": "<1.1.10", @@ -5636,7 +5625,7 @@ "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.5", + "shopware/platform": "<=6.3.5.1", "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", @@ -5672,6 +5661,7 @@ "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -5708,8 +5698,8 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", @@ -5788,20 +5778,20 @@ "type": "tidelift" } ], - "time": "2021-03-11T18:09:51+00:00" + "time": "2021-03-19T20:02:32+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.0", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0" + "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/92a76ca5e64effd41ce111b8f476144dfa29f1f0", - "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/9d85d900c1afe29138a0d5854505eb684bc3ac6d", + "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d", "shasum": "" }, "require": { @@ -5852,10 +5842,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PHPUnit Bridge", + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.4" }, "funding": [ { @@ -5871,7 +5861,7 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-02-04T18:05:54+00:00" } ], "aliases": [], @@ -5884,6 +5874,7 @@ "platform": { "php": "^8.0", "ext-ctype": "*", + "ext-dom": "*", "ext-iconv": "*", "ext-json": "*" }, diff --git a/docs/tle.html b/docs/tle.html deleted file mode 100644 index 9267052..0000000 --- a/docs/tle.html +++ /dev/null @@ -1,56 +0,0 @@ -

TLE API

- -

The TLE API provides up to date two line element set records, the data is updated daily from CelesTrak - and served in JSON format. - A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a - given point in time. For more information on TLE data format visit Definition - of Two-line Element Set Coordinate System. -

- -

Further documentation and response examples are available at: - http://data.ivanstanojevic.me/ - - api/tle/docs -

- -

Available endpoints

-

- The TLE API consists of two endpoints - - GET http://data.ivanstanojevic.me - -

- - - - - - - - - - - - - - - - - - -
EndpointDescription
GET /api/tle?search={q}Performing a search by satellite name
GET /api/tle/{q}Retrieving a single TLE record where query is satellite number
- -

Example query

-

- - - http://data.ivanstanojevic.me/ - - api/tle - - -

diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index 5b7c820..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - tests - - - - - - src - - - - - - - diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e69de29 diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 36f55de..0e5ce68 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,6 +14,15 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + protected const CORS_HEADERS = [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', + 'Access-Control-Max-Age' => 1728000, + ]; + protected const SORT_PARAM = 'sort'; protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; @@ -121,14 +130,7 @@ public function response($response): Response return new Response( $this->serializer->serialize($response, 'json'), Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - 'Access-Control-Allow-Credentials' => 'true', - 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', - 'Access-Control-Max-Age' => 1728000, - ] + self::CORS_HEADERS ); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 8890ad8..bff1611 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -6,11 +6,13 @@ use App\Repository\TleRepository; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[Route("/api/tle")] class TleController extends AbstractApiController @@ -20,8 +22,11 @@ class TleController extends AbstractApiController protected const PAGE_SIZE = 20; #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] - public function record(int $id, TleRepository $repository): Response - { + public function record( + int $id, + TleRepository $repository, + NormalizerInterface $normalizer + ): Response { /** @var Tle $tle */ $tle = $repository->findOneBy(['id' => $id]); @@ -29,7 +34,15 @@ public function record(int $id, TleRepository $repository): Response throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); } - return $this->response($tle); + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + ]; + + return new JsonResponse( + array_merge($data, $normalizer->normalize($tle)), + Response::HTTP_OK, + self::CORS_HEADERS, + ); } #[Route("/", name: "tle_collection")] diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 6cb79c1..7134a94 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -9,19 +9,16 @@ class TleModelNormalizer implements NormalizerInterface { - private UrlGeneratorInterface $router; - - public function __construct(UrlGeneratorInterface $router) + public function __construct(private UrlGeneratorInterface $router) { - $this->router = $router; } /** - * @param TleModel $model - * @param null $format - * @param array $context + * @param $entity + * @param string|null $format + * @param array $context * - * @return array|bool|float|int|string + * @return array */ public function normalize($entity, string $format = null, array $context = []) { diff --git a/symfony.lock b/symfony.lock index 4aca444..65c7ee3 100644 --- a/symfony.lock +++ b/symfony.lock @@ -117,6 +117,18 @@ "myclabs/php-enum": { "version": "1.7.2" }, + "nelmio/cors-bundle": { + "version": "1.5", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.5", + "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" + }, + "files": [ + "config/packages/nelmio_cors.yaml" + ] + }, "ocramius/package-versions": { "version": "1.5.1" }, diff --git a/tests/TleTest.php b/tests/TleTest.php index a557992..022982a 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -54,16 +54,16 @@ public function testTleCollectionRecord(): void $response = $this->toArray($response); self::assertArrayHasKey('@context', $response); - self::assertEquals($response['@context'], 'http://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals('http://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); - self::assertEquals($response['@id'], 'http://localhost/api/tle'); + self::assertEquals('http://localhost/api/tle', $response['@id']); self::assertArrayHasKey('@type', $response); - self::assertEquals($response['@type'], 'Collection'); + self::assertEquals('Collection', $response['@type']); self::assertArrayHasKey('totalItems', $response); - self::assertEquals($response['totalItems'], 10); + self::assertEquals(10, $response['totalItems']); self::assertArrayHasKey('member', $response); self::assertEquals(\count($response['member']), $pageSize); @@ -72,16 +72,16 @@ public function testTleCollectionRecord(): void $parameters = $response['parameters']; self::assertArrayHasKey('search', $parameters); - self::assertEquals($parameters['search'], '*'); + self::assertEquals('*', $parameters['search']); self::assertArrayHasKey('sort', $parameters); - self::assertEquals($parameters['sort'], 'name'); + self::assertEquals('name', $parameters['sort']); self::assertArrayHasKey('sort-dir', $parameters); - self::assertEquals($parameters['sort-dir'], 'asc'); + self::assertEquals('asc', $parameters['sort-dir']); self::assertArrayHasKey('page', $parameters); - self::assertEquals($parameters['page'], 1); + self::assertEquals(1, $parameters['page']); self::assertArrayHasKey('page-size', $parameters); self::assertEquals($parameters['page-size'], $pageSize); From ab2ad584f958a3347dde37a519784b2420d221c3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 16:01:56 +0100 Subject: [PATCH 063/221] add request --- src/Entity/Request.php | 68 ++++++++++++++++++++++++ src/Event/StatisticSubscriber.php | 18 ++++++- src/Migrations/Version20210322150028.php | 36 +++++++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/Entity/Request.php create mode 100644 src/Migrations/Version20210322150028.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php new file mode 100644 index 0000000..5bcaaaa --- /dev/null +++ b/src/Entity/Request.php @@ -0,0 +1,68 @@ +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 60aaf11..c2f171a 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -2,14 +2,17 @@ namespace App\Event; +use App\Entity\Request; +use App\Entity\Tle; use App\Repository\StatisticRepository; +use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\KernelEvents; class StatisticSubscriber implements EventSubscriberInterface { - public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em) + public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -26,6 +29,13 @@ public function onKernelTerminate($event): void return; } + /** @var Tle|null $tle */ + $tle = $this->tleRepository->find($event->getRequest()->get('id')); + + if ($tle === null) { + return; + } + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); if ($statistics === null) { @@ -34,6 +44,12 @@ public function onKernelTerminate($event): void $statistics->incrementHits(); + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + $this->em->flush(); } } diff --git a/src/Migrations/Version20210322150028.php b/src/Migrations/Version20210322150028.php new file mode 100644 index 0000000..358185d --- /dev/null +++ b/src/Migrations/Version20210322150028.php @@ -0,0 +1,36 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE request ADD CONSTRAINT FK_3B978F9FE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE request'); + } +} From 17facd9e2e2751395b21220884f969d721659539 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 16:12:15 +0100 Subject: [PATCH 064/221] add request --- src/Entity/Request.php | 2 +- src/Event/StatisticSubscriber.php | 14 ++++++++------ ...0210322150028.php => Version20210322151101.php} | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) rename src/Migrations/{Version20210322150028.php => Version20210322151101.php} (83%) diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 5bcaaaa..d39c0a5 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -22,7 +22,7 @@ class Request private int $id; /** - * @ORM\OneToOne(targetEntity="Tle") + * @ORM\ManyToOne(targetEntity="Tle") * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) */ private Tle $tle; diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index c2f171a..51f509b 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -36,6 +36,14 @@ public function onKernelTerminate($event): void return; } + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + + $this->em->flush(); + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); if ($statistics === null) { @@ -44,12 +52,6 @@ public function onKernelTerminate($event): void $statistics->incrementHits(); - $request = new Request(); - $request->setTle($tle); - $request->setIp($event->getRequest()->getClientIp()); - - $this->em->persist($request); - $this->em->flush(); } } diff --git a/src/Migrations/Version20210322150028.php b/src/Migrations/Version20210322151101.php similarity index 83% rename from src/Migrations/Version20210322150028.php rename to src/Migrations/Version20210322151101.php index 358185d..2d95f5d 100644 --- a/src/Migrations/Version20210322150028.php +++ b/src/Migrations/Version20210322151101.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20210322150028 extends AbstractMigration +final class Version20210322151101 extends AbstractMigration { public function getDescription() : string { @@ -22,7 +22,7 @@ public function up(Schema $schema) : void // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, INDEX IDX_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); $this->addSql('ALTER TABLE request ADD CONSTRAINT FK_3B978F9FE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); } From 7866c54450475cd70208a44e6bd547e49c27b253 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 19:57:54 +0100 Subject: [PATCH 065/221] gzip --- public/.htaccess | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/public/.htaccess b/public/.htaccess index 37fbfb3..e621e50 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -17,6 +17,37 @@ Options -MultiViews + + # Compress HTML, CSS, JavaScript, Text, XML and fonts + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + + # Remove browser bugs (only needed for really old browsers) + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + Header append Vary User-Agent + + RewriteEngine On From 60184f6cfa8cf518b8f4d41ef5a432650c09b752 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 08:28:27 +0100 Subject: [PATCH 066/221] gzip --- public/.htaccess | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/.htaccess b/public/.htaccess index e621e50..9c8c42f 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -65,6 +65,9 @@ RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] + RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] + RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L] + # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an From e8ffef87438a8e4f934346acef2385d81647377a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 08:33:20 +0100 Subject: [PATCH 067/221] add sentry --- .env | 4 + composer.json | 1 + composer.lock | 1550 ++++++++++++++++++++++++++++++++--- config/bundles.php | 1 + config/packages/sentry.yaml | 2 + symfony.lock | 12 + 6 files changed, 1471 insertions(+), 99 deletions(-) create mode 100644 config/packages/sentry.yaml diff --git a/.env b/.env index 5f55762..628129e 100644 --- a/.env +++ b/.env @@ -27,3 +27,7 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index 325f044..a6bb34d 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "ext-json": "*", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", + "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", diff --git a/composer.lock b/composer.lock index 314a685..e71770d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,74 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e6d04bc24eedc3ec7826c480308b3b26", + "content-hash": "4d907021f971067b7e8ead6351e31ca9", "packages": [ + { + "name": "clue/stream-filter", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-10-02T12:38:20+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.1", @@ -1668,6 +1734,60 @@ }, "time": "2021-03-21T16:25:00+00:00" }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.4.2", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.5", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" + }, + "time": "2018-07-31T19:32:56+00:00" + }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1714,6 +1834,65 @@ }, "time": "2021-02-25T11:17:02+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + }, + "time": "2021-02-22T10:52:38+00:00" + }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -1974,31 +2153,54 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "php-http/client-common", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/php-http/client-common.git", + "reference": "e37e46c610c87519753135fb893111798c69076a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", + "reference": "e37e46c610c87519753135fb893111798c69076a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.0", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2007,42 +2209,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "cache", - "psr", - "psr-6" + "client", + "common", + "http", + "httplug" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.3.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2020-07-21T10:04:13+00:00" }, { - "name": "psr/container", - "version": "1.1.1", + "name": "php-http/discovery", + "version": "1.13.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/php-http/discovery.git", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Http\\Discovery\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2051,51 +2275,60 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.13.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2020-11-27T14:49:42+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "php-http/httplug", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-http/httplug.git", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2104,49 +2337,77 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Standard interfaces for event handling.", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "events", - "psr", - "psr-14" + "client", + "http" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/master" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2020-07-13T15:43:23+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "php-http/message", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/php-http/message.git", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", "shasum": "" }, "require": { - "php": ">=5.3.0" + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" - } + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2154,51 +2415,50 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "message", + "psr-7" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.11.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2021-02-01T08:54:58+00:00" }, { - "name": "psr/log", - "version": "1.1.3", + "name": "php-http/message-factory", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.4", + "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2207,28 +2467,445 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", "keywords": [ - "log", - "psr", - "psr-3" + "factory", + "http", + "message", + "stream", + "uri" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2015-12-19T14:08:53+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "php-http/promise", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { @@ -2267,6 +2944,270 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "sentry/sdk", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.1", + "symfony/http-client": "^4.3|^5.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2020-12-01T10:31:45+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "899b0de58c1e01feb54829b3094af74252aff385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", + "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7", + "jean85/pretty-package-versions": "^1.5|^2.0.1", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.6.1", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-factory": "^1.0", + "psr/http-message-implementation": "^1.0", + "psr/log": "^1.0", + "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", + "symfony/polyfill-php80": "^1.17", + "symfony/polyfill-uuid": "^1.13.1" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.3|^2.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5.13|^9.4", + "symfony/phpunit-bridge": "^5.2", + "vimeo/psalm": "^4.2" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T11:54:34+00:00" + }, + { + "name": "sentry/sentry-symfony", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-symfony.git", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.5 || ^2.0", + "php": "^7.2||^8.0", + "php-http/discovery": "^1.11", + "sentry/sdk": "^3.1", + "symfony/config": "^3.4.43||^4.4.11||^5.0.11", + "symfony/console": "^3.4.43||^4.4.11||^5.0.11", + "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", + "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", + "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", + "symfony/psr-http-message-bridge": "^2.0", + "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jangregor/phpstan-prophecy": "^0.8", + "monolog/monolog": "^1.3||^2.0", + "phpspec/prophecy": "!=1.11.0", + "phpspec/prophecy-phpunit": "^1.1||^2.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5||^9.0", + "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", + "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", + "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/monolog-bundle": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "symfony/polyfill-php80": "^1.22", + "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "releases/3.2.x": "3.2.x-dev", + "releases/2.x": "2.x-dev", + "releases/1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Sentry\\SentryBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "David Cramer", + "email": "dcramer@gmail.com" + }, + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "Symfony integration for Sentry (http://getsentry.com)", + "homepage": "http://getsentry.com", + "keywords": [ + "errors", + "logging", + "sentry", + "symfony" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-symfony/issues", + "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T16:05:24+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3830,7 +4771,93 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-03-09T08:47:49+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/c7d1f35a31ef153a302e3f80336170e1280b983d", + "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/http-client-contracts": "^2.2", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.2" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-01T00:40:14+00:00" }, { "name": "symfony/http-client-contracts", @@ -4096,6 +5123,75 @@ ], "time": "2021-03-10T17:07:35+00:00" }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T12:56:27+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -4636,6 +5732,173 @@ ], "time": "2021-01-07T16:49:33+00:00" }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1", + "symfony/browser-kit": "^4.4 || ^5.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/event-dispatcher": "^4.4 || ^5.0", + "symfony/framework-bundle": "^4.4 || ^5.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^4.4.19 || ^5.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T10:35:25+00:00" + }, { "name": "symfony/routing", "version": "v5.2.4", @@ -4726,6 +5989,95 @@ ], "time": "2021-02-22T15:48:39+00:00" }, + { + "name": "symfony/security-core", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "688b21a293a7e4168e8e493a97625ac24280629f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/688b21a293a7e4168e8e493a97625ac24280629f", + "reference": "688b21a293a7e4168e8e493a97625ac24280629f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-07T15:51:33+00:00" + }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..fd8a43e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,5 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml new file mode 100644 index 0000000..342036f --- /dev/null +++ b/config/packages/sentry.yaml @@ -0,0 +1,2 @@ +sentry: + dsn: '%env(SENTRY_DSN)%' diff --git a/symfony.lock b/symfony.lock index 65c7ee3..38af902 100644 --- a/symfony.lock +++ b/symfony.lock @@ -159,6 +159,18 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sentry-symfony": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "3.0", + "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" + }, + "files": [ + "config/packages/sentry.yaml" + ] + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From 55ccc7ab4d89344bcce539a61a5f63d5c8b926c6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 09:53:36 +0100 Subject: [PATCH 068/221] popular --- src/Controller/DocsController.php | 2 +- src/Controller/TleController.php | 48 +++++++++++++++++++++++++++---- src/Repository/TleRepository.php | 18 ++++++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 4d4eed3..d96bf19 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -8,7 +8,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -class DocsController extends AbstractController +final class DocsController extends AbstractController { use FileSystemAwareTrait; diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index bff1611..a9d30f6 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -15,20 +15,23 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[Route("/api/tle")] -class TleController extends AbstractApiController +final class TleController extends AbstractApiController { protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; + public function __construct(protected TleRepository $repository,) + { + } + #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( int $id, - TleRepository $repository, NormalizerInterface $normalizer ): Response { /** @var Tle $tle */ - $tle = $repository->findOneBy(['id' => $id]); + $tle = $this->repository->findOneBy(['id' => $id]); if ($tle === null) { throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); @@ -46,8 +49,9 @@ public function record( } #[Route("/", name: "tle_collection")] - public function collection(Request $request, TleRepository $repository): Response - { + public function collection( + Request $request + ): Response { $this ->assertParamIsInteger($request, self::PAGE_PARAM) ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) @@ -62,7 +66,7 @@ public function collection(Request $request, TleRepository $repository): Respons $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - $collection = $repository->collection( + $collection = $this->repository->collection( $search, $sort, $sortDir, @@ -88,4 +92,36 @@ public function collection(Request $request, TleRepository $repository): Respons ] ); } + + #[Route("/popular", name: "tle_popular")] + public function popular( + Request $request, + TleRepository $repository + ): Response { + $newerThan = new \DateTime('now'); + $newerThan->setTime(0, 0, 0); + $newerThan->modify('-3 days'); + + $limit = 10; + + $members = $repository->popular($newerThan, $limit); + + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => \count($members), + 'member' => $members, + 'parameters' => [ + '*limit' => $limit, + '*newerThan' => $newerThan->format('c'), + ], + ]; + + return new JsonResponse( + $data, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 7dae0b2..bba8da3 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -2,6 +2,7 @@ namespace App\Repository; +use App\Entity\Request; use App\Entity\Statistic; use App\Entity\Tle; use App\ViewModel\Model\PaginationCollection; @@ -72,6 +73,23 @@ public function collection( return $collection; } + public function popular(\DateTime $newerThen, int $limit): array + { + $builder = $this->_em->createQueryBuilder(); + + $builder->select(['t.name', 't.id', 'COUNT(q.ip) as hits']) + ->from(Request::class, 'q') + ->distinct('t.id') + ->leftJoin('q.tle', 't') + ->groupBy('t.id') + ->where('q.createdAt > :newerThan') + ->setParameter('newerThan', $newerThen) + ->setMaxResults($limit) + ->orderBy('hits', 'DESC'); + + return $builder->getQuery()->getResult(); + } + private function getCount(QueryBuilder $builder): int { $builder = clone $builder; From a36ea657b5df00c93f6ba793a82d0226a45b4880 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 23 Mar 2021 10:21:06 +0100 Subject: [PATCH 069/221] add request --- composer.json | 1 + composer.lock | 2 +- src/Command/UpdateImportSources.php | 286 ++++++++++++------------- src/Entity/Request.php | 136 ++++++------ src/Entity/Statistic.php | 96 ++++----- src/Event/StatisticSubscriber.php | 114 +++++----- src/Repository/StatisticRepository.php | 80 +++---- 7 files changed, 358 insertions(+), 357 deletions(-) diff --git a/composer.json b/composer.json index a6bb34d..7cd5ebb 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", + "symfony/psr-http-message-bridge": "^2.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, diff --git a/composer.lock b/composer.lock index e71770d..108fb01 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4d907021f971067b7e8ead6351e31ca9", + "content-hash": "30d1edfb8d1e2c72a8738ecc09959d4c", "packages": [ { "name": "clue/stream-filter", diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 451b329..6ce7e84 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -1,143 +1,143 @@ -setName('tle:source'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $this->io = new SymfonyStyle($input, $output); - - $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; - - $this->sources = Yaml::parseFile($sourceFile); - - $newSources = $this->getSources(); - - $diff = array_diff($newSources, $this->sources); - - if (empty($diff)) { - $this->io->success('No new tle sources found'); - - return Command::SUCCESS; - } - - $this->io->writeln(""); - $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); - $this->io->writeln(""); - foreach ($diff as $url) { - $this->io->writeln($url); - } - - $this->io->writeln(""); - - $sources = array_merge($this->sources, $diff); - sort($sources); - - $yaml = Yaml::dump($sources); - - file_put_contents($sourceFile, $yaml); - - return Command::SUCCESS; - } - - protected function getSources(): array - { - $result = []; - - foreach (self::CATALOG as $catalog) { - $response = (new Client())->request('GET', $catalog); - - $crawler = new Crawler($response->getBody()->getContents()); - - /** @var DOMElement $anchor */ - foreach ($crawler->filter('a') as $anchor) { - $href = $anchor->getAttribute('href'); - $path = parse_url($href, PHP_URL_PATH); - $extension = pathinfo($path, PATHINFO_EXTENSION); - - if ($extension === 'txt') { - if (parse_url($href, PHP_URL_HOST) === null) { - if ($path[0] === '/') { - $scheme = parse_url($catalog, PHP_URL_SCHEME); - $host = parse_url($catalog, PHP_URL_HOST); - $href = $scheme . '://' . $host . $href; - } else { - $href = $catalog . trim($href, '/'); - } - } - - if (!$this->isIgnored($href)) { - $this->io->writeln(\sprintf('Verifying url: %s', $href)); - if ($this->isHealthy($href)) { - $result[] = $href; - } - } - } - } - } - - return $result; - } - - protected function isIgnored(string $url): bool - { - return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); - } - - protected function isHealthy(string $url): bool - { - try { - $response = (new Client())->request('GET', $url); - - return $response->getStatusCode() === 200; - } catch (\Exception) { - return false; - } - } -} +setName('tle:source'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->io = new SymfonyStyle($input, $output); + + $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; + + $this->sources = Yaml::parseFile($sourceFile); + + $newSources = $this->getSources(); + + $diff = array_diff($newSources, $this->sources); + + if (empty($diff)) { + $this->io->success('No new tle sources found'); + + return Command::SUCCESS; + } + + $this->io->writeln(""); + $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); + $this->io->writeln(""); + foreach ($diff as $url) { + $this->io->writeln($url); + } + + $this->io->writeln(""); + + $sources = array_merge($this->sources, $diff); + sort($sources); + + $yaml = Yaml::dump($sources); + + file_put_contents($sourceFile, $yaml); + + return Command::SUCCESS; + } + + protected function getSources(): array + { + $result = []; + + foreach (self::CATALOG as $catalog) { + $response = (new Client())->request('GET', $catalog); + + $crawler = new Crawler($response->getBody()->getContents()); + + /** @var DOMElement $anchor */ + foreach ($crawler->filter('a') as $anchor) { + $href = $anchor->getAttribute('href'); + $path = parse_url($href, PHP_URL_PATH); + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($extension === 'txt') { + if (parse_url($href, PHP_URL_HOST) === null) { + if ($path[0] === '/') { + $scheme = parse_url($catalog, PHP_URL_SCHEME); + $host = parse_url($catalog, PHP_URL_HOST); + $href = $scheme . '://' . $host . $href; + } else { + $href = $catalog . trim($href, '/'); + } + } + + if (!$this->isIgnored($href)) { + $this->io->writeln(\sprintf('Verifying url: %s', $href)); + if ($this->isHealthy($href)) { + $result[] = $href; + } + } + } + } + } + + return $result; + } + + protected function isIgnored(string $url): bool + { + return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); + } + + protected function isHealthy(string $url): bool + { + try { + $response = (new Client())->request('GET', $url); + + return $response->getStatusCode() === 200; + } catch (\Exception) { + return false; + } + } +} diff --git a/src/Entity/Request.php b/src/Entity/Request.php index d39c0a5..5813bef 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php index ba4c3d5..3d22e8e 100644 --- a/src/Entity/Statistic.php +++ b/src/Entity/Statistic.php @@ -1,48 +1,48 @@ -tle = $tle; - } - - public function getHits(): int - { - return $this->hits; - } - - public function setHits(int $hits): void - { - $this->hits = $hits; - } - - public function incrementHits(): void - { - $this->hits++; - } - - public function getTle(): Tle - { - return $this->tle; - } -} +tle = $tle; + } + + public function getHits(): int + { + return $this->hits; + } + + public function setHits(int $hits): void + { + $this->hits = $hits; + } + + public function incrementHits(): void + { + $this->hits++; + } + + public function getTle(): Tle + { + return $this->tle; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 51f509b..5175346 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -1,57 +1,57 @@ - 'onKernelTerminate', - ]; - } - - public function onKernelTerminate($event): void - { - if ($event->getRequest()->get('_route') !== 'tle_record') { - return; - } - - /** @var Tle|null $tle */ - $tle = $this->tleRepository->find($event->getRequest()->get('id')); - - if ($tle === null) { - return; - } - - $request = new Request(); - $request->setTle($tle); - $request->setIp($event->getRequest()->getClientIp()); - - $this->em->persist($request); - - $this->em->flush(); - - $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); - - if ($statistics === null) { - return; - } - - $statistics->incrementHits(); - - $this->em->flush(); - } -} + 'onKernelTerminate', + ]; + } + + public function onKernelTerminate($event): void + { + if ($event->getRequest()->get('_route') !== 'tle_record') { + return; + } + + /** @var Tle|null $tle */ + $tle = $this->tleRepository->find($event->getRequest()->get('id')); + + if ($tle === null) { + return; + } + + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + + $this->em->flush(); + + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); + + if ($statistics === null) { + return; + } + + $statistics->incrementHits(); + + $this->em->flush(); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php index 4c39959..e477ad1 100644 --- a/src/Repository/StatisticRepository.php +++ b/src/Repository/StatisticRepository.php @@ -1,40 +1,40 @@ -getEntityManager()->getRepository(Tle::class)->find($id); - - if ($tle === null) { - return null; - } - - $statistic = new Statistic($tle); - $statistic->setHits(1); - - $this->_em->persist($statistic); - - return $statistic; - } -} +getEntityManager()->getRepository(Tle::class)->find($id); + + if ($tle === null) { + return null; + } + + $statistic = new Statistic($tle); + $statistic->setHits(1); + + $this->_em->persist($statistic); + + return $statistic; + } +} From 6f6b2431db0004fe3acf4cc0ba523d6c69f088f4 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 23 Mar 2021 10:38:45 +0100 Subject: [PATCH 070/221] remove sentry --- composer.json | 2 -- config/bundles.php | 1 - symfony.lock | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 7cd5ebb..325f044 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,6 @@ "ext-json": "*", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", - "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", @@ -19,7 +18,6 @@ "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", - "symfony/psr-http-message-bridge": "^2.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, diff --git a/config/bundles.php b/config/bundles.php index fd8a43e..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,5 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/symfony.lock b/symfony.lock index 38af902..7a233ff 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,7 @@ { + "clue/stream-filter": { + "version": "v1.5.0" + }, "doctrine/annotations": { "version": "1.0", "recipe": { @@ -99,6 +102,9 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "http-interop/http-factory-guzzle": { + "version": "1.0.0" + }, "ivanstan/tle-php": { "version": "1.0" }, @@ -138,6 +144,15 @@ "php": { "version": "7.4" }, + "php-http/client-common": { + "version": "2.3.0" + }, + "php-http/message": { + "version": "1.11.0" + }, + "php-http/message-factory": { + "version": "v1.0.2" + }, "psr/cache": { "version": "1.0.1" }, @@ -147,6 +162,9 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-factory": { + "version": "1.0.1" + }, "psr/http-message": { "version": "1.0.1" }, @@ -159,6 +177,12 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sdk": { + "version": "3.1.0" + }, + "sentry/sentry": { + "version": "3.2.0" + }, "sentry/sentry-symfony": { "version": "3.0", "recipe": { @@ -276,6 +300,9 @@ "src/Kernel.php" ] }, + "symfony/http-client": { + "version": "v5.2.4" + }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -285,6 +312,9 @@ "symfony/http-kernel": { "version": "v5.0.1" }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -322,6 +352,9 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-uuid": { + "version": "v1.22.1" + }, "symfony/routing": { "version": "4.2", "recipe": { From 6cbc6d46e965461f92a77fcdd9c4dd5a35236fdd Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 10:39:24 +0100 Subject: [PATCH 071/221] popular --- config/packages/sentry.yaml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 config/packages/sentry.yaml diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml deleted file mode 100644 index 342036f..0000000 --- a/config/packages/sentry.yaml +++ /dev/null @@ -1,2 +0,0 @@ -sentry: - dsn: '%env(SENTRY_DSN)%' From b44fd96e2b9566bf2c3c247410898a8331a7aa94 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 30 Mar 2021 16:00:22 +0200 Subject: [PATCH 072/221] add statistics --- .env | 4 - composer.json | 1 + composer.lock | 1569 ++--------------------- config/packages/doctrine.yaml | 8 + src/Controller/StatisticsController.php | 60 + symfony.lock | 46 +- 6 files changed, 208 insertions(+), 1480 deletions(-) create mode 100644 src/Controller/StatisticsController.php diff --git a/.env b/.env index 628129e..5f55762 100644 --- a/.env +++ b/.env @@ -27,7 +27,3 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### - -###> sentry/sentry-symfony ### -SENTRY_DSN= -###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index 325f044..184b26e 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "ext-dom": "*", "ext-iconv": "*", "ext-json": "*", + "beberlei/doctrineextensions": "^1.3", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", diff --git a/composer.lock b/composer.lock index 108fb01..f92651f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,73 +4,64 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "30d1edfb8d1e2c72a8738ecc09959d4c", + "content-hash": "a91a1c78abd782bb3b8a5c6e1d2b2474", "packages": [ { - "name": "clue/stream-filter", - "version": "v1.5.0", + "name": "beberlei/doctrineextensions", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + "url": "https://github.com/beberlei/DoctrineExtensions.git", + "reference": "008f162f191584a6c37c03a803f718802ba9dd9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "url": "https://api.github.com/repos/beberlei/DoctrineExtensions/zipball/008f162f191584a6c37c03a803f718802ba9dd9a", + "reference": "008f162f191584a6c37c03a803f718802ba9dd9a", "shasum": "" }, "require": { - "php": ">=5.3" + "doctrine/orm": "^2.7", + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "friendsofphp/php-cs-fixer": "^2.14", + "nesbot/carbon": "*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "symfony/yaml": "^4.2 || ^5.0", + "zf1/zend-date": "^1.12", + "zf1/zend-registry": "^1.12" }, "type": "library", "autoload": { "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "DoctrineExtensions\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Steve Lacey", + "email": "steve@steve.ly" } ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "description": "A set of extensions to Doctrine 2 that add support for additional query functions available in MySQL, Oracle, PostgreSQL and SQLite.", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "database", + "doctrine", + "orm" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + "source": "https://github.com/beberlei/DoctrineExtensions/tree/v1.3.0" }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2020-10-02T12:38:20+00:00" + "time": "2020-11-29T07:37:23+00:00" }, { "name": "composer/package-versions-deprecated", @@ -1734,60 +1725,6 @@ }, "time": "2021-03-21T16:25:00+00:00" }, - { - "name": "http-interop/http-factory-guzzle", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.4.2", - "psr/http-factory": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.5", - "phpunit/phpunit": "^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Factory\\Guzzle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "An HTTP Factory using Guzzle PSR7", - "keywords": [ - "factory", - "http", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" - }, - "time": "2018-07-31T19:32:56+00:00" - }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1834,65 +1771,6 @@ }, "time": "2021-02-25T11:17:02+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" - }, - "time": "2021-02-22T10:52:38+00:00" - }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -2153,54 +2031,31 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "php-http/client-common", - "version": "2.3.0", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "e37e46c610c87519753135fb893111798c69076a" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", - "reference": "e37e46c610c87519753135fb893111798c69076a", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.0", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Client\\Common\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2209,64 +2064,42 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", + "description": "Common interface for caching libraries", "keywords": [ - "client", - "common", - "http", - "httplug" + "cache", + "psr", + "psr-6" ], "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.3.0" + "source": "https://github.com/php-fig/cache/tree/master" }, - "time": "2020-07-21T10:04:13+00:00" + "time": "2016-08-06T20:24:11+00:00" }, { - "name": "php-http/discovery", - "version": "1.13.0", + "name": "psr/container", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0" - }, - "require-dev": { - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" - }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", - "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, "autoload": { "psr-4": { - "Http\\Discovery\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2275,60 +2108,51 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", - "homepage": "http://php-http.org", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr7" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.13.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2020-11-27T14:49:42+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { - "name": "php-http/httplug", - "version": "2.2.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Client\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2337,77 +2161,49 @@ ], "authors": [ { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", + "description": "Standard interfaces for event handling.", "keywords": [ - "client", - "http" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/master" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2020-07-13T15:43:23+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "php-http/message", - "version": "1.11.0", + "name": "psr/http-message", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { - "clue/stream-filter": "^1.5", - "php": "^7.1 || ^8.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", - "phpspec/phpspec": "^5.1 || ^6.3", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" - }, - "files": [ - "src/filters.php" - ] + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2415,50 +2211,51 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", - "message", - "psr-7" + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.11.0" + "source": "https://github.com/php-fig/http-message/tree/master" }, - "time": "2021-02-01T08:54:58+00:00" + "time": "2016-08-06T14:39:51+00:00" }, { - "name": "php-http/message-factory", - "version": "v1.0.2", + "name": "psr/log", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2467,465 +2264,48 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" + "source": "https://github.com/php-fig/log/tree/1.1.3" }, - "time": "2015-12-19T14:08:53+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { - "name": "php-http/promise", - "version": "1.1.0", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": ">=5.6" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" - }, - "time": "2020-07-07T09:29:14+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" - }, - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2944,270 +2324,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "sentry/sdk", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", - "shasum": "" - }, - "require": { - "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.1", - "symfony/http-client": "^4.3|^5.0" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2020-12-01T10:31:45+00:00" - }, - { - "name": "sentry/sentry", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "899b0de58c1e01feb54829b3094af74252aff385" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", - "reference": "899b0de58c1e01feb54829b3094af74252aff385", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", - "jean85/pretty-package-versions": "^1.5|^2.0.1", - "php": "^7.2|^8.0", - "php-http/async-client-implementation": "^1.0", - "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.6.1", - "php-http/httplug": "^1.1|^2.0", - "php-http/message": "^1.5", - "psr/http-factory": "^1.0", - "psr/http-message-implementation": "^1.0", - "psr/log": "^1.0", - "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", - "symfony/polyfill-php80": "^1.17", - "symfony/polyfill-uuid": "^1.13.1" - }, - "conflict": { - "php-http/client-common": "1.8.0", - "raven/raven": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "http-interop/http-factory-guzzle": "^1.0", - "monolog/monolog": "^1.3|^2.0", - "nikic/php-parser": "^4.10.3", - "php-http/mock-client": "^1.3", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5.13|^9.4", - "symfony/phpunit-bridge": "^5.2", - "vimeo/psalm": "^4.2" - }, - "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Sentry\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "A PHP SDK for Sentry (http://sentry.io)", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2021-03-03T11:54:34+00:00" - }, - { - "name": "sentry/sentry-symfony", - "version": "4.0.3", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "shasum": "" - }, - "require": { - "jean85/pretty-package-versions": "^1.5 || ^2.0", - "php": "^7.2||^8.0", - "php-http/discovery": "^1.11", - "sentry/sdk": "^3.1", - "symfony/config": "^3.4.43||^4.4.11||^5.0.11", - "symfony/console": "^3.4.43||^4.4.11||^5.0.11", - "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", - "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", - "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", - "symfony/psr-http-message-bridge": "^2.0", - "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "jangregor/phpstan-prophecy": "^0.8", - "monolog/monolog": "^1.3||^2.0", - "phpspec/prophecy": "!=1.11.0", - "phpspec/prophecy-phpunit": "^1.1||^2.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5||^9.0", - "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", - "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", - "symfony/messenger": "^4.4.11||^5.0.11", - "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "symfony/polyfill-php80": "^1.22", - "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", - "vimeo/psalm": "^4.3" - }, - "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "releases/3.2.x": "3.2.x-dev", - "releases/2.x": "2.x-dev", - "releases/1.x": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/aliases.php" - ], - "psr-4": { - "Sentry\\SentryBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - }, - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "Symfony integration for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "errors", - "logging", - "sentry", - "symfony" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2021-03-03T16:05:24+00:00" - }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -4771,93 +3887,7 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" - }, - { - "name": "symfony/http-client", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/c7d1f35a31ef153a302e3f80336170e1280b983d", - "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/http-client-contracts": "^2.2", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.0|^2" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.2" - }, - "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/http-kernel": "^4.4.13|^5.1.5", - "symfony/process": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-client/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-01T00:40:14+00:00" + "time": "2021-03-09T08:47:49+00:00" }, { "name": "symfony/http-client-contracts", @@ -5123,75 +4153,6 @@ ], "time": "2021-03-10T17:07:35+00:00" }, - { - "name": "symfony/options-resolver", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T12:56:27+00:00" - }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -5732,173 +4693,6 @@ ], "time": "2021-01-07T16:49:33+00:00" }, - { - "name": "symfony/polyfill-uuid", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-uuid": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for uuid functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "uuid" - ], - "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/psr-http-message-bridge", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "psr/log": "^1.1", - "symfony/browser-kit": "^4.4 || ^5.0", - "symfony/config": "^4.4 || ^5.0", - "symfony/event-dispatcher": "^4.4 || ^5.0", - "symfony/framework-bundle": "^4.4 || ^5.0", - "symfony/http-kernel": "^4.4 || ^5.0", - "symfony/phpunit-bridge": "^4.4.19 || ^5.2" - }, - "suggest": { - "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-main": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\PsrHttpMessage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "PSR HTTP message bridge", - "homepage": "http://symfony.com", - "keywords": [ - "http", - "http-message", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-17T10:35:25+00:00" - }, { "name": "symfony/routing", "version": "v5.2.4", @@ -5989,95 +4783,6 @@ ], "time": "2021-02-22T15:48:39+00:00" }, - { - "name": "symfony/security-core", - "version": "v5.2.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "688b21a293a7e4168e8e493a97625ac24280629f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/688b21a293a7e4168e8e493a97625ac24280629f", - "reference": "688b21a293a7e4168e8e493a97625ac24280629f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^1.1|^2", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/event-dispatcher": "<4.4", - "symfony/ldap": "<4.4", - "symfony/security-guard": "<4.4", - "symfony/validator": "<5.2" - }, - "require-dev": { - "psr/container": "^1.0|^2.0", - "psr/log": "~1.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/ldap": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.2" - }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Core\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Security Component - Core Library", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-core/tree/v5.2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-07T15:51:33+00:00" - }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 5e80e77..e7bec11 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -16,3 +16,11 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App + + dql: + string_functions: + DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat + CAST: DoctrineExtensions\Query\Mysql\Cast + IF: DoctrineExtensions\Query\Mysql\IfElse + numeric_functions: + ROUND: DoctrineExtensions\Query\Mysql\Round diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php new file mode 100644 index 0000000..b89c66b --- /dev/null +++ b/src/Controller/StatisticsController.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + + $qb->select( + [ + 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', + 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', + 'COUNT(r.id) as hits', + ] + ); + + $qb + ->from(Request::class, 'r') + ->groupBy('date, hour') + ->setParameter('interval', self::INTERVAL); + + $result = $qb->getQuery()->getResult(); + + $response = []; + foreach ($result as $key => &$item) { + if ($item['hour'] === "0") { + $previousKey = $key - 1; + if (isset($result[$previousKey])) { + $result[$previousKey]['hits'] = $item['hits']; + } + + unset($result[$key]); + } + + $date = new \DateTime($item['date']); + $date->setTime((int)$item['hour'] * self::INTERVAL, 0); + + $response[$date->format('c')] = $item['hits']; + } + + return new JsonResponse( + $response, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } +} diff --git a/symfony.lock b/symfony.lock index 7a233ff..9ea3583 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,6 +1,6 @@ { - "clue/stream-filter": { - "version": "v1.5.0" + "beberlei/doctrineextensions": { + "version": "v1.3.0" }, "doctrine/annotations": { "version": "1.0", @@ -102,9 +102,6 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, - "http-interop/http-factory-guzzle": { - "version": "1.0.0" - }, "ivanstan/tle-php": { "version": "1.0" }, @@ -144,15 +141,6 @@ "php": { "version": "7.4" }, - "php-http/client-common": { - "version": "2.3.0" - }, - "php-http/message": { - "version": "1.11.0" - }, - "php-http/message-factory": { - "version": "v1.0.2" - }, "psr/cache": { "version": "1.0.1" }, @@ -162,9 +150,6 @@ "psr/event-dispatcher": { "version": "1.0.0" }, - "psr/http-factory": { - "version": "1.0.1" - }, "psr/http-message": { "version": "1.0.1" }, @@ -177,24 +162,6 @@ "roave/security-advisories": { "version": "dev-master" }, - "sentry/sdk": { - "version": "3.1.0" - }, - "sentry/sentry": { - "version": "3.2.0" - }, - "sentry/sentry-symfony": { - "version": "3.0", - "recipe": { - "repo": "github.com/symfony/recipes-contrib", - "branch": "master", - "version": "3.0", - "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" - }, - "files": [ - "config/packages/sentry.yaml" - ] - }, "symfony/apache-pack": { "version": "1.0", "recipe": { @@ -300,9 +267,6 @@ "src/Kernel.php" ] }, - "symfony/http-client": { - "version": "v5.2.4" - }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -312,9 +276,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/options-resolver": { - "version": "v5.2.4" - }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -352,9 +313,6 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, - "symfony/polyfill-uuid": { - "version": "v1.22.1" - }, "symfony/routing": { "version": "4.2", "recipe": { From 2905429f4353d2ca69c2b591299da28ac2e406ed Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 30 Mar 2021 16:06:13 +0200 Subject: [PATCH 073/221] add statistics --- src/Controller/StatisticsController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index b89c66b..56edda4 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -17,6 +17,10 @@ class StatisticsController extends AbstractApiController public function hits( EntityManagerInterface $em ): Response { + $newerThan = new \DateTime('now'); + $newerThan->setTime(0, 0, 0); + $newerThan->modify('-3 days'); + $qb = $em->createQueryBuilder(); $qb->select( @@ -29,6 +33,8 @@ public function hits( $qb ->from(Request::class, 'r') + ->where('r.createdAt > :newerThan') + ->setParameter('newerThan', $newerThan) ->groupBy('date, hour') ->setParameter('interval', self::INTERVAL); From 47cc1a538f5c7f22e088f398e7f9268907baf59e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:23:35 +0200 Subject: [PATCH 074/221] change column name --- src/Entity/Request.php | 136 +++++++++++------------ src/Migrations/Version20210331192030.php | 35 ++++++ 2 files changed, 103 insertions(+), 68 deletions(-) create mode 100644 src/Migrations/Version20210331192030.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 5813bef..d39c0a5 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Migrations/Version20210331192030.php b/src/Migrations/Version20210331192030.php new file mode 100644 index 0000000..0404c36 --- /dev/null +++ b/src/Migrations/Version20210331192030.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request CHANGE updated_at created_at DATETIME NOT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request CHANGE created_at updated_at DATETIME NOT NULL'); + } +} From e26bb52c1adb8a73e4b561e011a1c4eff6a2d248 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:23:58 +0200 Subject: [PATCH 075/221] change column name --- src/Entity/Request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Request.php b/src/Entity/Request.php index d39c0a5..3be4d0c 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -28,7 +28,7 @@ class Request private Tle $tle; /** - * @ORM\Column(name="updated_at", type="datetime") + * @ORM\Column(name="created_at", type="datetime") */ private \DateTime $createdAt; From 83621ff8002f708852f69f8e3607e165bdd7342a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:37:37 +0200 Subject: [PATCH 076/221] add tle subscriber --- src/Controller/AbstractApiController.php | 2 +- src/Event/ApiExceptionSubscriber.php | 7 ++-- src/Event/TleEntitySubscriber.php | 42 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/Event/TleEntitySubscriber.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 0e5ce68..645d8e1 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,7 +14,7 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; - protected const CORS_HEADERS = [ + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Credentials' => 'true', diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 83a5b91..9b8f465 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -2,6 +2,7 @@ namespace App\Event; +use App\Controller\AbstractApiController; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; @@ -32,7 +33,7 @@ public static function getSubscribedEvents(): array public function onException(ExceptionEvent $event): void { - if (strpos($event->getRequest()->getPathInfo(), self::API_PATH) === false) { + if (!str_contains($event->getRequest()->getPathInfo(), self::API_PATH)) { return; } @@ -63,9 +64,7 @@ private function setJsonResponse(ExceptionEvent $event, array $response): void 'response' => $response ], Response::HTTP_OK, - [ - 'Access-Control-Allow-Origin' => '*', - ] + AbstractApiController::CORS_HEADERS ) ); } diff --git a/src/Event/TleEntitySubscriber.php b/src/Event/TleEntitySubscriber.php new file mode 100644 index 0000000..6ca949f --- /dev/null +++ b/src/Event/TleEntitySubscriber.php @@ -0,0 +1,42 @@ +calculateFields($args); + } + + public function postPersist(LifecycleEventArgs $args): void + { + $this->calculateFields($args); + } + + protected function calculateFields(LifecycleEventArgs $args): void + { + $entity = $args->getObject(); + + if (!$entity instanceof Tle) { + return; + } + + $entityManager = $args->getObjectManager(); + } + + +} From 5dfb39146a3bd9ae1378dcad0522d1fcca09d3a0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 1 Apr 2021 15:03:20 +0200 Subject: [PATCH 077/221] add tle subscriber --- .../Attributes/TleOneToOneReference.php | 26 ++++++++++++ src/Entity/Statistic.php | 13 +----- src/Entity/TleInformation.php | 29 +++++++++++++ src/Event/TleEntitySubscriber.php | 42 ------------------- 4 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 src/Entity/Attributes/TleOneToOneReference.php create mode 100644 src/Entity/TleInformation.php delete mode 100644 src/Event/TleEntitySubscriber.php diff --git a/src/Entity/Attributes/TleOneToOneReference.php b/src/Entity/Attributes/TleOneToOneReference.php new file mode 100644 index 0000000..6dd34a4 --- /dev/null +++ b/src/Entity/Attributes/TleOneToOneReference.php @@ -0,0 +1,26 @@ +tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } +} diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php index 3d22e8e..c360155 100644 --- a/src/Entity/Statistic.php +++ b/src/Entity/Statistic.php @@ -2,6 +2,7 @@ namespace App\Entity; +use App\Entity\Attributes\TleOneToOneReference; use Doctrine\ORM\Mapping as ORM; /** @@ -9,12 +10,7 @@ */ class Statistic { - /** - * @ORM\Id - * @ORM\OneToOne(targetEntity="Tle") - * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) - */ - private Tle $tle; + use TleOneToOneReference; /** * @ORM\Column(name="hits", type="bigint") @@ -40,9 +36,4 @@ public function incrementHits(): void { $this->hits++; } - - public function getTle(): Tle - { - return $this->tle; - } } diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php new file mode 100644 index 0000000..d78f8d2 --- /dev/null +++ b/src/Entity/TleInformation.php @@ -0,0 +1,29 @@ +tle = $tle; + } +} diff --git a/src/Event/TleEntitySubscriber.php b/src/Event/TleEntitySubscriber.php deleted file mode 100644 index 6ca949f..0000000 --- a/src/Event/TleEntitySubscriber.php +++ /dev/null @@ -1,42 +0,0 @@ -calculateFields($args); - } - - public function postPersist(LifecycleEventArgs $args): void - { - $this->calculateFields($args); - } - - protected function calculateFields(LifecycleEventArgs $args): void - { - $entity = $args->getObject(); - - if (!$entity instanceof Tle) { - return; - } - - $entityManager = $args->getObjectManager(); - } - - -} From 0169b3823fbb1579dc672da4cb03a4e5e2918490 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 07:11:06 +0200 Subject: [PATCH 078/221] add tle calculate add monolog --- composer.json | 1 + composer.lock | 261 +++++++++++++++++++- config/bundles.php | 1 + config/packages/dev/monolog.yaml | 19 ++ config/packages/prod/deprecations.yaml | 8 + config/packages/prod/monolog.yaml | 17 ++ config/packages/test/monolog.yaml | 12 + src/Command/TleCalculate.php | 67 +++++ src/Entity/TleInformation.php | 8 +- src/Migrations/Version20210402050806.php | 41 +++ src/Repository/TleInformationRepository.php | 15 ++ symfony.lock | 21 ++ 12 files changed, 466 insertions(+), 5 deletions(-) create mode 100644 config/packages/dev/monolog.yaml create mode 100644 config/packages/prod/deprecations.yaml create mode 100644 config/packages/prod/monolog.yaml create mode 100644 config/packages/test/monolog.yaml create mode 100644 src/Command/TleCalculate.php create mode 100644 src/Migrations/Version20210402050806.php create mode 100644 src/Repository/TleInformationRepository.php diff --git a/composer.json b/composer.json index 184b26e..e713a49 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", + "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" diff --git a/composer.lock b/composer.lock index f92651f..201e4fe 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a91a1c78abd782bb3b8a5c6e1d2b2474", + "content-hash": "ac57924d16513118d6d09c51e69e22dc", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1970,6 +1970,102 @@ ], "time": "2021-02-25T21:54:58+00:00" }, + { + "name": "monolog/monolog", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <7.0.1", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-12-14T13:15:25+00:00" + }, { "name": "myclabs/php-enum", "version": "1.8.0", @@ -4153,6 +4249,169 @@ ], "time": "2021-03-10T17:07:35+00:00" }, + { + "name": "symfony/monolog-bridge", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-06T07:59:01+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/4054b2e940a25195ae15f0a49ab0c51718922eb4", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.22 || ~2.0", + "php": ">=7.1.3", + "symfony/config": "~4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/http-kernel": "~4.4 || ^5.0", + "symfony/monolog-bridge": "~4.4 || ^5.0" + }, + "require-dev": { + "symfony/console": "~4.4 || ^5.0", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "~4.4 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-31T07:20:47+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..b10047b 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,5 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml new file mode 100644 index 0000000..32039e9 --- /dev/null +++ b/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: php://stderr + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] diff --git a/config/packages/prod/deprecations.yaml b/config/packages/prod/deprecations.yaml new file mode 100644 index 0000000..60026a1 --- /dev/null +++ b/config/packages/prod/deprecations.yaml @@ -0,0 +1,8 @@ +# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists +#monolog: +# channels: [deprecation] +# handlers: +# deprecation: +# type: stream +# channels: [deprecation] +# path: php://stderr diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml new file mode 100644 index 0000000..2c02ad8 --- /dev/null +++ b/config/packages/prod/monolog.yaml @@ -0,0 +1,17 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks + nested: + type: stream + path: php://stderr + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml new file mode 100644 index 0000000..fc40641 --- /dev/null +++ b/config/packages/test/monolog.yaml @@ -0,0 +1,12 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php new file mode 100644 index 0000000..f12ebe5 --- /dev/null +++ b/src/Command/TleCalculate.php @@ -0,0 +1,67 @@ +setDescription('Calculate and persist data in TleInformation entity'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $builder = $this->entityManager + ->createQueryBuilder() + ->select('tle') + ->from(Tle::class, 'tle'); + + $repository = $this->entityManager->getRepository(TleInformation::class); + + /** @var Tle $tle */ + foreach ($builder->getQuery()->toIterable() as $i => $tle) { + $exists = true; + + $tleInformation = $repository->find($tle->getId()); + + if ($tleInformation === null) { + $exists = false; + $tleInformation = new TleInformation($tle); + } + + $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); + + $tleInformation->inclination = $tleModel->getInclination(); + $tleInformation->eccentricity = $tleModel->eccentricity(); + + if (!$exists) { + $this->entityManager->persist($tleInformation); + } + + if (($i % self::BATCH_SIZE) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + } + + $this->entityManager->flush(); + + return Command::SUCCESS; + } +} diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index d78f8d2..347bd31 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -13,14 +13,14 @@ class TleInformation use TleOneToOneReference; /** - * @ORM\Column(type="float", precision=10, nullable=true) + * @ORM\Column(type="float", precision=14, scale=12, nullable=true) */ - public int $eccentricity; + public float $eccentricity; /** - * @ORM\Column(type="float", precision=10, nullable=true) + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) */ - public int $inclination; + public float $inclination; public function __construct(Tle $tle) { diff --git a/src/Migrations/Version20210402050806.php b/src/Migrations/Version20210402050806.php new file mode 100644 index 0000000..442c840 --- /dev/null +++ b/src/Migrations/Version20210402050806.php @@ -0,0 +1,41 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE tle_information (tle_id INT NOT NULL, eccentricity DOUBLE PRECISION DEFAULT NULL, inclination DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE tle_information ADD CONSTRAINT FK_E216A773E84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE tle_information'); + } +} diff --git a/src/Repository/TleInformationRepository.php b/src/Repository/TleInformationRepository.php new file mode 100644 index 0000000..daea987 --- /dev/null +++ b/src/Repository/TleInformationRepository.php @@ -0,0 +1,15 @@ + Date: Fri, 2 Apr 2021 11:43:21 +0200 Subject: [PATCH 079/221] filter validator added --- src/Controller/AbstractApiController.php | 11 ++++ src/Controller/TleController.php | 12 ++++- src/Service/Validator/RequestValidator.php | 61 +++++++++++++++++++++- 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 645d8e1..9484b8d 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,6 +14,17 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + protected const FILTER_TYPE_FLOAT = 'float'; + + protected const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + 'gt' => '>', + 'gte' => '>=', + 'lt' => '<', + 'lte' => '<=', + ], + ]; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index a9d30f6..dfc67b1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -21,7 +21,14 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - public function __construct(protected TleRepository $repository,) + protected const FILTER_ECCENTRICITY = 'eccentricity'; + protected const FILTER_INCLINATION = 'inclination'; + + protected const COLLECTION_FILTERS = [ + self::FILTER_ECCENTRICITY => self::FILTER_TYPE_FLOAT, + ]; + + public function __construct(protected TleRepository $repository) { } @@ -60,6 +67,9 @@ public function collection( ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); + + dd($filters); $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index b50bd63..5301f6a 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -78,4 +78,63 @@ protected function assertParamInEnum(Request $request, string $name, array $valu return $this; } -} \ No newline at end of file + + protected function assertFilter(Request $request, array $filters): array + { + $result = []; + + foreach ($filters as $filter => $type) { + $values = $request->get($filter); + + foreach ($values as $operator => $value) { + $operator = $this->assertOperator($operator, $type, $filter); + $value = $this->assertValue($value, $type, $filter); + + $result[$filter][$operator] = $value; + } + } + + return $result; + } + + protected function assertOperator(string $operator, string $type, string $filter): ?string + { + if ($type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $filter, + implode(', ', array_keys($operators)), + $operator + ) + ); + } + + return $operators[$operator]; + } + + return null; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function assertValue(string $value, string $type, string $filter): mixed + { + if ($type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new BadRequestHttpException( + \sprintf('Filter %s value should be %s', $filter, $type) + ); + } + + return $value; + } + + return null; + } +} From b4bdf1b9dfeacfe4b7e8fa9b0f5fab97e5776dae Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 11:53:27 +0200 Subject: [PATCH 080/221] add filters --- src/Controller/TleController.php | 5 ++--- src/Repository/TleRepository.php | 17 ++++++++++++++++- src/Service/Validator/RequestValidator.php | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index dfc67b1..865fa29 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -69,8 +69,6 @@ public function collection( ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); - dd($filters); - $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); @@ -81,7 +79,8 @@ public function collection( $sort, $sortDir, $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) + $this->getPageOffset($this->getPage($request), $pageSize), + $filters, ); return $this->response( diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index bba8da3..8b712ce 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Statistic; use App\Entity\Tle; +use App\Entity\TleInformation; use App\ViewModel\Model\PaginationCollection; use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; @@ -35,9 +36,11 @@ public function collection( string $sort, string $sortDir, int $pageSize, - int $offset + int $offset, + array $filters, ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); + $builder->leftJoin(TleInformation::class, 'info', Expr\Join::WITH, 'info.tle = tle.id'); // search if ($search) { @@ -53,6 +56,18 @@ public function collection( $total = $this->getCount($builder); + if (!empty($filters)) { + foreach ($filters as $filter => $operators) { + $key = 0; + foreach ($operators as $operator => $value) { + $paramName = 'filter_' . $filter . '_' . $key; + $builder->andWhere(\sprintf('info.%s %s :%s', $filter, $operator, $paramName)); + $builder->setParameter($paramName, $value); + $key++; + } + } + } + // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 5301f6a..73ee7ba 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -84,7 +84,7 @@ protected function assertFilter(Request $request, array $filters): array $result = []; foreach ($filters as $filter => $type) { - $values = $request->get($filter); + $values = $request->get($filter, []); foreach ($values as $operator => $value) { $operator = $this->assertOperator($operator, $type, $filter); From b9bdf581b239c6e558df37274fb381589d3e286c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 13:01:20 +0200 Subject: [PATCH 081/221] add filters --- src/Controller/AbstractApiController.php | 11 --- src/Controller/TleController.php | 25 ++++--- src/Repository/TleRepository.php | 16 ++--- src/Service/Validator/RequestValidator.php | 47 +------------ src/ViewModel/Filter.php | 78 ++++++++++++++++++++++ 5 files changed, 103 insertions(+), 74 deletions(-) create mode 100644 src/ViewModel/Filter.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 9484b8d..645d8e1 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,17 +14,6 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; - protected const FILTER_TYPE_FLOAT = 'float'; - - protected const FILTER_FLOAT_OPERATORS = [ - self::FILTER_TYPE_FLOAT => [ - 'gt' => '>', - 'gte' => '>=', - 'lt' => '<', - 'lte' => '<=', - ], - ]; - public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 865fa29..70cc649 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -4,6 +4,7 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; @@ -25,7 +26,8 @@ final class TleController extends AbstractApiController protected const FILTER_INCLINATION = 'inclination'; protected const COLLECTION_FILTERS = [ - self::FILTER_ECCENTRICITY => self::FILTER_TYPE_FLOAT, + self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, + self::FILTER_INCLINATION => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) @@ -67,6 +69,7 @@ public function collection( ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); $search = $request->get(self::SEARCH_PARAM); @@ -83,6 +86,18 @@ public function collection( $filters, ); + $parameters = [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ]; + + foreach ($filters as $filter) { + $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; + } + return $this->response( [ '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', @@ -90,13 +105,7 @@ public function collection( '@type' => 'Collection', 'totalItems' => $collection->getTotal(), 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], + 'parameters' => $parameters, 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), ] ); diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 8b712ce..676a3db 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -56,16 +56,12 @@ public function collection( $total = $this->getCount($builder); - if (!empty($filters)) { - foreach ($filters as $filter => $operators) { - $key = 0; - foreach ($operators as $operator => $value) { - $paramName = 'filter_' . $filter . '_' . $key; - $builder->andWhere(\sprintf('info.%s %s :%s', $filter, $operator, $paramName)); - $builder->setParameter($paramName, $value); - $key++; - } - } + $key = 0; + foreach ($filters as $filter) { + $paramName = 'filter_' . $filter->filter . '_' . $key; + $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $paramName)); + $builder->setParameter($paramName, $filter->value); + $key++; } // sort diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 73ee7ba..32214fd 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -2,6 +2,7 @@ namespace App\Service\Validator; +use App\ViewModel\Filter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -87,54 +88,10 @@ protected function assertFilter(Request $request, array $filters): array $values = $request->get($filter, []); foreach ($values as $operator => $value) { - $operator = $this->assertOperator($operator, $type, $filter); - $value = $this->assertValue($value, $type, $filter); - - $result[$filter][$operator] = $value; + $result[] = new Filter($filter, $type, $operator, $value); } } return $result; } - - protected function assertOperator(string $operator, string $type, string $filter): ?string - { - if ($type === self::FILTER_TYPE_FLOAT) { - $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; - if (!array_key_exists($operator, $operators)) { - throw new BadRequestHttpException( - \sprintf( - 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', - $filter, - implode(', ', array_keys($operators)), - $operator - ) - ); - } - - return $operators[$operator]; - } - - return null; - } - - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function assertValue(string $value, string $type, string $filter): mixed - { - if ($type === self::FILTER_TYPE_FLOAT) { - $value = (float)$value; - - if (!is_float($value)) { - throw new BadRequestHttpException( - \sprintf('Filter %s value should be %s', $filter, $type) - ); - } - - return $value; - } - - return null; - } } diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php new file mode 100644 index 0000000..fcb3483 --- /dev/null +++ b/src/ViewModel/Filter.php @@ -0,0 +1,78 @@ +'; + public const OPERATOR_GREATER_THEN_EQUAL = '>='; + public const OPERATOR_LESS_THEN = '<'; + public const OPERATOR_LESS_THEN_EQUAL = '<='; + public const REST_OPERATOR_GREATER_THEN = 'gt'; + public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; + public const REST_OPERATOR_LESS_THEN = 'lt'; + public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + + public const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, + self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, + self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, + self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, + ], + ]; + + public mixed $value; + public string $sqlOperator; + + public function __construct(public string $filter, public string $type, public string $operator, mixed $value) + { + $this->value = $this->validateValue($value); + $this->sqlOperator = $this->validateOperator(); + } + + protected function validateOperator(): string + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($this->operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $this->filter, + implode(', ', array_keys($operators)), + $this->operator + ) + ); + } + + return $operators[$this->operator]; + } + + return ''; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function validateValue(string $value): mixed + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + + return null; + } +} From 68b2b806c0bf5b3106b978de4088e60950069709 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 14:01:00 +0200 Subject: [PATCH 082/221] add filters --- config/custom/tle.json | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index f84e61f..7efee55 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.0" + "version": "1.3.1" }, "servers": [ { @@ -74,6 +74,34 @@ }, { "$ref": "#/components/parameters/pageSize" + }, + { + "name": "eccentricity[gte]", + "in": "query", + "description": "Filter records with orbital eccentricity greater then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "eccentricity[lte]", + "in": "query", + "description": "Filter records with orbital eccentricity less then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "inclination[lt]", + "in": "query", + "description": "Filter records with orbital posigrade orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "inclination[gt]", + "in": "query", + "description": "Filter records with orbital retrograde orbital inclination", + "required": false, + "example": 90 } ], "responses": { From a3dabb5285005ee6b5b323c014a7b186c27b5553 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 2 Apr 2021 14:47:10 +0200 Subject: [PATCH 083/221] add sentry --- .env | 4 + composer.json | 1 + composer.lock | 1550 +++++++++++++++-- config/bundles.php | 1 + config/packages/sentry.yaml | 2 + config/services.yaml | 60 +- src/Command/TleCalculate.php | 134 +- src/Controller/StatisticsController.php | 132 +- .../Attributes/TleOneToOneReference.php | 52 +- src/Entity/Request.php | 136 +- src/Entity/TleInformation.php | 58 +- src/Repository/TleInformationRepository.php | 30 +- src/ViewModel/Filter.php | 156 +- symfony.lock | 66 + 14 files changed, 1904 insertions(+), 478 deletions(-) create mode 100644 config/packages/sentry.yaml diff --git a/.env b/.env index 5f55762..628129e 100644 --- a/.env +++ b/.env @@ -27,3 +27,7 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index e713a49..f89ed8c 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "beberlei/doctrineextensions": "^1.3", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", + "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", diff --git a/composer.lock b/composer.lock index 201e4fe..5add4c0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ac57924d16513118d6d09c51e69e22dc", + "content-hash": "4e878b0a0dd3d72e0cbc2f48d6e0e6c3", "packages": [ { "name": "beberlei/doctrineextensions", @@ -63,6 +63,72 @@ }, "time": "2020-11-29T07:37:23+00:00" }, + { + "name": "clue/stream-filter", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-10-02T12:38:20+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.1", @@ -1725,6 +1791,60 @@ }, "time": "2021-03-21T16:25:00+00:00" }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.4.2", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.5", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" + }, + "time": "2018-07-31T19:32:56+00:00" + }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1771,6 +1891,65 @@ }, "time": "2021-02-25T11:17:02+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + }, + "time": "2021-02-22T10:52:38+00:00" + }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -2127,31 +2306,54 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "php-http/client-common", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/php-http/client-common.git", + "reference": "e37e46c610c87519753135fb893111798c69076a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", + "reference": "e37e46c610c87519753135fb893111798c69076a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.0", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2160,42 +2362,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "cache", - "psr", - "psr-6" + "client", + "common", + "http", + "httplug" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.3.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2020-07-21T10:04:13+00:00" }, { - "name": "psr/container", - "version": "1.1.1", + "name": "php-http/discovery", + "version": "1.13.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/php-http/discovery.git", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Http\\Discovery\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2204,51 +2428,60 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.13.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2020-11-27T14:49:42+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "php-http/httplug", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-http/httplug.git", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2257,49 +2490,77 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Standard interfaces for event handling.", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "events", - "psr", - "psr-14" + "client", + "http" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/master" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2020-07-13T15:43:23+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "php-http/message", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/php-http/message.git", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", "shasum": "" }, "require": { - "php": ">=5.3.0" + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" - } + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2307,51 +2568,50 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "message", + "psr-7" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.11.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2021-02-01T08:54:58+00:00" }, { - "name": "psr/log", - "version": "1.1.3", + "name": "php-http/message-factory", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.4", + "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2360,25 +2620,442 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", "keywords": [ - "log", - "psr", - "psr-3" + "factory", + "http", + "message", + "stream", + "uri" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2015-12-19T14:08:53+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", @@ -2420,6 +3097,270 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "sentry/sdk", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.1", + "symfony/http-client": "^4.3|^5.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2020-12-01T10:31:45+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "899b0de58c1e01feb54829b3094af74252aff385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", + "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7", + "jean85/pretty-package-versions": "^1.5|^2.0.1", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.6.1", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-factory": "^1.0", + "psr/http-message-implementation": "^1.0", + "psr/log": "^1.0", + "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", + "symfony/polyfill-php80": "^1.17", + "symfony/polyfill-uuid": "^1.13.1" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.3|^2.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5.13|^9.4", + "symfony/phpunit-bridge": "^5.2", + "vimeo/psalm": "^4.2" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T11:54:34+00:00" + }, + { + "name": "sentry/sentry-symfony", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-symfony.git", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.5 || ^2.0", + "php": "^7.2||^8.0", + "php-http/discovery": "^1.11", + "sentry/sdk": "^3.1", + "symfony/config": "^3.4.43||^4.4.11||^5.0.11", + "symfony/console": "^3.4.43||^4.4.11||^5.0.11", + "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", + "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", + "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", + "symfony/psr-http-message-bridge": "^2.0", + "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jangregor/phpstan-prophecy": "^0.8", + "monolog/monolog": "^1.3||^2.0", + "phpspec/prophecy": "!=1.11.0", + "phpspec/prophecy-phpunit": "^1.1||^2.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5||^9.0", + "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", + "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", + "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/monolog-bundle": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "symfony/polyfill-php80": "^1.22", + "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "releases/3.2.x": "3.2.x-dev", + "releases/2.x": "2.x-dev", + "releases/1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Sentry\\SentryBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "David Cramer", + "email": "dcramer@gmail.com" + }, + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "Symfony integration for Sentry (http://getsentry.com)", + "homepage": "http://getsentry.com", + "keywords": [ + "errors", + "logging", + "sentry", + "symfony" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-symfony/issues", + "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T16:05:24+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3967,7 +4908,93 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-09T08:47:49+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3c3075467da15bc2edf38d2ac20d34719e794bd8", + "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/http-client-contracts": "^2.2", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.2" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.2.6" }, "funding": [ { @@ -3983,7 +5010,7 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-03-28T09:42:18+00:00" }, { "name": "symfony/http-client-contracts", @@ -4412,6 +5439,75 @@ ], "time": "2021-03-31T07:20:47+00:00" }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T12:56:27+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -4952,6 +6048,173 @@ ], "time": "2021-01-07T16:49:33+00:00" }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1", + "symfony/browser-kit": "^4.4 || ^5.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/event-dispatcher": "^4.4 || ^5.0", + "symfony/framework-bundle": "^4.4 || ^5.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^4.4.19 || ^5.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T10:35:25+00:00" + }, { "name": "symfony/routing", "version": "v5.2.4", @@ -5042,6 +6305,95 @@ ], "time": "2021-02-22T15:48:39+00:00" }, + { + "name": "symfony/security-core", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9dcedab1c2c637fc9a377b3a9313a61087609760", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-10T22:10:15+00:00" + }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/bundles.php b/config/bundles.php index b10047b..ec6d32d 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,4 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml new file mode 100644 index 0000000..342036f --- /dev/null +++ b/config/packages/sentry.yaml @@ -0,0 +1,2 @@ +sentry: + dsn: '%env(SENTRY_DSN)%' diff --git a/config/services.yaml b/config/services.yaml index 6a1b3f7..3235b01 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -1,30 +1,30 @@ -# This file is the entry point to configure your own services. -# Files in the packages/ subdirectory configure your dependencies. - -# Put parameters here that don't need to change on each machine where the app is deployed -# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: - -services: - # default configuration for services in *this* file - _defaults: - autowire: true # Automatically injects dependencies in your services. - autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. - - # makes classes in src/ available to be used as services - # this creates a service per class whose id is the fully-qualified class name - App\: - resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - bind: - $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" - - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - - # add more service definitions when explicit configuration is needed - # please note that last definitions always *replace* previous ones +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + bind: + $env: '%kernel.environment%' + $projectDir: "%kernel.project_dir%" + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index f12ebe5..fb0f190 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -1,67 +1,67 @@ -setDescription('Calculate and persist data in TleInformation entity'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $builder = $this->entityManager - ->createQueryBuilder() - ->select('tle') - ->from(Tle::class, 'tle'); - - $repository = $this->entityManager->getRepository(TleInformation::class); - - /** @var Tle $tle */ - foreach ($builder->getQuery()->toIterable() as $i => $tle) { - $exists = true; - - $tleInformation = $repository->find($tle->getId()); - - if ($tleInformation === null) { - $exists = false; - $tleInformation = new TleInformation($tle); - } - - $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); - - $tleInformation->inclination = $tleModel->getInclination(); - $tleInformation->eccentricity = $tleModel->eccentricity(); - - if (!$exists) { - $this->entityManager->persist($tleInformation); - } - - if (($i % self::BATCH_SIZE) === 0) { - $this->entityManager->flush(); - $this->entityManager->clear(); - } - } - - $this->entityManager->flush(); - - return Command::SUCCESS; - } -} +setDescription('Calculate and persist data in TleInformation entity'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $builder = $this->entityManager + ->createQueryBuilder() + ->select('tle') + ->from(Tle::class, 'tle'); + + $repository = $this->entityManager->getRepository(TleInformation::class); + + /** @var Tle $tle */ + foreach ($builder->getQuery()->toIterable() as $i => $tle) { + $exists = true; + + $tleInformation = $repository->find($tle->getId()); + + if ($tleInformation === null) { + $exists = false; + $tleInformation = new TleInformation($tle); + } + + $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); + + $tleInformation->inclination = $tleModel->getInclination(); + $tleInformation->eccentricity = $tleModel->eccentricity(); + + if (!$exists) { + $this->entityManager->persist($tleInformation); + } + + if (($i % self::BATCH_SIZE) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + } + + $this->entityManager->flush(); + + return Command::SUCCESS; + } +} diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 56edda4..79880e4 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -1,66 +1,66 @@ -setTime(0, 0, 0); - $newerThan->modify('-3 days'); - - $qb = $em->createQueryBuilder(); - - $qb->select( - [ - 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', - 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', - 'COUNT(r.id) as hits', - ] - ); - - $qb - ->from(Request::class, 'r') - ->where('r.createdAt > :newerThan') - ->setParameter('newerThan', $newerThan) - ->groupBy('date, hour') - ->setParameter('interval', self::INTERVAL); - - $result = $qb->getQuery()->getResult(); - - $response = []; - foreach ($result as $key => &$item) { - if ($item['hour'] === "0") { - $previousKey = $key - 1; - if (isset($result[$previousKey])) { - $result[$previousKey]['hits'] = $item['hits']; - } - - unset($result[$key]); - } - - $date = new \DateTime($item['date']); - $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - - $response[$date->format('c')] = $item['hits']; - } - - return new JsonResponse( - $response, - Response::HTTP_OK, - self::CORS_HEADERS, - ); - } -} +setTime(0, 0, 0); + $newerThan->modify('-3 days'); + + $qb = $em->createQueryBuilder(); + + $qb->select( + [ + 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', + 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', + 'COUNT(r.id) as hits', + ] + ); + + $qb + ->from(Request::class, 'r') + ->where('r.createdAt > :newerThan') + ->setParameter('newerThan', $newerThan) + ->groupBy('date, hour') + ->setParameter('interval', self::INTERVAL); + + $result = $qb->getQuery()->getResult(); + + $response = []; + foreach ($result as $key => &$item) { + if ($item['hour'] === "0") { + $previousKey = $key - 1; + if (isset($result[$previousKey])) { + $result[$previousKey]['hits'] = $item['hits']; + } + + unset($result[$key]); + } + + $date = new \DateTime($item['date']); + $date->setTime((int)$item['hour'] * self::INTERVAL, 0); + + $response[$date->format('c')] = $item['hits']; + } + + return new JsonResponse( + $response, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } +} diff --git a/src/Entity/Attributes/TleOneToOneReference.php b/src/Entity/Attributes/TleOneToOneReference.php index 6dd34a4..3b2dcda 100644 --- a/src/Entity/Attributes/TleOneToOneReference.php +++ b/src/Entity/Attributes/TleOneToOneReference.php @@ -1,26 +1,26 @@ -tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } -} +tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } +} diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 3be4d0c..549ffad 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 347bd31..0f55c69 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -1,29 +1,29 @@ -tle = $tle; - } -} +tle = $tle; + } +} diff --git a/src/Repository/TleInformationRepository.php b/src/Repository/TleInformationRepository.php index daea987..1cd77e7 100644 --- a/src/Repository/TleInformationRepository.php +++ b/src/Repository/TleInformationRepository.php @@ -1,15 +1,15 @@ -'; - public const OPERATOR_GREATER_THEN_EQUAL = '>='; - public const OPERATOR_LESS_THEN = '<'; - public const OPERATOR_LESS_THEN_EQUAL = '<='; - public const REST_OPERATOR_GREATER_THEN = 'gt'; - public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; - public const REST_OPERATOR_LESS_THEN = 'lt'; - public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; - - public const FILTER_FLOAT_OPERATORS = [ - self::FILTER_TYPE_FLOAT => [ - self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, - self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, - self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, - self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, - ], - ]; - - public mixed $value; - public string $sqlOperator; - - public function __construct(public string $filter, public string $type, public string $operator, mixed $value) - { - $this->value = $this->validateValue($value); - $this->sqlOperator = $this->validateOperator(); - } - - protected function validateOperator(): string - { - if ($this->type === self::FILTER_TYPE_FLOAT) { - $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; - if (!array_key_exists($this->operator, $operators)) { - throw new BadRequestHttpException( - \sprintf( - 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', - $this->filter, - implode(', ', array_keys($operators)), - $this->operator - ) - ); - } - - return $operators[$this->operator]; - } - - return ''; - } - - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function validateValue(string $value): mixed - { - if ($this->type === self::FILTER_TYPE_FLOAT) { - $value = (float)$value; - - if (!is_float($value)) { - throw new \InvalidArgumentException( - \sprintf('Filter %s value should be %s', $this->filter, $this->type) - ); - } - - return $value; - } - - return null; - } -} +'; + public const OPERATOR_GREATER_THEN_EQUAL = '>='; + public const OPERATOR_LESS_THEN = '<'; + public const OPERATOR_LESS_THEN_EQUAL = '<='; + public const REST_OPERATOR_GREATER_THEN = 'gt'; + public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; + public const REST_OPERATOR_LESS_THEN = 'lt'; + public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + + public const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, + self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, + self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, + self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, + ], + ]; + + public mixed $value; + public string $sqlOperator; + + public function __construct(public string $filter, public string $type, public string $operator, mixed $value) + { + $this->value = $this->validateValue($value); + $this->sqlOperator = $this->validateOperator(); + } + + protected function validateOperator(): string + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($this->operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $this->filter, + implode(', ', array_keys($operators)), + $this->operator + ) + ); + } + + return $operators[$this->operator]; + } + + return ''; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function validateValue(string $value): mixed + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + + return null; + } +} diff --git a/symfony.lock b/symfony.lock index 467554c..373001a 100644 --- a/symfony.lock +++ b/symfony.lock @@ -2,6 +2,9 @@ "beberlei/doctrineextensions": { "version": "v1.3.0" }, + "clue/stream-filter": { + "version": "v1.5.0" + }, "doctrine/annotations": { "version": "1.0", "recipe": { @@ -102,12 +105,18 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "http-interop/http-factory-guzzle": { + "version": "1.0.0" + }, "ivanstan/tle-php": { "version": "1.0" }, "jdorn/sql-formatter": { "version": "v1.2.17" }, + "jean85/pretty-package-versions": { + "version": "2.0.3" + }, "laminas/laminas-code": { "version": "3.4.1" }, @@ -144,6 +153,24 @@ "php": { "version": "7.4" }, + "php-http/client-common": { + "version": "2.3.0" + }, + "php-http/discovery": { + "version": "1.13.0" + }, + "php-http/httplug": { + "version": "2.2.0" + }, + "php-http/message": { + "version": "1.11.0" + }, + "php-http/message-factory": { + "version": "v1.0.2" + }, + "php-http/promise": { + "version": "1.1.0" + }, "psr/cache": { "version": "1.0.1" }, @@ -153,6 +180,12 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-client": { + "version": "1.0.1" + }, + "psr/http-factory": { + "version": "1.0.1" + }, "psr/http-message": { "version": "1.0.1" }, @@ -165,6 +198,24 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sdk": { + "version": "3.1.0" + }, + "sentry/sentry": { + "version": "3.2.0" + }, + "sentry/sentry-symfony": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "3.0", + "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" + }, + "files": [ + "config/packages/sentry.yaml" + ] + }, "symfony/apache-pack": { "version": "1.0", "recipe": { @@ -270,6 +321,9 @@ "src/Kernel.php" ] }, + "symfony/http-client": { + "version": "v5.2.6" + }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -297,6 +351,9 @@ "config/packages/test/monolog.yaml" ] }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -334,6 +391,12 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-uuid": { + "version": "v1.22.1" + }, + "symfony/psr-http-message-bridge": { + "version": "v2.1.0" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -348,6 +411,9 @@ "config/routes.yaml" ] }, + "symfony/security-core": { + "version": "v5.2.6" + }, "symfony/serializer": { "version": "v5.0.2" }, From 341c7ebec3fef3d09ea60d43dfe37aaf2f986062 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 16:57:34 +0200 Subject: [PATCH 084/221] response --- src/Controller/AbstractApiController.php | 9 ++++--- src/Controller/TleController.php | 33 +++++++++++------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 645d8e1..96d3a40 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -4,6 +4,7 @@ use App\Service\Validator\RequestValidator; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -125,12 +126,12 @@ public function getPagination(Request $request, int $total, int $pageSize): arra return $result; } - public function response($response): Response + public function response(array $data): Response { - return new Response( - $this->serializer->serialize($response, 'json'), + return new JsonResponse( + $data, Response::HTTP_OK, - self::CORS_HEADERS + self::CORS_HEADERS, ); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 70cc649..1c42bc1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -50,16 +50,15 @@ public function record( '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', ]; - return new JsonResponse( + return $this->response( array_merge($data, $normalizer->normalize($tle)), - Response::HTTP_OK, - self::CORS_HEADERS, ); } #[Route("/", name: "tle_collection")] public function collection( - Request $request + Request $request, + NormalizerInterface $normalizer ): Response { $this ->assertParamIsInteger($request, self::PAGE_PARAM) @@ -98,16 +97,18 @@ public function collection( $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; } + $response = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => $parameters, + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ]; + return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => $parameters, - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] + $normalizer->normalize($response) ); } @@ -136,10 +137,6 @@ public function popular( ], ]; - return new JsonResponse( - $data, - Response::HTTP_OK, - self::CORS_HEADERS, - ); + return $this->response($data); } } From 0a1d5ac18db1e4b2cf1f72bb298aca82b7eacf99 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 21:17:14 +0200 Subject: [PATCH 085/221] add sentry frontend --- src/Serializer/TleModelNormalizer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 7134a94..8696825 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -14,13 +14,13 @@ public function __construct(private UrlGeneratorInterface $router) } /** - * @param $entity + * @param Tle $entity * @param string|null $format * @param array $context * * @return array */ - public function normalize($entity, string $format = null, array $context = []) + public function normalize($entity, ?string $format = null, array $context = []): array { $id = $this->router->generate('tle_record', ['id' => $entity->getId()], UrlGeneratorInterface::ABSOLUTE_URL); From 1d0556d012bd9bbc43eb7d32ad252fecd5f85419 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 22:06:33 +0200 Subject: [PATCH 086/221] add tle extra --- src/Controller/TleController.php | 24 +++++++++++++++------- src/Entity/Tle.php | 10 +++++++++ src/Repository/TleRepository.php | 19 +++++++++-------- src/Serializer/TleModelNormalizer.php | 18 +++++++++++++++- src/Service/Validator/RequestValidator.php | 16 +++++++++++++++ src/ViewModel/Filter.php | 5 +++++ 6 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 1c42bc1..b6c94fd 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -7,7 +7,6 @@ use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; -use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -22,8 +21,10 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - protected const FILTER_ECCENTRICITY = 'eccentricity'; - protected const FILTER_INCLINATION = 'inclination'; + public const FILTER_ECCENTRICITY = 'eccentricity'; + public const FILTER_INCLINATION = 'inclination'; + + public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, @@ -37,8 +38,13 @@ public function __construct(protected TleRepository $repository) #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( int $id, - NormalizerInterface $normalizer + NormalizerInterface $normalizer, + Request $request, ): Response { + $this->assertParamIsBoolean($request, self::PARAM_EXTRA); + + $extra = (bool)$request->get(self::PARAM_EXTRA, false); + /** @var Tle $tle */ $tle = $this->repository->findOneBy(['id' => $id]); @@ -51,7 +57,7 @@ public function record( ]; return $this->response( - array_merge($data, $normalizer->normalize($tle)), + array_merge($data, $normalizer->normalize($tle, null, [self::PARAM_EXTRA => $extra])), ); } @@ -67,7 +73,11 @@ public function collection( ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) - ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()) + ->assertParamIsBoolean($request, self::PARAM_EXTRA); + + $extra = (bool)$request->get(self::PARAM_EXTRA, false); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); @@ -108,7 +118,7 @@ public function collection( ]; return $this->response( - $normalizer->normalize($response) + $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) ); } diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 1fc8f78..2fa9441 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -7,6 +7,7 @@ use App\Field\TleField; use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\OneToOne; /** * @ORM\Entity(repositoryClass="App\Repository\TleRepository") @@ -18,6 +19,11 @@ class Tle use NameField; use TleField; + /** + * @OneToOne(targetEntity="TleInformation", mappedBy="tle") + */ + private $info; + /** * @ORM\Column(name="updated_at", type="datetime") */ @@ -31,4 +37,8 @@ public function update(): void { $this->updatedAt = DateTimeService::getCurrentUTC(); } + + public function getInfo(): TleInformation { + return $this->info; + } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 676a3db..454dd94 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -24,7 +24,7 @@ public function __construct(ManagerRegistry $registry) /** * @return Tle[]|Collection */ - public function fetchAllIndexed() + public function fetchAllIndexed(): array|Collection { return $this->createQueryBuilder('tle', 'tle.id') ->getQuery() @@ -40,6 +40,8 @@ public function collection( array $filters, ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); + + $builder->select('tle'); $builder->leftJoin(TleInformation::class, 'info', Expr\Join::WITH, 'info.tle = tle.id'); // search @@ -54,16 +56,15 @@ public function collection( ->setParameter('search', '%' . $search . '%'); } - $total = $this->getCount($builder); - - $key = 0; - foreach ($filters as $filter) { - $paramName = 'filter_' . $filter->filter . '_' . $key; - $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $paramName)); - $builder->setParameter($paramName, $filter->value); - $key++; + // filters + foreach ($filters as $index => $filter) { + $placeholder = \sprintf('filter_%s_%d', $filter->filter, $index); + $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $placeholder)); + $builder->setParameter($placeholder, $filter->value); } + $total = $this->getCount($builder); + // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 8696825..b9e7c2b 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -2,6 +2,7 @@ namespace App\Serializer; +use App\Controller\TleController; use App\Entity\Tle; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -26,7 +27,9 @@ public function normalize($entity, ?string $format = null, array $context = []): $model = new TleModel($entity->getLine1(), $entity->getLine2(), $entity->getName()); - return [ + $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; + + $normalized = [ '@id' => $id, '@type' => 'TleModel', 'satelliteId' => $model->getId(), @@ -35,6 +38,19 @@ public function normalize($entity, ?string $format = null, array $context = []): 'line1' => $model->getLine1(), 'line2' => $model->getLine2(), ]; + + if ($isExtra) { + $extra = [ + 'extra' => [ + TleController::FILTER_ECCENTRICITY => $entity->getInfo()->eccentricity, + TleController::FILTER_INCLINATION => $entity->getInfo()->inclination, + ], + ]; + + $normalized = array_merge($normalized, $extra); + } + + return $normalized; } public function supportsNormalization($data, string $format = null): bool diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 32214fd..14d3519 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -8,6 +8,22 @@ trait RequestValidator { + protected function assertParamIsBoolean(Request $request, string $name): self { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!in_array($param, Filter::BOOLEAN_VALUES, true)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be boolean. Supported values are %s.', $name, implode(' or ', Filter::BOOLEAN_VALUES)) + ); + } + + return $this; + } + protected function assertParamIsInteger(Request $request, string $name): self { $param = (int)$request->get($name); diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index e23e192..4ad6d43 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -17,6 +17,11 @@ class Filter public const REST_OPERATOR_LESS_THEN = 'lt'; public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + public const BOOLEAN_VALUES = [ + '1', + '0', + ]; + public const FILTER_FLOAT_OPERATORS = [ self::FILTER_TYPE_FLOAT => [ self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, From a189a35ff2c5351b3dfabb5343dfa39a3f0bc09a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 3 Apr 2021 14:23:20 +0200 Subject: [PATCH 087/221] add logos to deploy --- deploy.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deploy.php b/deploy.php index debfba5..4c7b8a7 100644 --- a/deploy.php +++ b/deploy.php @@ -18,6 +18,8 @@ 'public/asset-manifest.json', 'public/favicon.ico', 'public/index.html', + 'public/logo192.png', + 'public/logo512.png', ]); add('shared_dirs', [ 'var', From 28408cd5b0bee5d93ef338b9c51329d0718f48a1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 19 Apr 2021 20:32:44 +0200 Subject: [PATCH 088/221] add sort by inclination and eccentricity --- src/Repository/TleRepository.php | 13 ++++++++++++- src/ViewModel/TleCollectionSortableFieldsEnum.php | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 454dd94..83107b9 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -70,7 +70,7 @@ public function collection( $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); $builder->addOrderBy('s.hits', $sortDir); } else { - $builder->addOrderBy('tle.' . $sort, $sortDir); + $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } // limit @@ -110,4 +110,15 @@ private function getCount(QueryBuilder $builder): int return $builder->getQuery()->getSingleScalarResult(); } + + private function getSortTableColumnMapping(string $sort) + { + return match ($sort) { + TleCollectionSortableFieldsEnum::ID => 'tle.id', + TleCollectionSortableFieldsEnum::NAME => 'tle.name', + TleCollectionSortableFieldsEnum::POPULARITY => null, + TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', + TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', + }; + } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 6ba0f01..b573e33 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -9,4 +9,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const ID = 'id'; public const NAME = 'name'; public const POPULARITY = 'popularity'; + public const INCLINATION = 'inclination'; + public const ECCENTRICITY = 'eccentricity'; } From 365a97fad7e02efa400f81334ebdd612312db39f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 19 Apr 2021 20:33:00 +0200 Subject: [PATCH 089/221] add sort by inclination and eccentricity --- src/Repository/TleRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 83107b9..6d5d1e2 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -111,7 +111,7 @@ private function getCount(QueryBuilder $builder): int return $builder->getQuery()->getSingleScalarResult(); } - private function getSortTableColumnMapping(string $sort) + private function getSortTableColumnMapping(string $sort): ?string { return match ($sort) { TleCollectionSortableFieldsEnum::ID => 'tle.id', From 7c16306b5d961e2b613a474e0b636a4afe1ac61a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 10:46:53 +0200 Subject: [PATCH 090/221] add inclination filter --- composer.json | 29 +- composer.lock | 216 +++- lib/predict/Predict.php | 864 ++++++++++++++++ lib/predict/Predict/DeepArg.php | 35 + lib/predict/Predict/DeepStatic.php | 83 ++ lib/predict/Predict/Exception.php | 5 + lib/predict/Predict/Geodetic.php | 13 + lib/predict/Predict/Math.php | 194 ++++ lib/predict/Predict/ObsSet.php | 12 + lib/predict/Predict/Pass.php | 18 + lib/predict/Predict/PassDetail.php | 35 + lib/predict/Predict/QTH.php | 20 + lib/predict/Predict/SGPObs.php | 149 +++ lib/predict/Predict/SGPSDP.php | 1055 ++++++++++++++++++++ lib/predict/Predict/SGSDPStatic.php | 39 + lib/predict/Predict/Sat.php | 310 ++++++ lib/predict/Predict/Solar.php | 106 ++ lib/predict/Predict/TLE.php | 230 +++++ lib/predict/Predict/Time.php | 229 +++++ lib/predict/Predict/Vector.php | 13 + lib/predict/examples/benchmark.php | 57 ++ lib/predict/examples/findsun.php | 31 + lib/predict/examples/iss.tle | 3 + lib/predict/examples/solar_position.php | 44 + lib/predict/examples/visible_passes.php | 74 ++ lib/predict/tests/Table.php | 893 +++++++++++++++++ lib/predict/tests/test-001.php | 133 +++ lib/predict/tests/test-001.tle | 3 + lib/predict/tests/test-002.php | 135 +++ lib/predict/tests/test-002.tle | 4 + src/Controller/AbstractApiController.php | 2 + src/Controller/PropagateController.php | 77 ++ src/Serializer/ObserverNormalizer.php | 39 + src/Serializer/SatellitePassNormalizer.php | 49 + src/ViewModel/LatLng.php | 41 + src/ViewModel/Observer.php | 15 + symfony.lock | 6 + 37 files changed, 5244 insertions(+), 17 deletions(-) create mode 100644 lib/predict/Predict.php create mode 100644 lib/predict/Predict/DeepArg.php create mode 100644 lib/predict/Predict/DeepStatic.php create mode 100644 lib/predict/Predict/Exception.php create mode 100644 lib/predict/Predict/Geodetic.php create mode 100644 lib/predict/Predict/Math.php create mode 100644 lib/predict/Predict/ObsSet.php create mode 100644 lib/predict/Predict/Pass.php create mode 100644 lib/predict/Predict/PassDetail.php create mode 100644 lib/predict/Predict/QTH.php create mode 100644 lib/predict/Predict/SGPObs.php create mode 100644 lib/predict/Predict/SGPSDP.php create mode 100644 lib/predict/Predict/SGSDPStatic.php create mode 100644 lib/predict/Predict/Sat.php create mode 100644 lib/predict/Predict/Solar.php create mode 100644 lib/predict/Predict/TLE.php create mode 100644 lib/predict/Predict/Time.php create mode 100644 lib/predict/Predict/Vector.php create mode 100644 lib/predict/examples/benchmark.php create mode 100644 lib/predict/examples/findsun.php create mode 100644 lib/predict/examples/iss.tle create mode 100644 lib/predict/examples/solar_position.php create mode 100644 lib/predict/examples/visible_passes.php create mode 100644 lib/predict/tests/Table.php create mode 100644 lib/predict/tests/test-001.php create mode 100644 lib/predict/tests/test-001.tle create mode 100644 lib/predict/tests/test-002.php create mode 100644 lib/predict/tests/test-002.tle create mode 100644 src/Controller/PropagateController.php create mode 100644 src/Serializer/ObserverNormalizer.php create mode 100644 src/Serializer/SatellitePassNormalizer.php create mode 100644 src/ViewModel/LatLng.php create mode 100644 src/ViewModel/Observer.php diff --git a/composer.json b/composer.json index f89ed8c..75a8902 100644 --- a/composer.json +++ b/composer.json @@ -1,4 +1,6 @@ { + "name": "ivanstan/tle-backend", + "description": "TLE API backend", "type": "project", "license": "proprietary", "require": { @@ -21,11 +23,12 @@ "symfony/framework-bundle": "5.2.*", "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", + "symfony/property-access": "5.2.*", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, "require-dev": { - "roave/security-advisories": "dev-master", + "roave/security-advisories": "dev-latest", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.2" }, @@ -44,7 +47,29 @@ "autoload-dev": { "psr-4": { "App\\Tests\\": "tests/" - } + }, + "files": [ + "lib/predict/Predict.php", + "lib/predict/Predict/Time.php", + "lib/predict/Predict/Math.php", + "lib/predict/Predict/Pass.php", + "lib/predict/Predict/PassDetail.php", + "lib/predict/Predict/Vector.php", + "lib/predict/Predict/Geodetic.php", + "lib/predict/Predict/ObsSet.php", + "lib/predict/Predict/Solar.php", + "lib/predict/Predict/SGPObs.php", + "lib/predict/Predict/SGPSDP.php", + "lib/predict/Predict.php", + "lib/predict/Predict/Sat.php", + "lib/predict/Predict/QTH.php", + "lib/predict/Predict/Time.php", + "lib/predict/Predict/TLE.php", + "lib/predict/Predict/SGSDPStatic.php", + "lib/predict/Predict/SGSDPStatic.php", + "lib/predict/Predict/DeepArg.php", + "lib/predict/Predict/DeepStatic.php" + ] }, "replace": { "paragonie/random_compat": "2.*", diff --git a/composer.lock b/composer.lock index 5add4c0..0909423 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4e878b0a0dd3d72e0cbc2f48d6e0e6c3", + "content-hash": "e0bbf162f1ab7711762d6c0e7c9c710c", "packages": [ { "name": "beberlei/doctrineextensions", @@ -6127,6 +6127,177 @@ ], "time": "2021-01-22T09:19:47+00:00" }, + { + "name": "symfony/property-access", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.2" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T15:24:54+00:00" + }, { "name": "symfony/psr-http-message-bridge", "version": "v2.1.0", @@ -7118,16 +7289,16 @@ }, { "name": "roave/security-advisories", - "version": "dev-master", + "version": "dev-latest", "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc" + "reference": "593c4de369ca852cf3b86037f19435d47c136448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11b8a607a59818bb21fc9ffb334f03032a6ce5dc", - "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/593c4de369ca852cf3b86037f19435d47c136448", + "reference": "593c4de369ca852cf3b86037f19435d47c136448", "shasum": "" }, "conflict": { @@ -7171,7 +7342,7 @@ "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", @@ -7194,10 +7365,11 @@ "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<=2.5.1,>=2.0|<=1.16.13", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", "firebase/php-jwt": "<2", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", "fossar/tcpdf-parser": "<6.2.22", "friendsofsymfony/oauth2-php": "<1.3", @@ -7205,7 +7377,7 @@ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", + "getgrav/grav": "<1.7.11", "getkirby/cms": ">=3,<3.4.5", "getkirby/panel": "<2.5.14", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", @@ -7237,11 +7409,15 @@ "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1", + "mautic/core": "<3.3.2|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nystudio107/craft-seomatic": "<3.3", @@ -7270,21 +7446,25 @@ "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/pimcore": "<6.8.8", "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -7292,8 +7472,9 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.5.1", + "shopware/core": "<=6.3.5.2", + "shopware/platform": "<=6.3.5.2", + "shopware/production": "<=6.3.5.2", "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", @@ -7367,16 +7548,20 @@ "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", @@ -7414,6 +7599,7 @@ "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2" }, + "default-branch": true, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7446,7 +7632,7 @@ "type": "tidelift" } ], - "time": "2021-03-19T20:02:32+00:00" + "time": "2021-04-16T20:01:44+00:00" }, { "name": "symfony/phpunit-bridge", diff --git a/lib/predict/Predict.php b/lib/predict/Predict.php new file mode 100644 index 0000000..9615ca8 --- /dev/null +++ b/lib/predict/Predict.php @@ -0,0 +1,864 @@ + + John A. Magliacane, KD2BD. + + Comments, questions and bugreports should be submitted via + http://sourceforge.net/projects/gpredict/ + More details can be found at the project home page: + + http://gpredict.oz9aec.net/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, visit http://www.fsf.org/ +*/ + +/** + * The main Predict class. Contains constants for use by other classes, as well as + * the prediction logic. + */ +class Predict +{ + const de2ra = 1.74532925E-2; /* Degrees to Radians */ + const pi = 3.1415926535898; /* Pi */ + const pio2 = 1.5707963267949; /* Pi/2 */ + const x3pio2 = 4.71238898; /* 3*Pi/2 */ + const twopi = 6.2831853071796; /* 2*Pi */ + const e6a = 1.0E-6; + const tothrd = 6.6666667E-1; /* 2/3 */ + const xj2 = 1.0826158E-3; /* J2 Harmonic */ + const xj3 = -2.53881E-6; /* J3 Harmonic */ + const xj4 = -1.65597E-6; /* J4 Harmonic */ + const xke = 7.43669161E-2; + const xkmper = 6.378135E3; /* Earth radius km */ + const xmnpda = 1.44E3; /* Minutes per day */ + const km2mi = 0.621371; /* Kilometers per Mile */ + const ae = 1.0; + const ck2 = 5.413079E-4; + const ck4 = 6.209887E-7; + const __f = 3.352779E-3; + const ge = 3.986008E5; + const __s__ = 1.012229; + const qoms2t = 1.880279E-09; + const secday = 8.6400E4; /* Seconds per day */ + const omega_E = 1.0027379; + const omega_ER = 6.3003879; + const zns = 1.19459E-5; + const c1ss = 2.9864797E-6; + const zes = 1.675E-2; + const znl = 1.5835218E-4; + const c1l = 4.7968065E-7; + const zel = 5.490E-2; + const zcosis = 9.1744867E-1; + const zsinis = 3.9785416E-1; + const zsings = -9.8088458E-1; + const zcosgs = 1.945905E-1; + const zcoshs = 1; + const zsinhs = 0; + const q22 = 1.7891679E-6; + const q31 = 2.1460748E-6; + const q33 = 2.2123015E-7; + const g22 = 5.7686396; + const g32 = 9.5240898E-1; + const g44 = 1.8014998; + const g52 = 1.0508330; + const g54 = 4.4108898; + const root22 = 1.7891679E-6; + const root32 = 3.7393792E-7; + const root44 = 7.3636953E-9; + const root52 = 1.1428639E-7; + const root54 = 2.1765803E-9; + const thdt = 4.3752691E-3; + const rho = 1.5696615E-1; + const mfactor = 7.292115E-5; + const __sr__ = 6.96000E5; /*Solar radius - kilometers (IAU 76)*/ + const AU = 1.49597870E8; /*Astronomical unit - kilometers (IAU 76)*/ + + /* visibility constants */ + const SAT_VIS_NONE = 0; + const SAT_VIS_VISIBLE = 1; + const SAT_VIS_DAYLIGHT = 2; + const SAT_VIS_ECLIPSED = 3; + + /* preferences */ + public $minEle = 10; // Minimum elevation + public $timeRes = 10; // Pass details: time resolution + public $numEntries = 20; // Pass details: number of entries + public $threshold = -6; // Twilight threshold + + /** + * Predict the next pass. + * + * This function simply wraps the get_pass function using the current time + * as parameter. + * + * Note: the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on (eg. if the caller + * is GtkSatList). + * + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer data. + * @param int $maxdt The maximum number of days to look ahead. + * + * @return Predict_Pass Pointer instance or NULL if no pass can be + * found. + */ + public function get_next_pass(Predict_Sat $sat, Predict_QTH $qth, $maxdt) + { + /* get the current time and call the get_pass function */ + $now = Predict_Time::get_current_daynum(); + + return $this->get_pass($sat, $qth, $now, $maxdt); + } + + /** Predict first pass after a certain time. + * + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location data. + * @param float $start Starting time. + * @param int $maxdt The maximum number of days to look ahead (0 for no limit). + * + * @return Predict_Pass or NULL if there was an error. + * + * This function will find the first upcoming pass with AOS no earlier than + * t = start and no later than t = (start+maxdt). + * + * note For no time limit use maxdt = 0.0 + * + * note the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on + */ + public function get_pass(Predict_Sat $sat_in, Predict_QTH $qth, $start, $maxdt) + { + $aos = 0.0; /* time of AOS */ + $tca = 0.0; /* time of TCA */ + $los = 0.0; /* time of LOS */ + $dt = 0.0; /* time diff */ + $step = 0.0; /* time step */ + $t0 = $start; + $tres = 0.0; /* required time resolution */ + $max_el = 0.0; /* maximum elevation */ + $pass = null; + $detail = null; + $done = false; + $iter = 0; /* number of iterations */ + /* FIXME: watchdog */ + + /*copy sat_in to a working structure*/ + $sat = clone $sat_in; + $sat_working = clone $sat_in; + + /* get time resolution; sat-cfg stores it in seconds */ + $tres = $this->timeRes / 86400.0; + + /* loop until we find a pass with elevation > SAT_CFG_INT_PRED_MIN_EL + or we run out of time + FIXME: we should have a safety break + */ + while (!$done) { + /* Find los of next pass or of current pass */ + $los = $this->find_los($sat, $qth, $t0, $maxdt); // See if a pass is ongoing + $aos = $this->find_aos($sat, $qth, $t0, $maxdt); + /* sat_log_log(SAT_LOG_LEVEL_MSG, "%s:%s:%d: found aos %f and los %f for t0=%f", */ + /* __FILE__, */ + /* __FUNCTION__, */ + /* __LINE__, */ + /* aos, */ + /* los, */ + /* t0); */ + if ($aos > $los) { + // los is from an currently happening pass, find previous aos + $aos = $this->find_prev_aos($sat, $qth, $t0); + } + + /* aos = 0.0 means no aos */ + if ($aos == 0.0) { + $done = true; + } else if (($maxdt > 0.0) && ($aos > ($start + $maxdt)) ) { + /* check whether we are within time limits; + maxdt = 0 mean no time limit. + */ + $done = true; + } else { + //los = find_los (sat, qth, aos + 0.001, maxdt); // +1.5 min later + $dt = $los - $aos; + + /* get time step, which will give us the max number of entries */ + $step = $dt / $this->numEntries; + + /* but if this is smaller than the required resolution + we go with the resolution + */ + if ($step < $tres) { + $step = $tres; + } + + /* create a pass_t entry; FIXME: g_try_new in 2.8 */ + $pass = new Predict_Pass(); + + $pass->aos = $aos; + $pass->los = $los; + $pass->max_el = 0.0; + $pass->aos_az = 0.0; + $pass->los_az = 0.0; + $pass->maxel_az = 0.0; + $pass->vis = '---'; + $pass->satname = $sat->nickname; + $pass->details = array(); + + /* iterate over each time step */ + for ($t = $pass->aos; $t <= $pass->los; $t += $step) { + + /* calculate satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* in the first iter we want to store + pass->aos_az + */ + if ($t == $pass->aos) { + $pass->aos_az = $sat->az; + $pass->orbit = $sat->orbit; + } + + /* append details to sat->details */ + $detail = new Predict_PassDetail(); + $detail->time = $t; + $detail->pos->x = $sat->pos->x; + $detail->pos->y = $sat->pos->y; + $detail->pos->z = $sat->pos->z; + $detail->pos->w = $sat->pos->w; + $detail->vel->x = $sat->vel->x; + $detail->vel->y = $sat->vel->y; + $detail->vel->z = $sat->vel->z; + $detail->vel->w = $sat->vel->w; + $detail->velo = $sat->velo; + $detail->az = $sat->az; + $detail->el = $sat->el; + $detail->range = $sat->range; + $detail->range_rate = $sat->range_rate; + $detail->lat = $sat->ssplat; + $detail->lon = $sat->ssplon; + $detail->alt = $sat->alt; + $detail->ma = $sat->ma; + $detail->phase = $sat->phase; + $detail->footprint = $sat->footprint; + $detail->orbit = $sat->orbit; + $detail->vis = $this->get_sat_vis($sat, $qth, $t); + + /* also store visibility "bit" */ + switch ($detail->vis) { + case self::SAT_VIS_VISIBLE: + $pass->vis[0] = 'V'; + break; + case self::SAT_VIS_DAYLIGHT: + $pass->vis[1] = 'D'; + break; + case self::SAT_VIS_ECLIPSED: + $pass->vis[2] = 'E'; + break; + default: + break; + } + + // Using an array, no need to prepend and reverse the list + // as gpredict does + $pass->details[] = $detail; + + // Look up apparent magnitude if this is a visible pass + if ($detail->vis === self::SAT_VIS_VISIBLE) { + $apmag = $sat->calculateApparentMagnitude($t, $qth); + if ($pass->max_apparent_magnitude === null || $apmag < $pass->max_apparent_magnitude) { + $pass->max_apparent_magnitude = $apmag; + } + } + + /* store elevation if greater than the + previously stored one + */ + if ($sat->el > $max_el) { + $max_el = $sat->el; + $tca = $t; + $pass->maxel_az = $sat->az; + } + + /* g_print ("TIME: %f\tAZ: %f\tEL: %f (MAX: %f)\n", */ + /* t, sat->az, sat->el, max_el); */ + } + + /* calculate satellite data */ + $this->predict_calc($sat, $qth, $pass->los); + /* store los_az, max_el and tca */ + $pass->los_az = $sat->az; + $pass->max_el = $max_el; + $pass->tca = $tca; + + /* check whether this pass is good */ + if ($max_el >= $this->minEle) { + $done = true; + } else { + $done = false; + $t0 = $los + 0.014; // +20 min + $pass = null; + } + + $iter++; + } + } + + return $pass; + } + + /** + * Calculate satellite visibility. + * + * @param Predict_Sat $sat The satellite structure. + * @param Predict_QTH $qth The QTH + * @param float $jul_utc The time at which the visibility should be calculated. + * + * @return int The visiblity constant, 0, 1, 2, or 3 (see above) + */ + public function get_sat_vis(Predict_Sat $sat, Predict_QTH $qth, $jul_utc) + { + /* gboolean sat_sun_status; + gdouble sun_el; + gdouble threshold; + gdouble eclipse_depth; + sat_vis_t vis = SAT_VIS_NONE; */ + + $eclipse_depth = 0.0; + $zero_vector = new Predict_Vector(); + $obs_geodetic = new Predict_Geodetic(); + + /* Solar ECI position vector */ + $solar_vector = new Predict_Vector(); + + /* Solar observed az and el vector */ + $solar_set = new Predict_ObsSet(); + + /* FIXME: could be passed as parameter */ + $obs_geodetic->lon = $qth->lon * self::de2ra; + $obs_geodetic->lat = $qth->lat * self::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + Predict_Solar::Calculate_Solar_Position($jul_utc, $solar_vector); + Predict_SGPObs::Calculate_Obs($jul_utc, $solar_vector, $zero_vector, $obs_geodetic, $solar_set); + + if (Predict_Solar::Sat_Eclipsed($sat->pos, $solar_vector, $eclipse_depth)) { + /* satellite is eclipsed */ + $sat_sun_status = false; + } else { + /* satellite in sunlight => may be visible */ + $sat_sun_status = true; + } + + if ($sat_sun_status) { + $sun_el = Predict_Math::Degrees($solar_set->el); + + if ($sun_el <= $this->threshold && $sat->el >= 0.0) { + $vis = self::SAT_VIS_VISIBLE; + } else { + $vis = self::SAT_VIS_DAYLIGHT; + } + } else { + $vis = self::SAT_VIS_ECLIPSED; + } + + return $vis; + } + + /** Find the AOS time of the next pass. + * @author Alexandru Csete, OZ9AEC + * @author John A. Magliacane, KD2BD + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location (QTH) data. + * @param float $start The julian date where calculation should start. + * @param int $maxdt The upper time limit in days (0.0 = no limit) + * @return The julain date of the next AOS or 0.0 if the satellite has no AOS. + * + * This function finds the time of AOS for the first coming pass taking place + * no earlier that start. + * If the satellite is currently within range, the function first calls + * find_los to get the next LOS time. Then the calculations are done using + * the new start time. + * + */ + public function find_aos(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt) + { + $t = $start; + $aostime = 0.0; + + + /* make sure current sat values are + in sync with the time + */ + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos($sat, $qth)) { + + return 0.0; + } + + if ($sat->el > 0.0) { + $t = $this->find_los($sat, $qth, $start, $maxdt) + 0.014; // +20 min + } + + /* invalid time (potentially returned by find_los) */ + if ($t < 0.1) { + return 0.0; + } + + /* update satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* use upper time limit */ + if ($maxdt > 0.0) { + + /* coarse time steps */ + while (($sat->el < -1.0) && ($t <= ($start + $maxdt))) { + $t -= 0.00035 * ($sat->el * (($sat->alt / 8400.0) + 0.46) - 2.0); + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while (($aostime == 0.0) && ($t <= ($start + $maxdt))) { + + if (abs($sat->el) < 0.005) { + $aostime = $t; + } else { + $t -= $sat->el * sqrt($sat->alt) / 530000.0; + $this->predict_calc($sat, $qth, $t); + } + } + } else { + /* don't use upper time limit */ + + /* coarse time steps */ + while ($sat->el < -1.0) { + + $t -= 0.00035 * ($sat->el * (($sat->alt / 8400.0) + 0.46) - 2.0); + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while ($aostime == 0.0) { + + if (abs($sat->el) < 0.005) { + $aostime = $t; + } else { + $t -= $sat->el * sqrt($sat->alt) / 530000.0; + $this->predict_calc($sat, $qth, $t); + } + + } + } + + return $aostime; + } + + /** SGP4SDP4 driver for doing AOS/LOS calculations. + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The QTH observer location data. + * @param float $t The time for calculation (Julian Date) + * + */ + public function predict_calc(Predict_Sat $sat, Predict_QTH $qth, $t) + { + $obs_set = new Predict_ObsSet(); + $sat_geodetic = new Predict_Geodetic(); + $obs_geodetic = new Predict_Geodetic(); + + $obs_geodetic->lon = $qth->lon * self::de2ra; + $obs_geodetic->lat = $qth->lat * self::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + $sat->jul_utc = $t; + $sat->tsince = ($sat->jul_utc - $sat->jul_epoch) * self::xmnpda; + + /* call the norad routines according to the deep-space flag */ + $sgpsdp = Predict_SGPSDP::getInstance($sat); + if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) { + $sgpsdp->SDP4($sat, $sat->tsince); + } else { + $sgpsdp->SGP4($sat, $sat->tsince); + } + + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + /* get the velocity of the satellite */ + $sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z); + $sat->velo = $sat->vel->w; + Predict_SGPObs::Calculate_Obs($sat->jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set); + Predict_SGPObs::Calculate_LatLonAlt($sat->jul_utc, $sat->pos, $sat_geodetic); + + while ($sat_geodetic->lon < -self::pi) { + $sat_geodetic->lon += self::twopi; + } + + while ($sat_geodetic->lon > (self::pi)) { + $sat_geodetic->lon -= self::twopi; + } + + $sat->az = Predict_Math::Degrees($obs_set->az); + $sat->el = Predict_Math::Degrees($obs_set->el); + $sat->range = $obs_set->range; + $sat->range_rate = $obs_set->range_rate; + $sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat); + $sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon); + $sat->alt = $sat_geodetic->alt; + $sat->ma = Predict_Math::Degrees($sat->phase); + $sat->ma *= 256.0 / 360.0; + $sat->phase = Predict_Math::Degrees($sat->phase); + + /* same formulas, but the one from predict is nicer */ + //sat->footprint = 2.0 * xkmper * acos (xkmper/sat->pos.w); + $sat->footprint = 12756.33 * acos(self::xkmper / (self::xkmper + $sat->alt)); + $age = $sat->jul_utc - $sat->jul_epoch; + $sat->orbit = floor(($sat->tle->xno * self::xmnpda / self::twopi + + $age * $sat->tle->bstar * self::ae) * $age + + $sat->tle->xmo / self::twopi) + $sat->tle->revnum - 1; + } + + /** Find the LOS time of the next pass. + * @author Alexandru Csete, OZ9AEC + * @author John A. Magliacane, KD2BD + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The QTH observer location data. + * @param float $start The time where calculation should start. (Julian Date) + * @param int $maxdt The upper time limit in days (0.0 = no limit) + * @return The time (julian date) of the next LOS or 0.0 if the satellite has no LOS. + * + * This function finds the time of LOS for the first coming pass taking place + * no earlier that start. + * If the satellite is currently out of range, the function first calls + * find_aos to get the next AOS time. Then the calculations are done using + * the new start time. + * The function has a built-in watchdog to ensure that we don't end up in + * lengthy loops. + * + */ + public function find_los(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt) + { + $t = $start; + $lostime = 0.0; + + + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos ($sat, $qth)) { + + return 0.0; + } + + if ($sat->el < 0.0) { + $t = $this->find_aos($sat, $qth, $start, $maxdt) + 0.001; // +1.5 min + } + + /* invalid time (potentially returned by find_aos) */ + if ($t < 0.01) { + return 0.0; + } + + /* update satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* use upper time limit */ + if ($maxdt > 0.0) { + + /* coarse steps */ + while (($sat->el >= 1.0) && ($t <= ($start + $maxdt))) { + $t += cos(($sat->el - 1.0) * self::de2ra) * sqrt($sat->alt) / 25000.0; + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while (($lostime == 0.0) && ($t <= ($start + $maxdt))) { + + $t += $sat->el * sqrt($sat->alt) / 502500.0; + $this->predict_calc($sat, $qth, $t); + + if (abs($sat->el) < 0.005) { + $lostime = $t; + } + } + } else { + /* don't use upper limit */ + + /* coarse steps */ + while ($sat->el >= 1.0) { + $t += cos(($sat->el - 1.0) * self::de2ra) * sqrt($sat->alt) / 25000.0; + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while ($lostime == 0.0) { + + $t += $sat->el * sqrt($sat->alt) / 502500.0; + $this->predict_calc($sat, $qth, $t); + + if (abs($sat->el) < 0.005) + $lostime = $t; + } + } + + return $lostime; + } + + /** Find AOS time of current pass. + * @param Predict_Sat $sat The satellite to find AOS for. + * @param Predict_QTH $qth The ground station. + * @param float $start Start time, prefereably now. + * @return The time of the previous AOS or 0.0 if the satellite has no AOS. + * + * This function can be used to find the AOS time in the past of the + * current pass. + */ + public function find_prev_aos(Predict_Sat $sat, Predict_QTH $qth, $start) + { + $aostime = $start; + + /* make sure current sat values are + in sync with the time + */ + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos($sat, $qth)) { + + return 0.0; + } + + while ($sat->el >= 0.0) { + $aostime -= 0.0005; // 0.75 min + $this->predict_calc($sat, $qth, $aostime); + } + + return $aostime; + } + + /** Determine whether satellite ever reaches AOS. + * @author John A. Magliacane, KD2BD + * @author Alexandru Csete, OZ9AEC + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location data + * @return bool true if the satellite will reach AOS, false otherwise. + * + */ + public function has_aos(Predict_Sat $sat, Predict_QTH $qth) + { + $retcode = false; + + /* FIXME */ + if ($sat->meanmo == 0.0) { + $retcode = false; + } else { + + /* xincl is already in RAD by select_ephemeris */ + $lin = $sat->tle->xincl; + if ($lin >= self::pio2) { + $lin = self::pi - $lin; + } + + $sma = 331.25 * exp(log(1440.0 / $sat->meanmo) * (2.0 / 3.0)); + $apogee = $sma * (1.0 + $sat->tle->eo) - self::xkmper; + + if ((acos(self::xkmper / ($apogee + self::xkmper)) + ($lin)) > abs($qth->lat * self::de2ra)) { + $retcode = true; + } else { + $retcode = false; + } + } + + return $retcode; + } + + /** Predict passes after a certain time. + * + * + * This function calculates num upcoming passes with AOS no earlier + * than t = start and not later that t = (start+maxdt). The function will + * repeatedly call get_pass until + * the number of predicted passes is equal to num, the time has reached + * limit or the get_pass function returns NULL. + * + * note For no time limit use maxdt = 0.0 + * + * note the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on (eg. if the caller + * is GtkSatList). + * + * note Prepending to a singly linked list is much faster than appending. + * Therefore, the elements are prepended whereafter the GSList is + * reversed + * + * + * @param Predict_Sat $sat The satellite data + * @param Predict_QTH $qth The observer's location data + * @param float $start The start julian date + * @param int $maxdt The max # of days to look + * @param int $num The max # of passes to get + * @return array of Predict_Pass instances if found, empty array otherwise + */ + public function get_passes(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt, $num = 0) + { + $passes = array(); + + /* if no number has been specified + set it to something big */ + if ($num == 0) { + $num = 100; + } + + $t = $start; + + for ($i = 0; $i < $num; $i++) { + $pass = $this->get_pass($sat, $qth, $t, $maxdt); + + if ($pass != null) { + $passes[] = $pass; + $t = $pass->los + 0.014; // +20 min + + /* if maxdt > 0.0 check whether we have reached t = start+maxdt + if yes finish predictions + */ + if (($maxdt > 0.0) && ($t >= ($start + $maxdt))) { + $i = $num; + } + } else { + /* we can't get any more passes */ + $i = $num; + } + } + + return $passes; + } + + /** + * Filters out visible passes and adds the visible aos, tca, los, and + * corresponding az and ele for each. + * + * @param array $passes The passes returned from get_passes() + * + * @author Bill Shupp + * @return array + */ + public function filterVisiblePasses(array $passes) + { + $filtered = array(); + + foreach ($passes as $result) { + // Dummy check + if ($result->vis[0] != 'V') { + continue; + } + + $aos = false; + $aos_az = false; + $aos = false; + $tca = false; + $los_az = false; + $max_el = 0; + + foreach ($result->details as $detail) { + if ($detail->vis != Predict::SAT_VIS_VISIBLE) { + continue; + } + if ($detail->el < $this->minEle) { + continue; + } + + if ($aos == false) { + $aos = $detail->time; + $aos_az = $detail->az; + $aos_el = $detail->el; + $tca = $detail->time; + $los = $detail->time; + $los_az = $detail->az; + $los_el = $detail->el; + $max_el = $detail->el; + $max_el_az = $detail->el; + continue; + } + $los = $detail->time; + $los_az = $detail->az; + $los_el = $detail->el; + + if ($detail->el > $max_el) { + $tca = $detail->time; + $max_el = $detail->el; + $max_el_az = $detail->az; + } + } + + if ($aos === false) { + // Does not reach minimum elevation, skip + continue; + } + + $result->visible_aos = $aos; + $result->visible_aos_az = $aos_az; + $result->visible_aos_el = $aos_el; + $result->visible_tca = $tca; + $result->visible_max_el = $max_el; + $result->visible_max_el_az = $max_el_az; + $result->visible_los = $los; + $result->visible_los_az = $los_az; + $result->visible_los_el = $los_el; + + $filtered[] = $result; + } + + return $filtered; + } + + /** + * Translates aziumuth degrees to compass direction: + * + * N (0°), NNE (22.5°), NE (45°), ENE (67.5°), E (90°), ESE (112.5°), + * SE (135°), SSE (157.5°), S (180°), SSW (202.5°), SW (225°), + * WSW (247.5°), W (270°), WNW (292.5°), NW (315°), NNW (337.5°) + * + * @param int $az The azimuth in degrees, defaults to 0 + * + * @return string + */ + public static function azDegreesToDirection($az = 0) + { + $i = floor($az / 22.5); + $m = (22.5 * (2 * $i + 1)) / 2; + $i = ($az >= $m) ? $i + 1 : $i; + + return trim(substr('N NNENE ENEE ESESE SSES SSWSW WSWW WNWNW NNWN ', $i * 3, 3)); + } +} diff --git a/lib/predict/Predict/DeepArg.php b/lib/predict/Predict/DeepArg.php new file mode 100644 index 0000000..f29178f --- /dev/null +++ b/lib/predict/Predict/DeepArg.php @@ -0,0 +1,35 @@ + 0 ) { + return 1; + } else if ($arg < 0 ) { + return -1; + } else { + return 0; + } + } + + /* Returns the arcsine of the argument */ + public static function ArcSin($arg) + { + if (abs($arg) >= 1 ) { + return (self::Sign($arg) * Predict::pio2); + } else { + return(atan($arg / sqrt(1 - $arg * $arg))); + } + } + + /* Returns arccosine of rgument */ + public static function ArcCos($arg) + { + return Predict::pio2 - self::ArcSin($arg); + } + + /* Adds vectors v1 and v2 together to produce v3 */ + public static function Vec_Add(Predict_Vector $v1, Predict_Vector $v2, Predict_Vector $v3) + { + $v3->x = $v1->x + $v2->x; + $v3->y = $v1->y + $v2->y; + $v3->z = $v1->z + $v2->z; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Subtracts vector v2 from v1 to produce v3 */ + public static function Vec_Sub(Predict_Vector $v1, Predict_Vector $v2, Predict_Vector $v3) + { + $v3->x = $v1->x - $v2->x; + $v3->y = $v1->y - $v2->y; + $v3->z = $v1->z - $v2->z; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Multiplies the vector v1 by the scalar k to produce the vector v2 */ + public static function Scalar_Multiply($k, Predict_Vector $v1, Predict_Vector $v2) + { + $v2->x = $k * $v1->x; + $v2->y = $k * $v1->y; + $v2->z = $k * $v1->z; + $v2->w = abs($k) * $v1->w; + } + + /* Multiplies the vector v1 by the scalar k */ + public static function Scale_Vector($k, Predict_Vector $v) + { + $v->x *= $k; + $v->y *= $k; + $v->z *= $k; + + $v->w = sqrt($v->x * $v->x + $v->y * $v->y + $v->z * $v->z); + } + + /* Returns the dot product of two vectors */ + public static function Dot(Predict_Vector $v1, Predict_Vector $v2) + { + return ($v1->x * $v2->x + $v1->y * $v2->y + $v1->z * $v2->z); + } + + /* Calculates the angle between vectors v1 and v2 */ + public static function Angle(Predict_Vector $v1, Predict_Vector $v2) + { + $v1->w = sqrt($v1->x * $v1->x + $v1->y * $v1->y + $v1->z * $v1->z); + $v2->w = sqrt($v2->x * $v2->x + $v2->y * $v2->y + $v2->z * $v2->z); + return (self::ArcCos(self::Dot($v1, $v2) / ($v1->w * $v2->w))); + } + + /* Produces cross product of v1 and v2, and returns in v3 */ + public static function Cross(Predict_Vector $v1, Predict_Vector $v2 ,Predict_Vector $v3) + { + $v3->x = $v1->y * $v2->z - $v1->z * $v2->y; + $v3->y = $v1->z * $v2->x - $v1->x * $v2->z; + $v3->z = $v1->x * $v2->y - $v1->y * $v2->x; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Normalizes a vector */ + public static function Normalize(Predict_Vector $v ) + { + $v->x /= $v->w; + $v->y /= $v->w; + $v->z /= $v->w; + } + + /* Four-quadrant arctan function */ + public static function AcTan($sinx, $cosx) + { + if ($cosx == 0) { + if ($sinx > 0) { + return Predict::pio2; + } else { + return Predict::x3pio2; + } + } else { + if ($cosx > 0) { + if ($sinx > 0) { + return atan($sinx / $cosx); + } else { + return Predict::twopi + atan($sinx / $cosx); + } + } else { + return Predict::pi + atan($sinx / $cosx); + } + } + } + + /* Returns mod 2pi of argument */ + public static function FMod2p($x) + { + $ret_val = $x; + $i = (int) ($ret_val / Predict::twopi); + $ret_val -= $i * Predict::twopi; + + if ($ret_val < 0) { + $ret_val += Predict::twopi; + } + + return $ret_val; + } + + /* Returns arg1 mod arg2 */ + public static function Modulus($arg1, $arg2) + { + $ret_val = $arg1; + $i = (int) ($ret_val / $arg2); + $ret_val -= $i * $arg2; + + if ($ret_val < 0) { + $ret_val += $arg2; + } + + return $ret_val; + } + + /* Returns fractional part of double argument */ + public static function Frac($arg) + { + return $arg - floor($arg); + } + + /* Converts the satellite's position and velocity */ + /* vectors from normalised values to km and km/sec */ + public static function Convert_Sat_State(Predict_Vector $pos, Predict_Vector $vel) + { + self::Scale_Vector(Predict::xkmper, $pos); + self::Scale_Vector(Predict::xkmper * Predict::xmnpda / Predict::secday, $vel); + } + + /* Returns angle in radians from arg in degrees */ + public static function Radians($arg) + { + return $arg * Predict::de2ra; + } + + /* Returns angle in degrees from arg in rads */ + public static function Degrees($arg) + { + return $arg / Predict::de2ra; + } +} diff --git a/lib/predict/Predict/ObsSet.php b/lib/predict/Predict/ObsSet.php new file mode 100644 index 0000000..9470b93 --- /dev/null +++ b/lib/predict/Predict/ObsSet.php @@ -0,0 +1,12 @@ +pos = new Predict_Vector(); + $this->vel = new Predict_Vector(); + } +} diff --git a/lib/predict/Predict/QTH.php b/lib/predict/Predict/QTH.php new file mode 100644 index 0000000..5ccd5d3 --- /dev/null +++ b/lib/predict/Predict/QTH.php @@ -0,0 +1,20 @@ +lat); /* Only run sin($geodetic->lat) once */ + + $geodetic->theta = Predict_Math::FMod2p(Predict_Time::ThetaG_JD($_time) + $geodetic->lon);/*LMST*/ + $c = 1 / sqrt(1 + Predict::__f * (Predict::__f - 2) * $sinGeodeticLat * $sinGeodeticLat); + $sq = (1 - Predict::__f) * (1 - Predict::__f) * $c; + $achcp = (Predict::xkmper * $c + $geodetic->alt) * cos($geodetic->lat); + $obs_pos->x = $achcp * cos($geodetic->theta); /*kilometers*/ + $obs_pos->y = $achcp * sin($geodetic->theta); + $obs_pos->z = (Predict::xkmper * $sq + $geodetic->alt) * $sinGeodeticLat; + $obs_vel->x = -Predict::mfactor * $obs_pos->y; /*kilometers/second*/ + $obs_vel->y = Predict::mfactor * $obs_pos->x; + $obs_vel->z = 0; + $obs_pos->w = sqrt($obs_pos->x * $obs_pos->x + $obs_pos->y * $obs_pos->y + $obs_pos->z * $obs_pos->z); + $obs_vel->w = sqrt($obs_vel->x * $obs_vel->x + $obs_vel->y * $obs_vel->y + $obs_vel->z * $obs_vel->z); + } + + /* Procedure Calculate_LatLonAlt will calculate the geodetic */ + /* position of an object given its ECI position pos and time. */ + /* It is intended to be used to determine the ground track of */ + /* a satellite. The calculations assume the earth to be an */ + /* oblate spheroid as defined in WGS '72. */ + public static function Calculate_LatLonAlt($_time, Predict_Vector $pos, Predict_Geodetic $geodetic) + { + /* Reference: The 1992 Astronomical Almanac, page K12. */ + + /* double r,e2,phi,c; */ + + $geodetic->theta = Predict_Math::AcTan($pos->y, $pos->x); /*radians*/ + $geodetic->lon = Predict_Math::FMod2p($geodetic->theta - Predict_Time::ThetaG_JD($_time)); /*radians*/ + $r = sqrt(($pos->x * $pos->x) + ($pos->y * $pos->y)); + $e2 = Predict::__f * (2 - Predict::__f); + $geodetic->lat = Predict_Math::AcTan($pos->z, $r); /*radians*/ + + do { + $phi = $geodetic->lat; + $sinPhi = sin($phi); + $c = 1 / sqrt(1 - $e2 * ($sinPhi * $sinPhi)); + $geodetic->lat = Predict_Math::AcTan($pos->z + Predict::xkmper * $c * $e2 * $sinPhi, $r); + } while (abs($geodetic->lat - $phi) >= 1E-10); + + $geodetic->alt = $r / cos($geodetic->lat) - Predict::xkmper * $c;/*kilometers*/ + + if ($geodetic->lat > Predict::pio2) { + $geodetic->lat -= Predict::twopi; + } + } + + /* The procedures Calculate_Obs and Calculate_RADec calculate */ + /* the *topocentric* coordinates of the object with ECI position, */ + /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ + /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ + /* elevation, range, and range rate (in that order) with units of */ + /* radians, radians, kilometers, and kilometers/second, respectively. */ + /* The WGS '72 geoid is used and the effect of atmospheric refraction */ + /* (under standard temperature and pressure) is incorporated into the */ + /* elevation calculation; the effect of atmospheric refraction on */ + /* range and range rate has not yet been quantified. */ + + /* The {obs_set} for Calculate_RADec consists of right ascension and */ + /* declination (in that order) in radians. Again, calculations are */ + /* based on *topocentric* position using the WGS '72 geoid and */ + /* incorporating atmospheric refraction. */ + public static function Calculate_Obs($_time, Predict_Vector $pos, Predict_Vector $vel, Predict_Geodetic $geodetic, Predict_ObsSet $obs_set) + { + $obs_pos = new Predict_Vector(); + $obs_vel = new Predict_Vector(); + $range = new Predict_Vector(); + $rgvel = new Predict_Vector(); + + self::Calculate_User_PosVel($_time, $geodetic, $obs_pos, $obs_vel); + + $range->x = $pos->x - $obs_pos->x; + $range->y = $pos->y - $obs_pos->y; + $range->z = $pos->z - $obs_pos->z; + + $rgvel->x = $vel->x - $obs_vel->x; + $rgvel->y = $vel->y - $obs_vel->y; + $rgvel->z = $vel->z - $obs_vel->z; + + $range->w = sqrt($range->x * $range->x + $range->y * $range->y + $range->z * $range->z); + + $sin_lat = sin($geodetic->lat); + $cos_lat = cos($geodetic->lat); + $sin_theta = sin($geodetic->theta); + $cos_theta = cos($geodetic->theta); + $top_s = $sin_lat * $cos_theta * $range->x + + $sin_lat * $sin_theta * $range->y + - $cos_lat * $range->z; + $top_e = -$sin_theta * $range->x + + $cos_theta * $range->y; + $top_z = $cos_lat * $cos_theta * $range->x + + $cos_lat * $sin_theta * $range->y + + $sin_lat * $range->z; + $azim = atan(-$top_e / $top_s); /*Azimuth*/ + if ($top_s > 0) { + $azim = $azim + Predict::pi; + } + if ($azim < 0 ) { + $azim = $azim + Predict::twopi; + } + $el = Predict_Math::ArcSin($top_z / $range->w); + $obs_set->az = $azim; /* Azimuth (radians) */ + $obs_set->el = $el; /* Elevation (radians)*/ + $obs_set->range = $range->w; /* Range (kilometers) */ + + /* Range Rate (kilometers/second)*/ + $obs_set->range_rate = Predict_Math::Dot($range, $rgvel) / $range->w; + + /* Corrections for atmospheric refraction */ + /* Reference: Astronomical Algorithms by Jean Meeus, pp. 101-104 */ + /* Correction is meaningless when apparent elevation is below horizon */ + // obs_set->el = obs_set->el + Radians((1.02/tan(Radians(Degrees(el)+ + // 10.3/(Degrees(el)+5.11))))/60); + if ($obs_set->el < 0) { + $obs_set->el = $el; /*Reset to true elevation*/ + } + } +} diff --git a/lib/predict/Predict/SGPSDP.php b/lib/predict/Predict/SGPSDP.php new file mode 100644 index 0000000..eed5e1c --- /dev/null +++ b/lib/predict/Predict/SGPSDP.php @@ -0,0 +1,1055 @@ +flags & self::SGP4_INITIALIZED_FLAG) { + $sat->flags |= self::SGP4_INITIALIZED_FLAG; + + /* Recover original mean motion (xnodp) and */ + /* semimajor axis (aodp) from input elements. */ + $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd); + $sat->sgps->cosio = cos($sat->tle->xincl); + $theta2 = $sat->sgps->cosio * $sat->sgps->cosio; + $sat->sgps->x3thm1 = 3 * $theta2 - 1.0; + $eosq = $sat->tle->eo * $sat->tle->eo; + $betao2 = 1 - $eosq; + $betao = sqrt($betao2); + $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($a1 * $a1 * $betao * $betao2); + $ao = $a1 * (1 - $del1 * (0.5 * Predict::tothrd + $del1 * (1 + 134.0 / 81.0 * $del1))); + $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($ao * $ao * $betao * $betao2); + $sat->sgps->xnodp = $sat->tle->xno / (1.0 + $delo); + $sat->sgps->aodp = $ao / (1.0 - $delo); + + /* For perigee less than 220 kilometers, the "simple" flag is set */ + /* and the equations are truncated to linear variation in sqrt a */ + /* and quadratic variation in mean anomaly. Also, the c3 term, */ + /* the delta omega term, and the delta m term are dropped. */ + if (($sat->sgps->aodp * (1.0 - $sat->tle->eo) / Predict::ae) < (220.0 / Predict::xkmper + Predict::ae)) { + $sat->flags |= self::SIMPLE_FLAG; + } else { + $sat->flags &= ~self::SIMPLE_FLAG; + } + + /* For perigee below 156 km, the */ + /* values of s and qoms2t are altered. */ + $s4 = Predict::__s__; + $qoms24 = Predict::qoms2t; + $perige = ($sat->sgps->aodp * (1 - $sat->tle->eo) - Predict::ae) * Predict::xkmper; + if ($perige < 156.0) { + if ($perige <= 98.0) { + $s4 = 20.0; + } else { + $s4 = $perige - 78.0; + } + $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4); + $s4 = $s4 / Predict::xkmper + Predict::ae; + }; /* FIXME FIXME: End of if(perige <= 98) NO WAY!!!! */ + + $pinvsq = 1.0 / ($sat->sgps->aodp * $sat->sgps->aodp * $betao2 * $betao2); + $tsi = 1.0 / ($sat->sgps->aodp - $s4); + $sat->sgps->eta = $sat->sgps->aodp * $sat->tle->eo * $tsi; + $etasq = $sat->sgps->eta * $sat->sgps->eta; + $eeta = $sat->tle->eo * $sat->sgps->eta; + $psisq = abs(1.0 - $etasq); + $coef = $qoms24 * pow($tsi, 4); + $coef1 = $coef / pow($psisq, 3.5); + $c2 = $coef1 * $sat->sgps->xnodp * ($sat->sgps->aodp * + (1.0 + 1.5 * $etasq + $eeta * (4.0 + $etasq)) + + 0.75 * Predict::ck2 * $tsi / $psisq * $sat->sgps->x3thm1 * + (8.0 + 3.0 * $etasq * (8 + $etasq))); + $sat->sgps->c1 = $c2 * $sat->tle->bstar; + $sat->sgps->sinio = sin($sat->tle->xincl); + $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3); + $c3 = $coef * $tsi * $a3ovk2 * $sat->sgps->xnodp * Predict::ae * $sat->sgps->sinio / $sat->tle->eo; + $sat->sgps->x1mth2 = 1.0 - $theta2; + $sat->sgps->c4 = 2.0 * $sat->sgps->xnodp * $coef1 * $sat->sgps->aodp * $betao2 * + ($sat->sgps->eta * (2.0 + 0.5 * $etasq) + + $sat->tle->eo * (0.5 + 2.0 * $etasq) - + 2.0 * Predict::ck2 * $tsi / ($sat->sgps->aodp * $psisq) * + (-3.0 * $sat->sgps->x3thm1 * (1.0 - 2.0 * $eeta + $etasq * (1.5 - 0.5 * $eeta)) + + 0.75 * $sat->sgps->x1mth2 * (2.0 * $etasq - $eeta * (1.0 + $etasq)) * + cos(2.0 * $sat->tle->omegao))); + $sat->sgps->c5 = 2.0 * $coef1 * $sat->sgps->aodp * $betao2 * + (1.0 + 2.75 * ($etasq + $eeta) + $eeta * $etasq); + $theta4 = $theta2 * $theta2; + $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->sgps->xnodp; + $temp2 = $temp1 * Predict::ck2 * $pinvsq; + $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->sgps->xnodp; + $sat->sgps->xmdot = $sat->sgps->xnodp + 0.5 * $temp1 * $betao * $sat->sgps->x3thm1 + + 0.0625 * $temp2 * $betao * (13.0 - 78.0 * $theta2 + 137.0 * $theta4); + $x1m5th = 1.0 - 5.0 * $theta2; + $sat->sgps->omgdot = -0.5 * $temp1 * $x1m5th + + 0.0625 * $temp2 * (7.0 - 114.0 * $theta2 + 395.0 * $theta4) + + $temp3 * (3.0 - 36.0 * $theta2 + 49.0 * $theta4); + $xhdot1 = -$temp1 * $sat->sgps->cosio; + $sat->sgps->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $theta2) + + 2.0 * $temp3 * (3.0 - 7.0 * $theta2)) * $sat->sgps->cosio; + $sat->sgps->omgcof = $sat->tle->bstar * $c3 * cos($sat->tle->omegao); + $sat->sgps->xmcof = -Predict::tothrd * $coef * $sat->tle->bstar * Predict::ae / $eeta; + $sat->sgps->xnodcf = 3.5 * $betao2 * $xhdot1 * $sat->sgps->c1; + $sat->sgps->t2cof = 1.5 * $sat->sgps->c1; + $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->sgps->sinio * + (3.0 + 5.0 * $sat->sgps->cosio) / (1.0 + $sat->sgps->cosio); + $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->sgps->sinio; + $sat->sgps->delmo = pow(1.0 + $sat->sgps->eta * cos($sat->tle->xmo), 3); + $sat->sgps->sinmo = sin($sat->tle->xmo); + $sat->sgps->x7thm1 = 7.0 * $theta2 - 1.0; + if (~$sat->flags & self::SIMPLE_FLAG) { + $c1sq = $sat->sgps->c1 * $sat->sgps->c1; + $sat->sgps->d2 = 4.0 * $sat->sgps->aodp * $tsi * $c1sq; + $temp = $sat->sgps->d2 * $tsi * $sat->sgps->c1 / 3.0; + $sat->sgps->d3 = (17.0 * $sat->sgps->aodp + $s4) * $temp; + $sat->sgps->d4 = 0.5 * $temp * $sat->sgps->aodp * $tsi * + (221.0 * $sat->sgps->aodp + 31.0 * $s4) * $sat->sgps->c1; + $sat->sgps->t3cof = $sat->sgps->d2 + 2.0 * $c1sq; + $sat->sgps->t4cof = 0.25 * (3.0 * $sat->sgps->d3 + $sat->sgps->c1 * + (12.0 * $sat->sgps->d2 + 10.0 * $c1sq)); + $sat->sgps->t5cof = 0.2 * (3.0 * $sat->sgps->d4 + + 12.0 * $sat->sgps->c1 * $sat->sgps->d3 + + 6.0 * $sat->sgps->d2 * $sat->sgps->d2 + + 15.0 * $c1sq * (2.0 * $sat->sgps->d2 + $c1sq)); + }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ + }; /* End of SGP4() initialization */ + + /* Update for secular gravity and atmospheric drag. */ + $xmdf = $sat->tle->xmo + $sat->sgps->xmdot * $tsince; + $omgadf = $sat->tle->omegao + $sat->sgps->omgdot * $tsince; + $xnoddf = $sat->tle->xnodeo + $sat->sgps->xnodot * $tsince; + $omega = $omgadf; + $xmp = $xmdf; + $tsq = $tsince * $tsince; + $xnode = $xnoddf + $sat->sgps->xnodcf * $tsq; + $tempa = 1.0 - $sat->sgps->c1 * $tsince; + $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince; + $templ = $sat->sgps->t2cof * $tsq; + if (~$sat->flags & self::SIMPLE_FLAG) { + $delomg = $sat->sgps->omgcof * $tsince; + $delm = $sat->sgps->xmcof * (pow(1 + $sat->sgps->eta * cos($xmdf), 3) - $sat->sgps->delmo); + $temp = $delomg + $delm; + $xmp = $xmdf + $temp; + $omega = $omgadf - $temp; + $tcube = $tsq * $tsince; + $tfour = $tsince * $tcube; + $tempa = $tempa - $sat->sgps->d2 * $tsq - $sat->sgps->d3 * $tcube - $sat->sgps->d4 * $tfour; + $tempe = $tempe + $sat->tle->bstar * $sat->sgps->c5 * (sin($xmp) - $sat->sgps->sinmo); + $templ = $templ + $sat->sgps->t3cof * $tcube + $tfour * + ($sat->sgps->t4cof + $tsince * $sat->sgps->t5cof); + }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ + + $a = $sat->sgps->aodp * pow($tempa, 2); + $e = $sat->tle->eo - $tempe; + $xl = $xmp + $omega + $xnode + $sat->sgps->xnodp * $templ; + $beta = sqrt(1.0 - ($e * $e)); + $xn = Predict::xke / pow($a, 1.5); + + /* Long period periodics */ + $axn = $e * cos($omega); + $temp = 1.0 / ($a * $beta * $beta); + $xll = $temp * $sat->sgps->xlcof * $axn; + $aynl = $temp * $sat->sgps->aycof; + $xlt = $xl + $xll; + $ayn = $e * sin($omega) + $aynl; + + /* Solve Kepler's' Equation */ + $capu = Predict_Math::FMod2p($xlt - $xnode); + $temp2 = $capu; + + $i = 0; + do { + $sinepw = sin($temp2); + $cosepw = cos($temp2); + $temp3 = $axn * $sinepw; + $temp4 = $ayn * $cosepw; + $temp5 = $axn * $cosepw; + $temp6 = $ayn * $sinepw; + $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2; + if (abs($epw - $temp2) <= Predict::e6a) { + break; + } + $temp2 = $epw; + } while ($i++ < 10); + + /* Short period preliminary quantities */ + $ecose = $temp5 + $temp6; + $esine = $temp3 - $temp4; + $elsq = $axn * $axn + $ayn * $ayn; + $temp = 1.0 - $elsq; + $pl = $a * $temp; + $r = $a * (1.0 - $ecose); + $temp1 = 1.0 / $r; + $rdot = Predict::xke * sqrt($a) * $esine * $temp1; + $rfdot = Predict::xke * sqrt($pl) * $temp1; + $temp2 = $a * $temp1; + $betal = sqrt($temp); + $temp3 = 1.0 / (1.0 + $betal); + $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3); + $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3); + $u = Predict_Math::AcTan($sinu, $cosu); + $sin2u = 2.0 * $sinu * $cosu; + $cos2u = 2.0 * $cosu * $cosu - 1.0; + $temp = 1.0 / $pl; + $temp1 = Predict::ck2 * $temp; + $temp2 = $temp1 * $temp; + + /* Update for short periodics */ + $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) + + 0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u; + $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u; + $xnodek = $xnode + 1.5 * $temp2 * $sat->sgps->cosio * $sin2u; + $xinck = $sat->tle->xincl + 1.5 * $temp2 * $sat->sgps->cosio * $sat->sgps->sinio * $cos2u; + $rdotk = $rdot - $xn * $temp1 * $sat->sgps->x1mth2 * $sin2u; + $rfdotk = $rfdot + $xn * $temp1 * ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1); + + + /* Orientation vectors */ + $sinuk = sin($uk); + $cosuk = cos($uk); + $sinik = sin($xinck); + $cosik = cos($xinck); + $sinnok = sin($xnodek); + $cosnok = cos($xnodek); + $xmx = -$sinnok * $cosik; + $xmy = $cosnok * $cosik; + $ux = $xmx * $sinuk + $cosnok * $cosuk; + $uy = $xmy * $sinuk + $sinnok * $cosuk; + $uz = $sinik * $sinuk; + $vx = $xmx * $cosuk - $cosnok * $sinuk; + $vy = $xmy * $cosuk - $sinnok * $sinuk; + $vz = $sinik * $cosuk; + + /* Position and velocity */ + $sat->pos->x = $rk * $ux; + $sat->pos->y = $rk * $uy; + $sat->pos->z = $rk * $uz; + $sat->vel->x = $rdotk * $ux + $rfdotk * $vx; + $sat->vel->y = $rdotk * $uy + $rfdotk * $vy; + $sat->vel->z = $rdotk * $uz + $rfdotk * $vz; + + $sat->phase = $xlt - $xnode - $omgadf + Predict::twopi; + if ($sat->phase < 0) { + $sat->phase += Predict::twopi; + } + $sat->phase = Predict_Math::FMod2p($sat->phase); + + $sat->tle->omegao1 = $omega; + $sat->tle->xincl1 = $xinck; + $sat->tle->xnodeo1 = $xnodek; + + } /*SGP4*/ + + /* SDP4 */ + /* This function is used to calculate the position and velocity */ + /* of deep-space (period > 225 minutes) satellites. tsince is */ + /* time since epoch in minutes, tle is a pointer to a tle_t */ + /* structure with Keplerian orbital elements and pos and vel */ + /* are vector_t structures returning ECI satellite position and */ + /* velocity. Use Convert_Sat_State() to convert to km and km/s. */ + public function SDP4(Predict_Sat $sat, $tsince) + { + /* Initialization */ + if (~$sat->flags & self::SDP4_INITIALIZED_FLAG) { + + $sat->flags |= self::SDP4_INITIALIZED_FLAG; + + /* Recover original mean motion (xnodp) and */ + /* semimajor axis (aodp) from input elements. */ + $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd); + $sat->deep_arg->cosio = cos($sat->tle->xincl); + $sat->deep_arg->theta2 = $sat->deep_arg->cosio * $sat->deep_arg->cosio; + $sat->sgps->x3thm1 = 3.0 * $sat->deep_arg->theta2 - 1.0; + $sat->deep_arg->eosq = $sat->tle->eo * $sat->tle->eo; + $sat->deep_arg->betao2 = 1.0 - $sat->deep_arg->eosq; + $sat->deep_arg->betao = sqrt($sat->deep_arg->betao2); + $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / + ($a1 * $a1 * $sat->deep_arg->betao * $sat->deep_arg->betao2); + $ao = $a1 * (1.0 - $del1 * (0.5 * Predict::tothrd + $del1 * (1.0 + 134.0 / 81.0 * $del1))); + $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / + ($ao * $ao * $sat->deep_arg->betao * $sat->deep_arg->betao2); + $sat->deep_arg->xnodp = $sat->tle->xno / (1.0 + $delo); + $sat->deep_arg->aodp = $ao / (1.0 - $delo); + + /* For perigee below 156 km, the values */ + /* of s and qoms2t are altered. */ + $s4 = Predict::__s__; + $qoms24 = Predict::qoms2t; + $perige = ($sat->deep_arg->aodp * (1.0 - $sat->tle->eo) - Predict::ae) * Predict::xkmper; + if ($perige < 156.0) { + if ($perige <= 98.0) { + $s4 = 20.0; + } else { + $s4 = $perige - 78.0; + } + $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4); + $s4 = $s4 / Predict::xkmper + Predict::ae; + } + $pinvsq = 1.0 / ($sat->deep_arg->aodp * $sat->deep_arg->aodp * + $sat->deep_arg->betao2 * $sat->deep_arg->betao2); + $sat->deep_arg->sing = sin($sat->tle->omegao); + $sat->deep_arg->cosg = cos($sat->tle->omegao); + $tsi = 1.0 / ($sat->deep_arg->aodp - $s4); + $eta = $sat->deep_arg->aodp * $sat->tle->eo * $tsi; + $etasq = $eta * $eta; + $eeta = $sat->tle->eo * $eta; + $psisq = abs(1.0 - $etasq); + $coef = $qoms24 * pow($tsi, 4); + $coef1 = $coef / pow($psisq, 3.5); + $c2 = $coef1 * $sat->deep_arg->xnodp * ($sat->deep_arg->aodp * + (1.0 + 1.5 * $etasq + $eeta * + (4.0 + $etasq)) + 0.75 * Predict::ck2 * $tsi / $psisq * + $sat->sgps->x3thm1 * (8.0 + 3.0 * $etasq * + (8.0 + $etasq))); + $sat->sgps->c1 = $sat->tle->bstar * $c2; + $sat->deep_arg->sinio = sin($sat->tle->xincl); + $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3); + $sat->sgps->x1mth2 = 1.0 - $sat->deep_arg->theta2; + $sat->sgps->c4 = 2.0 * $sat->deep_arg->xnodp * $coef1 * + $sat->deep_arg->aodp * $sat->deep_arg->betao2 * + ($eta * (2.0 + 0.5 * $etasq) + $sat->tle->eo * + (0.5 + 2.0 * $etasq) - 2.0 * Predict::ck2 * $tsi / + ($sat->deep_arg->aodp * $psisq) * (-3.0 * $sat->sgps->x3thm1 * + (1.0 - 2.0 * $eeta + $etasq * + (1.5 - 0.5 * $eeta)) + + 0.75 * $sat->sgps->x1mth2 * + (2.0 * $etasq - $eeta * (1.0 + $etasq)) * + cos(2.0 * $sat->tle->omegao))); + $theta4 = $sat->deep_arg->theta2 * $sat->deep_arg->theta2; + $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->deep_arg->xnodp; + $temp2 = $temp1 * Predict::ck2 * $pinvsq; + $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->deep_arg->xnodp; + $sat->deep_arg->xmdot = $sat->deep_arg->xnodp + 0.5 * $temp1 * $sat->deep_arg->betao * + $sat->sgps->x3thm1 + 0.0625 * $temp2 * $sat->deep_arg->betao * + (13.0 - 78.0 * $sat->deep_arg->theta2 + 137.0 * $theta4); + $x1m5th = 1.0 - 5.0 * $sat->deep_arg->theta2; + $sat->deep_arg->omgdot = -0.5 * $temp1 * $x1m5th + 0.0625 * $temp2 * + (7.0 - 114.0 * $sat->deep_arg->theta2 + 395.0 * $theta4) + + $temp3 * (3.0 - 36.0 * $sat->deep_arg->theta2 + 49.0 * $theta4); + $xhdot1 = -$temp1 * $sat->deep_arg->cosio; + $sat->deep_arg->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $sat->deep_arg->theta2) + + 2.0 * $temp3 * (3.0 - 7.0 * $sat->deep_arg->theta2)) * + $sat->deep_arg->cosio; + $sat->sgps->xnodcf = 3.5 * $sat->deep_arg->betao2 * $xhdot1 * $sat->sgps->c1; + $sat->sgps->t2cof = 1.5 * $sat->sgps->c1; + $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->deep_arg->sinio * + (3.0 + 5.0 * $sat->deep_arg->cosio) / (1.0 + $sat->deep_arg->cosio); + $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->deep_arg->sinio; + $sat->sgps->x7thm1 = 7.0 * $sat->deep_arg->theta2 - 1.0; + + /* initialize Deep() */ + $this->Deep(self::dpinit, $sat); + }; /*End of SDP4() initialization */ + + /* Update for secular gravity and atmospheric drag */ + $xmdf = $sat->tle->xmo + $sat->deep_arg->xmdot * $tsince; + $sat->deep_arg->omgadf = $sat->tle->omegao + $sat->deep_arg->omgdot * $tsince; + $xnoddf = $sat->tle->xnodeo + $sat->deep_arg->xnodot * $tsince; + $tsq = $tsince * $tsince; + $sat->deep_arg->xnode = $xnoddf + $sat->sgps->xnodcf * $tsq; + $tempa = 1.0 - $sat->sgps->c1 * $tsince; + $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince; + $templ = $sat->sgps->t2cof * $tsq; + $sat->deep_arg->xn = $sat->deep_arg->xnodp; + + /* Update for deep-space secular effects */ + $sat->deep_arg->xll = $xmdf; + $sat->deep_arg->t = $tsince; + + $this->Deep(self::dpsec, $sat); + + $xmdf = $sat->deep_arg->xll; + $a = pow(Predict::xke / $sat->deep_arg->xn, Predict::tothrd) * $tempa * $tempa; + $sat->deep_arg->em = $sat->deep_arg->em - $tempe; + $xmam = $xmdf + $sat->deep_arg->xnodp * $templ; + + /* Update for deep-space periodic effects */ + $sat->deep_arg->xll = $xmam; + + $this->Deep(self::dpper, $sat); + + $xmam = $sat->deep_arg->xll; + $xl = $xmam + $sat->deep_arg->omgadf + $sat->deep_arg->xnode; + $beta = sqrt(1.0 - $sat->deep_arg->em * $sat->deep_arg->em); + $sat->deep_arg->xn = Predict::xke / pow($a, 1.5); + + /* Long period periodics */ + $axn = $sat->deep_arg->em * cos($sat->deep_arg->omgadf); + $temp = 1.0 / ($a * $beta * $beta); + $xll = $temp * $sat->sgps->xlcof * $axn; + $aynl = $temp * $sat->sgps->aycof; + $xlt = $xl + $xll; + $ayn = $sat->deep_arg->em * sin($sat->deep_arg->omgadf) + $aynl; + + /* Solve Kepler's Equation */ + $capu = Predict_Math::FMod2p ($xlt - $sat->deep_arg->xnode); + $temp2 = $capu; + + $i = 0; + do { + $sinepw = sin($temp2); + $cosepw = cos($temp2); + $temp3 = $axn * $sinepw; + $temp4 = $ayn * $cosepw; + $temp5 = $axn * $cosepw; + $temp6 = $ayn * $sinepw; + $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2; + if (abs($epw - $temp2) <= Predict::e6a) { + break; + } + $temp2 = $epw; + } while ($i++ < 10); + + /* Short period preliminary quantities */ + $ecose = $temp5 + $temp6; + $esine = $temp3 - $temp4; + $elsq = $axn * $axn + $ayn * $ayn; + $temp = 1.0 - $elsq; + $pl = $a * $temp; + $r = $a * (1.0 - $ecose); + $temp1 = 1.0 / $r; + $rdot = Predict::xke * sqrt($a) * $esine * $temp1; + $rfdot = Predict::xke * sqrt($pl) * $temp1; + $temp2 = $a * $temp1; + $betal = sqrt($temp); + $temp3 = 1.0 / (1.0 + $betal); + $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3); + $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3); + $u = Predict_Math::AcTan($sinu, $cosu); + $sin2u = 2.0 * $sinu * $cosu; + $cos2u = 2.0 * $cosu * $cosu - 1.0; + $temp = 1.0 / $pl; + $temp1 = Predict::ck2 * $temp; + $temp2 = $temp1 * $temp; + + /* Update for short periodics */ + $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) + + 0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u; + $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u; + $xnodek = $sat->deep_arg->xnode + 1.5 * $temp2 * $sat->deep_arg->cosio * $sin2u; + $xinck = $sat->deep_arg->xinc + 1.5 * $temp2 * + $sat->deep_arg->cosio * $sat->deep_arg->sinio * $cos2u; + $rdotk = $rdot - $sat->deep_arg->xn * $temp1 * $sat->sgps->x1mth2 * $sin2u; + $rfdotk = $rfdot + $sat->deep_arg->xn * $temp1 * + ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1); + + /* Orientation vectors */ + $sinuk = sin($uk); + $cosuk = cos($uk); + $sinik = sin($xinck); + $cosik = cos($xinck); + $sinnok = sin($xnodek); + $cosnok = cos($xnodek); + $xmx = -$sinnok * $cosik; + $xmy = $cosnok * $cosik; + $ux = $xmx * $sinuk + $cosnok * $cosuk; + $uy = $xmy * $sinuk + $sinnok * $cosuk; + $uz = $sinik * $sinuk; + $vx = $xmx * $cosuk - $cosnok * $sinuk; + $vy = $xmy * $cosuk - $sinnok * $sinuk; + $vz = $sinik * $cosuk; + + /* Position and velocity */ + $sat->pos->x = $rk * $ux; + $sat->pos->y = $rk * $uy; + $sat->pos->z = $rk * $uz; + $sat->vel->x = $rdotk * $ux + $rfdotk * $vx; + $sat->vel->y = $rdotk * $uy + $rfdotk * $vy; + $sat->vel->z = $rdotk * $uz + $rfdotk * $vz; + + /* Phase in rads */ + $sat->phase = $xlt - $sat->deep_arg->xnode - $sat->deep_arg->omgadf + Predict::twopi; + if ($sat->phase < 0.0) { + $sat->phase += Predict::twopi; + } + $sat->phase = Predict_Math::FMod2p ($sat->phase); + + $sat->tle->omegao1 = $sat->deep_arg->omgadf; + $sat->tle->xincl1 = $sat->deep_arg->xinc; + $sat->tle->xnodeo1 = $sat->deep_arg->xnode; + } /* SDP4 */ + + + /* DEEP */ + /* This function is used by SDP4 to add lunar and solar */ + /* perturbation effects to deep-space orbit objects. */ + public function Deep($ientry, Predict_Sat $sat) + { + switch ($ientry) { + case self::dpinit : /* Entrance for deep space initialization */ + $sat->dps->thgr = Predict_Time::ThetaG($sat->tle->epoch, $sat->deep_arg); + $eq = $sat->tle->eo; + $sat->dps->xnq = $sat->deep_arg->xnodp; + $aqnv = 1.0 / $sat->deep_arg->aodp; + $sat->dps->xqncl = $sat->tle->xincl; + $xmao = $sat->tle->xmo; + $xpidot = $sat->deep_arg->omgdot + $sat->deep_arg->xnodot; + $sinq = sin($sat->tle->xnodeo); + $cosq = cos($sat->tle->xnodeo); + $sat->dps->omegaq = $sat->tle->omegao; + $sat->dps->preep = 0; + + /* Initialize lunar solar terms */ + $day = $sat->deep_arg->ds50 + 18261.5; /* Days since 1900 Jan 0.5 */ + if ($day != $sat->dps->preep) { + $sat->dps->preep = $day; + $xnodce = 4.5236020 - 9.2422029E-4 * $day; + $stem = sin($xnodce); + $ctem = cos($xnodce); + $sat->dps->zcosil = 0.91375164 - 0.03568096 * $ctem; + $sat->dps->zsinil = sqrt(1.0 - $sat->dps->zcosil * $sat->dps->zcosil); + $sat->dps->zsinhl = 0.089683511 * $stem / $sat->dps->zsinil; + $sat->dps->zcoshl = sqrt(1.0 - $sat->dps->zsinhl * $sat->dps->zsinhl); + $c = 4.7199672 + 0.22997150 * $day; + $gam = 5.8351514 + 0.0019443680 * $day; + $sat->dps->zmol = Predict_Math::FMod2p($c - $gam); + $zx = 0.39785416 * $stem / $sat->dps->zsinil; + $zy = $sat->dps->zcoshl * $ctem + 0.91744867 * $sat->dps->zsinhl * $stem; + $zx = Predict_Math::AcTan($zx, $zy); + $zx = $gam + $zx - $xnodce; + $sat->dps->zcosgl = cos($zx); + $sat->dps->zsingl = sin($zx); + $sat->dps->zmos = 6.2565837 + 0.017201977 * $day; + $sat->dps->zmos = Predict_Math::FMod2p($sat->dps->zmos); + } /* End if(day != preep) */ + + /* Do solar terms */ + $sat->dps->savtsn = 1E20; + $zcosg = Predict::zcosgs; + $zsing = Predict::zsings; + $zcosi = Predict::zcosis; + $zsini = Predict::zsinis; + $zcosh = $cosq; + $zsinh = $sinq; + $cc = Predict::c1ss; + $zn = Predict::zns; + $ze = Predict::zes; + $zmo = $sat->dps->zmos; + $xnoi = 1.0 / $sat->dps->xnq; + + /* Loop breaks when Solar terms are done a second */ + /* time, after Lunar terms are initialized */ + for(;;) { + /* Solar terms done again after Lunar terms are done */ + $a1 = $zcosg * $zcosh + $zsing * $zcosi * $zsinh; + $a3 = -$zsing * $zcosh + $zcosg * $zcosi * $zsinh; + $a7 = -$zcosg * $zsinh + $zsing * $zcosi * $zcosh; + $a8 = $zsing * $zsini; + $a9 = $zsing * $zsinh + $zcosg * $zcosi * $zcosh; + $a10 = $zcosg * $zsini; + $a2 = $sat->deep_arg->cosio * $a7 + $sat->deep_arg->sinio * $a8; + $a4 = $sat->deep_arg->cosio * $a9 + $sat->deep_arg->sinio * $a10; + $a5 = -$sat->deep_arg->sinio * $a7 + $sat->deep_arg->cosio * $a8; + $a6 = -$sat->deep_arg->sinio * $a9 + $sat->deep_arg->cosio * $a10; + $x1 = $a1 * $sat->deep_arg->cosg + $a2 * $sat->deep_arg->sing; + $x2 = $a3 * $sat->deep_arg->cosg + $a4 * $sat->deep_arg->sing; + $x3 = -$a1 * $sat->deep_arg->sing + $a2 * $sat->deep_arg->cosg; + $x4 = -$a3 * $sat->deep_arg->sing + $a4 * $sat->deep_arg->cosg; + $x5 = $a5 * $sat->deep_arg->sing; + $x6 = $a6 * $sat->deep_arg->sing; + $x7 = $a5 * $sat->deep_arg->cosg; + $x8 = $a6 * $sat->deep_arg->cosg; + $z31 = 12 * $x1 * $x1 - 3 * $x3 * $x3; + $z32 = 24 * $x1 * $x2 - 6 * $x3 * $x4; + $z33 = 12 * $x2 * $x2 - 3 * $x4 * $x4; + $z1 = 3 * ($a1 * $a1 + $a2 * $a2) + $z31 * $sat->deep_arg->eosq; + $z2 = 6 * ($a1 * $a3 + $a2 * $a4) + $z32 * $sat->deep_arg->eosq; + $z3 = 3 * ($a3 * $a3 + $a4 * $a4) + $z33 * $sat->deep_arg->eosq; + $z11 = -6 * $a1 * $a5 + $sat->deep_arg->eosq * (-24 * $x1 * $x7 - 6 * $x3 * $x5); + $z12 = -6 * ($a1 * $a6 + $a3 * $a5) + $sat->deep_arg->eosq * + (-24 * ($x2 * $x7 + $x1 * $x8) - 6 * ($x3 * $x6 + $x4 * $x5)); + $z13 = -6 * $a3 * $a6 + $sat->deep_arg->eosq * (-24 * $x2 * $x8 - 6 * $x4 * $x6); + $z21 = 6 * $a2 * $a5 + $sat->deep_arg->eosq * (24 * $x1 * $x5 - 6 * $x3 * $x7); + $z22 = 6 * ($a4 * $a5 + $a2 * $a6) + $sat->deep_arg->eosq * + (24 * ($x2 * $x5 + $x1 * $x6) - 6 * ($x4 * $x7 + $x3 * $x8)); + $z23 = 6 * $a4 * $a6 + $sat->deep_arg->eosq * (24 * $x2 * $x6 - 6 * $x4 * $x8); + $z1 = $z1 + $z1 + $sat->deep_arg->betao2 * $z31; + $z2 = $z2 + $z2 + $sat->deep_arg->betao2 * $z32; + $z3 = $z3 + $z3 + $sat->deep_arg->betao2 * $z33; + $s3 = $cc * $xnoi; + $s2 = -0.5 * $s3 / $sat->deep_arg->betao; + $s4 = $s3 * $sat->deep_arg->betao; + $s1 = -15 * $eq * $s4; + $s5 = $x1 * $x3 + $x2 * $x4; + $s6 = $x2 * $x3 + $x1 * $x4; + $s7 = $x2 * $x4 - $x1 * $x3; + $se = $s1 * $zn * $s5; + $si = $s2 * $zn * ($z11 + $z13); + $sl = -$zn * $s3 * ($z1 + $z3 - 14 - 6 * $sat->deep_arg->eosq); + $sgh = $s4 * $zn * ($z31 + $z33 - 6); + $sh = -$zn * $s2 * ($z21 + $z23); + if ($sat->dps->xqncl < 5.2359877E-2) { + $sh = 0; + } + $sat->dps->ee2 = 2 * $s1 * $s6; + $sat->dps->e3 = 2 * $s1 * $s7; + $sat->dps->xi2 = 2 * $s2 * $z12; + $sat->dps->xi3 = 2 * $s2 * ($z13 - $z11); + $sat->dps->xl2 = -2 * $s3 * $z2; + $sat->dps->xl3 = -2 * $s3 * ($z3 - $z1); + $sat->dps->xl4 = -2 * $s3 * (-21 - 9 * $sat->deep_arg->eosq) * $ze; + $sat->dps->xgh2 = 2 * $s4 * $z32; + $sat->dps->xgh3 = 2 * $s4 * ($z33 - $z31); + $sat->dps->xgh4 = -18 * $s4 * $ze; + $sat->dps->xh2 = -2 * $s2 * $z22; + $sat->dps->xh3 = -2 * $s2 * ($z23 - $z21); + + if ($sat->flags & self::LUNAR_TERMS_DONE_FLAG) { + break; + } + + /* Do lunar terms */ + $sat->dps->sse = $se; + $sat->dps->ssi = $si; + $sat->dps->ssl = $sl; + $sat->dps->ssh = $sh / $sat->deep_arg->sinio; + $sat->dps->ssg = $sgh - $sat->deep_arg->cosio * $sat->dps->ssh; + $sat->dps->se2 = $sat->dps->ee2; + $sat->dps->si2 = $sat->dps->xi2; + $sat->dps->sl2 = $sat->dps->xl2; + $sat->dps->sgh2 = $sat->dps->xgh2; + $sat->dps->sh2 = $sat->dps->xh2; + $sat->dps->se3 = $sat->dps->e3; + $sat->dps->si3 = $sat->dps->xi3; + $sat->dps->sl3 = $sat->dps->xl3; + $sat->dps->sgh3 = $sat->dps->xgh3; + $sat->dps->sh3 = $sat->dps->xh3; + $sat->dps->sl4 = $sat->dps->xl4; + $sat->dps->sgh4 = $sat->dps->xgh4; + $zcosg = $sat->dps->zcosgl; + $zsing = $sat->dps->zsingl; + $zcosi = $sat->dps->zcosil; + $zsini = $sat->dps->zsinil; + $zcosh = $sat->dps->zcoshl * $cosq + $sat->dps->zsinhl * $sinq; + $zsinh = $sinq * $sat->dps->zcoshl - $cosq * $sat->dps->zsinhl; + $zn = Predict::znl; + $cc = Predict::c1l; + $ze = Predict::zel; + $zmo = $sat->dps->zmol; + $sat->flags |= self::LUNAR_TERMS_DONE_FLAG; + } /* End of for(;;) */ + + $sat->dps->sse = $sat->dps->sse + $se; + $sat->dps->ssi = $sat->dps->ssi + $si; + $sat->dps->ssl = $sat->dps->ssl + $sl; + $sat->dps->ssg = $sat->dps->ssg + $sgh - $sat->deep_arg->cosio / $sat->deep_arg->sinio * $sh; + $sat->dps->ssh = $sat->dps->ssh + $sh / $sat->deep_arg->sinio; + + /* Geopotential resonance initialization for 12 hour orbits */ + $sat->flags &= ~self::RESONANCE_FLAG; + $sat->flags &= ~self::SYNCHRONOUS_FLAG; + + if (!(($sat->dps->xnq < 0.0052359877) && ($sat->dps->xnq > 0.0034906585))) { + if( ($sat->dps->xnq < 0.00826) || ($sat->dps->xnq > 0.00924) ) { + return; + } + if ($eq < 0.5) { + return; + } + $sat->flags |= self::RESONANCE_FLAG; + $eoc = $eq * $sat->deep_arg->eosq; + $g201 = -0.306 - ($eq - 0.64) * 0.440; + if ($eq <= 0.65) { + $g211 = 3.616 - 13.247 * $eq + 16.290 * $sat->deep_arg->eosq; + $g310 = -19.302 + 117.390 * $eq - 228.419 * + $sat->deep_arg->eosq + 156.591 * $eoc; + $g322 = -18.9068 + 109.7927 * $eq - 214.6334 * + $sat->deep_arg->eosq + 146.5816 * $eoc; + $g410 = -41.122 + 242.694 * $eq - 471.094 * + $sat->deep_arg->eosq + 313.953 * $eoc; + $g422 = -146.407 + 841.880 * $eq - 1629.014 * + $sat->deep_arg->eosq + 1083.435 * $eoc; + $g520 = -532.114 + 3017.977 * $eq - 5740 * + $sat->deep_arg->eosq + 3708.276 * $eoc; + } else { + $g211 = -72.099 + 331.819 * $eq - 508.738 * + $sat->deep_arg->eosq + 266.724 * $eoc; + $g310 = -346.844 + 1582.851 * $eq - 2415.925 * + $sat->deep_arg->eosq + 1246.113 * $eoc; + $g322 = -342.585 + 1554.908 * $eq - 2366.899 * + $sat->deep_arg->eosq + 1215.972 * $eoc; + $g410 = -1052.797 + 4758.686 * $eq - 7193.992 * + $sat->deep_arg->eosq + 3651.957 * $eoc; + $g422 = -3581.69 + 16178.11 * $eq - 24462.77 * + $sat->deep_arg->eosq+ 12422.52 * $eoc; + if ($eq <= 0.715) { + $g520 = 1464.74 - 4664.75 * $eq + 3763.64 * $sat->deep_arg->eosq; + } else { + $g520 = -5149.66 + 29936.92 * $eq - 54087.36 * + $sat->deep_arg->eosq + 31324.56 * $eoc; + } + } /* End if (eq <= 0.65) */ + + if ($eq < 0.7) { + $g533 = -919.2277 + 4988.61 * $eq - 9064.77 * + $sat->deep_arg->eosq + 5542.21 * $eoc; + $g521 = -822.71072 + 4568.6173 * $eq - 8491.4146 * + $sat->deep_arg->eosq + 5337.524 * $eoc; + $g532 = -853.666 + 4690.25 * $eq - 8624.77 * + $sat->deep_arg->eosq + 5341.4 * $eoc; + } + else { + $g533 = -37995.78 + 161616.52 * $eq - 229838.2* + $sat->deep_arg->eosq + 109377.94 * $eoc; + $g521 = -51752.104 + 218913.95 * $eq - 309468.16* + $sat->deep_arg->eosq + 146349.42 * $eoc; + $g532 = -40023.88 + 170470.89 * $eq - 242699.48* + $sat->deep_arg->eosq + 115605.82 * $eoc; + } /* End if (eq <= 0.7) */ + + $sini2 = $sat->deep_arg->sinio * $sat->deep_arg->sinio; + $f220 = 0.75 * (1 + 2 * $sat->deep_arg->cosio + $sat->deep_arg->theta2); + $f221 = 1.5 * $sini2; + $f321 = 1.875 * $sat->deep_arg->sinio * (1 - 2 * + $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2); + $f322 = -1.875 * $sat->deep_arg->sinio * (1 + 2* + $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2); + $f441 = 35 * $sini2 * $f220; + $f442 = 39.3750 * $sini2 * $sini2; + $f522 = 9.84375 * $sat->deep_arg->sinio * ($sini2 * (1 - 2 * $sat->deep_arg->cosio - 5 * + $sat->deep_arg->theta2) + 0.33333333 * (-2 + 4 * $sat->deep_arg->cosio + + 6 * $sat->deep_arg->theta2)); + $f523 = $sat->deep_arg->sinio * (4.92187512 * $sini2 * (-2 - 4 * + $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2) + 6.56250012 + * (1 + 2 * $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2)); + $f542 = 29.53125 * $sat->deep_arg->sinio * (2 - 8 * + $sat->deep_arg->cosio + $sat->deep_arg->theta2 * + (-12 + 8 * $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2)); + $f543 = 29.53125 * $sat->deep_arg->sinio * (-2 - 8 * $sat->deep_arg->cosio + + $sat->deep_arg->theta2 * (12 + 8 * $sat->deep_arg->cosio - 10 * + $sat->deep_arg->theta2)); + $xno2 = $sat->dps->xnq * $sat->dps->xnq; + $ainv2 = $aqnv * $aqnv; + $temp1 = 3 * $xno2 * $ainv2; + $temp = $temp1 * Predict::root22; + $sat->dps->d2201 = $temp * $f220 * $g201; + $sat->dps->d2211 = $temp * $f221 * $g211; + $temp1 = $temp1 * $aqnv; + $temp = $temp1 * Predict::root32; + $sat->dps->d3210 = $temp * $f321 * $g310; + $sat->dps->d3222 = $temp * $f322 * $g322; + $temp1 = $temp1 * $aqnv; + $temp = 2 * $temp1 * Predict::root44; + $sat->dps->d4410 = $temp * $f441 * $g410; + $sat->dps->d4422 = $temp * $f442 * $g422; + $temp1 = $temp1 * $aqnv; + $temp = $temp1 * Predict::root52; + $sat->dps->d5220 = $temp * $f522 * $g520; + $sat->dps->d5232 = $temp * $f523 * $g532; + $temp = 2 * $temp1 * Predict::root54; + $sat->dps->d5421 = $temp * $f542 * $g521; + $sat->dps->d5433 = $temp * $f543 * $g533; + $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->xnodeo - $sat->dps->thgr - $sat->dps->thgr; + $bfact = $sat->deep_arg->xmdot + $sat->deep_arg->xnodot + + $sat->deep_arg->xnodot - Predict::thdt - Predict::thdt; + $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssh + $sat->dps->ssh; + } else { + $sat->flags |= self::RESONANCE_FLAG; + $sat->flags |= self::SYNCHRONOUS_FLAG; + /* Synchronous resonance terms initialization */ + $g200 = 1 + $sat->deep_arg->eosq * (-2.5 + 0.8125 * $sat->deep_arg->eosq); + $g310 = 1 + 2 * $sat->deep_arg->eosq; + $g300 = 1 + $sat->deep_arg->eosq * (-6 + 6.60937 * $sat->deep_arg->eosq); + $f220 = 0.75 * (1 + $sat->deep_arg->cosio) * (1 + $sat->deep_arg->cosio); + $f311 = 0.9375 * $sat->deep_arg->sinio * $sat->deep_arg->sinio * + (1 + 3 * $sat->deep_arg->cosio) - 0.75 * (1 + $sat->deep_arg->cosio); + $f330 = 1 + $sat->deep_arg->cosio; + $f330 = 1.875 * $f330 * $f330 * $f330; + $sat->dps->del1 = 3 * $sat->dps->xnq * $sat->dps->xnq * $aqnv * $aqnv; + $sat->dps->del2 = 2 * $sat->dps->del1 * $f220 * $g200 * Predict::q22; + $sat->dps->del3 = 3 * $sat->dps->del1 * $f330 * $g300 * Predict::q33 * $aqnv; + $sat->dps->del1 = $sat->dps->del1 * $f311 * $g310 * Predict::q31 * $aqnv; + $sat->dps->fasx2 = 0.13130908; + $sat->dps->fasx4 = 2.8843198; + $sat->dps->fasx6 = 0.37448087; + $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->omegao - $sat->dps->thgr; + $bfact = $sat->deep_arg->xmdot + $xpidot - Predict::thdt; + $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssg + $sat->dps->ssh; + } /* End if( !(xnq < 0.0052359877) && (xnq > 0.0034906585) ) */ + + $sat->dps->xfact = $bfact - $sat->dps->xnq; + + /* Initialize integrator */ + $sat->dps->xli = $sat->dps->xlamo; + $sat->dps->xni = $sat->dps->xnq; + $sat->dps->atime = 0; + $sat->dps->stepp = 720; + $sat->dps->stepn = -720; + $sat->dps->step2 = 259200; + /* End case self::dpinit: */ + return; + + case self::dpsec: /* Entrance for deep space secular effects */ + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->ssl * $sat->deep_arg->t; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $sat->dps->ssg * $sat->deep_arg->t; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + $sat->dps->ssh * $sat->deep_arg->t; + $sat->deep_arg->em = $sat->tle->eo + $sat->dps->sse * $sat->deep_arg->t; + $sat->deep_arg->xinc = $sat->tle->xincl + $sat->dps->ssi * $sat->deep_arg->t; + if ($sat->deep_arg->xinc < 0) { + $sat->deep_arg->xinc = -$sat->deep_arg->xinc; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + Predict::pi; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf - Predict::pi; + } + if(~$sat->flags & self::RESONANCE_FLAG ) { + return; + } + + do { + if ( ($sat->dps->atime == 0) || + (($sat->deep_arg->t >= 0) && ($sat->dps->atime < 0)) || + (($sat->deep_arg->t < 0) && ($sat->dps->atime >= 0)) ) { + /* Epoch restart */ + if ($sat->deep_arg->t >= 0) { + $delt = $sat->dps->stepp; + } else { + $delt = $sat->dps->stepn; + } + + $sat->dps->atime = 0; + $sat->dps->xni = $sat->dps->xnq; + $sat->dps->xli = $sat->dps->xlamo; + } else { + if (abs($sat->deep_arg->t) >= abs($sat->dps->atime)) { + if ($sat->deep_arg->t > 0) { + $delt = $sat->dps->stepp; + } else { + $delt = $sat->dps->stepn; + } + } + } + + do { + if (abs($sat->deep_arg->t - $sat->dps->atime) >= $sat->dps->stepp) { + $sat->flags |= self::DO_LOOP_FLAG; + $sat->flags &= ~self::EPOCH_RESTART_FLAG; + } + else { + $ft = $sat->deep_arg->t - $sat->dps->atime; + $sat->flags &= ~self::DO_LOOP_FLAG; + } + + if (abs($sat->deep_arg->t) < abs($sat->dps->atime)) { + if ($sat->deep_arg->t >= 0) { + $delt = $sat->dps->stepn; + } else { + $delt = $sat->dps->stepp; + } + $sat->flags |= (self::DO_LOOP_FLAG | self::EPOCH_RESTART_FLAG); + } + + /* Dot terms calculated */ + if ($sat->flags & self::SYNCHRONOUS_FLAG) { + $xndot = $sat->dps->del1 * sin($sat->dps->xli - $sat->dps->fasx2) + $sat->dps->del2 * sin(2 * ($sat->dps->xli - $sat->dps->fasx4)) + + $sat->dps->del3 * sin(3 * ($sat->dps->xli - $sat->dps->fasx6)); + $xnddt = $sat->dps->del1 * cos($sat->dps->xli - $sat->dps->fasx2) + 2 * $sat->dps->del2 * cos(2 * ($sat->dps->xli - $sat->dps->fasx4)) + + 3 * $sat->dps->del3 * cos(3 * ($sat->dps->xli - $sat->dps->fasx6)); + } else { + $xomi = $sat->dps->omegaq + $sat->deep_arg->omgdot * $sat->dps->atime; + $x2omi = $xomi + $xomi; + $x2li = $sat->dps->xli + $sat->dps->xli; + $xndot = $sat->dps->d2201 * sin($x2omi + $sat->dps->xli - Predict::g22) + + $sat->dps->d2211 * sin($sat->dps->xli - Predict::g22) + + $sat->dps->d3210 * sin($xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d3222 * sin(-$xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d4410 * sin($x2omi + $x2li- Predict::g44) + + $sat->dps->d4422 * sin($x2li- Predict::g44) + + $sat->dps->d5220 * sin($xomi + $sat->dps->xli- Predict::g52) + + $sat->dps->d5232 * sin(-$xomi + $sat->dps->xli- Predict::g52) + + $sat->dps->d5421 * sin($xomi + $x2li - Predict::g54) + + $sat->dps->d5433 * sin(-$xomi + $x2li - Predict::g54); + $xnddt = $sat->dps->d2201 * cos($x2omi + $sat->dps->xli- Predict::g22) + + $sat->dps->d2211 * cos($sat->dps->xli - Predict::g22) + + $sat->dps->d3210 * cos($xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d3222 * cos(-$xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d5220 * cos($xomi + $sat->dps->xli - Predict::g52) + + $sat->dps->d5232 * cos(-$xomi + $sat->dps->xli - Predict::g52) + + 2 * ($sat->dps->d4410 * cos($x2omi + $x2li - Predict::g44) + + $sat->dps->d4422 * cos($x2li - Predict::g44) + + $sat->dps->d5421 * cos($xomi + $x2li - Predict::g54) + + $sat->dps->d5433 * cos(-$xomi + $x2li - Predict::g54)); + } /* End of if (isFlagSet(SYNCHRONOUS_FLAG)) */ + + $xldot = $sat->dps->xni + $sat->dps->xfact; + $xnddt = $xnddt * $xldot; + + if ($sat->flags & self::DO_LOOP_FLAG) { + $sat->dps->xli = $sat->dps->xli + $xldot * $delt + $xndot * $sat->dps->step2; + $sat->dps->xni = $sat->dps->xni + $xndot * $delt + $xnddt * $sat->dps->step2; + $sat->dps->atime = $sat->dps->atime + $delt; + } + } while (($sat->flags & self::DO_LOOP_FLAG) && + (~$sat->flags & self::EPOCH_RESTART_FLAG)); + } + while (($sat->flags & self::DO_LOOP_FLAG) && ($sat->flags & self::EPOCH_RESTART_FLAG)); + + $sat->deep_arg->xn = $sat->dps->xni + $xndot * $ft + $xnddt * $ft * $ft * 0.5; + $xl = $sat->dps->xli + $xldot * $ft + $xndot * $ft * $ft * 0.5; + $temp = -$sat->deep_arg->xnode + $sat->dps->thgr + $sat->deep_arg->t * Predict::thdt; + + if (~$sat->flags & self::SYNCHRONOUS_FLAG) { + $sat->deep_arg->xll = $xl + $temp + $temp; + } else { + $sat->deep_arg->xll = $xl - $sat->deep_arg->omgadf + $temp; + } + + return; + /* End case dpsec: */ + + case self::dpper: /* Entrance for lunar-solar periodics */ + $sinis = sin($sat->deep_arg->xinc); + $cosis = cos($sat->deep_arg->xinc); + if (abs($sat->dps->savtsn - $sat->deep_arg->t) >= 30) { + $sat->dps->savtsn = $sat->deep_arg->t; + $zm = $sat->dps->zmos + Predict::zns * $sat->deep_arg->t; + $zf = $zm + 2 * Predict::zes * sin($zm); + $sinzf = sin($zf); + $f2 = 0.5 * $sinzf * $sinzf - 0.25; + $f3 = -0.5 * $sinzf * cos($zf); + $ses = $sat->dps->se2 * $f2 + $sat->dps->se3 * $f3; + $sis = $sat->dps->si2 * $f2 + $sat->dps->si3 * $f3; + $sls = $sat->dps->sl2 * $f2 + $sat->dps->sl3 * $f3 + $sat->dps->sl4 * $sinzf; + $sat->dps->sghs = $sat->dps->sgh2 * $f2 + $sat->dps->sgh3 * $f3 + $sat->dps->sgh4 * $sinzf; + $sat->dps->shs = $sat->dps->sh2 * $f2 + $sat->dps->sh3 * $f3; + $zm = $sat->dps->zmol + Predict::znl * $sat->deep_arg->t; + $zf = $zm + 2 * Predict::zel * sin($zm); + $sinzf = sin($zf); + $f2 = 0.5 * $sinzf * $sinzf - 0.25; + $f3 = -0.5 * $sinzf * cos($zf); + $sel = $sat->dps->ee2 * $f2 + $sat->dps->e3 * $f3; + $sil = $sat->dps->xi2 * $f2 + $sat->dps->xi3 * $f3; + $sll = $sat->dps->xl2 * $f2 + $sat->dps->xl3 * $f3 + $sat->dps->xl4 * $sinzf; + $sat->dps->sghl = $sat->dps->xgh2 * $f2 + $sat->dps->xgh3 * $f3 + $sat->dps->xgh4 * $sinzf; + $sat->dps->sh1 = $sat->dps->xh2 * $f2 + $sat->dps->xh3 * $f3; + $sat->dps->pe = $ses + $sel; + $sat->dps->pinc = $sis + $sil; + $sat->dps->pl = $sls + $sll; + } + + $pgh = $sat->dps->sghs + $sat->dps->sghl; + $ph = $sat->dps->shs + $sat->dps->sh1; + $sat->deep_arg->xinc = $sat->deep_arg->xinc + $sat->dps->pinc; + $sat->deep_arg->em = $sat->deep_arg->em + $sat->dps->pe; + + if ($sat->dps->xqncl >= 0.2) { + /* Apply periodics directly */ + $ph = $ph / $sat->deep_arg->sinio; + $pgh = $pgh - $sat->deep_arg->cosio * $ph; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $pgh; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + $ph; + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl; + } else { + /* Apply periodics with Lyddane modification */ + $sinok = sin($sat->deep_arg->xnode); + $cosok = cos($sat->deep_arg->xnode); + $alfdp = $sinis * $sinok; + $betdp = $sinis * $cosok; + $dalf = $ph * $cosok + $sat->dps->pinc * $cosis * $sinok; + $dbet = -$ph * $sinok + $sat->dps->pinc * $cosis * $cosok; + $alfdp = $alfdp + $dalf; + $betdp = $betdp + $dbet; + $sat->deep_arg->xnode = Predict_Math::FMod2p($sat->deep_arg->xnode); + $xls = $sat->deep_arg->xll + $sat->deep_arg->omgadf + $cosis * $sat->deep_arg->xnode; + $dls = $sat->dps->pl + $pgh - $sat->dps->pinc * $sat->deep_arg->xnode * $sinis; + $xls = $xls + $dls; + $xnoh = $sat->deep_arg->xnode; + $sat->deep_arg->xnode = Predict_Math::AcTan($alfdp, $betdp); + + /* This is a patch to Lyddane modification */ + /* suggested by Rob Matson. */ + if(abs($xnoh - $sat->deep_arg->xnode) > Predict::pi) { + if ($sat->deep_arg->xnode < $xnoh) { + $sat->deep_arg->xnode += Predict::twopi; + } else { + $sat->deep_arg->xnode -= Predict::twopi; + } + } + + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl; + $sat->deep_arg->omgadf = $xls - $sat->deep_arg->xll - cos($sat->deep_arg->xinc) * + $sat->deep_arg->xnode; + } /* End case dpper: */ + return; + + } /* End switch(ientry) */ + + } /* End of Deep() */ + + /** + * Singleton + * + * @param Predict_Sat $sat The current satellite data instance + * + * @return Predict_SGPSDP + */ + public static function getInstance(Predict_Sat $sat) + { + static $instances = array(); + $catnr = $sat->tle->catnr; + if (!isset($instances[$catnr])) { + $instances[$catnr] = new self(); + } + return $instances[$catnr]; + } +} +?> diff --git a/lib/predict/Predict/SGSDPStatic.php b/lib/predict/Predict/SGSDPStatic.php new file mode 100644 index 0000000..12a43a4 --- /dev/null +++ b/lib/predict/Predict/SGSDPStatic.php @@ -0,0 +1,39 @@ +header); + $this->name = $headerParts[0]; + $this->nickname = $this->name; + $this->tle = $tle; + $this->pos = new Predict_Vector(); + $this->vel = new Predict_Vector(); + $this->sgps = new Predict_SGSDPStatic(); + $this->deep_arg = new Predict_DeepArg(); + $this->dps = new Predict_DeepStatic(); + + $this->select_ephemeris(); + $this->sat_data_init_sat($this); + } + + /* Selects the apropriate ephemeris type to be used */ + /* for predictions according to the data in the TLE */ + /* It also processes values in the tle set so that */ + /* they are apropriate for the sgp4/sdp4 routines */ + public function select_ephemeris() + { + /* Preprocess tle set */ + $this->tle->xnodeo *= Predict::de2ra; + $this->tle->omegao *= Predict::de2ra; + $this->tle->xmo *= Predict::de2ra; + $this->tle->xincl *= Predict::de2ra; + $temp = Predict::twopi / Predict::xmnpda / Predict::xmnpda; + + /* store mean motion before conversion */ + $this->meanmo = $this->tle->xno; + $this->tle->xno = $this->tle->xno * $temp * Predict::xmnpda; + $this->tle->xndt2o *= $temp; + $this->tle->xndd6o = $this->tle->xndd6o * $temp / Predict::xmnpda; + $this->tle->bstar /= Predict::ae; + + /* Period > 225 minutes is deep space */ + $dd1 = Predict::xke / $this->tle->xno; + $dd2 = Predict::tothrd; + $a1 = pow($dd1, $dd2); + $r1 = cos($this->tle->xincl); + $dd1 = 1.0 - $this->tle->eo * $this->tle->eo; + $temp = Predict::ck2 * 1.5 * ($r1 * $r1 * 3.0 - 1.0) / pow($dd1, 1.5); + $del1 = $temp / ($a1 * $a1); + $ao = $a1 * (1.0 - $del1 * (Predict::tothrd * 0.5 + $del1 * + ($del1 * 1.654320987654321 + 1.0))); + $delo = $temp / ($ao * $ao); + $xnodp = $this->tle->xno / ($delo + 1.0); + + /* Select a deep-space/near-earth ephemeris */ + if (Predict::twopi / $xnodp / Predict::xmnpda >= .15625) { + $this->flags |= Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG; + } else { + $this->flags &= ~Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG; + } + } + + /** Initialise satellite data. + * @param sat The satellite to initialise. + * @param qth Optional QTH info, use (0,0) if NULL. + * + * This function calculates the satellite data at t = 0, ie. epoch time + * The function is called automatically by gtk_sat_data_read_sat. + */ + public function sat_data_init_sat(Predict_Sat $sat, Predict_QTH $qth = null) + { + $obs_geodetic = new Predict_Geodetic(); + $obs_set = new Predict_ObsSet(); + $sat_geodetic = new Predict_Geodetic(); + /* double jul_utc, age; */ + + $jul_utc = Predict_Time::Julian_Date_of_Epoch($sat->tle->epoch); // => tsince = 0.0 + $sat->jul_epoch = $jul_utc; + + /* initialise observer location */ + if ($qth != null) { + $obs_geodetic->lon = $qth->lon * Predict::de2ra; + $obs_geodetic->lat = $qth->lat * Predict::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + } + else { + $obs_geodetic->lon = 0.0; + $obs_geodetic->lat = 0.0; + $obs_geodetic->alt = 0.0; + $obs_geodetic->theta = 0; + } + + /* execute computations */ + $sdpsgp = Predict_SGPSDP::getInstance($sat); + if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) { + $sdpsgp->SDP4($sat, 0.0); + } else { + $sdpsgp->SGP4($sat, 0.0); + } + + /* scale position and velocity to km and km/sec */ + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + /* get the velocity of the satellite */ + $sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z); + $sat->velo = $sat->vel->w; + Predict_SGPObs::Calculate_Obs($jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set); + Predict_SGPObs::Calculate_LatLonAlt($jul_utc, $sat->pos, $sat_geodetic); + + while ($sat_geodetic->lon < -Predict::pi) { + $sat_geodetic->lon += Predict::twopi; + } + + while ($sat_geodetic->lon > Predict::pi) { + $sat_geodetic->lon -= Predict::twopi; + } + + $sat->az = Predict_Math::Degrees($obs_set->az); + $sat->el = Predict_Math::Degrees($obs_set->el); + $sat->range = $obs_set->range; + $sat->range_rate = $obs_set->range_rate; + $sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat); + $sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon); + $sat->alt = $sat_geodetic->alt; + $sat->ma = Predict_Math::Degrees($sat->phase); + $sat->ma *= 256.0 / 360.0; + $sat->footprint = 2.0 * Predict::xkmper * acos (Predict::xkmper/$sat->pos->w); + $age = 0.0; + $sat->orbit = floor(($sat->tle->xno * Predict::xmnpda / Predict::twopi + + $age * $sat->tle->bstar * Predict::ae) * $age + + $sat->tle->xmo / Predict::twopi) + $sat->tle->revnum - 1; + + /* orbit type */ + $sat->otype = $sat->get_orbit_type($sat); + } + + public function get_orbit_type(Predict_Sat $sat) + { + $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN; + + if ($this->geostationary($sat)) { + $orbit = Predict_SGPSDP::ORBIT_TYPE_GEO; + } else if ($this->decayed($sat)) { + $orbit = Predict_SGPSDP::ORBIT_TYPE_DECAYED; + } else { + $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN; + } + + return $orbit; + } + + + /** Determinte whether satellite is in geostationary orbit. + * @author John A. Magliacane, KD2BD + * @param sat Pointer to satellite data. + * @return TRUE if the satellite appears to be in geostationary orbit, + * FALSE otherwise. + * + * A satellite is in geostationary orbit if + * + * fabs (sat.meanmotion - 1.0027) < 0.0002 + * + * Note: Appearantly, the mean motion can deviate much more from 1.0027 than 0.0002 + */ + public function geostationary(Predict_Sat $sat) + { + if (abs($sat->meanmo - 1.0027) < 0.0002) { + return true; + } else { + return false; + } + } + + + /** Determine whether satellite has decayed. + * @author John A. Magliacane, KD2BD + * @author Alexandru Csete, OZ9AEC + * @param sat Pointer to satellite data. + * @return TRUE if the satellite appears to have decayed, FALSE otherwise. + * @bug Modified version of the predict code but it is not tested. + * + * A satellite is decayed if + * + * satepoch + ((16.666666 - sat.meanmo) / (10.0*fabs(sat.drag))) < "now" + * + */ + public function decayed(Predict_Sat $sat) + { + /* tle.xndt2o/(twopi/xmnpda/xmnpda) is the value before converted the + value matches up with the value in predict 2.2.3 */ + /*** FIXME decayed is treated as a static quantity. + It is time dependent. Also sat->jul_utc is often zero + when this function is called + ***/ + if ($sat->jul_epoch + ((16.666666 - $sat->meanmo) / + (10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda)))) < $sat->jul_utc) { + return true; + } else { + return false; + } + } + + /** + * Experimental attempt at calculating apparent magnitude. Known intrinsic + * magnitudes are listed inside the function for now. + * + * @param float $time The daynum the satellite is calculated for + * @param Predict_QTH $qth The observer location + * + * @return null on failure, float otherwise + */ + public function calculateApparentMagnitude($time, Predict_QTH $qth) + { + // Recorded intrinsic magnitudes and their respective + // illumination and distance from heavens-above.com + static $intrinsicMagnitudes = array( + '25544' => array( + 'mag' => -1.3, + 'illum' => .5, + 'distance' => 1000, + ) + ); + + // Return null if we don't have a record of the intrinsic mag + if (!isset($intrinsicMagnitudes[$this->tle->catnr])) { + return null; + } + $imag = $intrinsicMagnitudes[$this->tle->catnr]; + + // Convert the observer's geodetic info to radians and km so + // we can compare vectors + $observerGeo = new Predict_Geodetic(); + $observerGeo->lat = Predict_Math::Radians($qth->lat); + $observerGeo->lon = Predict_Math::Radians($qth->lon); + $observerGeo->alt = $qth->alt * 1000; + + // Now determine the sun and observer positions + $observerPos = new Predict_Vector(); + $observerVel = new Predict_Vector(); + $solarVector = new Predict_Vector(); + Predict_Solar::Calculate_Solar_Position($time, $solarVector); + Predict_SGPObs::Calculate_User_PosVel($time, $observerGeo, $observerPos, $observerVel); + + // Determine the solar phase and and thus the percent illumination + $observerSatPos = new Predict_Vector(); + Predict_Math::Vec_Sub($this->pos, $observerPos, $observerSatPos); + $phaseAngle = Predict_Math::Degrees(Predict_Math::Angle($solarVector, $observerSatPos)); + $illum = $phaseAngle / 180; + + $illuminationChange = $illum / $imag['illum']; + $inverseSquareOfDistanceChange = pow(($imag['distance'] / $this->range), 2); + $changeInMagnitude = log( + $illuminationChange * $inverseSquareOfDistanceChange, + self::POGSONS_RATIO + ); + + return $imag['mag'] - $changeInMagnitude; + } +} diff --git a/lib/predict/Predict/Solar.php b/lib/predict/Predict/Solar.php new file mode 100644 index 0000000..06c2b9f --- /dev/null +++ b/lib/predict/Predict/Solar.php @@ -0,0 +1,106 @@ +x = $R * cos($Lsa); + $solar_vector->y = $R * sin($Lsa) * cos($eps); + $solar_vector->z = $R * sin($Lsa) * sin($eps); + $solar_vector->w = $R; + } + + /* Calculates stellite's eclipse status and depth */ + public static function Sat_Eclipsed(Predict_Vector $pos, Predict_Vector $sol, &$depth) + { + $Rho = new Predict_Vector(); + $earth = new Predict_Vector(); + + /* Determine partial eclipse */ + $sd_earth = Predict_Math::ArcSin(Predict::xkmper / $pos->w); + Predict_Math::Vec_Sub($sol, $pos, $Rho); + $sd_sun = Predict_Math::ArcSin(Predict::__sr__ / $Rho->w); + Predict_Math::Scalar_Multiply(-1, $pos, $earth); + $delta = Predict_Math::Angle($sol, $earth); + $depth = $sd_earth - $sd_sun - $delta; + + if ($sd_earth < $sd_sun) { + return 0; + } else if ($depth >= 0) { + return 1; + } else { + return 0; + } + } + + /** + * Finds the current location of the sun based on the observer location + * + * @param Predict_QTH $qth The observer location + * @param int $daynum The daynum or null to use the current daynum + * + * @return Predict_ObsSet + */ + public static function FindSun(Predict_QTH $qth, $daynum = null) + { + if ($daynum === null) { + $daynum = Predict_Time::get_current_daynum(); + } + + $obs_geodetic = new Predict_Geodetic(); + $obs_geodetic->lon = $qth->lon * Predict::de2ra; + $obs_geodetic->lat = $qth->lat * Predict::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + $solar_vector = new Predict_Vector(); + $zero_vector = new Predict_Vector(); + $solar_set = new Predict_ObsSet(); + + self::Calculate_Solar_Position($daynum, $solar_vector); + Predict_SGPObs::Calculate_Obs( + $daynum, + $solar_vector, + $zero_vector, + $obs_geodetic, + $solar_set + ); + + $solar_set->az = Predict_Math::Degrees($solar_set->az); + $solar_set->el = Predict_Math::Degrees($solar_set->el); + + return $solar_set; + } +} diff --git a/lib/predict/Predict/TLE.php b/lib/predict/Predict/TLE.php new file mode 100644 index 0000000..4764f05 --- /dev/null +++ b/lib/predict/Predict/TLE.php @@ -0,0 +1,230 @@ +Good_Elements($line1, $line2)) { + throw new Predict_Exception('Invalid TLE contents'); + } + + $this->header = $header; + $this->line1 = $line1; + $this->line2 = $line2; + + /** Decode Card 1 **/ + /* Satellite's catalogue number */ + $this->catnr = (int) substr($line1, 2, 5); + + /* International Designator for satellite */ + $this->idesg = substr($line1, 9, 8); + + /* Epoch time; this is the complete, unconverted epoch. */ + /* Replace spaces with 0 before casting, as leading spaces are allowed */ + $this->epoch = (float) str_replace(' ', '0', substr($line1, 18, 14)); + + /* Now, convert the epoch time into year, day + and fraction of day, according to: + + YYDDD.FFFFFFFF + */ + + // Adjust for 2 digit year through 2056 + $this->epoch_year = (int) substr($line1, 18, 2); + if ($this->epoch_year > 56) { + $this->epoch_year = $this->epoch_year + 1900; + } else { + $this->epoch_year = $this->epoch_year + 2000; + } + + /* Epoch day */ + $this->epoch_day = (int) substr($line1, 20, 3); + + /* Epoch fraction of day */ + $this->epoch_fod = (float) substr($line1, 23, 9); + + + /* Satellite's First Time Derivative */ + $this->xndt2o = (float) substr($line1, 33, 10); + + /* Satellite's Second Time Derivative */ + $this->xndd6o = (float) (substr($line1, 44, 1) . '.' . substr($line1, 45, 5) . 'E' . substr($line1, 50, 2)); + + /* Satellite's bstar drag term + FIXME: How about buff[0] ???? + */ + $this->bstar = (float) (substr($line1, 53, 1) . '.' . substr($line1, 54, 5) . 'E' . substr($line1, 59, 2)); + + /* Element Number */ + $this->elset = (int) substr($line1, 64, 4); + + /** Decode Card 2 **/ + /* Satellite's Orbital Inclination (degrees) */ + $this->xincl = (float) substr($line2, 8, 8); + + /* Satellite's RAAN (degrees) */ + $this->xnodeo = (float) substr($line2, 17, 8); + + /* Satellite's Orbital Eccentricity */ + $this->eo = (float) ('.' . substr($line2, 26, 7)); + + /* Satellite's Argument of Perigee (degrees) */ + $this->omegao = (float) substr($line2, 34, 8); + + /* Satellite's Mean Anomaly of Orbit (degrees) */ + $this->xmo = (float) substr($line2, 43, 8); + + /* Satellite's Mean Motion (rev/day) */ + $this->xno = (float) substr($line2, 52, 11); + + /* Satellite's Revolution number at epoch */ + $this->revnum = (float) substr($line2, 63, 5); + } + + /* Calculates the checksum mod 10 of a line from a TLE set and */ + /* returns true if it compares with checksum in column 68, else false.*/ + /* tle_set is a character string holding the two lines read */ + /* from a text file containing NASA format Keplerian elements. */ + /* NOTE!!! The stuff about two lines is not quite true. + The function assumes that tle_set[0] is the begining + of the line and that there are 68 elements - see the consumer + */ + public function Checksum_Good($tle_set) + { + if (strlen($tle_set) < 69) { + return false; + } + + $checksum = 0; + + for ($i = 0; $i < 68; $i++) { + if (($tle_set[$i] >= '0') && ($tle_set[$i] <= '9')) { + $value = $tle_set[$i] - '0'; + } else if ($tle_set[$i] == '-' ) { + $value = 1; + } else { + $value = 0; + } + + $checksum += $value; + } + + $checksum %= 10; + $check_digit = $tle_set[68] - '0'; + + return $checksum == $check_digit; + } + + /* Carries out various checks on a TLE set to verify its validity */ + /* $line1 is the first line of the TLE, $line2 is the second line */ + /* from a text file containing NASA format Keplerian elements. */ + public function Good_Elements($line1, $line2) + { + /* Verify checksum of both lines of a TLE set */ + if (!$this->Checksum_Good($line1) || !$this->Checksum_Good($line2)) { + return false; + } + + /* Check the line number of each line */ + if (($line1[0] != '1') || ($line2[0] != '2')) { + return false; + } + + /* Verify that Satellite Number is same in both lines */ + if (strncmp($line1[2], $line2[2], 5) != 0) { + return false; + } + + /* Check that various elements are in the right place */ + if (($line1[23] != '.') || + ($line1[34] != '.') || + ($line2[11] != '.') || + ($line2[20] != '.') || + ($line2[37] != '.') || + ($line2[46] != '.') || + ($line2[54] != '.') || + (strncmp(substr($line1, 61), ' 0 ', 3) != 0)) { + + return false; + } + + return true; + } + + /** + * A function to allow checksum creation of a line. This is driven by + * the fact that some TLEs from SpaceTrack are missing checksum numbers. + * You can use this to create a checksum for a line, but you should + * probably have confidence that the TLE data itself is good. YMMV. + * + * @throws Predict_Exception if the line is not exactly 68 chars + * @return string + */ + static public function createChecksum($line) + { + if (strlen($line) != 68) { + throw Predict_Exception('Invalid line, needs to e 68 chars'); + } + + $checksum = 0; + + for ($i = 0; $i < 68; $i++) { + if (($line[$i] >= '0') && ($line[$i] <= '9')) { + $value = (int) $line[$i]; + } else if ($line[$i] == '-' ) { + $value = 1; + } else { + $value = 0; + } + + $checksum += $value; + } + + $checksum %= 10; + + return $checksum; + } +} diff --git a/lib/predict/Predict/Time.php b/lib/predict/Predict/Time.php new file mode 100644 index 0000000..b5c0d90 --- /dev/null +++ b/lib/predict/Predict/Time.php @@ -0,0 +1,229 @@ +ds50 = $jd - 2433281.5 + $UT; + + return Predict_Math::FMod2p(6.3003880987 * $deep_arg->ds50 + 1.72944494); + } + + /* See the ThetaG doc block above */ + public static function ThetaG_JD($jd) + { + /* Reference: The 1992 Astronomical Almanac, page B6. */ + $UT = Predict_Math::Frac($jd + 0.5); + $jd = $jd - $UT; + $TU = ($jd - 2451545.0) / 36525; + $GMST = 24110.54841 + $TU * (8640184.812866 + $TU * (0.093104 - $TU * 6.2E-6)); + $GMST = Predict_Math::Modulus($GMST + Predict::secday * Predict::omega_E * $UT, Predict::secday); + + return Predict::twopi * $GMST / Predict::secday; + } + + /** + * Read the system clock and return the current Julian day. From phpPredict + * + * @return float + */ + public static function get_current_daynum() { + // Gets the current decimal day number from microtime + + list($usec, $sec) = explode(' ', microtime()); + return self::unix2daynum($sec, $usec); + } + + /** + * Converts a standard unix timestamp and optional + * milliseconds to a daynum + * + * @param int $sec Seconds from the unix epoch + * @param int $usec Optional milliseconds + * + * @return float + */ + public static function unix2daynum($sec, $usec = 0) + { + $time = ((($sec + $usec) / 86400.0) - 3651.0); + return $time + 2444238.5; + } + + /* The function Delta_ET has been added to allow calculations on */ + /* the position of the sun. It provides the difference between UT */ + /* (approximately the same as UTC) and ET (now referred to as TDT).*/ + /* This function is based on a least squares fit of data from 1950 */ + /* to 1991 and will need to be updated periodically. */ + public static function Delta_ET($year) + { + /* Values determined using data from 1950-1991 in the 1990 + Astronomical Almanac. See DELTA_ET.WQ1 for details. */ + + $delta_et = 26.465 + 0.747622 * ($year - 1950) + + 1.886913 * sin(Predict::twopi * ($year - 1975) / 33); + + return $delta_et; + } + + /** + * Converts a daynum to a unix timestamp. From phpPredict. + * + * @param float $dn Julian Daynum + * + * @return float + */ + public static function daynum2unix($dn) { + // Converts a daynum to a UNIX timestamp + + return (86400.0 * ($dn - 2444238.5 + 3651.0)); + } + + /** + * Converts a daynum to a readable time format. + * + * @param float $dn The julian date + * @param string $zone The zone string, defaults to America/Los_Angeles + * @param string $format The date() function's format string. Defaults to m-d-Y H:i:s + * + * @return string + */ + public static function daynum2readable($dn, $zone = 'America/Los_Angeles', $format = 'm-d-Y H:i:s') + { + $unix = self::daynum2unix($dn); + $date = new DateTime("@" . round($unix)); + $dateTimezone = new DateTimezone($zone); + $date->setTimezone($dateTimezone); + return $date->format($format); + } + + public static function daynum2datetime($dn, $zone = 'UTC') + { + $unix = self::daynum2unix($dn); + $date = new DateTime("@" . round($unix)); + $dateTimezone = new DateTimezone($zone); + $date->setTimezone($dateTimezone); + return $date; + } + + /** + * Returns the unix timestamp of a TLE's epoch + * + * @param Predict_TLE $tle The TLE object + * + * @return int + */ + public static function getEpochTimeStamp(Predict_TLE $tle) + { + $year = $tle->epoch_year; + $day = $tle->epoch_day; + $sec = round(86400 * $tle->epoch_fod); + + $zone = new DateTimeZone('GMT'); + $date = new DateTime(); + $date->setTimezone($zone); + $date->setDate($year, 1, 1); + $date->setTime(0, 0, 0); + + return $date->format('U') + (86400 * $day) + $sec - 86400; + } +} diff --git a/lib/predict/Predict/Vector.php b/lib/predict/Predict/Vector.php new file mode 100644 index 0000000..8474905 --- /dev/null +++ b/lib/predict/Predict/Vector.php @@ -0,0 +1,13 @@ +save_run($xhprofData, $xhprofNameSpace); + } + register_shutdown_function('stop_xhprof_profiling'); +} + +$start = microtime(true); + +$predict = new Predict(); +$qth = new Predict_QTH(); +$qth->lat = 37.6550; +$qth->lon = -122.4070; +$qth->alt = 0; + +$tleFile = file('examples/iss.tle'); +$tle = new Predict_TLE($tleFile[0], $tleFile[1], $tleFile[2]); +$sat = new Predict_Sat($tle); +$now = Predict_Time::get_current_daynum(); + +$results = $predict->get_passes($sat, $qth, $now, 10); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; exit; diff --git a/lib/predict/examples/findsun.php b/lib/predict/examples/findsun.php new file mode 100644 index 0000000..1a3834f --- /dev/null +++ b/lib/predict/examples/findsun.php @@ -0,0 +1,31 @@ +lat = 37.786759; +$qth->lon = -122.405162; +$qth->alt = 10; // Altitude above sea level in meters + +$sunInfo = Predict_Solar::FindSun($qth, $daynum); + +$output = array( + 'elevation' => $sunInfo->el, + 'azimuth' => $sunInfo->az, + 'timestamp' => $time +); + +// output results +echo json_encode($output); diff --git a/lib/predict/examples/iss.tle b/lib/predict/examples/iss.tle new file mode 100644 index 0000000..e01670f --- /dev/null +++ b/lib/predict/examples/iss.tle @@ -0,0 +1,3 @@ +ISS (ZARYA) +1 25544U 98067A 21109.21251552 .00001445 00000-0 34486-4 0 9999 +2 25544 51.6452 274.4230 0002486 246.0034 286.0425 15.48900816279452 diff --git a/lib/predict/examples/solar_position.php b/lib/predict/examples/solar_position.php new file mode 100644 index 0000000..d07c4bc --- /dev/null +++ b/lib/predict/examples/solar_position.php @@ -0,0 +1,44 @@ +lat); +$solar_lon = Predict_Math::Degrees($solar_geodetic->lon); + +// Reverse values for night circle center +$dark_lat = -$solar_lat; +$dark_lon = -$solar_lon; + +$output = array( + 'solar_lat' => $solar_lat, + 'solar_lon' => $solar_lon, + 'dark_lat' => $dark_lat, + 'dark_lon' => $dark_lon, + 'timestamp' => $time +); + +// output results +var_dump(json_encode($output)); diff --git a/lib/predict/examples/visible_passes.php b/lib/predict/examples/visible_passes.php new file mode 100644 index 0000000..2741946 --- /dev/null +++ b/lib/predict/examples/visible_passes.php @@ -0,0 +1,74 @@ +alt = 0; // Altitude in meters + +// South San Francisco, example west of the meridian +$qth->lat = 37.6550; // Latitude North +$qth->lon = -122.4070; // Longitude East + +// Munich, example east of the meridian +// $qth->lat = 48.1505; // Lat North +// $qth->lon = 11.5809; // Lon East + +// The iss.tle file is the first 3 lines of +// http://celestrak.com/NORAD/elements/stations.txt +// Make sure you update this content, it goes out of date within a day or two +$tleFile = file('examples/iss.tle'); // Load up the ISS data file from NORAD +$tle = new Predict_TLE($tleFile[0], $tleFile[1], $tleFile[2]); // Instantiate it +$sat = new Predict_Sat($tle); // Load up the satellite data +$now = Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) + +// You can modify some preferences in Predict(), the defaults are below +// +// $predict->minEle = 10; // Minimum elevation for a pass +// $predict->timeRes = 10; // Pass details: time resolution in seconds +// $predict->numEntries = 20; // Pass details: number of entries per pass +// $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + +// Get the passes and filter visible only, takes about 4 seconds for 10 days +$results = $predict->get_passes($sat, $qth, $now, 10); +$filtered = $predict->filterVisiblePasses($results); + +$zone = 'America/Los_Angeles'; // Pacific time zone +$format = 'm-d-Y H:i:s'; // Time format from PHP's date() function + +// Format the output similar to the heavens-above.com website +foreach ($filtered as $pass) { + echo "AOS Daynum: " . $pass->visible_aos . "\n"; + echo "AOS Time: " . Predict_Time::daynum2readable($pass->visible_aos, $zone, $format) . "\n"; + echo "AOS Az: " . $predict->azDegreesToDirection($pass->visible_aos_az) . "\n"; + echo "AOS El: " . round($pass->visible_aos_el) . "\n"; + echo "Max Time: " . Predict_Time::daynum2readable($pass->visible_tca, $zone, $format) . "\n"; + echo "Max Az: " . $predict->azDegreesToDirection($pass->visible_max_el_az) . "\n"; + echo "Max El: " . round($pass->visible_max_el) . "\n"; + echo "LOS Time: " . Predict_Time::daynum2readable($pass->visible_los, $zone, $format) . "\n"; + echo "LOS Az: " . $predict->azDegreesToDirection($pass->visible_los_az) . "\n"; + echo "LOS El: " . round($pass->visible_los_el) . "\n"; + echo "Magnitude: " . number_format($pass->max_apparent_magnitude, 1) . "\n"; + echo "\n"; +} + +// How long did this take? +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; exit; diff --git a/lib/predict/tests/Table.php b/lib/predict/tests/Table.php new file mode 100644 index 0000000..ce9d640 --- /dev/null +++ b/lib/predict/tests/Table.php @@ -0,0 +1,893 @@ + + * @author Jan Schneider + * @copyright 2002-2005 Richard Heyes + * @copyright 2006-2008 Jan Schneider + * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) + * @version CVS: $Id: Table.php 268934 2008-11-13 10:35:34Z yunosh $ + * @link http://pear.php.net/package/Console_Table + */ + +define('CONSOLE_TABLE_HORIZONTAL_RULE', 1); +define('CONSOLE_TABLE_ALIGN_LEFT', -1); +define('CONSOLE_TABLE_ALIGN_CENTER', 0); +define('CONSOLE_TABLE_ALIGN_RIGHT', 1); +define('CONSOLE_TABLE_BORDER_ASCII', -1); + +/** + * The main class. + * + * @category Console + * @package Console_Table + * @author Jan Schneider + * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) + * @link http://pear.php.net/package/Console_Table + */ +class Console_Table +{ + /** + * The table headers. + * + * @var array + */ + var $_headers = array(); + + /** + * The data of the table. + * + * @var array + */ + var $_data = array(); + + /** + * The maximum number of columns in a row. + * + * @var integer + */ + var $_max_cols = 0; + + /** + * The maximum number of rows in the table. + * + * @var integer + */ + var $_max_rows = 0; + + /** + * Lengths of the columns, calculated when rows are added to the table. + * + * @var array + */ + var $_cell_lengths = array(); + + /** + * Heights of the rows. + * + * @var array + */ + var $_row_heights = array(); + + /** + * How many spaces to use to pad the table. + * + * @var integer + */ + var $_padding = 1; + + /** + * Column filters. + * + * @var array + */ + var $_filters = array(); + + /** + * Columns to calculate totals for. + * + * @var array + */ + var $_calculateTotals; + + /** + * Alignment of the columns. + * + * @var array + */ + var $_col_align = array(); + + /** + * Default alignment of columns. + * + * @var integer + */ + var $_defaultAlign; + + /** + * Character set of the data. + * + * @var string + */ + var $_charset = 'utf-8'; + + /** + * Border character. + * + * @var string + */ + var $_border = CONSOLE_TABLE_BORDER_ASCII; + + /** + * Whether the data has ANSI colors. + * + * @var boolean + */ + var $_ansiColor = false; + + /** + * Constructor. + * + * @param integer $align Default alignment. One of + * CONSOLE_TABLE_ALIGN_LEFT, + * CONSOLE_TABLE_ALIGN_CENTER or + * CONSOLE_TABLE_ALIGN_RIGHT. + * @param string $border The character used for table borders or + * CONSOLE_TABLE_BORDER_ASCII. + * @param integer $padding How many spaces to use to pad the table. + * @param string $charset A charset supported by the mbstring PHP + * extension. + * @param boolean $color Whether the data contains ansi color codes. + */ + function Console_Table($align = CONSOLE_TABLE_ALIGN_LEFT, + $border = CONSOLE_TABLE_BORDER_ASCII, $padding = 1, + $charset = null, $color = false) + { + $this->_defaultAlign = $align; + $this->_border = $border; + $this->_padding = $padding; + $this->_ansiColor = $color; + if ($this->_ansiColor) { + include_once 'Console/Color.php'; + } + if (!empty($charset)) { + $this->setCharset($charset); + } + } + + /** + * Converts an array to a table. + * + * @param array $headers Headers for the table. + * @param array $data A two dimensional array with the table + * data. + * @param boolean $returnObject Whether to return the Console_Table object + * instead of the rendered table. + * + * @static + * + * @return Console_Table|string A Console_Table object or the generated + * table. + */ + function fromArray($headers, $data, $returnObject = false) + { + if (!is_array($headers) || !is_array($data)) { + return false; + } + + $table = new Console_Table(); + $table->setHeaders($headers); + + foreach ($data as $row) { + $table->addRow($row); + } + + return $returnObject ? $table : $table->getTable(); + } + + /** + * Adds a filter to a column. + * + * Filters are standard PHP callbacks which are run on the data before + * table generation is performed. Filters are applied in the order they + * are added. The callback function must accept a single argument, which + * is a single table cell. + * + * @param integer $col Column to apply filter to. + * @param mixed &$callback PHP callback to apply. + * + * @return void + */ + function addFilter($col, &$callback) + { + $this->_filters[] = array($col, &$callback); + } + + /** + * Sets the charset of the provided table data. + * + * @param string $charset A charset supported by the mbstring PHP + * extension. + * + * @return void + */ + function setCharset($charset) + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'en_US'); + $this->_charset = strtolower($charset); + setlocale(LC_CTYPE, $locale); + } + + /** + * Sets the alignment for the columns. + * + * @param integer $col_id The column number. + * @param integer $align Alignment to set for this column. One of + * CONSOLE_TABLE_ALIGN_LEFT + * CONSOLE_TABLE_ALIGN_CENTER + * CONSOLE_TABLE_ALIGN_RIGHT. + * + * @return void + */ + function setAlign($col_id, $align = CONSOLE_TABLE_ALIGN_LEFT) + { + switch ($align) { + case CONSOLE_TABLE_ALIGN_CENTER: + $pad = STR_PAD_BOTH; + break; + case CONSOLE_TABLE_ALIGN_RIGHT: + $pad = STR_PAD_LEFT; + break; + default: + $pad = STR_PAD_RIGHT; + break; + } + $this->_col_align[$col_id] = $pad; + } + + /** + * Specifies which columns are to have totals calculated for them and + * added as a new row at the bottom. + * + * @param array $cols Array of column numbers (starting with 0). + * + * @return void + */ + function calculateTotalsFor($cols) + { + $this->_calculateTotals = $cols; + } + + /** + * Sets the headers for the columns. + * + * @param array $headers The column headers. + * + * @return void + */ + function setHeaders($headers) + { + $this->_headers = array(array_values($headers)); + $this->_updateRowsCols($headers); + } + + /** + * Adds a row to the table. + * + * @param array $row The row data to add. + * @param boolean $append Whether to append or prepend the row. + * + * @return void + */ + function addRow($row, $append = true) + { + if ($append) { + $this->_data[] = array_values($row); + } else { + array_unshift($this->_data, array_values($row)); + } + + $this->_updateRowsCols($row); + } + + /** + * Inserts a row after a given row number in the table. + * + * If $row_id is not given it will prepend the row. + * + * @param array $row The data to insert. + * @param integer $row_id Row number to insert before. + * + * @return void + */ + function insertRow($row, $row_id = 0) + { + array_splice($this->_data, $row_id, 0, array($row)); + + $this->_updateRowsCols($row); + } + + /** + * Adds a column to the table. + * + * @param array $col_data The data of the column. + * @param integer $col_id The column index to populate. + * @param integer $row_id If starting row is not zero, specify it here. + * + * @return void + */ + function addCol($col_data, $col_id = 0, $row_id = 0) + { + foreach ($col_data as $col_cell) { + $this->_data[$row_id++][$col_id] = $col_cell; + } + + $this->_updateRowsCols(); + $this->_max_cols = max($this->_max_cols, $col_id + 1); + } + + /** + * Adds data to the table. + * + * @param array $data A two dimensional array with the table data. + * @param integer $col_id Starting column number. + * @param integer $row_id Starting row number. + * + * @return void + */ + function addData($data, $col_id = 0, $row_id = 0) + { + foreach ($data as $row) { + if ($row === CONSOLE_TABLE_HORIZONTAL_RULE) { + $this->_data[$row_id] = CONSOLE_TABLE_HORIZONTAL_RULE; + $row_id++; + continue; + } + $starting_col = $col_id; + foreach ($row as $cell) { + $this->_data[$row_id][$starting_col++] = $cell; + } + $this->_updateRowsCols(); + $this->_max_cols = max($this->_max_cols, $starting_col); + $row_id++; + } + } + + /** + * Adds a horizontal seperator to the table. + * + * @return void + */ + function addSeparator() + { + $this->_data[] = CONSOLE_TABLE_HORIZONTAL_RULE; + } + + /** + * Returns the generated table. + * + * @return string The generated table. + */ + function getTable() + { + $this->_applyFilters(); + $this->_calculateTotals(); + $this->_validateTable(); + + return $this->_buildTable(); + } + + /** + * Calculates totals for columns. + * + * @return void + */ + function _calculateTotals() + { + if (empty($this->_calculateTotals)) { + return; + } + + $this->addSeparator(); + + $totals = array(); + foreach ($this->_data as $row) { + if (is_array($row)) { + foreach ($this->_calculateTotals as $columnID) { + $totals[$columnID] += $row[$columnID]; + } + } + } + + $this->_data[] = $totals; + $this->_updateRowsCols(); + } + + /** + * Applies any column filters to the data. + * + * @return void + */ + function _applyFilters() + { + if (empty($this->_filters)) { + return; + } + + foreach ($this->_filters as $filter) { + $column = $filter[0]; + $callback = $filter[1]; + + foreach ($this->_data as $row_id => $row_data) { + if ($row_data !== CONSOLE_TABLE_HORIZONTAL_RULE) { + $this->_data[$row_id][$column] = + call_user_func($callback, $row_data[$column]); + } + } + } + } + + /** + * Ensures that column and row counts are correct. + * + * @return void + */ + function _validateTable() + { + if (!empty($this->_headers)) { + $this->_calculateRowHeight(-1, $this->_headers[0]); + } + + for ($i = 0; $i < $this->_max_rows; $i++) { + for ($j = 0; $j < $this->_max_cols; $j++) { + if (!isset($this->_data[$i][$j]) && + (!isset($this->_data[$i]) || + $this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE)) { + $this->_data[$i][$j] = ''; + } + + } + $this->_calculateRowHeight($i, $this->_data[$i]); + + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE) { + ksort($this->_data[$i]); + } + + } + + $this->_splitMultilineRows(); + + // Update cell lengths. + for ($i = 0; $i < count($this->_headers); $i++) { + $this->_calculateCellLengths($this->_headers[$i]); + } + for ($i = 0; $i < $this->_max_rows; $i++) { + $this->_calculateCellLengths($this->_data[$i]); + } + + ksort($this->_data); + } + + /** + * Splits multiline rows into many smaller one-line rows. + * + * @return void + */ + function _splitMultilineRows() + { + ksort($this->_data); + $sections = array(&$this->_headers, &$this->_data); + $max_rows = array(count($this->_headers), $this->_max_rows); + $row_height_offset = array(-1, 0); + + for ($s = 0; $s <= 1; $s++) { + $inserted = 0; + $new_data = $sections[$s]; + + for ($i = 0; $i < $max_rows[$s]; $i++) { + // Process only rows that have many lines. + $height = $this->_row_heights[$i + $row_height_offset[$s]]; + if ($height > 1) { + // Split column data into one-liners. + $split = array(); + for ($j = 0; $j < $this->_max_cols; $j++) { + $split[$j] = preg_split('/\r?\n|\r/', + $sections[$s][$i][$j]); + } + + $new_rows = array(); + // Construct new 'virtual' rows - insert empty strings for + // columns that have less lines that the highest one. + for ($i2 = 0; $i2 < $height; $i2++) { + for ($j = 0; $j < $this->_max_cols; $j++) { + $new_rows[$i2][$j] = !isset($split[$j][$i2]) + ? '' + : $split[$j][$i2]; + } + } + + // Replace current row with smaller rows. $inserted is + // used to take account of bigger array because of already + // inserted rows. + array_splice($new_data, $i + $inserted, 1, $new_rows); + $inserted += count($new_rows) - 1; + } + } + + // Has the data been modified? + if ($inserted > 0) { + $sections[$s] = $new_data; + $this->_updateRowsCols(); + } + } + } + + /** + * Builds the table. + * + * @return string The generated table string. + */ + function _buildTable() + { + if (!count($this->_data)) { + return ''; + } + + $rule = $this->_border == CONSOLE_TABLE_BORDER_ASCII + ? '|' + : $this->_border; + $separator = $this->_getSeparator(); + + $return = array(); + for ($i = 0; $i < count($this->_data); $i++) { + for ($j = 0; $j < count($this->_data[$i]); $j++) { + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE && + $this->_strlen($this->_data[$i][$j]) < + $this->_cell_lengths[$j]) { + $this->_data[$i][$j] = $this->_strpad($this->_data[$i][$j], + $this->_cell_lengths[$j], + ' ', + $this->_col_align[$j]); + } + } + + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE) { + $row_begin = $rule . str_repeat(' ', $this->_padding); + $row_end = str_repeat(' ', $this->_padding) . $rule; + $implode_char = str_repeat(' ', $this->_padding) . $rule + . str_repeat(' ', $this->_padding); + $return[] = $row_begin + . implode($implode_char, $this->_data[$i]) . $row_end; + } elseif (!empty($separator)) { + $return[] = $separator; + } + + } + + $return = implode("\r\n", $return); + if (!empty($separator)) { + $return = $separator . "\r\n" . $return . "\r\n" . $separator; + } + $return .= "\r\n"; + + if (!empty($this->_headers)) { + $return = $this->_getHeaderLine() . "\r\n" . $return; + } + + return $return; + } + + /** + * Creates a horizontal separator for header separation and table + * start/end etc. + * + * @return string The horizontal separator. + */ + function _getSeparator() + { + if (!$this->_border) { + return; + } + + if ($this->_border == CONSOLE_TABLE_BORDER_ASCII) { + $rule = '-'; + $sect = '+'; + } else { + $rule = $sect = $this->_border; + } + + $return = array(); + foreach ($this->_cell_lengths as $cl) { + $return[] = str_repeat($rule, $cl); + } + + $row_begin = $sect . str_repeat($rule, $this->_padding); + $row_end = str_repeat($rule, $this->_padding) . $sect; + $implode_char = str_repeat($rule, $this->_padding) . $sect + . str_repeat($rule, $this->_padding); + + return $row_begin . implode($implode_char, $return) . $row_end; + } + + /** + * Returns the header line for the table. + * + * @return string The header line of the table. + */ + function _getHeaderLine() + { + // Make sure column count is correct + for ($j = 0; $j < count($this->_headers); $j++) { + for ($i = 0; $i < $this->_max_cols; $i++) { + if (!isset($this->_headers[$j][$i])) { + $this->_headers[$j][$i] = ''; + } + } + } + + for ($j = 0; $j < count($this->_headers); $j++) { + for ($i = 0; $i < count($this->_headers[$j]); $i++) { + if ($this->_strlen($this->_headers[$j][$i]) < + $this->_cell_lengths[$i]) { + $this->_headers[$j][$i] = + $this->_strpad($this->_headers[$j][$i], + $this->_cell_lengths[$i], + ' ', + $this->_col_align[$i]); + } + } + } + + $rule = $this->_border == CONSOLE_TABLE_BORDER_ASCII + ? '|' + : $this->_border; + $row_begin = $rule . str_repeat(' ', $this->_padding); + $row_end = str_repeat(' ', $this->_padding) . $rule; + $implode_char = str_repeat(' ', $this->_padding) . $rule + . str_repeat(' ', $this->_padding); + + $separator = $this->_getSeparator(); + if (!empty($separator)) { + $return[] = $separator; + } + for ($j = 0; $j < count($this->_headers); $j++) { + $return[] = $row_begin + . implode($implode_char, $this->_headers[$j]) . $row_end; + } + + return implode("\r\n", $return); + } + + /** + * Updates values for maximum columns and rows. + * + * @param array $rowdata Data array of a single row. + * + * @return void + */ + function _updateRowsCols($rowdata = array()) + { + // Update maximum columns. + $this->_max_cols = max($this->_max_cols, count($rowdata)); + + // Update maximum rows. + ksort($this->_data); + $keys = array_keys($this->_data); + $this->_max_rows = end($keys) + 1; + + switch ($this->_defaultAlign) { + case CONSOLE_TABLE_ALIGN_CENTER: + $pad = STR_PAD_BOTH; + break; + case CONSOLE_TABLE_ALIGN_RIGHT: + $pad = STR_PAD_LEFT; + break; + default: + $pad = STR_PAD_RIGHT; + break; + } + + // Set default column alignments + for ($i = count($this->_col_align); $i < $this->_max_cols; $i++) { + $this->_col_align[$i] = $pad; + } + } + + /** + * Calculates the maximum length for each column of a row. + * + * @param array $row The row data. + * + * @return void + */ + function _calculateCellLengths($row) + { + for ($i = 0; $i < count($row); $i++) { + if (!isset($this->_cell_lengths[$i])) { + $this->_cell_lengths[$i] = 0; + } + $this->_cell_lengths[$i] = max($this->_cell_lengths[$i], + $this->_strlen($row[$i])); + } + } + + /** + * Calculates the maximum height for all columns of a row. + * + * @param integer $row_number The row number. + * @param array $row The row data. + * + * @return void + */ + function _calculateRowHeight($row_number, $row) + { + if (!isset($this->_row_heights[$row_number])) { + $this->_row_heights[$row_number] = 1; + } + + // Do not process horizontal rule rows. + if ($row === CONSOLE_TABLE_HORIZONTAL_RULE) { + return; + } + + for ($i = 0, $c = count($row); $i < $c; ++$i) { + $lines = preg_split('/\r?\n|\r/', $row[$i]); + $this->_row_heights[$row_number] = max($this->_row_heights[$row_number], + count($lines)); + } + } + + /** + * Returns the character length of a string. + * + * @param string $str A multibyte or singlebyte string. + * + * @return integer The string length. + */ + function _strlen($str) + { + static $mbstring, $utf8; + + // Strip ANSI color codes if requested. + if ($this->_ansiColor) { + $str = Console_Color::strip($str); + } + + // Cache expensive function_exists() calls. + if (!isset($mbstring)) { + $mbstring = function_exists('mb_strlen'); + } + if (!isset($utf8)) { + $utf8 = function_exists('utf8_decode'); + } + + if ($utf8 && + ($this->_charset == strtolower('utf-8') || + $this->_charset == strtolower('utf8'))) { + return strlen(utf8_decode($str)); + } + if ($mbstring) { + return mb_strlen($str, $this->_charset); + } + + return strlen($str); + } + + /** + * Returns part of a string. + * + * @param string $string The string to be converted. + * @param integer $start The part's start position, zero based. + * @param integer $length The part's length. + * + * @return string The string's part. + */ + function _substr($string, $start, $length = null) + { + static $mbstring; + + // Cache expensive function_exists() calls. + if (!isset($mbstring)) { + $mbstring = function_exists('mb_substr'); + } + + if (is_null($length)) { + $length = $this->_strlen($string); + } + if ($mbstring) { + $ret = @mb_substr($string, $start, $length, $this->_charset); + if (!empty($ret)) { + return $ret; + } + } + return substr($string, $start, $length); + } + + /** + * Returns a string padded to a certain length with another string. + * + * This method behaves exactly like str_pad but is multibyte safe. + * + * @param string $input The string to be padded. + * @param integer $length The length of the resulting string. + * @param string $pad The string to pad the input string with. Must + * be in the same charset like the input string. + * @param const $type The padding type. One of STR_PAD_LEFT, + * STR_PAD_RIGHT, or STR_PAD_BOTH. + * + * @return string The padded string. + */ + function _strpad($input, $length, $pad = ' ', $type = STR_PAD_RIGHT) + { + $mb_length = $this->_strlen($input); + $sb_length = strlen($input); + $pad_length = $this->_strlen($pad); + + /* Return if we already have the length. */ + if ($mb_length >= $length) { + return $input; + } + + /* Shortcut for single byte strings. */ + if ($mb_length == $sb_length && $pad_length == strlen($pad)) { + return str_pad($input, $length, $pad, $type); + } + + switch ($type) { + case STR_PAD_LEFT: + $left = $length - $mb_length; + $output = $this->_substr(str_repeat($pad, ceil($left / $pad_length)), + 0, $left, $this->_charset) . $input; + break; + case STR_PAD_BOTH: + $left = floor(($length - $mb_length) / 2); + $right = ceil(($length - $mb_length) / 2); + $output = $this->_substr(str_repeat($pad, ceil($left / $pad_length)), + 0, $left, $this->_charset) . + $input . + $this->_substr(str_repeat($pad, ceil($right / $pad_length)), + 0, $right, $this->_charset); + break; + case STR_PAD_RIGHT: + $right = $length - $mb_length; + $output = $input . + $this->_substr(str_repeat($pad, ceil($right / $pad_length)), + 0, $right, $this->_charset); + break; + } + + return $output; + } + +} diff --git a/lib/predict/tests/test-001.php b/lib/predict/tests/test-001.php new file mode 100644 index 0000000..f9ab5e5 --- /dev/null +++ b/lib/predict/tests/test-001.php @@ -0,0 +1,133 @@ + 0.0, + 'x' => 2328.97048951, + 'y' => -5995.22076416, + 'z' => 1719.97067261, + 'vx' => 2.91207230, + 'vy' => -0.98341546, + 'vz' => -7.09081703 + ), + array( + 'step' => 360.0, + 'x' => 2456.10705566, + 'y' => -6071.93853760, + 'z' => 1222.89727783, + 'vx' => 2.67938992, + 'vy' => -0.44829041, + 'vz' => -7.22879231 + ), + array( + 'step' => 720.0, + 'x' => 2567.56195068, + 'y' => -6112.50384522, + 'z' => 713.96397400, + 'vx' => 2.44024599, + 'vy' => 0.09810869, + 'vz' => -7.31995916 + ), + array( + 'step' => 1080.0, + 'x' => 2663.09078980, + 'y' => -6115.48229980, + 'z' => 196.39640427, + 'vx' => 2.19611958, + 'vy' => 0.65241995, + 'vz' => -7.36282432 + ), + array( + 'step' => 1440.0, + 'x' => 2742.55133057, + 'y' => -6079.67144775, + 'z' => -326.38095856, + 'vx' => 1.94850229, + 'vy' => 1.21106251, + 'vz' => -7.35619372 + ) +); + +$headers = array( + 'step time', + 'label', + 'result', + 'expected', +); + +$data = array(); + + +$file = file('tests/test-001.tle'); +$tle = new Predict_TLE($file[0], $file[1], $file[2]); +$sat = new Predict_Sat($tle); +$sgpsdp = new Predict_SGPSDP(); + +$count = 0; +foreach ($expected as $e) { + $sgpsdp->SGP4($sat, $e['step']); + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $count++; + $data[$count] = array(); + $data[$count][0] = $e['step']; + $data[$count][1] = 'X'; + $data[$count][2] = $sat->pos->x; + $data[$count][3] = $e['x']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Y'; + $data[$count][2] = $sat->pos->y; + $data[$count][3] = $e['y']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Z'; + $data[$count][2] = $sat->pos->z; + $data[$count][3] = $e['z']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VX'; + $data[$count][2] = $sat->vel->x; + $data[$count][3] = $e['vx']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VY'; + $data[$count][2] = $sat->vel->y; + $data[$count][3] = $e['vy']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VZ'; + $data[$count][2] = $sat->vel->z; + $data[$count][3] = $e['vz']; +} +// exit; + +$tbl = new Console_Table(); +$tbl->setHeaders($headers); +$tbl->addData($data); + +echo "DEEP_SPACE_EPHEM: " . ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) . " (expected: 0)\n\n"; + +echo $tbl->getTable(); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; diff --git a/lib/predict/tests/test-001.tle b/lib/predict/tests/test-001.tle new file mode 100644 index 0000000..2d8ac4e --- /dev/null +++ b/lib/predict/tests/test-001.tle @@ -0,0 +1,3 @@ +TEST SAT SGP 001 +1 88888U 80275.98708465 .00073094 13844-3 66816-4 0 9 +2 88888 72.8435 115.9689 0086731 52.6988 110.5714 16.05824518 103 diff --git a/lib/predict/tests/test-002.php b/lib/predict/tests/test-002.php new file mode 100644 index 0000000..e491aa2 --- /dev/null +++ b/lib/predict/tests/test-002.php @@ -0,0 +1,135 @@ + 0.0, + 'x' => 7473.37066650, + 'y' => 428.95261765, + 'z' => 5828.74786377, + 'vx' => 5.1071513, + 'vy' => 6.44468284, + 'vz' => -0.18613096 + ), + array( + 'step' => 360.0, + 'x' => -3305.22537232, + 'y' => 32410.86328125, + 'z' => -24697.17675781, + 'vx' => -1.30113538, + 'vy' => -1.15131518, + 'vz' => -0.28333528 + ), + array( + 'step' => 720.0, + 'x' => 14271.28759766, + 'y' => 24110.46411133, + 'z' => -4725.76837158, + 'vx' => -0.32050445, + 'vy' => 2.67984074, + 'vz' => -2.08405289 + ), + array( + 'step' => 1080.0, + 'x' => -9990.05883789, + 'y' => 22717.35522461, + 'z' => -23616.890662501, + 'vx' => -1.01667246, + 'vy' => -2.29026759, + 'vz' => 0.72892364 + ), + array( + 'step' => 1440.0, + 'x' => 9787.86975097, + 'y' => 33753.34667969, + 'z' => -15030.81176758, + 'vx' => -1.09425966, + 'vy' => 0.92358845, + 'vz' => -1.52230928 + ) +); + +$headers = array( + 'step time', + 'label', + 'result', + 'expected', +); + +$data = array(); + + +$file = file('tests/test-002.tle'); +$tle = new Predict_TLE($file[0], $file[1], $file[2]); +$sat = new Predict_Sat($tle); +$sgpsdp = new Predict_SGPSDP(); + +$count = 0; +foreach ($expected as $e) { + $sgpsdp->SGP4($sat, $e['step']); + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $count++; + $data[$count] = array(); + $data[$count][0] = $e['step']; + $data[$count][1] = 'X'; + $data[$count][2] = $sat->pos->x; + $data[$count][3] = $e['x']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Y'; + $data[$count][2] = $sat->pos->y; + $data[$count][3] = $e['y']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Z'; + $data[$count][2] = $sat->pos->z; + $data[$count][3] = $e['z']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VX'; + $data[$count][2] = $sat->vel->x; + $data[$count][3] = $e['vx']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VY'; + $data[$count][2] = $sat->vel->y; + $data[$count][3] = $e['vy']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VZ'; + $data[$count][2] = $sat->vel->z; + $data[$count][3] = $e['vz']; +} +// exit; + +$tbl = new Console_Table(); +$tbl->setHeaders($headers); +$tbl->addData($data); + + +echo "DEEP_SPACE_EPHEM: " . ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) . " (expected: 64)\n\n"; + +echo $tbl->getTable(); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; diff --git a/lib/predict/tests/test-002.tle b/lib/predict/tests/test-002.tle new file mode 100644 index 0000000..e7faff7 --- /dev/null +++ b/lib/predict/tests/test-002.tle @@ -0,0 +1,4 @@ +TEST SAT SDP 001 +1 11801U 80230.29629788 .01431103 00000-0 14311-1 0 2 +2 11801 46.7916 230.4354 7318036 47.4722 10.4117 2.28537848 2 + diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 96d3a40..e404293 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -15,6 +15,8 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + public const DATETIME_FORMAT = 'c'; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php new file mode 100644 index 0000000..8d709f3 --- /dev/null +++ b/src/Controller/PropagateController.php @@ -0,0 +1,77 @@ + "\d+"])] + public function nextPass(int $id, Request $request, NormalizerInterface $normalizer): JsonResponse { + + try { + $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + + $predict = new \Predict(); + $qth = new \Predict_QTH(); + + $qth->lat = $observer->latitude; + $qth->lon = $observer->longitude; + $qth->alt = $observer->altitude; + + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + + $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); // Instantiate it + $sat = new \Predict_Sat($tle); // Load up the satellite data + $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) + + $predict->minEle = 10; // Minimum elevation for a pass + $predict->timeRes = 10; // Pass details: time resolution in seconds + $predict->numEntries = 20; // Pass details: number of entries per pass + $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + $results = $predict->get_passes($sat, $qth, $now, 10); + $results = $predict->filterVisiblePasses($results); + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + ]; + + $url = $this->router->generate( + 'tle_pass', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $url, + '@type' => 'VisibleSatellitePassCollection', + 'observer' => $normalizer->normalize($observer), + 'member' => $normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]), + 'parameters' => $parameters, + ]; + + return new JsonResponse($data); + } +} diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php new file mode 100644 index 0000000..45bdc6c --- /dev/null +++ b/src/Serializer/ObserverNormalizer.php @@ -0,0 +1,39 @@ +normalizer->normalize($object); + + unset($result['timeZone']); + + $result['@type'] = 'Observer'; + $result['datetime'] = $object->datetime; + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php new file mode 100644 index 0000000..d0ab383 --- /dev/null +++ b/src/Serializer/SatellitePassNormalizer.php @@ -0,0 +1,49 @@ + 'VisibleSatellitePass', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_aos_az, 2), + 'elevation' => round($object->visible_aos_el, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_max_el_az, 2), + 'elevation' => round($object->visible_max_el, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_los_az, 2), + 'elevation' => round($object->visible_los_el, 2), + ], + ]; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php new file mode 100644 index 0000000..85742c9 --- /dev/null +++ b/src/ViewModel/LatLng.php @@ -0,0 +1,41 @@ +latitude > 90 || $this->latitude < -90) { + throw new \InvalidArgumentException('Invalid latitude value'); + } + + if ($this->longitude > 180 || $this->longitude < -180) { + throw new \InvalidArgumentException('Invalid longitude value'); + } + } + + public function getTimeZone(): ?string + { + $diffs = []; + foreach (DateTimeZone::listIdentifiers() as $timezoneID) { + $timezone = new DateTimeZone($timezoneID); + $location = $timezone->getLocation(); + $tLat = $location['latitude']; + $tLng = $location['longitude']; + $diffLat = abs($this->latitude - $tLat); + $diffLng = abs($this->longitude - $tLng); + $diff = $diffLat + $diffLng; + $diffs[$timezoneID] = $diff; + } + + $timezone = array_keys($diffs, min($diffs)); + + return $timezone[0] ?? null; + } +} diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php new file mode 100644 index 0000000..749cdc9 --- /dev/null +++ b/src/ViewModel/Observer.php @@ -0,0 +1,15 @@ +datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + } +} diff --git a/symfony.lock b/symfony.lock index 373001a..eec58c9 100644 --- a/symfony.lock +++ b/symfony.lock @@ -394,6 +394,12 @@ "symfony/polyfill-uuid": { "version": "v1.22.1" }, + "symfony/property-access": { + "version": "v5.2.4" + }, + "symfony/property-info": { + "version": "v5.2.4" + }, "symfony/psr-http-message-bridge": { "version": "v2.1.0" }, From 6a609afdadc4d2f569faf968cff75f9552c1d511 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:03:02 +0200 Subject: [PATCH 091/221] add period data --- composer.json | 2 +- composer.lock | 16 ++++++----- src/Command/TleCalculate.php | 1 + src/Entity/TleInformation.php | 11 ++++++-- src/Migrations/Version20210420125645.php | 35 ++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/Migrations/Version20210420125645.php diff --git a/composer.json b/composer.json index 75a8902..72f24ca 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "ext-iconv": "*", "ext-json": "*", "beberlei/doctrineextensions": "^1.3", - "ivanstan/tle-php": "^1.0.2", + "ivanstan/tle-php": "dev-master", "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", diff --git a/composer.lock b/composer.lock index 0909423..c10083b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e0bbf162f1ab7711762d6c0e7c9c710c", + "content-hash": "0a7e43912dee92d8247bdf135fc82f38", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1847,16 +1847,16 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0.3", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0" + "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/4ae1dbd53cba8de3d89328b8d20c701ee96558c0", - "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/78133b47a05e336e3088d46ac0ffa9abdb084743", + "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743", "shasum": "" }, "require": { @@ -1868,6 +1868,7 @@ "require-dev": { "phpunit/phpunit": "^8" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1887,9 +1888,9 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0.3" + "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-02-25T11:17:02+00:00" + "time": "2021-04-20T12:58:40+00:00" }, { "name": "jean85/pretty-package-versions", @@ -7721,6 +7722,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "ivanstan/tle-php": 20, "roave/security-advisories": 20 }, "prefer-stable": false, diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index fb0f190..47d665a 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -49,6 +49,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); + $tleInformation->period = $tleModel->period(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 0f55c69..34614a9 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -15,12 +15,19 @@ class TleInformation /** * @ORM\Column(type="float", precision=14, scale=12, nullable=true) */ - public float $eccentricity; + public ?float $eccentricity; /** * @ORM\Column(type="float", precision=16, scale=10, nullable=true) */ - public float $inclination; + public ?float $inclination; + + /** + * Period for complete orbit in seconds + * + * @ORM\Column(type="float", precision=24, scale=10, nullable=true) + */ + public ?float $period; public function __construct(Tle $tle) { diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php new file mode 100644 index 0000000..dbdf819 --- /dev/null +++ b/src/Migrations/Version20210420125645.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD period DOUBLE PRECISION DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP period'); + } +} From 78e9dd3fe01d0bffbb91cbd6b7030f6bf3749938 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:05:43 +0200 Subject: [PATCH 092/221] add period data --- src/Entity/TleInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 34614a9..8767b29 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -25,7 +25,7 @@ class TleInformation /** * Period for complete orbit in seconds * - * @ORM\Column(type="float", precision=24, scale=10, nullable=true) + * @ORM\Column(type="float", name="`period`" precision=24, scale=10, nullable=true) */ public ?float $period; From a6fb4a4943968dcee77fc506beacf1c4f937246b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:06:05 +0200 Subject: [PATCH 093/221] add period data --- src/Migrations/Version20210420125645.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php index dbdf819..0942a2c 100644 --- a/src/Migrations/Version20210420125645.php +++ b/src/Migrations/Version20210420125645.php @@ -22,7 +22,7 @@ public function up(Schema $schema) : void // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('ALTER TABLE tle_information ADD period DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE tle_information ADD `period` DOUBLE PRECISION DEFAULT NULL'); } public function down(Schema $schema) : void @@ -30,6 +30,6 @@ public function down(Schema $schema) : void // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('ALTER TABLE tle_information DROP period'); + $this->addSql('ALTER TABLE tle_information DROP `period`'); } } From b849594d14e5ab1a88d8d478af7b0d59ea1abe49 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:07:28 +0200 Subject: [PATCH 094/221] add period data --- src/Entity/TleInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 8767b29..19eb374 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -25,7 +25,7 @@ class TleInformation /** * Period for complete orbit in seconds * - * @ORM\Column(type="float", name="`period`" precision=24, scale=10, nullable=true) + * @ORM\Column(type="float", name="`period`", precision=24, scale=10, nullable=true) */ public ?float $period; From ff780f98e275ce5e537e27c0b64182e75cec7971 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:13:30 +0200 Subject: [PATCH 095/221] hydra context in constant --- src/Controller/AbstractApiController.php | 2 ++ src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 2 +- src/Controller/TleController.php | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index e404293..e70641a 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -17,6 +17,8 @@ abstract class AbstractApiController extends AbstractController public const DATETIME_FORMAT = 'c'; + protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 8d709f3..060220b 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -64,7 +64,7 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali $parameters['satelliteId'] = $id; $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $url, '@type' => 'VisibleSatellitePassCollection', 'observer' => $normalizer->normalize($observer), diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 79880e4..9be3a8e 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -54,7 +54,7 @@ public function hits( $date = new \DateTime($item['date']); $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - $response[$date->format('c')] = $item['hits']; + $response[$date->format(self::DATETIME_FORMAT)] = $item['hits']; } return new JsonResponse( diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index b6c94fd..2384214 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -53,7 +53,7 @@ public function record( } $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, ]; return $this->response( @@ -108,7 +108,7 @@ public function collection( } $response = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', 'totalItems' => $collection->getTotal(), @@ -136,14 +136,14 @@ public function popular( $members = $repository->popular($newerThan, $limit); $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', 'totalItems' => \count($members), 'member' => $members, 'parameters' => [ '*limit' => $limit, - '*newerThan' => $newerThan->format('c'), + '*newerThan' => $newerThan->format(self::DATETIME_FORMAT), ], ]; From eb366e7f90a714e4114aa1e643d580a919fac4b1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 19:02:01 +0200 Subject: [PATCH 096/221] hydra context in constant --- composer.lock | 8 +- src/Command/TleCalculate.php | 1 + src/Controller/AbstractApiController.php | 3 +- src/Controller/PropagateController.php | 96 ++++++++++++++++++++++-- src/Controller/TleController.php | 17 ++--- src/Entity/TleInformation.php | 7 ++ src/Migrations/Version20210420170012.php | 35 +++++++++ src/Service/Traits/TleHttpTrait.php | 21 ++++++ 8 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 src/Migrations/Version20210420170012.php create mode 100644 src/Service/Traits/TleHttpTrait.php diff --git a/composer.lock b/composer.lock index c10083b..c350a2f 100644 --- a/composer.lock +++ b/composer.lock @@ -1851,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743" + "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/78133b47a05e336e3088d46ac0ffa9abdb084743", - "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/50ea45311c3bc50450a799d5cff56f3a904d5835", + "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835", "shasum": "" }, "require": { @@ -1890,7 +1890,7 @@ "issues": "https://github.com/ivanstan/tle-php/issues", "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-04-20T12:58:40+00:00" + "time": "2021-04-20T16:57:25+00:00" }, { "name": "jean85/pretty-package-versions", diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 47d665a..e33e90d 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -50,6 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); + $tleInformation->geostationary = $tleModel->isGeostationary(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index e70641a..5db1684 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -15,6 +15,7 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + /** @var string ISO-8601 date format */ public const DATETIME_FORMAT = 'c'; protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; @@ -130,7 +131,7 @@ public function getPagination(Request $request, int $total, int $pageSize): arra return $result; } - public function response(array $data): Response + public function response(array $data): JsonResponse { return new JsonResponse( $data, diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 060220b..ff3e403 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -4,23 +4,33 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Traits\TleHttpTrait; use App\ViewModel\Observer; +use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; class PropagateController extends AbstractApiController { + use TleHttpTrait; + + protected const DEEP_SATELLITE_PERIOD = 225; // minutes + public function __construct(protected TleRepository $repository) { } - #[Route("/api/tle/{id}/next-pass", name: "tle_pass", requirements: ["id" => "\d+"])] - public function nextPass(int $id, Request $request, NormalizerInterface $normalizer): JsonResponse { - + #[Route("/api/tle/{id}/pass", name: "tle_pass", requirements: ["id" => "\d+"])] + public function pass( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { try { $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); } catch (\InvalidArgumentException $exception) { @@ -34,10 +44,9 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali $qth->lon = $observer->longitude; $qth->alt = $observer->altitude; - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); + $tle = $this->getTle($id); - $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); // Instantiate it + $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); $sat = new \Predict_Sat($tle); // Load up the satellite data $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) @@ -72,6 +81,79 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali 'parameters' => $parameters, ]; - return new JsonResponse($data); + return $this->response($data); + } + + #[Route("/api/tle/{id}/vector", name: "tle_propagate", requirements: ["id" => "\d+"])] + public function vector( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); + $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); + + $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + + $dateTimeUTC = clone $datetime; + $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); + $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + + $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + + $propagator = new \Predict_SGPSDP(); + if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { + $propagator->SDP4($sat, $deltaT); + $algorithm = 'SDP4'; + } else { + $propagator->SGP4($sat, $deltaT); + $algorithm = 'SGP4'; + } + + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $parameters = [ + 'date' => $datetime->format(self::DATETIME_FORMAT), + ]; + + $url = $this->router->generate( + 'tle_propagate', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteStateVector', + 'propagator' => $algorithm, + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], + 'parameters' => $parameters, + ]; + + return $this->response($data); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 2384214..eda86c9 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -4,9 +4,11 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -17,6 +19,8 @@ #[Route("/api/tle")] final class TleController extends AbstractApiController { + use TleHttpTrait; + protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; @@ -40,17 +44,12 @@ public function record( int $id, NormalizerInterface $normalizer, Request $request, - ): Response { + ): JsonResponse { $this->assertParamIsBoolean($request, self::PARAM_EXTRA); $extra = (bool)$request->get(self::PARAM_EXTRA, false); - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } + $tle = $this->getTle($id); $data = [ '@context' => self::HYDRA_CONTEXT, @@ -65,7 +64,7 @@ public function record( public function collection( Request $request, NormalizerInterface $normalizer - ): Response { + ): JsonResponse { $this ->assertParamIsInteger($request, self::PAGE_PARAM) ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) @@ -126,7 +125,7 @@ public function collection( public function popular( Request $request, TleRepository $repository - ): Response { + ): JsonResponse { $newerThan = new \DateTime('now'); $newerThan->setTime(0, 0, 0); $newerThan->modify('-3 days'); diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 19eb374..b2d3cad 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -29,6 +29,13 @@ class TleInformation */ public ?float $period; + /** + * Period for complete orbit in seconds + * + * @ORM\Column(type="boolean", options={"default":"0"}) + */ + public bool $geostationary = false; + public function __construct(Tle $tle) { $this->tle = $tle; diff --git a/src/Migrations/Version20210420170012.php b/src/Migrations/Version20210420170012.php new file mode 100644 index 0000000..7755448 --- /dev/null +++ b/src/Migrations/Version20210420170012.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD geostationary TINYINT(1) DEFAULT \'0\' NOT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP geostationary'); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php new file mode 100644 index 0000000..4814033 --- /dev/null +++ b/src/Service/Traits/TleHttpTrait.php @@ -0,0 +1,21 @@ +repository->findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $tle; + } +} From f99e2e2161841600c77b11b979c32c07e62721a5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Apr 2021 12:31:44 +0200 Subject: [PATCH 097/221] add period --- src/Controller/TleController.php | 7 ++----- src/Repository/TleRepository.php | 1 + src/Serializer/TleModelNormalizer.php | 6 ++++-- src/ViewModel/TleCollectionSortableFieldsEnum.php | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index eda86c9..e646e20 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -25,14 +25,11 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - public const FILTER_ECCENTRICITY = 'eccentricity'; - public const FILTER_INCLINATION = 'inclination'; - public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ - self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, - self::FILTER_INCLINATION => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 6d5d1e2..7ce5b60 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -119,6 +119,7 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::POPULARITY => null, TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', + TleCollectionSortableFieldsEnum::PERIOD => 'info.period', }; } } diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index b9e7c2b..45bcb8e 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -4,6 +4,7 @@ use App\Controller\TleController; use App\Entity\Tle; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -42,8 +43,9 @@ public function normalize($entity, ?string $format = null, array $context = []): if ($isExtra) { $extra = [ 'extra' => [ - TleController::FILTER_ECCENTRICITY => $entity->getInfo()->eccentricity, - TleController::FILTER_INCLINATION => $entity->getInfo()->inclination, + TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, ], ]; diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index b573e33..7aa6989 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -11,4 +11,5 @@ class TleCollectionSortableFieldsEnum extends Enum public const POPULARITY = 'popularity'; public const INCLINATION = 'inclination'; public const ECCENTRICITY = 'eccentricity'; + public const PERIOD = 'period'; } From 3d17a056bbdf7e8b6217910122fa2c22c177328a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Apr 2021 14:32:40 +0200 Subject: [PATCH 098/221] add geodetic propagator --- src/Controller/PropagateController.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index ff3e403..1690bff 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -117,8 +117,17 @@ public function vector( $algorithm = 'SGP4'; } + $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $sat_geodetic = new \Predict_Geodetic(); + \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + + $sat_geodetic->lat = rad2deg($sat_geodetic->lat); + $sat_geodetic->lon = rad2deg($sat_geodetic->lon); + $parameters = [ 'date' => $datetime->format(self::DATETIME_FORMAT), ]; @@ -151,6 +160,11 @@ public function vector( 'r' => $sat->vel->w, 'unit' => 'km/s', ], + 'geodetic' => [ + 'latitude' => $sat_geodetic->lat, + 'longitude' => $sat_geodetic->lon, + 'altitude' => $sat_geodetic->alt, + ], 'parameters' => $parameters, ]; From b15aba813bbfc3d3c57750a778637ed815634f72 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:16:46 +0200 Subject: [PATCH 099/221] add geodetic propagator --- config/custom/tle.json | 176 ++++++++++++++++++++++++- src/Controller/DocsController.php | 7 +- src/Controller/PropagateController.php | 42 +++--- src/Event/StatisticSubscriber.php | 8 +- 4 files changed, 207 insertions(+), 26 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 7efee55..0fa53d5 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.1" + "version": "1.3.2" }, "servers": [ { @@ -62,7 +62,11 @@ "default": "name", "enum": [ "id", - "name" + "name", + "popularity", + "inclination", + "eccentricity", + "period" ] } }, @@ -92,16 +96,30 @@ { "name": "inclination[lt]", "in": "query", - "description": "Filter records with orbital posigrade orbital inclination", + "description": "Filter records with posigrade orbital inclination", "required": false, "example": 90 }, { "name": "inclination[gt]", "in": "query", - "description": "Filter records with orbital retrograde orbital inclination", + "description": "Filter records with retrograde orbital inclination", "required": false, "example": 90 + }, + { + "name": "period[lt]", + "in": "query", + "description": "Filter records with orbital period less than specified", + "required": false, + "example": 255 + }, + { + "name": "period[gt]", + "in": "query", + "description": "Filter records with orbital period greater than specified", + "required": false, + "example": 255 } ], "responses": { @@ -170,6 +188,42 @@ } } } + }, + "/api/tle/{id}/propagate": { + "get": { + "summary": "Propagate (experimental)", + "operationId": "propagate", + "parameters": [ + { + "name": "date", + "in": "path", + "description": "date", + "required": true, + "schema": { + "type": "string", + "example": "2021-04-20T16:28:40+00:00" + } + } + ], + "responses": { + "200": { + "description": "Record found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Propagation" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } } }, "components": { @@ -242,6 +296,120 @@ "type": "object" } ] + }, + "Propagation": { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/44859/vector?date=2021-04-26T08:39:45+00:00" + }, + "@type": { + "type": "string", + "example": "SatellitePropagationResult" + }, + "tle": { + "$ref": "#/components/schemas/TLE" + }, + "propagator": { + "type": "string", + "example": "SGP4" + }, + "vector": { + "properties": { + "reference_frame": { + "type": "string", + "example": "ECI" + }, + "position": { + "properties": { + "x": { + "type": "number", + "example": "-2450.396984017652" + }, + "y": { + "type": "number", + "example": "6101.198295995954" + }, + "z": { + "type": "number", + "example": "-6032.216318229235" + }, + "r": { + "type": "number", + "example": "8922.819046481767" + }, + "unit": { + "type": "string", + "example": "km" + } + }, + "type": "object" + }, + + "velocity": { + "properties": { + "x": { + "type": "number", + "example": "-0.1644949004552056" + }, + "y": { + "type": "number", + "example": "4.639904402973215" + }, + "z": { + "type": "number", + "example": "4.406398357056158" + }, + "r": { + "type": "number", + "example": "6.400946642651633" + }, + "unit": { + "type": "string", + "example": "km/s" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "geodetic": { + "properties": { + "latitude": { + "type": "number", + "example": "-42.67210184042445" + }, + "longitude": { + "type": "number", + "example": "124.524923099869" + }, + "altitude": { + "type": "number", + "example": "2554.4740343929398" + } + }, + "type": "object" + }, + "parameters": { + "properties": { + "date": { + "type": "string", + "example": "2021-04-26T08:39:45+00:00" + }, + "satelliteId": { + "type": "string", + "example": "44859" + } + }, + "type": "object" + } + }, + "type": "object" } }, "responses": { diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index d96bf19..dc2e7ac 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -23,13 +23,16 @@ public function docs(): Response /** * @Route("/api/{name}.json", name="app_api_docs_json") + * @throws \JsonException */ public function getJson(string $name): JsonResponse { $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + unset($docs['paths']['/api/tle/{id}/propagate']); + + return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 1690bff..8b1f28a 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -84,8 +84,8 @@ public function pass( return $this->response($data); } - #[Route("/api/tle/{id}/vector", name: "tle_propagate", requirements: ["id" => "\d+"])] - public function vector( + #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] + public function propagate( int $id, Request $request, NormalizerInterface $normalizer @@ -121,7 +121,6 @@ public function vector( \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); - $sat_geodetic = new \Predict_Geodetic(); \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); @@ -143,22 +142,25 @@ public function vector( $data = [ '@context' => self::HYDRA_CONTEXT, '@id' => $url, - '@type' => 'SatelliteStateVector', + '@type' => 'SatellitePropagationResult', + 'tle' => $tle, 'propagator' => $algorithm, - 'reference_frame' => 'ECI', - 'position' => [ - 'x' => $sat->pos->x, - 'y' => $sat->pos->y, - 'z' => $sat->pos->z, - 'r' => $sat->pos->w, - 'unit' => 'km', - ], - 'velocity' => [ - 'x' => $sat->vel->x, - 'y' => $sat->vel->y, - 'z' => $sat->vel->z, - 'r' => $sat->vel->w, - 'unit' => 'km/s', + 'vector' => [ + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], ], 'geodetic' => [ 'latitude' => $sat_geodetic->lat, @@ -168,6 +170,8 @@ public function vector( 'parameters' => $parameters, ]; - return $this->response($data); + return $this->response( + $normalizer->normalize($data) + ); } } diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 5175346..adc462d 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -12,6 +12,12 @@ class StatisticSubscriber implements EventSubscriberInterface { + protected const TLE_ROUTES = [ + 'tle_propagate', + 'tle_pass', + 'tle_record' + ]; + public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -25,7 +31,7 @@ public static function getSubscribedEvents(): array public function onKernelTerminate($event): void { - if ($event->getRequest()->get('_route') !== 'tle_record') { + if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { return; } From de58636aa6280804f6502c9ee5d9fb76c09d1b08 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:23:04 +0200 Subject: [PATCH 100/221] add geodetic propagator --- src/Controller/DocsController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index dc2e7ac..7512dec 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -22,12 +22,12 @@ public function docs(): Response } /** - * @Route("/api/{name}.json", name="app_api_docs_json") + * @Route("/api/tle.json", name="app_api_docs_json") * @throws \JsonException */ - public function getJson(string $name): JsonResponse + public function getJson(): JsonResponse { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + $path = $this->getProjectDir() . '/config/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); From bf474a14dcea488c3ed4dd571a743e8d9836bdd3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:48:51 +0200 Subject: [PATCH 101/221] add geodetic propagator --- config/custom/tle.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 0fa53d5..a8291f8 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -31,7 +31,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" } } } @@ -148,11 +148,11 @@ "member": { "type": "array", "items": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" } }, "parameters": { - "type": "array" + "type": "object" }, "view": { "type": "object", @@ -264,7 +264,7 @@ }, "type": "object" }, - "TLE": { + "TleModel": { "allOf": [ { "properties": { @@ -276,6 +276,10 @@ "type": "string", "example": "TleModel" }, + "satelliteId": { + "type": "integer", + "example": 43638 + }, "name": { "type": "string", "example": "1998-067PN" @@ -312,7 +316,7 @@ "example": "SatellitePropagationResult" }, "tle": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" }, "propagator": { "type": "string", @@ -480,7 +484,7 @@ "pageSize": { "name": "page-size", "in": "query", - "description": "Number of items per page", + "description": "Number of records per page", "schema": { "type": "integer", "default": 20, From 986c3c2a7e00d05679b8e732bb456c682b8062c5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 12:02:05 +0200 Subject: [PATCH 102/221] add geodetic propagator --- src/Controller/DocsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 7512dec..386cbd5 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -31,7 +31,7 @@ public function getJson(): JsonResponse $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - unset($docs['paths']['/api/tle/{id}/propagate']); +// unset($docs['paths']['/api/tle/{id}/propagate']); return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } From 6478b8f51159602ebeef7c6305e0e22202dee9d4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 12:40:21 +0200 Subject: [PATCH 103/221] add geodetic propagator --- config/custom/tle.json | 60 ++++++++++++++++---------- src/Controller/PropagateController.php | 2 +- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index a8291f8..0346117 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -14,20 +14,22 @@ "get": { "summary": "Record", "operationId": "record", + "description": "Return single TleModel for requested satellite id", "parameters": [ { "name": "id", "in": "path", - "description": "id", + "description": "Satellite id", "required": true, "schema": { + "example": 43638, "type": "integer" } } ], "responses": { "200": { - "description": "Record found", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -49,6 +51,7 @@ "get": { "summary": "Collection", "operationId": "collection", + "description": "Return collection of TleModels depending on requested parameters", "parameters": [ { "$ref": "#/components/parameters/search" @@ -124,7 +127,7 @@ ], "responses": { "200": { - "description": "Tle collection", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -143,7 +146,7 @@ }, "totalItems": { "type": "integer", - "example": "50" + "example": 10414 }, "member": { "type": "array", @@ -192,13 +195,24 @@ "/api/tle/{id}/propagate": { "get": { "summary": "Propagate (experimental)", + "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", "operationId": "propagate", "parameters": [ { - "name": "date", + "name": "id", "in": "path", - "description": "date", + "description": "Target satellite id for which propagation is calculated", "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "description": "Target date and time", + "required": false, "schema": { "type": "string", "example": "2021-04-20T16:28:40+00:00" @@ -207,7 +221,7 @@ ], "responses": { "200": { - "description": "Record found", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -318,8 +332,10 @@ "tle": { "$ref": "#/components/schemas/TleModel" }, - "propagator": { + "algorithm": { "type": "string", + "enum": ["SGP4", "SDP4"], + "description": "Algorithm used for propagation. Determined based on mean motion.", "example": "SGP4" }, "vector": { @@ -332,19 +348,19 @@ "properties": { "x": { "type": "number", - "example": "-2450.396984017652" + "example": -2450.396984017652 }, "y": { "type": "number", - "example": "6101.198295995954" + "example": 6101.198295995954 }, "z": { "type": "number", - "example": "-6032.216318229235" + "example": -6032.216318229235 }, "r": { "type": "number", - "example": "8922.819046481767" + "example": 8922.819046481767 }, "unit": { "type": "string", @@ -358,19 +374,19 @@ "properties": { "x": { "type": "number", - "example": "-0.1644949004552056" + "example": -0.1644949004552056 }, "y": { "type": "number", - "example": "4.639904402973215" + "example": 4.639904402973215 }, "z": { "type": "number", - "example": "4.406398357056158" + "example": 4.406398357056158 }, "r": { "type": "number", - "example": "6.400946642651633" + "example": 6.400946642651633 }, "unit": { "type": "string", @@ -386,15 +402,15 @@ "properties": { "latitude": { "type": "number", - "example": "-42.67210184042445" + "example": -42.67210184042445 }, "longitude": { "type": "number", - "example": "124.524923099869" + "example": 124.524923099869 }, "altitude": { "type": "number", - "example": "2554.4740343929398" + "example": 2554.4740343929398 } }, "type": "object" @@ -426,7 +442,7 @@ }, "example": { "response": { - "message": "Not found" + "message": "Resource not found" } } } @@ -441,7 +457,7 @@ }, "example": { "response": { - "message": "Server error" + "message": "Server has encountered an internal error" } } } @@ -484,7 +500,7 @@ "pageSize": { "name": "page-size", "in": "query", - "description": "Number of records per page", + "description": "Number of collection member per page", "schema": { "type": "integer", "default": 20, diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 8b1f28a..d65e994 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -144,7 +144,7 @@ public function propagate( '@id' => $url, '@type' => 'SatellitePropagationResult', 'tle' => $tle, - 'propagator' => $algorithm, + 'algorithm' => $algorithm, 'vector' => [ 'reference_frame' => 'ECI', 'position' => [ From 5495ae60a1457a1d8a7cf2472aa7d055ac718149 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 14:53:24 +0200 Subject: [PATCH 104/221] get rid of Statistic table --- config/packages/doctrine.yaml | 2 ++ src/Entity/Statistic.php | 39 ---------------------- src/Event/StatisticSubscriber.php | 13 +------- src/Migrations/Version20210426124814.php | 41 ++++++++++++++++++++++++ src/Repository/StatisticRepository.php | 40 ----------------------- src/Repository/TleRepository.php | 8 +++-- 6 files changed, 49 insertions(+), 94 deletions(-) delete mode 100644 src/Entity/Statistic.php create mode 100644 src/Migrations/Version20210426124814.php delete mode 100644 src/Repository/StatisticRepository.php diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index e7bec11..176cb1e 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -1,6 +1,8 @@ doctrine: dbal: url: '%env(resolve:DATABASE_URL)%' + options: + 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' # IMPORTANT: You MUST configure your server version, # either here or in the DATABASE_URL env var (see .env file) diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php deleted file mode 100644 index c360155..0000000 --- a/src/Entity/Statistic.php +++ /dev/null @@ -1,39 +0,0 @@ -tle = $tle; - } - - public function getHits(): int - { - return $this->hits; - } - - public function setHits(int $hits): void - { - $this->hits = $hits; - } - - public function incrementHits(): void - { - $this->hits++; - } -} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index adc462d..df566cc 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -18,7 +18,7 @@ class StatisticSubscriber implements EventSubscriberInterface 'tle_record' ]; - public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) + public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -47,17 +47,6 @@ public function onKernelTerminate($event): void $request->setIp($event->getRequest()->getClientIp()); $this->em->persist($request); - - $this->em->flush(); - - $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); - - if ($statistics === null) { - return; - } - - $statistics->incrementHits(); - $this->em->flush(); } } diff --git a/src/Migrations/Version20210426124814.php b/src/Migrations/Version20210426124814.php new file mode 100644 index 0000000..44a827e --- /dev/null +++ b/src/Migrations/Version20210426124814.php @@ -0,0 +1,41 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE statistic'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE statistic (tle_id INT NOT NULL, hits BIGINT NOT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB COMMENT = \'\' '); + $this->addSql('ALTER TABLE statistic ADD CONSTRAINT FK_649B469CE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id) ON UPDATE NO ACTION ON DELETE NO ACTION'); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php deleted file mode 100644 index e477ad1..0000000 --- a/src/Repository/StatisticRepository.php +++ /dev/null @@ -1,40 +0,0 @@ -getEntityManager()->getRepository(Tle::class)->find($id); - - if ($tle === null) { - return null; - } - - $statistic = new Statistic($tle); - $statistic->setHits(1); - - $this->_em->persist($statistic); - - return $statistic; - } -} diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 7ce5b60..e6100cc 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -3,7 +3,6 @@ namespace App\Repository; use App\Entity\Request; -use App\Entity\Statistic; use App\Entity\Tle; use App\Entity\TleInformation; use App\ViewModel\Model\PaginationCollection; @@ -67,8 +66,11 @@ public function collection( // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { - $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); - $builder->addOrderBy('s.hits', $sortDir); + $before = (new \DateTime())->sub(new \DateInterval('P7D')); + $builder->leftJoin(Request::class, 's', Expr\Join::WITH, 's.tle = tle.id AND s.createdAt < :date'); + $builder->setParameter('date', $before); + $builder->groupBy('tle.id'); + $builder->addOrderBy('COUNT(s.id)', $sortDir); } else { $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } From dd0dae89b5a979ea8f9a1f1a566325929af24921 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 15:11:03 +0200 Subject: [PATCH 105/221] fix deprecations --- config/packages/doctrine.yaml | 1 + config/packages/doctrine_migrations.yaml | 6 ++---- src/Kernel.php | 4 ++-- tests/CollectionTest.php | 2 +- tests/TleTest.php | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 176cb1e..b5a2432 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -1,6 +1,7 @@ doctrine: dbal: url: '%env(resolve:DATABASE_URL)%' + override_url: true options: 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index 3bf0fbc..aa336b1 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,5 +1,3 @@ doctrine_migrations: - dir_name: '%kernel.project_dir%/src/Migrations' - # namespace is arbitrary but should be different from App\Migrations - # as migrations classes should NOT be autoloaded - namespace: DoctrineMigrations + migrations_paths: + 'DoctrineMigrations': '%kernel.project_dir%/src/Migrations' diff --git a/src/Kernel.php b/src/Kernel.php index 509a308..2c07f58 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -7,7 +7,7 @@ use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel as BaseKernel; -use Symfony\Component\Routing\RouteCollectionBuilder; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; /** * @codeCoverageIgnore @@ -54,7 +54,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa } /** @throws \Exception */ - protected function configureRoutes(RouteCollectionBuilder $routes): void + protected function configureRoutes(RoutingConfigurator $routes): void { $confDir = $this->getProjectDir().'/config'; diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 288e50e..20d2fd7 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -120,4 +120,4 @@ private function getCollection(int $page, int $pageSize): Response ] ); } -} \ No newline at end of file +} diff --git a/tests/TleTest.php b/tests/TleTest.php index 022982a..01ed397 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -54,7 +54,7 @@ public function testTleCollectionRecord(): void $response = $this->toArray($response); self::assertArrayHasKey('@context', $response); - self::assertEquals('http://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); self::assertEquals('http://localhost/api/tle', $response['@id']); From bbedad13e4a4968cac1429abb747c483c5ed42e3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 15:40:47 +0200 Subject: [PATCH 106/221] fix deprecations --- .env.test | 3 +-- config/routes.yaml | 6 +++--- config/routes/annotations.yaml | 3 --- config/routes/dev/framework.yaml | 3 --- src/Kernel.php | 8 ++++---- 5 files changed, 8 insertions(+), 15 deletions(-) delete mode 100644 config/routes/annotations.yaml delete mode 100644 config/routes/dev/framework.yaml diff --git a/.env.test b/.env.test index a68eadb..410d981 100644 --- a/.env.test +++ b/.env.test @@ -2,5 +2,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 -PANTHER_APP_ENV=panther -DATABASE_URL=mysql://root:root@127.0.0.1:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 diff --git a/config/routes.yaml b/config/routes.yaml index c3283aa..a9bbdc3 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,3 +1,3 @@ -#index: -# path: / -# controller: App\Controller\DefaultController::index +controllers: + resource: ../src/Controller/ + type: annotation diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml deleted file mode 100644 index d49a502..0000000 --- a/config/routes/annotations.yaml +++ /dev/null @@ -1,3 +0,0 @@ -controllers: - resource: ../../src/Controller/ - type: annotation diff --git a/config/routes/dev/framework.yaml b/config/routes/dev/framework.yaml deleted file mode 100644 index bcbbf13..0000000 --- a/config/routes/dev/framework.yaml +++ /dev/null @@ -1,3 +0,0 @@ -_errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' - prefix: /_error diff --git a/src/Kernel.php b/src/Kernel.php index 2c07f58..d842862 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -54,12 +54,12 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa } /** @throws \Exception */ - protected function configureRoutes(RoutingConfigurator $routes): void + protected function configureRoutes(RoutingConfigurator $routes): void { $confDir = $this->getProjectDir().'/config'; - $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS); } } From 94a7f4a32374e16a9f05a7110f28c98aea372fda Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:06:59 +0200 Subject: [PATCH 107/221] fix tests --- config/custom/tle.json | 4 ++++ deploy.php | 2 +- tests/CollectionTest.php | 36 ++++++++++++++++++------------------ tests/DocumentationTest.php | 6 +++--- tests/TleTest.php | 8 ++++---- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 0346117..7022b48 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -282,6 +282,10 @@ "allOf": [ { "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, "@id": { "type": "string", "example": "https://tle.ivanstanojevic.me/api/tle/43638" diff --git a/deploy.php b/deploy.php index 4c7b8a7..154a0ff 100644 --- a/deploy.php +++ b/deploy.php @@ -67,5 +67,5 @@ ] ); -//before('deploy', 'test'); +before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 20d2fd7..b54e390 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -10,42 +10,42 @@ final class CollectionTest extends AbstractWebTestCase [ 'page' => 1, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=1&page-size=2', + '@id' => 'http://localhost/api/tle/?page=1&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'next' => 'http://localhost/api/tle?page=2&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'next' => 'http://localhost/api/tle/?page=2&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 3, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=3&page-size=2', + '@id' => 'http://localhost/api/tle/?page=3&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=2&page-size=2', - 'next' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', + 'next' => 'http://localhost/api/tle/?page=4&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 5, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=5&page-size=2', + '@id' => 'http://localhost/api/tle/?page=5&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 7, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=7&page-size=2', + '@id' => 'http://localhost/api/tle/?page=7&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=6&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ] ]; @@ -113,7 +113,7 @@ private function getCollectionContent(int $page, int $pageSize): array private function getCollection(int $page, int $pageSize): Response { return $this->get( - '/api/tle', + '/api/tle/', [ 'page' => $page, 'page-size' => $pageSize, diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index 64be291..1878bb8 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -17,7 +17,7 @@ public function testDocumentationIsCorrect(): void $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; + $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; $tle = TleFixtures::create(); @@ -26,7 +26,7 @@ public function testDocumentationIsCorrect(): void self::assertCount(\count($tleSchema), $response); self::assertEquals(array_keys($tleSchema), array_keys($response)); - $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); + $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); self::assertCount(\count($paginationSchema), $response['view']); self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); @@ -34,4 +34,4 @@ public function testDocumentationIsCorrect(): void self::assertCount(\count($response), $collectionSchema); self::assertEquals(array_keys($response), array_keys($collectionSchema)); } -} \ No newline at end of file +} diff --git a/tests/TleTest.php b/tests/TleTest.php index 01ed397..6039820 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -43,7 +43,7 @@ public function testTleCollectionRecord(): void $pageSize = 2; $response = $this->get( - '/api/tle', + '/api/tle/', [ 'page-size' => $pageSize, ] @@ -57,7 +57,7 @@ public function testTleCollectionRecord(): void self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); - self::assertEquals('http://localhost/api/tle', $response['@id']); + self::assertEquals('http://localhost/api/tle/', $response['@id']); self::assertArrayHasKey('@type', $response); self::assertEquals('Collection', $response['@type']); @@ -75,10 +75,10 @@ public function testTleCollectionRecord(): void self::assertEquals('*', $parameters['search']); self::assertArrayHasKey('sort', $parameters); - self::assertEquals('name', $parameters['sort']); + self::assertEquals('popularity', $parameters['sort']); self::assertArrayHasKey('sort-dir', $parameters); - self::assertEquals('asc', $parameters['sort-dir']); + self::assertEquals('desc', $parameters['sort-dir']); self::assertArrayHasKey('page', $parameters); self::assertEquals(1, $parameters['page']); From a525bb1d7eb5e2f101752a27782e8bdb29fa5b85 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:34:36 +0200 Subject: [PATCH 108/221] move sentry to production --- config/bundles.php | 2 +- config/packages/{ => prod}/sentry.yaml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename config/packages/{ => prod}/sentry.yaml (100%) diff --git a/config/bundles.php b/config/bundles.php index ec6d32d..190f48c 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,5 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Sentry\SentryBundle\SentryBundle::class => ['all' => true], + Sentry\SentryBundle\SentryBundle::class => ['prod' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/prod/sentry.yaml similarity index 100% rename from config/packages/sentry.yaml rename to config/packages/prod/sentry.yaml From 296e7e5e91fec00c98cd370a9d584625c6a5c5c6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:44:12 +0200 Subject: [PATCH 109/221] move sentry to production --- composer.json | 2 +- composer.lock | 12 ++++++------ src/Event/ApiExceptionSubscriber.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 72f24ca..73ca5b5 100644 --- a/composer.json +++ b/composer.json @@ -91,7 +91,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit --coverage-text", + "test": "php bin/phpunit --coverage-text", "deploy": "dep deploy" }, "conflict": { diff --git a/composer.lock b/composer.lock index c350a2f..0802e91 100644 --- a/composer.lock +++ b/composer.lock @@ -7637,16 +7637,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.4", + "version": "v5.2.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d" + "reference": "f2f94fd78379cdcdef09dd5025af791301913968" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/9d85d900c1afe29138a0d5854505eb684bc3ac6d", - "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f2f94fd78379cdcdef09dd5025af791301913968", + "reference": "f2f94fd78379cdcdef09dd5025af791301913968", "shasum": "" }, "require": { @@ -7700,7 +7700,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.6" }, "funding": [ { @@ -7716,7 +7716,7 @@ "type": "tidelift" } ], - "time": "2021-02-04T18:05:54+00:00" + "time": "2021-03-23T20:42:04+00:00" } ], "aliases": [], diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 9b8f465..a2434b1 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -41,7 +41,7 @@ public function onException(ExceptionEvent $event): void $response = ['message' => 'Unspecified error']; - if ($this->env === 'dev') { + if ($this->env === 'dev' || $this->env === 'test') { $response['message'] = $exception->getMessage(); $response['exception'] = $this->throwableToArray($exception); } From 5fb357709a57bd758669b844629b3dcdb58d2ef6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:45:29 +0200 Subject: [PATCH 110/221] move sentry to production --- phpunit.xml.dist | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 phpunit.xml.dist diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..e2d15c0 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + tests + + + + + + src + + + + + + + From d5d1b010ea60c1d45bee69739c6d7f5a04beb5e8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:53:12 +0200 Subject: [PATCH 111/221] move sentry to production --- .gitignore | 1 + phpunit.xml.dist | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 4ea500f..e108fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ .phpunit .phpunit.result.cache /phpunit.xml +coverage ###< symfony/phpunit-bridge ### public/index.html diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e2d15c0..4681a8a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,7 +12,7 @@ - + @@ -21,11 +21,18 @@ - - - src - - + + + src + + + + src/Migrations + src/Command + src/DataFixtures + src/Kernel.php + + From 1387b38db500adf664f74f6148ccd544e42e88af Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 17:42:14 +0200 Subject: [PATCH 112/221] move sentry to production --- src/Controller/TleController.php | 35 ++------------------------------ 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index e646e20..f763330 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -10,8 +10,6 @@ use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -30,6 +28,7 @@ final class TleController extends AbstractApiController protected const COLLECTION_FILTERS = [ TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) @@ -46,14 +45,12 @@ public function record( $extra = (bool)$request->get(self::PARAM_EXTRA, false); - $tle = $this->getTle($id); - $data = [ '@context' => self::HYDRA_CONTEXT, ]; return $this->response( - array_merge($data, $normalizer->normalize($tle, null, [self::PARAM_EXTRA => $extra])), + array_merge($data, $normalizer->normalize($this->getTle($id), null, [self::PARAM_EXTRA => $extra])), ); } @@ -117,32 +114,4 @@ public function collection( $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) ); } - - #[Route("/popular", name: "tle_popular")] - public function popular( - Request $request, - TleRepository $repository - ): JsonResponse { - $newerThan = new \DateTime('now'); - $newerThan->setTime(0, 0, 0); - $newerThan->modify('-3 days'); - - $limit = 10; - - $members = $repository->popular($newerThan, $limit); - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => \count($members), - 'member' => $members, - 'parameters' => [ - '*limit' => $limit, - '*newerThan' => $newerThan->format(self::DATETIME_FORMAT), - ], - ]; - - return $this->response($data); - } } From 645c09756cd529e411394b64f07c9fa5a1a9c25e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 17:58:15 +0200 Subject: [PATCH 113/221] move sentry to production --- tests/.gitignore | 0 tests/PropagateControllerTest.php | 53 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) delete mode 100644 tests/.gitignore create mode 100644 tests/PropagateControllerTest.php diff --git a/tests/.gitignore b/tests/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php new file mode 100644 index 0000000..3224379 --- /dev/null +++ b/tests/PropagateControllerTest.php @@ -0,0 +1,53 @@ +get('/api/tle/' . $tle->getId() . '/propagate', [ + 'date' => '2021-04-26T17:49:45+02:00' + ]); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} From 3d99478901fb9981c3ae6623b4ff0525f662ae52 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:11:09 +0200 Subject: [PATCH 114/221] move sentry to production --- phpunit.xml.dist | 2 +- src/DataFixtures/TleFixtures.php | 12 +++++++ tests/PropagateControllerTest.php | 56 ++++++++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4681a8a..47cc715 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -23,7 +23,7 @@ - src + ./src diff --git a/src/DataFixtures/TleFixtures.php b/src/DataFixtures/TleFixtures.php index 9ab650c..7b2ce03 100644 --- a/src/DataFixtures/TleFixtures.php +++ b/src/DataFixtures/TleFixtures.php @@ -25,10 +25,22 @@ public static function create(): Tle return $tle; } + public static function createDeep(): Tle + { + $tle = new Tle(); + $tle->setId(22049); + $tle->setName('GEOTAIL'); + $tle->setLine1('1 22049U 92044A 21119.24930644 -.00001485 00000-0 00000+0 0 9990'); + $tle->setLine2('2 22049 38.4941 42.7845 5317694 181.2241 357.6003 0.19228928 12156'); + + return $tle; + } + public function load(ObjectManager $manager): void { // create single record $manager->persist(self::create()); + $manager->persist(self::createDeep()); // create additional nine records with dummy satelliteIds for ($satelliteId = 1; $satelliteId < 10; $satelliteId++) { diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index 3224379..c28bb79 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -9,13 +9,16 @@ class PropagateControllerTest extends AbstractWebTestCase { - public function testPropagate(): void + public function testPropagateSGP4(): void { $tle = TleFixtures::create(); - $response = $this->get('/api/tle/' . $tle->getId() . '/propagate', [ - 'date' => '2021-04-26T17:49:45+02:00' - ]); + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); @@ -50,4 +53,49 @@ public function testPropagate(): void self::assertEquals($response['parameters']['satelliteId'], 43550); self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } } From 3cd2f4794dac8d64ef398282f9f0cd6675be8a17 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:24:41 +0200 Subject: [PATCH 115/221] move sentry to production --- tests/CollectionTest.php | 11 ++++++----- tests/PropagateControllerTest.php | 11 +++++++++++ tests/TleTest.php | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index b54e390..bbe070a 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -14,7 +14,7 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'next' => 'http://localhost/api/tle/?page=2&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -25,7 +25,7 @@ final class CollectionTest extends AbstractWebTestCase 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', 'next' => 'http://localhost/api/tle/?page=4&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -35,7 +35,8 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'next' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -45,7 +46,7 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ] ]; @@ -99,7 +100,7 @@ private function assertViewIsCorrect($expected, $actual): void { foreach ($actual as $key => $value) { self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); - self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); + self::assertEquals($expected[$key], $value , \sprintf('Assert value of key %s is correct', $key)); } } diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index c28bb79..cd302d4 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -9,6 +9,17 @@ class PropagateControllerTest extends AbstractWebTestCase { + public function testResourceNotFound(): void + { + $response = $this->get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + public function testPropagateSGP4(): void { $tle = TleFixtures::create(); diff --git a/tests/TleTest.php b/tests/TleTest.php index 6039820..0630b22 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -63,7 +63,7 @@ public function testTleCollectionRecord(): void self::assertEquals('Collection', $response['@type']); self::assertArrayHasKey('totalItems', $response); - self::assertEquals(10, $response['totalItems']); + self::assertEquals(11, $response['totalItems']); self::assertArrayHasKey('member', $response); self::assertEquals(\count($response['member']), $pageSize); From 7b5767838aa410856e13774c5450e7d44ca40238 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:31:09 +0200 Subject: [PATCH 116/221] move sentry to production --- tests/StatisticsControllerTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/StatisticsControllerTest.php diff --git a/tests/StatisticsControllerTest.php b/tests/StatisticsControllerTest.php new file mode 100644 index 0000000..9c748c3 --- /dev/null +++ b/tests/StatisticsControllerTest.php @@ -0,0 +1,15 @@ +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} From d6552f084eabcbd408707b38e54f77fd5ac84cb9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 19:10:31 +0200 Subject: [PATCH 117/221] tests --- src/Command/TleCalculate.php | 10 +++++ src/Entity/Tle.php | 2 +- src/Repository/TleRepository.php | 17 --------- src/Serializer/TleModelNormalizer.php | 2 +- tests/AssertionTrait.php | 22 +++++++++++ tests/TleControllerTest.php | 54 +++++++++++++++++++++++++++ 6 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 tests/AssertionTrait.php create mode 100644 tests/TleControllerTest.php diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index e33e90d..2c65cee 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -7,11 +7,13 @@ use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class TleCalculate extends Command { protected const BATCH_SIZE = 20; + protected const OPTION_TLE = 'tle'; protected static $defaultName = 'tle:calculate'; @@ -23,6 +25,7 @@ public function __construct(protected EntityManagerInterface $entityManager) protected function configure() { $this->setDescription('Calculate and persist data in TleInformation entity'); + $this->addOption(self::OPTION_TLE, 't', InputOption::VALUE_REQUIRED, 'Calculate only for specified record'); } protected function execute(InputInterface $input, OutputInterface $output): int @@ -32,6 +35,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int ->select('tle') ->from(Tle::class, 'tle'); + $tle = $input->getOption(self::OPTION_TLE); + + if ($tle !== null) { + $builder->andWhere('tle.id = :tle'); + $builder->setParameter('tle', $tle); + } + $repository = $this->entityManager->getRepository(TleInformation::class); /** @var Tle $tle */ diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 2fa9441..01ccef3 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -38,7 +38,7 @@ public function update(): void $this->updatedAt = DateTimeService::getCurrentUTC(); } - public function getInfo(): TleInformation { + public function getInfo(): ?TleInformation { return $this->info; } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index e6100cc..0cea49d 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -87,23 +87,6 @@ public function collection( return $collection; } - public function popular(\DateTime $newerThen, int $limit): array - { - $builder = $this->_em->createQueryBuilder(); - - $builder->select(['t.name', 't.id', 'COUNT(q.ip) as hits']) - ->from(Request::class, 'q') - ->distinct('t.id') - ->leftJoin('q.tle', 't') - ->groupBy('t.id') - ->where('q.createdAt > :newerThan') - ->setParameter('newerThan', $newerThen) - ->setMaxResults($limit) - ->orderBy('hits', 'DESC'); - - return $builder->getQuery()->getResult(); - } - private function getCount(QueryBuilder $builder): int { $builder = clone $builder; diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 45bcb8e..77a8a29 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -40,7 +40,7 @@ public function normalize($entity, ?string $format = null, array $context = []): 'line2' => $model->getLine2(), ]; - if ($isExtra) { + if ($isExtra && $entity->getInfo()) { $extra = [ 'extra' => [ TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php new file mode 100644 index 0000000..f318f59 --- /dev/null +++ b/tests/AssertionTrait.php @@ -0,0 +1,22 @@ +getLine1(), $tle->getLine2(), $tle->getName()); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); + self::assertEquals('TleModel', $response['@type']); + self::assertEquals($tle->getId(), $response['satelliteId']); + self::assertEquals($tle->getName(), $response['name']); + self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($tle->getLine1(), $response['line1']); + self::assertEquals($tle->getLine2(), $response['line2']); + } +} diff --git a/tests/TleControllerTest.php b/tests/TleControllerTest.php new file mode 100644 index 0000000..99736cb --- /dev/null +++ b/tests/TleControllerTest.php @@ -0,0 +1,54 @@ + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} From beff4376e04714c1b00968a010d2895ac8c886fe Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Apr 2021 09:18:18 +0200 Subject: [PATCH 118/221] tests --- config/custom/tle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 7022b48..445957b 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -327,7 +327,7 @@ }, "@id": { "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/44859/vector?date=2021-04-26T08:39:45+00:00" + "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" }, "@type": { "type": "string", From 51af694ece2d5f2fde2195a5ee28cf93901d7cc5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 27 May 2021 21:24:23 +0200 Subject: [PATCH 119/221] ground tracks --- src/Command/TleCalculate.php | 2 + src/Controller/FlyOverController.php | 130 ++++++++++++++++++ src/Controller/PropagateController.php | 61 -------- src/Entity/TleInformation.php | 10 ++ src/Migrations/Version20210524103622.php | 35 +++++ src/Serializer/SatellitePassNormalizer.php | 41 ++++-- src/Serializer/TleModelNormalizer.php | 2 + src/Service/FlyOverService.php | 53 +++++++ src/Service/Traits/TleHttpTrait.php | 12 ++ .../TleCollectionSortableFieldsEnum.php | 2 + 10 files changed, 276 insertions(+), 72 deletions(-) create mode 100644 src/Controller/FlyOverController.php create mode 100644 src/Migrations/Version20210524103622.php create mode 100644 src/Service/FlyOverService.php diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2c65cee..2850d50 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -61,6 +61,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); $tleInformation->geostationary = $tleModel->isGeostationary(); + $tleInformation->raan = $tleModel->raan(); + $tleInformation->semiMajorAxis = $tleModel->semiMajorAxis(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php new file mode 100644 index 0000000..6ba504c --- /dev/null +++ b/src/Controller/FlyOverController.php @@ -0,0 +1,130 @@ + "\d+"])] + public function flyover( + int $id, + Request $request + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $onlyVisible, + ]; + + $url = $this->router->generate( + 'tle_flyover', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + + foreach ($members as $index => &$member) { + $member = array_merge( + [ + '@id' => $this->generateUrl( + 'tle_flyover_details', + ['id' => $id, 'passId' => $index], + UrlGeneratorInterface::ABSOLUTE_URL + ), + ], + $member + ); + } + + return $this->response( + [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteFlyOverCollection', + 'observer' => $this->normalizer->normalize($observer), + 'member' => $members, + 'parameters' => $parameters, + ] + ); + } + + #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] + public function flyoverDetails( + int $id, + int $passId, + Request $request, + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $pass = $results[$passId] ?? null; + + if ($pass === null) { + throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + } + + $url = $this->router->generate( + 'tle_flyover_details', + array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + 'observer' => $this->normalizer->normalize($observer), + ]; + + return $this->response( + array_merge( + $data, + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + ) + ); + } + +} diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index d65e994..2edfb0f 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -5,11 +5,9 @@ use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; -use App\ViewModel\Observer; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -25,65 +23,6 @@ public function __construct(protected TleRepository $repository) { } - #[Route("/api/tle/{id}/pass", name: "tle_pass", requirements: ["id" => "\d+"])] - public function pass( - int $id, - Request $request, - NormalizerInterface $normalizer - ): JsonResponse { - try { - $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); - } catch (\InvalidArgumentException $exception) { - throw new BadRequestHttpException($exception->getMessage()); - } - - $predict = new \Predict(); - $qth = new \Predict_QTH(); - - $qth->lat = $observer->latitude; - $qth->lon = $observer->longitude; - $qth->alt = $observer->altitude; - - $tle = $this->getTle($id); - - $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); - $sat = new \Predict_Sat($tle); // Load up the satellite data - $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) - - $predict->minEle = 10; // Minimum elevation for a pass - $predict->timeRes = 10; // Pass details: time resolution in seconds - $predict->numEntries = 20; // Pass details: number of entries per pass - $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) - - // Get the passes and filter visible only, takes about 4 seconds for 10 days - $results = $predict->get_passes($sat, $qth, $now, 10); - $results = $predict->filterVisiblePasses($results); - - $parameters = [ - 'latitude' => $observer->latitude, - 'longitude' => $observer->longitude, - ]; - - $url = $this->router->generate( - 'tle_pass', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'VisibleSatellitePassCollection', - 'observer' => $normalizer->normalize($observer), - 'member' => $normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]), - 'parameters' => $parameters, - ]; - - return $this->response($data); - } - #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] public function propagate( int $id, diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index b2d3cad..e0e55d4 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -22,6 +22,16 @@ class TleInformation */ public ?float $inclination; + /** + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) + */ + public ?float $raan; + + /** + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) + */ + public ?float $semiMajorAxis; + /** * Period for complete orbit in seconds * diff --git a/src/Migrations/Version20210524103622.php b/src/Migrations/Version20210524103622.php new file mode 100644 index 0000000..7c8a16c --- /dev/null +++ b/src/Migrations/Version20210524103622.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD raan DOUBLE PRECISION DEFAULT NULL, ADD semi_major_axis DOUBLE PRECISION DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP raan, DROP semi_major_axis'); + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index d0ab383..c267f04 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -4,9 +4,14 @@ use App\Controller\AbstractApiController; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; class SatellitePassNormalizer implements NormalizerInterface { + public function __construct(protected ObjectNormalizer $normalizer) + { + } + /** * @param \Predict_Pass $object * @param string|null $format @@ -16,30 +21,44 @@ class SatellitePassNormalizer implements NormalizerInterface */ public function normalize($object, string $format = null, array $context = []): array { - return [ - '@type' => 'VisibleSatellitePass', + $timezone = $context['timezone'] ?? 'UTC'; + $details = $context['details'] ?? false; + + $result = [ + '@type' => $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_aos_az, 2), - 'elevation' => round($object->visible_aos_el, 2), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), ], 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_max_el_az, 2), - 'elevation' => round($object->visible_max_el, 2), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), ], 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_los_az, 2), - 'elevation' => round($object->visible_los_el, 2), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), ], ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; } public function supportsNormalization($data, string $format = null): bool diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 77a8a29..2357599 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -46,6 +46,8 @@ public function normalize($entity, ?string $format = null, array $context = []): TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $entity->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $entity->getInfo()->semiMajorAxis, ], ]; diff --git a/src/Service/FlyOverService.php b/src/Service/FlyOverService.php new file mode 100644 index 0000000..dd86ac1 --- /dev/null +++ b/src/Service/FlyOverService.php @@ -0,0 +1,53 @@ +predict = new \Predict(); + $this->qth = new \Predict_QTH(); + } + + public function setTle(Tle $tle): self + { + $this->sat = new \Predict_Sat( + new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) + ); + + return $this; + } + + public function setObserver(Observer $observer): self + { + $this->qth->lat = $observer->latitude; + $this->qth->lon = $observer->longitude; + $this->qth->alt = $observer->altitude; + + return $this; + } + + public function getVisiblePasses(float $time): array + { + return $this->predict->filterVisiblePasses($this->getPasses($time)); + } + + public function getPasses(float $time): array + { + $this->predict->minEle = 10; // Minimum elevation for a pass + $this->predict->timeRes = 10; // Pass details: time resolution in seconds + $this->predict->numEntries = 20; // Pass details: number of entries per pass + $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + return $this->predict->get_passes($this->sat, $this->qth, $time, 10); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index 4814033..64c92e0 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -3,6 +3,9 @@ namespace App\Service\Traits; use App\Entity\Tle; +use App\ViewModel\Observer; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; trait TleHttpTrait @@ -18,4 +21,13 @@ protected function getTle(int $id): Tle return $tle; } + + protected function getObserver(Request $request): Observer + { + try { + return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 7aa6989..ca3bc88 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -12,4 +12,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const INCLINATION = 'inclination'; public const ECCENTRICITY = 'eccentricity'; public const PERIOD = 'period'; + public const RAAN = 'raan'; + public const SEMI_MAJOR_AXIS = 'semi_major_axis'; } From 369db01f5a96613899c5574fa1610106f5ee9459 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 27 May 2021 21:26:17 +0200 Subject: [PATCH 120/221] update tle client --- composer.lock | 8 +- config/bootstrap.php | 98 ++++---- src/Controller/FlyOverController.php | 260 ++++++++++----------- src/Controller/PropagateController.php | 232 +++++++++--------- src/Serializer/ObserverNormalizer.php | 78 +++---- src/Serializer/SatellitePassNormalizer.php | 136 +++++------ src/Service/FlyOverService.php | 106 ++++----- src/Service/Traits/TleHttpTrait.php | 66 +++--- src/ViewModel/LatLng.php | 82 +++---- src/ViewModel/Observer.php | 30 +-- tests/AssertionTrait.php | 44 ++-- tests/PropagateControllerTest.php | 224 +++++++++--------- tests/StatisticsControllerTest.php | 30 +-- tests/TleControllerTest.php | 108 ++++----- 14 files changed, 751 insertions(+), 751 deletions(-) diff --git a/composer.lock b/composer.lock index 0802e91..cea44af 100644 --- a/composer.lock +++ b/composer.lock @@ -1851,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835" + "reference": "45255e18e2730938e8428f4f232d1943b9893991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/50ea45311c3bc50450a799d5cff56f3a904d5835", - "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/45255e18e2730938e8428f4f232d1943b9893991", + "reference": "45255e18e2730938e8428f4f232d1943b9893991", "shasum": "" }, "require": { @@ -1890,7 +1890,7 @@ "issues": "https://github.com/ivanstan/tle-php/issues", "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-04-20T16:57:25+00:00" + "time": "2021-05-27T19:24:24+00:00" }, { "name": "jean85/pretty-package-versions", diff --git a/config/bootstrap.php b/config/bootstrap.php index 452a4fb..9b1b3e9 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 6ba504c..7109001 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -1,130 +1,130 @@ - "\d+"])] - public function flyover( - int $id, - Request $request - ): JsonResponse { - $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); - - $this->service - ->setObserver($observer) - ->setTle($this->getTle($id)); - - if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); - } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); - } - - $parameters = [ - 'latitude' => $observer->latitude, - 'longitude' => $observer->longitude, - 'only_visible' => $onlyVisible, - ]; - - $url = $this->router->generate( - 'tle_flyover', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); - - foreach ($members as $index => &$member) { - $member = array_merge( - [ - '@id' => $this->generateUrl( - 'tle_flyover_details', - ['id' => $id, 'passId' => $index], - UrlGeneratorInterface::ABSOLUTE_URL - ), - ], - $member - ); - } - - return $this->response( - [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'SatelliteFlyOverCollection', - 'observer' => $this->normalizer->normalize($observer), - 'member' => $members, - 'parameters' => $parameters, - ] - ); - } - - #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] - public function flyoverDetails( - int $id, - int $passId, - Request $request, - ): JsonResponse { - $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); - - $this->service - ->setObserver($observer) - ->setTle($this->getTle($id)); - - if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); - } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); - } - - $pass = $results[$passId] ?? null; - - if ($pass === null) { - throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); - } - - $url = $this->router->generate( - 'tle_flyover_details', - array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - 'observer' => $this->normalizer->normalize($observer), - ]; - - return $this->response( - array_merge( - $data, - $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) - ) - ); - } - -} + "\d+"])] + public function flyover( + int $id, + Request $request + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $onlyVisible, + ]; + + $url = $this->router->generate( + 'tle_flyover', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + + foreach ($members as $index => &$member) { + $member = array_merge( + [ + '@id' => $this->generateUrl( + 'tle_flyover_details', + ['id' => $id, 'passId' => $index], + UrlGeneratorInterface::ABSOLUTE_URL + ), + ], + $member + ); + } + + return $this->response( + [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteFlyOverCollection', + 'observer' => $this->normalizer->normalize($observer), + 'member' => $members, + 'parameters' => $parameters, + ] + ); + } + + #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] + public function flyoverDetails( + int $id, + int $passId, + Request $request, + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $pass = $results[$passId] ?? null; + + if ($pass === null) { + throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + } + + $url = $this->router->generate( + 'tle_flyover_details', + array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + 'observer' => $this->normalizer->normalize($observer), + ]; + + return $this->response( + array_merge( + $data, + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + ) + ); + } + +} diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 2edfb0f..6a4fbfe 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -1,116 +1,116 @@ - "\d+"])] - public function propagate( - int $id, - Request $request, - NormalizerInterface $normalizer - ): JsonResponse { - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); - $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); - - $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); - $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); - - $dateTimeUTC = clone $datetime; - $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); - $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); - - $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes - - $propagator = new \Predict_SGPSDP(); - if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { - $propagator->SDP4($sat, $deltaT); - $algorithm = 'SDP4'; - } else { - $propagator->SGP4($sat, $deltaT); - $algorithm = 'SGP4'; - } - - $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); - - \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); - - $sat_geodetic = new \Predict_Geodetic(); - \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); - - $sat_geodetic->lat = rad2deg($sat_geodetic->lat); - $sat_geodetic->lon = rad2deg($sat_geodetic->lon); - - $parameters = [ - 'date' => $datetime->format(self::DATETIME_FORMAT), - ]; - - $url = $this->router->generate( - 'tle_propagate', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'SatellitePropagationResult', - 'tle' => $tle, - 'algorithm' => $algorithm, - 'vector' => [ - 'reference_frame' => 'ECI', - 'position' => [ - 'x' => $sat->pos->x, - 'y' => $sat->pos->y, - 'z' => $sat->pos->z, - 'r' => $sat->pos->w, - 'unit' => 'km', - ], - 'velocity' => [ - 'x' => $sat->vel->x, - 'y' => $sat->vel->y, - 'z' => $sat->vel->z, - 'r' => $sat->vel->w, - 'unit' => 'km/s', - ], - ], - 'geodetic' => [ - 'latitude' => $sat_geodetic->lat, - 'longitude' => $sat_geodetic->lon, - 'altitude' => $sat_geodetic->alt, - ], - 'parameters' => $parameters, - ]; - - return $this->response( - $normalizer->normalize($data) - ); - } -} + "\d+"])] + public function propagate( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); + $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); + + $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + + $dateTimeUTC = clone $datetime; + $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); + $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + + $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + + $propagator = new \Predict_SGPSDP(); + if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { + $propagator->SDP4($sat, $deltaT); + $algorithm = 'SDP4'; + } else { + $propagator->SGP4($sat, $deltaT); + $algorithm = 'SGP4'; + } + + $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); + + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $sat_geodetic = new \Predict_Geodetic(); + \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + + $sat_geodetic->lat = rad2deg($sat_geodetic->lat); + $sat_geodetic->lon = rad2deg($sat_geodetic->lon); + + $parameters = [ + 'date' => $datetime->format(self::DATETIME_FORMAT), + ]; + + $url = $this->router->generate( + 'tle_propagate', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatellitePropagationResult', + 'tle' => $tle, + 'algorithm' => $algorithm, + 'vector' => [ + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], + ], + 'geodetic' => [ + 'latitude' => $sat_geodetic->lat, + 'longitude' => $sat_geodetic->lon, + 'altitude' => $sat_geodetic->alt, + ], + 'parameters' => $parameters, + ]; + + return $this->response( + $normalizer->normalize($data) + ); + } +} diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php index 45bdc6c..e498d69 100644 --- a/src/Serializer/ObserverNormalizer.php +++ b/src/Serializer/ObserverNormalizer.php @@ -1,39 +1,39 @@ -normalizer->normalize($object); - - unset($result['timeZone']); - - $result['@type'] = 'Observer'; - $result['datetime'] = $object->datetime; - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Observer; - } -} +normalizer->normalize($object); + + unset($result['timeZone']); + + $result['@type'] = 'Observer'; + $result['datetime'] = $object->datetime; + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index c267f04..d1979e1 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -1,68 +1,68 @@ - $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', - 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_aos_az ?? null, 2), - 'elevation' => round($object->visible_aos_el ?? null, 2), - ], - 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_max_el_az ?? null, 2), - 'elevation' => round($object->visible_max_el ?? null, 2), - ], - 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), - 'elevation' => round($object->visible_los_el ?? null, 2), - ], - ]; - - if ($details) { - foreach ($object->details as $item) { - $result['details'][] = [ - 'azimuth' => $item->az, - 'elevation' => $item->el - ]; - } - } - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof \Predict_Pass; - } -} + $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), + ], + ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/Service/FlyOverService.php b/src/Service/FlyOverService.php index dd86ac1..b5e4ef6 100644 --- a/src/Service/FlyOverService.php +++ b/src/Service/FlyOverService.php @@ -1,53 +1,53 @@ -predict = new \Predict(); - $this->qth = new \Predict_QTH(); - } - - public function setTle(Tle $tle): self - { - $this->sat = new \Predict_Sat( - new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) - ); - - return $this; - } - - public function setObserver(Observer $observer): self - { - $this->qth->lat = $observer->latitude; - $this->qth->lon = $observer->longitude; - $this->qth->alt = $observer->altitude; - - return $this; - } - - public function getVisiblePasses(float $time): array - { - return $this->predict->filterVisiblePasses($this->getPasses($time)); - } - - public function getPasses(float $time): array - { - $this->predict->minEle = 10; // Minimum elevation for a pass - $this->predict->timeRes = 10; // Pass details: time resolution in seconds - $this->predict->numEntries = 20; // Pass details: number of entries per pass - $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) - - // Get the passes and filter visible only, takes about 4 seconds for 10 days - return $this->predict->get_passes($this->sat, $this->qth, $time, 10); - } -} +predict = new \Predict(); + $this->qth = new \Predict_QTH(); + } + + public function setTle(Tle $tle): self + { + $this->sat = new \Predict_Sat( + new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) + ); + + return $this; + } + + public function setObserver(Observer $observer): self + { + $this->qth->lat = $observer->latitude; + $this->qth->lon = $observer->longitude; + $this->qth->alt = $observer->altitude; + + return $this; + } + + public function getVisiblePasses(float $time): array + { + return $this->predict->filterVisiblePasses($this->getPasses($time)); + } + + public function getPasses(float $time): array + { + $this->predict->minEle = 10; // Minimum elevation for a pass + $this->predict->timeRes = 10; // Pass details: time resolution in seconds + $this->predict->numEntries = 20; // Pass details: number of entries per pass + $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + return $this->predict->get_passes($this->sat, $this->qth, $time, 10); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index 64c92e0..a87d0a5 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -1,33 +1,33 @@ -repository->findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $tle; - } - - protected function getObserver(Request $request): Observer - { - try { - return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); - } catch (\InvalidArgumentException $exception) { - throw new BadRequestHttpException($exception->getMessage()); - } - } -} +repository->findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $tle; + } + + protected function getObserver(Request $request): Observer + { + try { + return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + } +} diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php index 85742c9..64fa7d0 100644 --- a/src/ViewModel/LatLng.php +++ b/src/ViewModel/LatLng.php @@ -1,41 +1,41 @@ -latitude > 90 || $this->latitude < -90) { - throw new \InvalidArgumentException('Invalid latitude value'); - } - - if ($this->longitude > 180 || $this->longitude < -180) { - throw new \InvalidArgumentException('Invalid longitude value'); - } - } - - public function getTimeZone(): ?string - { - $diffs = []; - foreach (DateTimeZone::listIdentifiers() as $timezoneID) { - $timezone = new DateTimeZone($timezoneID); - $location = $timezone->getLocation(); - $tLat = $location['latitude']; - $tLng = $location['longitude']; - $diffLat = abs($this->latitude - $tLat); - $diffLng = abs($this->longitude - $tLng); - $diff = $diffLat + $diffLng; - $diffs[$timezoneID] = $diff; - } - - $timezone = array_keys($diffs, min($diffs)); - - return $timezone[0] ?? null; - } -} +latitude > 90 || $this->latitude < -90) { + throw new \InvalidArgumentException('Invalid latitude value'); + } + + if ($this->longitude > 180 || $this->longitude < -180) { + throw new \InvalidArgumentException('Invalid longitude value'); + } + } + + public function getTimeZone(): ?string + { + $diffs = []; + foreach (DateTimeZone::listIdentifiers() as $timezoneID) { + $timezone = new DateTimeZone($timezoneID); + $location = $timezone->getLocation(); + $tLat = $location['latitude']; + $tLng = $location['longitude']; + $diffLat = abs($this->latitude - $tLat); + $diffLng = abs($this->longitude - $tLng); + $diff = $diffLat + $diffLng; + $diffs[$timezoneID] = $diff; + } + + $timezone = array_keys($diffs, min($diffs)); + + return $timezone[0] ?? null; + } +} diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 749cdc9..93385a9 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -1,15 +1,15 @@ -datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); - } -} +datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + } +} diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index f318f59..bdb68f2 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -1,22 +1,22 @@ -getLine1(), $tle->getLine2(), $tle->getName()); - - self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); - self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); - self::assertEquals('TleModel', $response['@type']); - self::assertEquals($tle->getId(), $response['satelliteId']); - self::assertEquals($tle->getName(), $response['name']); - self::assertEquals($model->getDate(), $response['date']); - self::assertEquals($tle->getLine1(), $response['line1']); - self::assertEquals($tle->getLine2(), $response['line2']); - } -} +getLine1(), $tle->getLine2(), $tle->getName()); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); + self::assertEquals('TleModel', $response['@type']); + self::assertEquals($tle->getId(), $response['satelliteId']); + self::assertEquals($tle->getName(), $response['name']); + self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($tle->getLine1(), $response['line1']); + self::assertEquals($tle->getLine2(), $response['line2']); + } +} diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index cd302d4..ff3f655 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -1,112 +1,112 @@ -get('/api/tle/0/propagate'); - - self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); - } - - public function testPropagateSGP4(): void - { - $tle = TleFixtures::create(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SGP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); - - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } - - public function testPropagateSDP4(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SDP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); - - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } -} +get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + + public function testPropagateSGP4(): void + { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} diff --git a/tests/StatisticsControllerTest.php b/tests/StatisticsControllerTest.php index 9c748c3..a2e95ab 100644 --- a/tests/StatisticsControllerTest.php +++ b/tests/StatisticsControllerTest.php @@ -1,15 +1,15 @@ -get('/api/tle/hits'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - } -} +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} diff --git a/tests/TleControllerTest.php b/tests/TleControllerTest.php index 99736cb..082b8d7 100644 --- a/tests/TleControllerTest.php +++ b/tests/TleControllerTest.php @@ -1,54 +1,54 @@ - 'tle:calculate', - '--tle' => TleFixtures::createDeep()->getId(), - ] - ); - - $application = new Application(static::$kernel); - $application->setAutoExit(false); - $application->run($input, new BufferedOutput()); - } - - public function testTleExtraFieldsMissingData(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } - - public function testTleExtraFields(): void - { - $tle = TleFixtures::create(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } -} + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} From 63be8083cd87a9b6c2806a219c4c91b717a19b01 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 28 May 2021 21:47:46 +0200 Subject: [PATCH 121/221] ground tracks --- src/Controller/AbstractApiController.php | 12 ------------ src/Controller/PropagateController.php | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 5db1684..300c68c 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -9,7 +9,6 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Serializer\SerializerInterface; abstract class AbstractApiController extends AbstractController { @@ -36,19 +35,8 @@ abstract class AbstractApiController extends AbstractController protected const PAGE_SIZE = 50; protected const SEARCH_PARAM = 'search'; - protected SerializerInterface $serializer; protected RouterInterface $router; - /** - * @required - * - * @param SerializerInterface $serializer - */ - public function setSerializer(SerializerInterface $serializer): void - { - $this->serializer = $serializer; - } - /** * @required * diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 6a4fbfe..60af093 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -56,12 +56,10 @@ public function propagate( $algorithm = 'SGP4'; } - $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); - \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); $sat_geodetic = new \Predict_Geodetic(); - \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + \Predict_SGPObs::Calculate_LatLonAlt(\Predict_Time::unix2daynum($datetime->getTimestamp()), $sat->pos, $sat_geodetic); $sat_geodetic->lat = rad2deg($sat_geodetic->lat); $sat_geodetic->lon = rad2deg($sat_geodetic->lon); From 3e68d1d484cc63d0883c35a4a2ad6f80a3e8847a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 29 May 2021 21:31:32 +0200 Subject: [PATCH 122/221] add paypal button --- src/Repository/TleRepository.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 0cea49d..2885672 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -105,6 +105,8 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', TleCollectionSortableFieldsEnum::PERIOD => 'info.period', + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semi_major_axis', + TleCollectionSortableFieldsEnum::RAAN => 'info.raan', }; } } From d666b5a7e7abcafbe70126ceea343a203a5e0cad Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 29 May 2021 21:42:29 +0200 Subject: [PATCH 123/221] add paypal button --- deploy.php | 2 +- src/Repository/TleRepository.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy.php b/deploy.php index 154a0ff..4a8d877 100644 --- a/deploy.php +++ b/deploy.php @@ -56,10 +56,10 @@ 'deploy:shared', 'deploy:assets', 'deploy:vendors', + 'deploy:writable', 'deploy:cache:clear', 'deploy:cache:warmup', 'deploy:dump-env', - 'deploy:writable', 'database:migrate', 'deploy:symlink', 'deploy:unlock', diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 2885672..ce57f58 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -105,7 +105,7 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', TleCollectionSortableFieldsEnum::PERIOD => 'info.period', - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semi_major_axis', + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semiMajorAxis', TleCollectionSortableFieldsEnum::RAAN => 'info.raan', }; } From 04e5e533afaa73c33c5e97bec434692c4db6907b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:25:41 +0200 Subject: [PATCH 124/221] add paypal button --- src/Event/StatisticSubscriber.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index df566cc..61d80b1 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -4,7 +4,6 @@ use App\Entity\Request; use App\Entity\Tle; -use App\Repository\StatisticRepository; use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -13,9 +12,10 @@ class StatisticSubscriber implements EventSubscriberInterface { protected const TLE_ROUTES = [ + 'tle_record', 'tle_propagate', - 'tle_pass', - 'tle_record' + 'tle_flyover', + 'tle_flyover_details' ]; public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) From 6df0088626e2e5dde4b41d3870d4711dfcb71bf6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:40:32 +0200 Subject: [PATCH 125/221] upgrade symfony 5.3 --- composer.json | 22 +- composer.lock | 1362 +++++++++++++++++------------ src/Controller/DocsController.php | 13 +- symfony.lock | 9 + tests/ErrorPageTest.php | 4 +- 5 files changed, 840 insertions(+), 570 deletions(-) diff --git a/composer.json b/composer.json index 73ca5b5..f585d22 100644 --- a/composer.json +++ b/composer.json @@ -14,23 +14,23 @@ "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.2.*", - "symfony/browser-kit": "5.2.*", - "symfony/console": "5.2.*", - "symfony/css-selector": "5.2.*", - "symfony/dotenv": "5.2.*", + "symfony/asset": "5.3.*", + "symfony/browser-kit": "5.3.*", + "symfony/console": "5.3.*", + "symfony/css-selector": "5.3.*", + "symfony/dotenv": "5.3.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.2.*", + "symfony/framework-bundle": "5.3.*", "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", - "symfony/property-access": "5.2.*", - "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*" + "symfony/property-access": "5.3.*", + "symfony/serializer": "5.3.*", + "symfony/yaml": "5.3.*" }, "require-dev": { "roave/security-advisories": "dev-latest", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.2" + "symfony/phpunit-bridge": "^5.3" }, "config": { "preferred-install": { @@ -101,7 +101,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.2.*" + "require": "5.3.*" } } } diff --git a/composer.lock b/composer.lock index cea44af..d38071b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0a7e43912dee92d8247bdf135fc82f38", + "content-hash": "b41d3e11936a61ff068ced78f87c22a1", "packages": [ { "name": "beberlei/doctrineextensions", @@ -131,16 +131,16 @@ }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", + "version": "1.11.99.2", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c", + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c", "shasum": "" }, "require": { @@ -184,7 +184,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2" }, "funding": [ { @@ -200,32 +200,34 @@ "type": "tidelift" } ], - "time": "2020-11-11T10:22:58+00:00" + "time": "2021-05-24T07:46:03+00:00" }, { "name": "doctrine/annotations", - "version": "1.12.1", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", "autoload": { @@ -268,46 +270,45 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.12.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.1" }, - "time": "2021-02-21T21:00:45+00:00" + "time": "2021-05-16T18:07:53+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.11.3", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/3bb5588cec00a0268829cc4a518490df6741af9d", + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -354,7 +355,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.11.3" }, "funding": [ { @@ -370,7 +371,7 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-05-25T09:01:55+00:00" }, { "name": "doctrine/collections", @@ -443,16 +444,16 @@ }, { "name": "doctrine/common", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3" + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2afde5a9844126bc311cd5f548b5475e75f800d3", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3", + "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", "shasum": "" }, "require": { @@ -465,7 +466,8 @@ "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" }, "type": "library", "autoload": { @@ -512,7 +514,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.1" + "source": "https://github.com/doctrine/common/tree/3.1.2" }, "funding": [ { @@ -528,36 +530,37 @@ "type": "tidelift" } ], - "time": "2021-01-20T19:58:05+00:00" + "time": "2021-02-10T20:18:51+00:00" }, { "name": "doctrine/dbal", - "version": "2.12.1", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c800380457948e65bbd30ba92cc17cda108bf8c9", + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9", "shasum": "" }, "require": { "doctrine/cache": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.3 || ^8" + "php": "^7.1 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.12.40", - "phpunit/phpunit": "^9.4", - "psalm/plugin-phpunit": "^0.10.0", + "doctrine/coding-standard": "8.2.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", + "squizlabs/php_codesniffer": "3.6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.17.2" + "vimeo/psalm": "4.6.4" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -566,11 +569,6 @@ "bin/doctrine-dbal" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" @@ -623,7 +621,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.12.1" + "source": "https://github.com/doctrine/dbal/tree/2.13.1" }, "funding": [ { @@ -639,63 +637,108 @@ "type": "tidelift" } ], - "time": "2020-11-14T20:26:58+00:00" + "time": "2021-04-17T17:30:19+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.3.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "8b922578bdee2243a26202b13df795e170efaef8" + "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/8b922578bdee2243a26202b13df795e170efaef8", - "reference": "8b922578bdee2243a26202b13df795e170efaef8", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/7f472cc85eba050a83fcf38cece87b868877d7e2", + "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2", "shasum": "" }, "require": { + "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^2.9.0|^3.0", "doctrine/persistence": "^1.3.3|^2.0", "doctrine/sql-formatter": "^1.0.1", "php": "^7.1 || ^8.0", - "symfony/cache": "^4.3.3|^5.0", - "symfony/config": "^4.3.3|^5.0", - "symfony/console": "^3.4.30|^4.3.3|^5.0", - "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", - "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/cache": "^4.3.3|^5.0|^6.0", + "symfony/config": "^4.4.3|^5.0|^6.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/dependency-injection": "^4.3.3|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", "symfony/service-contracts": "^1.1.1|^2.0" }, "conflict": { - "doctrine/orm": "<2.6", + "doctrine/orm": "<2.9", "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^8.0", - "doctrine/orm": "^2.6", + "doctrine/coding-standard": "^9.0", + "doctrine/orm": "^2.9", "friendsofphp/proxy-manager-lts": "^1.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", - "symfony/phpunit-bridge": "^4.2", - "symfony/property-info": "^4.3.3|^5.0", - "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", - "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", - "symfony/validator": "^3.4.30|^4.3.3|^5.0", - "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", - "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12|^3.0" + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.3.0", + "symfony/phpunit-bridge": "^5.2|^6.0", + "symfony/property-info": "^4.3.3|^5.0|^6.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0|^6.0", + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", "symfony/web-profiler-bundle": "To use the data collector." }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\DoctrineBundle\\": "" @@ -733,7 +776,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.1" }, "funding": [ { @@ -749,7 +792,7 @@ "type": "tidelift" } ], - "time": "2021-03-16T16:24:04+00:00" + "time": "2021-06-01T18:38:32+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1277,53 +1320,53 @@ }, { "name": "doctrine/orm", - "version": "2.8.2", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c" + "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/ebae57eb9637acd8252b398df3121b120688ed5c", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c", + "url": "https://api.github.com/repos/doctrine/orm/zipball/75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", + "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.11.1", - "doctrine/cache": "^1.9.1", + "doctrine/annotations": "^1.13", + "doctrine/cache": "^1.11.3|^2.0.3", "doctrine/collections": "^1.5", "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.10.0", + "doctrine/dbal": "^2.13.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.1", "doctrine/inflector": "^1.4|^2.0", "doctrine/instantiator": "^1.3", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^2.0", + "doctrine/persistence": "^2.2", "ext-pdo": "*", - "php": "^7.2|^8.0", - "symfony/console": "^3.0|^4.0|^5.0" + "php": "^7.1|^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^3.0|^4.0|^5.0|^6.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", - "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^8.5|^9.4", - "symfony/yaml": "^3.4|^4.0|^5.0", - "vimeo/psalm": "4.1.1" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12.83", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "squizlabs/php_codesniffer": "3.6.0", + "symfony/cache": "^4.4|^5.2", + "symfony/yaml": "^3.4|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.7.0" }, "suggest": { + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, "bin": [ "bin/doctrine" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\ORM\\": "lib/Doctrine/ORM" @@ -1363,41 +1406,44 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.8.2" + "source": "https://github.com/doctrine/orm/tree/2.9.2" }, - "time": "2021-02-16T22:10:18+00:00" + "time": "2021-05-31T09:53:14+00:00" }, { "name": "doctrine/persistence", - "version": "2.1.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" + "reference": "d138f3ab5f761055cab1054070377cfd3222e368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/d138f3ab5f761055cab1054070377cfd3222e368", + "reference": "d138f3ab5f761055cab1054070377cfd3222e368", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/collections": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1.0|^2.0|^3.0" }, "conflict": { "doctrine/common": "<2.10@dev" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/coding-standard": "^6.0 || ^9.0", "doctrine/common": "^3.0", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "0.12.84", "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", - "vimeo/psalm": "^3.11" + "symfony/cache": "^4.4|^5.0", + "vimeo/psalm": "4.7.0" }, "type": "library", "autoload": { @@ -1447,9 +1493,9 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.1.0" + "source": "https://github.com/doctrine/persistence/tree/2.2.1" }, - "time": "2020-10-24T22:13:54+00:00" + "time": "2021-05-19T07:07:01+00:00" }, { "name": "doctrine/sql-formatter", @@ -1510,22 +1556,22 @@ }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.3", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", - "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/006aa5d32f887a4db4353b13b5b5095613e0611f", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f", "shasum": "" }, "require": { "laminas/laminas-code": "~3.4.1|^4.0", "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0" + "symfony/filesystem": "^4.4.17|^5.0|^6.0" }, "conflict": { "laminas/laminas-stdlib": "<3.2.1", @@ -1536,7 +1582,7 @@ }, "require-dev": { "ext-phar": "*", - "symfony/phpunit-bridge": "^5.2" + "symfony/phpunit-bridge": "^5.2|^6.0" }, "type": "library", "extra": { @@ -1576,7 +1622,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.5" }, "funding": [ { @@ -1588,7 +1634,7 @@ "type": "tidelift" } ], - "time": "2021-01-14T21:52:44+00:00" + "time": "2021-05-22T16:11:15+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1718,16 +1764,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -1787,9 +1833,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.1" + "source": "https://github.com/guzzle/psr7/tree/1.8.2" }, - "time": "2021-03-21T16:25:00+00:00" + "time": "2021-04-26T09:17:50+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -1894,16 +1940,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + "reference": "694492c653c518456af2805f04eec445b997ed1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/694492c653c518456af2805f04eec445b997ed1f", + "reference": "694492c653c518456af2805f04eec445b997ed1f", "shasum": "" }, "require": { @@ -1947,22 +1993,22 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.4" }, - "time": "2021-02-22T10:52:38+00:00" + "time": "2021-05-26T08:46:42+00:00" }, { "name": "laminas/laminas-code", - "version": "4.0.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a" + "reference": "1beb4447f9efd26041eba7eff50614e798c353fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/28a6d70ea8b8bca687d7163300e611ae33baf82a", - "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1beb4447f9efd26041eba7eff50614e798c353fd", + "reference": "1beb4447f9efd26041eba7eff50614e798c353fd", "shasum": "" }, "require": { @@ -2020,7 +2066,7 @@ "type": "community_bridge" } ], - "time": "2020-12-30T16:16:14+00:00" + "time": "2021-05-12T12:41:03+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -2383,16 +2429,16 @@ }, { "name": "php-http/discovery", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" + "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", + "url": "https://api.github.com/repos/php-http/discovery/zipball/778f722e29250c1fac0bbdef2c122fa5d038c9eb", + "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb", "shasum": "" }, "require": { @@ -2409,8 +2455,7 @@ "puli/composer-plugin": "1.0.0-beta10" }, "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", - "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" }, "type": "library", "extra": { @@ -2446,9 +2491,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.13.0" + "source": "https://github.com/php-http/discovery/tree/1.14.0" }, - "time": "2020-11-27T14:49:42+00:00" + "time": "2021-06-01T14:30:21+00:00" }, { "name": "php-http/httplug", @@ -2514,16 +2559,16 @@ }, { "name": "php-http/message", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" + "reference": "887734d9c515ad9a564f6581a682fff87a6253cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", + "url": "https://api.github.com/repos/php-http/message/zipball/887734d9c515ad9a564f6581a682fff87a6253cc", + "reference": "887734d9c515ad9a564f6581a682fff87a6253cc", "shasum": "" }, "require": { @@ -2582,9 +2627,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.11.0" + "source": "https://github.com/php-http/message/tree/1.11.1" }, - "time": "2021-02-01T08:54:58+00:00" + "time": "2021-05-24T18:11:08+00:00" }, { "name": "php-http/message-factory", @@ -2699,20 +2744,20 @@ }, { "name": "psr/cache", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -2732,7 +2777,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -2742,9 +2787,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/2.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:23:37+00:00" }, { "name": "psr/container", @@ -3006,16 +3051,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -3039,7 +3084,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -3050,9 +3095,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -3156,16 +3201,16 @@ }, { "name": "sentry/sentry", - "version": "3.2.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "899b0de58c1e01feb54829b3094af74252aff385" + "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", - "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/3bb122f9fc2bc43a4646e37db79eaf115b35b047", + "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047", "shasum": "" }, "require": { @@ -3210,7 +3255,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "3.3.x-dev" } }, "autoload": { @@ -3244,7 +3289,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + "source": "https://github.com/getsentry/sentry-php/tree/3.3.0" }, "funding": [ { @@ -3256,20 +3301,20 @@ "type": "custom" } ], - "time": "2021-03-03T11:54:34+00:00" + "time": "2021-05-25T18:32:24+00:00" }, { "name": "sentry/sentry-symfony", - "version": "4.0.3", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + "reference": "d0b85df21f65499db87341648541a526a1f7960d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/d0b85df21f65499db87341648541a526a1f7960d", + "reference": "d0b85df21f65499db87341648541a526a1f7960d", "shasum": "" }, "require": { @@ -3277,16 +3322,20 @@ "php": "^7.2||^8.0", "php-http/discovery": "^1.11", "sentry/sdk": "^3.1", - "symfony/config": "^3.4.43||^4.4.11||^5.0.11", - "symfony/console": "^3.4.43||^4.4.11||^5.0.11", - "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", - "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", - "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", - "symfony/psr-http-message-bridge": "^2.0", - "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + "symfony/cache-contracts": "^2.4", + "symfony/config": "^3.4.44||^4.4.20||^5.0.11", + "symfony/console": "^3.4.44||^4.4.20||^5.0.11", + "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11", + "symfony/event-dispatcher": "^3.4.44||^4.4.20||^5.0.11", + "symfony/http-kernel": "^3.4.44||^4.4.20||^5.0.11", + "symfony/polyfill-php80": "^1.22", + "symfony/psr-http-message-bridge": "^1.2||^2.0", + "symfony/security-core": "^3.4.44||^4.4.20||^5.0.11" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "doctrine/dbal": "^2.10||^3.0", + "doctrine/doctrine-bundle": "^1.12||^2.0", + "friendsofphp/php-cs-fixer": "^2.18", "jangregor/phpstan-prophecy": "^0.8", "monolog/monolog": "^1.3||^2.0", "phpspec/prophecy": "!=1.11.0", @@ -3295,17 +3344,22 @@ "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^8.5||^9.0", - "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", - "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", - "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/browser-kit": "^3.4.44||^4.4.20||^5.0.11", + "symfony/cache": "^3.4.44||^4.4.20||^5.0.11", + "symfony/dom-crawler": "^3.4.44||^4.4.20||^5.0.11", + "symfony/framework-bundle": "^3.4.44||^4.4.20||^5.0.11", + "symfony/messenger": "^4.4.20||^5.0.11", "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "symfony/polyfill-php80": "^1.22", - "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "symfony/phpunit-bridge": "^5.2.6", + "symfony/twig-bundle": "^3.4.44||^4.4.20||^5.0.11", + "symfony/yaml": "^3.4.44||^4.4.20||^5.0.11", "vimeo/psalm": "^4.3" }, "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + "doctrine/doctrine-bundle": "Allow distributed tracing of database queries using Sentry.", + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler.", + "symfony/cache": "Allow distributed tracing of cache pools using Sentry.", + "symfony/twig-bundle": "Allow distributed tracing of Twig template rendering using Sentry." }, "type": "symfony-bundle", "extra": { @@ -3348,7 +3402,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + "source": "https://github.com/getsentry/sentry-symfony/tree/4.1.3" }, "funding": [ { @@ -3360,7 +3414,7 @@ "type": "custom" } ], - "time": "2021-03-03T16:05:24+00:00" + "time": "2021-05-31T07:54:49+00:00" }, { "name": "symfony/apache-pack", @@ -3390,24 +3444,28 @@ }, { "name": "symfony/asset", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828" + "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/54a42aa50f9359d1184bf7e954521b45ca3d5828", - "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828", + "url": "https://api.github.com/repos/symfony/asset/zipball/4c8d354b8931788f2b07953cfe6846e5cda27637", + "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "symfony/http-foundation": "<5.3" }, "require-dev": { "symfony/http-client": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/http-kernel": "^4.4|^5.0" }, "suggest": { @@ -3439,7 +3497,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.2.4" + "source": "https://github.com/symfony/asset/tree/v5.3.0" }, "funding": [ { @@ -3455,20 +3513,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93" + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3ca3a57ce9860318b20a924fec5daf5c6db44d93", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/379984e25eee9811b0a25a2105e1a2b3b8d9b734", + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734", "shasum": "" }, "require": { @@ -3510,7 +3568,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.2.4" + "source": "https://github.com/symfony/browser-kit/tree/v5.3.0" }, "funding": [ { @@ -3526,20 +3584,20 @@ "type": "tidelift" } ], - "time": "2021-02-22T06:48:33+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/cache", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d" + "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", - "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", + "url": "https://api.github.com/repos/symfony/cache/zipball/44fd0f97d1fb198d344f22379dfc56af2221e608", + "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608", "shasum": "" }, "require": { @@ -3547,6 +3605,7 @@ "psr/cache": "^1.0|^2.0", "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" @@ -3564,7 +3623,7 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", + "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.10|^3.0", "predis/predis": "^1.1", "psr/simple-cache": "^1.0", @@ -3605,7 +3664,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.4" + "source": "https://github.com/symfony/cache/tree/v5.3.0" }, "funding": [ { @@ -3621,25 +3680,25 @@ "type": "tidelift" } ], - "time": "2021-02-25T23:54:56+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/cache": "^1.0" + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -3647,7 +3706,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3684,7 +3743,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" }, "funding": [ { @@ -3700,20 +3759,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/config", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263" + "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/212d54675bf203ff8aef7d8cee8eecfb72f4a263", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263", + "url": "https://api.github.com/repos/symfony/config/zipball/9f4a448c2d7fd2c90882dfff930b627ddbe16810", + "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810", "shasum": "" }, "require": { @@ -3721,7 +3780,8 @@ "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php81": "^1.22" }, "conflict": { "symfony/finder": "<4.4" @@ -3762,7 +3822,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.4" + "source": "https://github.com/symfony/config/tree/v5.3.0" }, "funding": [ { @@ -3778,24 +3838,25 @@ "type": "tidelift" } ], - "time": "2021-02-23T23:58:19+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/console", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79" + "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/938ebbadae1b0a9c9d1ec313f87f9708609f1b79", - "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79", + "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", + "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", @@ -3859,7 +3920,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.5" + "source": "https://github.com/symfony/console/tree/v5.3.0" }, "funding": [ { @@ -3875,20 +3936,20 @@ "type": "tidelift" } ], - "time": "2021-03-06T13:42:15+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", "shasum": "" }, "require": { @@ -3924,7 +3985,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.2.4" + "source": "https://github.com/symfony/css-selector/tree/v5.3.0" }, "funding": [ { @@ -3940,31 +4001,32 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:40:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970" + "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be0c7926f5729b15e4e79fd2bf917cac584b1970", - "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/94d973cb742d8c5c5dcf9534220e6b73b09af1d4", + "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0", + "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.1", + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -3974,7 +4036,7 @@ "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^5.1", + "symfony/config": "^5.3", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -4011,7 +4073,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.5" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.0" }, "funding": [ { @@ -4027,20 +4089,20 @@ "type": "tidelift" } ], - "time": "2021-03-05T20:13:41+00:00" + "time": "2021-05-26T17:57:12+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -4049,7 +4111,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4078,7 +4140,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -4094,20 +4156,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.5", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8" + "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", - "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/29516dcc8165bc7e2339182a9360ea7d3471fb03", + "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03", "shasum": "" }, "require": { @@ -4129,13 +4191,12 @@ "symfony/messenger": "<4.4", "symfony/property-info": "<5", "symfony/security-bundle": "<5", - "symfony/security-core": "<5", + "symfony/security-core": "<5.3", "symfony/validator": "<5.2" }, "require-dev": { "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.10|^3.0", @@ -4151,7 +4212,7 @@ "symfony/property-access": "^4.4|^5.0", "symfony/property-info": "^5.0", "symfony/proxy-manager-bridge": "^4.4|^5.0", - "symfony/security-core": "^5.0", + "symfony/security-core": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/uid": "^5.1", @@ -4192,7 +4253,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.1" }, "funding": [ { @@ -4208,24 +4269,25 @@ "type": "tidelift" } ], - "time": "2021-03-06T13:35:24+00:00" + "time": "2021-06-01T15:43:02+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "400e265163f65aceee7e904ef532e15228de674b" + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/400e265163f65aceee7e904ef532e15228de674b", - "reference": "400e265163f65aceee7e904ef532e15228de674b", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/55fff62b19f413f897a752488ade1bc9c8a19cdd", + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15" @@ -4266,7 +4328,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.2.4" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.0" }, "funding": [ { @@ -4282,20 +4344,20 @@ "type": "tidelift" } ], - "time": "2021-02-15T18:55:04+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/dotenv", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b" + "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/783f12027c6b40ab0e93d6136d9f642d1d67cd6b", - "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac423fcc9548709077f90aca26c733cdb7e6e5c", + "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c", "shasum": "" }, "require": { @@ -4336,7 +4398,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.2.4" + "source": "https://github.com/symfony/dotenv/tree/v5.3.0" }, "funding": [ { @@ -4352,20 +4414,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { "name": "symfony/error-handler", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0" + "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/b547d3babcab5c31e01de59ee33e9d9c1421d7d0", - "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0e6768b8c0dcef26df087df2bbbaa143867a59b2", + "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2", "shasum": "" }, "require": { @@ -4405,7 +4467,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.4" + "source": "https://github.com/symfony/error-handler/tree/v5.3.0" }, "funding": [ { @@ -4421,20 +4483,20 @@ "type": "tidelift" } ], - "time": "2021-02-11T08:21:20+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d08d6ec121a425897951900ab692b612a61d6240" + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d08d6ec121a425897951900ab692b612a61d6240", - "reference": "d08d6ec121a425897951900ab692b612a61d6240", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", "shasum": "" }, "require": { @@ -4490,7 +4552,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" }, "funding": [ { @@ -4506,20 +4568,20 @@ "type": "tidelift" } ], - "time": "2021-02-18T17:12:37+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { @@ -4532,7 +4594,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4569,7 +4631,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" }, "funding": [ { @@ -4585,20 +4647,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/filesystem", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108" + "reference": "348116319d7fb7d1faa781d26a48922428013eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/710d364200997a5afde34d9fe57bd52f3cc1e108", - "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2", + "reference": "348116319d7fb7d1faa781d26a48922428013eb2", "shasum": "" }, "require": { @@ -4631,7 +4693,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.4" + "source": "https://github.com/symfony/filesystem/tree/v5.3.0" }, "funding": [ { @@ -4647,20 +4709,20 @@ "type": "tidelift" } ], - "time": "2021-02-12T10:38:38+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/finder", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0d639a0943822626290d169965804f79400e6a04" + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", - "reference": "0d639a0943822626290d169965804f79400e6a04", + "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", "shasum": "" }, "require": { @@ -4692,7 +4754,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.4" + "source": "https://github.com/symfony/finder/tree/v5.3.0" }, "funding": [ { @@ -4708,20 +4770,20 @@ "type": "tidelift" } ], - "time": "2021-02-15T18:55:04+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { "name": "symfony/flex", - "version": "v1.12.2", + "version": "v1.13.3", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9" + "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/e472606b4b3173564f0edbca8f5d32b52fc4f2c9", - "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9", + "url": "https://api.github.com/repos/symfony/flex/zipball/2597d0dda8042c43eed44a9cd07236b897e427d7", + "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7", "shasum": "" }, "require": { @@ -4738,7 +4800,7 @@ "type": "composer-plugin", "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -4760,7 +4822,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.12.2" + "source": "https://github.com/symfony/flex/tree/v1.13.3" }, "funding": [ { @@ -4776,45 +4838,45 @@ "type": "tidelift" } ], - "time": "2021-02-16T14:05:05+00:00" + "time": "2021-05-19T07:19:15+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f" + "reference": "99196372c703b8cc97ee61d63d98acbf9896d425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4dae531503072a57cf26f7f4beb4c3ef8a061f8f", - "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/99196372c703b8cc97ee61d63d98acbf9896d425", + "reference": "99196372c703b8cc97ee61d63d98acbf9896d425", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=7.2.5", "symfony/cache": "^5.2", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.2", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4.1|^5.0.1", "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^5.2.1", - "symfony/http-kernel": "^5.2.1", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15", - "symfony/routing": "^5.2" + "symfony/routing": "^5.3" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.1", + "symfony/asset": "<5.3", "symfony/browser-kit": "<4.4", "symfony/console": "<5.2.5", "symfony/dom-crawler": "<4.4", @@ -4825,11 +4887,13 @@ "symfony/mailer": "<5.2", "symfony/messenger": "<4.4", "symfony/mime": "<4.4", - "symfony/property-access": "<5.2", + "symfony/property-access": "<5.3", "symfony/property-info": "<4.4", + "symfony/security-core": "<5.3", + "symfony/security-csrf": "<5.3", "symfony/serializer": "<5.2", "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.0", + "symfony/translation": "<5.3", "symfony/twig-bridge": "<4.4", "symfony/twig-bundle": "<4.4", "symfony/validator": "<5.2", @@ -4838,39 +4902,71 @@ }, "require-dev": { "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", + "doctrine/cache": "^1.0|^2.0", "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.1", + "symfony/allmysms-notifier": "^5.3", + "symfony/asset": "^5.3", "symfony/browser-kit": "^4.4|^5.0", + "symfony/clickatell-notifier": "^5.3", "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", + "symfony/discord-notifier": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/dotenv": "^5.1", + "symfony/esendex-notifier": "^5.3", "symfony/expression-language": "^4.4|^5.0", + "symfony/fake-chat-notifier": "^5.3", + "symfony/fake-sms-notifier": "^5.3", + "symfony/firebase-notifier": "^5.3", "symfony/form": "^5.2", + "symfony/free-mobile-notifier": "^5.3", + "symfony/gatewayapi-notifier": "^5.3", + "symfony/gitter-notifier": "^5.3", + "symfony/google-chat-notifier": "^5.3", "symfony/http-client": "^4.4|^5.0", + "symfony/infobip-notifier": "^5.3", + "symfony/iqsms-notifier": "^5.3", + "symfony/light-sms-notifier": "^5.3", + "symfony/linked-in-notifier": "^5.3", "symfony/lock": "^4.4|^5.0", "symfony/mailer": "^5.2", + "symfony/mattermost-notifier": "^5.3", + "symfony/message-bird-notifier": "^5.3", "symfony/messenger": "^5.2", + "symfony/microsoft-teams-notifier": "^5.3", "symfony/mime": "^4.4|^5.0", + "symfony/mobyt-notifier": "^5.3", + "symfony/nexmo-notifier": "^5.3", + "symfony/notifier": "^5.3", + "symfony/octopush-notifier": "^5.3", + "symfony/ovh-cloud-notifier": "^5.3", + "symfony/phpunit-bridge": "^5.3", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", - "symfony/security-bundle": "^5.1", - "symfony/security-core": "^4.4|^5.2", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", + "symfony/rate-limiter": "^5.2", + "symfony/rocket-chat-notifier": "^5.3", + "symfony/security-bundle": "^5.3", + "symfony/sendinblue-notifier": "^5.3", "symfony/serializer": "^5.2", + "symfony/sinch-notifier": "^5.3", + "symfony/slack-notifier": "^5.3", + "symfony/sms-biuras-notifier": "^5.3", + "symfony/smsapi-notifier": "^5.3", + "symfony/spot-hit-notifier": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/string": "^5.0", - "symfony/translation": "^5.0", + "symfony/telegram-notifier": "^5.3", + "symfony/translation": "^5.3", "symfony/twig-bundle": "^4.4|^5.0", + "symfony/twilio-notifier": "^5.3", "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", + "symfony/zulip-notifier": "^5.3", "twig/twig": "^2.10|^3.0" }, "suggest": { @@ -4909,7 +5005,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v5.3.0" }, "funding": [ { @@ -4925,26 +5021,27 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-05-31T10:12:54+00:00" }, { "name": "symfony/http-client", - "version": "v5.2.6", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8" + "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3c3075467da15bc2edf38d2ac20d34719e794bd8", - "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8", + "url": "https://api.github.com/repos/symfony/http-client/zipball/ef85ca5fa7a4f9c57592fab49faeccdf22b13136", + "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "^1.0", - "symfony/http-client-contracts": "^2.2", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-client-contracts": "^2.4", "symfony/polyfill-php73": "^1.11", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.0|^2" @@ -4953,7 +5050,7 @@ "php-http/async-client-implementation": "*", "php-http/client-implementation": "*", "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.2" + "symfony/http-client-implementation": "2.4" }, "require-dev": { "amphp/amp": "^2.5", @@ -4995,7 +5092,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.2.6" + "source": "https://github.com/symfony/http-client/tree/v5.3.0" }, "funding": [ { @@ -5011,20 +5108,20 @@ "type": "tidelift" } ], - "time": "2021-03-28T09:42:18+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { @@ -5035,9 +5132,8 @@ }, "type": "library", "extra": { - "branch-version": "2.3", "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5074,7 +5170,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" }, "funding": [ { @@ -5090,20 +5186,20 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2021-04-11T23:07:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf" + "reference": "8827b90cf8806e467124ad476acd15216c2fceb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf", - "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8827b90cf8806e467124ad476acd15216c2fceb6", + "reference": "8827b90cf8806e467124ad476acd15216c2fceb6", "shasum": "" }, "require": { @@ -5147,7 +5243,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.4" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.1" }, "funding": [ { @@ -5163,20 +5259,20 @@ "type": "tidelift" } ], - "time": "2021-02-25T17:16:57+00:00" + "time": "2021-06-02T09:32:00+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.5", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73" + "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", - "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/74eb022e3bac36b3d3a897951a98759f2b32b864", + "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864", "shasum": "" }, "require": { @@ -5186,7 +5282,7 @@ "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.15" @@ -5196,7 +5292,7 @@ "symfony/cache": "<5.0", "symfony/config": "<5.0", "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.1.8", + "symfony/dependency-injection": "<5.3", "symfony/doctrine-bridge": "<5.0", "symfony/form": "<5.0", "symfony/http-client": "<5.0", @@ -5216,7 +5312,7 @@ "symfony/config": "^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^5.1.8", + "symfony/dependency-injection": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", @@ -5259,7 +5355,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.1" }, "funding": [ { @@ -5275,37 +5371,38 @@ "type": "tidelift" } ], - "time": "2021-03-10T17:07:35+00:00" + "time": "2021-06-02T10:07:12+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52" + "reference": "84841557874df015ef2843aa16ac63d09f97c7b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8a330ab86c4bdf3983b26abf64bf85574edf0d52", - "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/84841557874df015ef2843aa16ac63d09f97c7b9", + "reference": "84841557874df015ef2843aa16ac63d09f97c7b9", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2", "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", + "symfony/http-kernel": "^5.3", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "symfony/console": "<4.4", - "symfony/http-foundation": "<4.4" + "symfony/http-foundation": "<5.3" }, "require-dev": { "symfony/console": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", "symfony/security-core": "^4.4|^5.0", "symfony/var-dumper": "^4.4|^5.0" @@ -5341,7 +5438,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.5" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.0" }, "funding": [ { @@ -5357,7 +5454,7 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/monolog-bundle", @@ -5442,16 +5539,16 @@ }, { "name": "symfony/options-resolver", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", "shasum": "" }, "require": { @@ -5491,7 +5588,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" }, "funding": [ { @@ -5507,7 +5604,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/orm-pack", @@ -5555,18 +5652,91 @@ ], "time": "2020-07-08T14:31:54+00:00" }, + { + "name": "symfony/password-hasher", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "d487faef0347d5351d3e361e123a73496595509f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d487faef0347d5351d3e361e123a73496595509f", + "reference": "d487faef0347d5351d3e361e123a73496595509f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/security-core": "<5.3" + }, + "require-dev": { + "symfony/console": "^5", + "symfony/security-core": "^5.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", "shasum": "" }, "require": { @@ -5578,7 +5748,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5618,7 +5788,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" }, "funding": [ { @@ -5634,20 +5804,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -5661,7 +5831,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5705,7 +5875,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -5721,20 +5891,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -5746,7 +5916,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5789,7 +5959,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -5805,20 +5975,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { @@ -5830,7 +6000,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5869,7 +6039,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" }, "funding": [ { @@ -5885,20 +6055,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -5907,7 +6077,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5948,7 +6118,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -5964,20 +6134,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { @@ -5986,7 +6156,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6031,7 +6201,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" }, "funding": [ { @@ -6047,20 +6217,99 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9165effa2eb8a31bb3fa608df9d529920d21ddd9", + "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9", "shasum": "" }, "require": { @@ -6072,7 +6321,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6110,7 +6359,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.23.0" }, "funding": [ { @@ -6126,20 +6375,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/property-access", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", - "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", + "url": "https://api.github.com/repos/symfony/property-access/zipball/8988399a556cffb0fba9bb3603f8d1ba4543eceb", + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb", "shasum": "" }, "require": { @@ -6191,7 +6440,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.2.4" + "source": "https://github.com/symfony/property-access/tree/v5.3.0" }, "funding": [ { @@ -6207,20 +6456,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/property-info", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189" + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189", - "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "url": "https://api.github.com/repos/symfony/property-info/zipball/6f8bff281f215dbf41929c7ec6f8309cdc0912cf", + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf", "shasum": "" }, "require": { @@ -6281,7 +6530,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.2.4" + "source": "https://github.com/symfony/property-info/tree/v5.3.1" }, "funding": [ { @@ -6297,7 +6546,7 @@ "type": "tidelift" } ], - "time": "2021-02-17T15:24:54+00:00" + "time": "2021-05-31T12:40:48+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6389,16 +6638,16 @@ }, { "name": "symfony/routing", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "cafa138128dfd6ab6be1abf6279169957b34f662" + "reference": "368e81376a8e049c37cb80ae87dbfbf411279199" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/cafa138128dfd6ab6be1abf6279169957b34f662", - "reference": "cafa138128dfd6ab6be1abf6279169957b34f662", + "url": "https://api.github.com/repos/symfony/routing/zipball/368e81376a8e049c37cb80ae87dbfbf411279199", + "reference": "368e81376a8e049c37cb80ae87dbfbf411279199", "shasum": "" }, "require": { @@ -6407,21 +6656,21 @@ "symfony/polyfill-php80": "^1.15" }, "conflict": { - "symfony/config": "<5.0", + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", "symfony/dependency-injection": "<4.4", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.12", "psr/log": "~1.0", - "symfony/config": "^5.0", + "symfony/config": "^5.3", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", @@ -6459,7 +6708,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.4" + "source": "https://github.com/symfony/routing/tree/v5.3.0" }, "funding": [ { @@ -6475,41 +6724,45 @@ "type": "tidelift" } ], - "time": "2021-02-22T15:48:39+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/security-core", - "version": "v5.2.6", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760" + "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/9dcedab1c2c637fc9a377b3a9313a61087609760", - "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760", + "url": "https://api.github.com/repos/symfony/security-core/zipball/22714af1f701937a0a0bd3e3ec2a761baed3f2d0", + "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/password-hasher": "^5.3", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { "symfony/event-dispatcher": "<4.4", + "symfony/http-foundation": "<5.3", "symfony/ldap": "<4.4", "symfony/security-guard": "<4.4", "symfony/validator": "<5.2" }, "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.0|^2.0", "psr/log": "~1.0", + "symfony/cache": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/ldap": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/validator": "^5.2" @@ -6548,7 +6801,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.2.6" + "source": "https://github.com/symfony/security-core/tree/v5.3.1" }, "funding": [ { @@ -6564,38 +6817,39 @@ "type": "tidelift" } ], - "time": "2021-03-10T22:10:15+00:00" + "time": "2021-06-01T15:43:02+00:00" }, { "name": "symfony/serializer", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a285f474a72397ccbd384900abc968ffcb511dda" + "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a285f474a72397ccbd384900abc968ffcb511dda", - "reference": "a285f474a72397ccbd384900abc968ffcb511dda", + "url": "https://api.github.com/repos/symfony/serializer/zipball/ebb3dc397af77a08d734eea7305e0b2ec8c5e875", + "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-php80": "^1.15" }, "conflict": { + "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<4.4", "symfony/property-access": "<4.4", - "symfony/property-info": "<4.4", + "symfony/property-info": "<5.3", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", + "doctrine/annotations": "^1.12", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^4.4|^5.0", "symfony/config": "^4.4|^5.0", @@ -6607,15 +6861,14 @@ "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", "symfony/property-access": "^4.4.9|^5.0.9", - "symfony/property-info": "^4.4|^5.0", + "symfony/property-info": "^5.3", "symfony/uid": "^5.1", "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0", "symfony/var-exporter": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", @@ -6650,7 +6903,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.2.4" + "source": "https://github.com/symfony/serializer/tree/v5.3.1" }, "funding": [ { @@ -6666,25 +6919,25 @@ "type": "tidelift" } ], - "time": "2021-03-02T12:14:02+00:00" + "time": "2021-06-02T09:36:17+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -6692,7 +6945,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6729,7 +6982,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -6745,20 +6998,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", "shasum": "" }, "require": { @@ -6791,7 +7044,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" }, "funding": [ { @@ -6807,20 +7060,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/string", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e78d7d47061fa183639927ec40d607973699609" + "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609", - "reference": "4e78d7d47061fa183639927ec40d607973699609", + "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", "shasum": "" }, "require": { @@ -6874,7 +7127,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.4" + "source": "https://github.com/symfony/string/tree/v5.3.0" }, "funding": [ { @@ -6890,20 +7143,20 @@ "type": "tidelift" } ], - "time": "2021-02-16T10:20:28+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e" + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/002ab5a36702adf0c9a11e6d8836623253e9045e", - "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1d3953e627fe4b5f6df503f356b6545ada6351f3", + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3", "shasum": "" }, "require": { @@ -6962,7 +7215,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.5" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.0" }, "funding": [ { @@ -6978,20 +7231,20 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-27T12:28:50+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307" + "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5aed4875ab514c8cb9b6ff4772baa25fa4c10307", - "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", + "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", "shasum": "" }, "require": { @@ -7035,7 +7288,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.4" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.0" }, "funding": [ { @@ -7051,20 +7304,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:40:38+00:00" }, { "name": "symfony/yaml", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "298a08ddda623485208506fcee08817807a251dd" + "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", - "reference": "298a08ddda623485208506fcee08817807a251dd", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", + "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", "shasum": "" }, "require": { @@ -7110,7 +7363,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.2.5" + "source": "https://github.com/symfony/yaml/tree/v5.3.0" }, "funding": [ { @@ -7126,7 +7379,7 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-26T17:43:10+00:00" } ], "packages-dev": [ @@ -7294,12 +7547,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "593c4de369ca852cf3b86037f19435d47c136448" + "reference": "9460a22455b82b353d2212fecedebcf73b141baa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/593c4de369ca852cf3b86037f19435d47c136448", - "reference": "593c4de369ca852cf3b86037f19435d47c136448", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9460a22455b82b353d2212fecedebcf73b141baa", + "reference": "9460a22455b82b353d2212fecedebcf73b141baa", "shasum": "" }, "conflict": { @@ -7316,7 +7569,8 @@ "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", - "bolt/bolt": "<3.7.1", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", @@ -7327,7 +7581,7 @@ "centreon/centreon": "<18.10.8|>=19,<19.4.5", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", @@ -7335,6 +7589,7 @@ "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -7346,8 +7601,9 @@ "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", - "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "dweeves/magmi": "<=0.7.24", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", @@ -7372,14 +7628,16 @@ "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.8.3", "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", "getgrav/grav": "<1.7.11", - "getkirby/cms": ">=3,<3.4.5", + "getkirby/cms": "<3.5.4", "getkirby/panel": "<2.5.14", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", @@ -7387,7 +7645,7 @@ "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", "impresscms/impresscms": "<=1.4.2", @@ -7398,12 +7656,14 @@ "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", @@ -7424,13 +7684,14 @@ "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", - "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", "october/rain": "<1.0.472|>=1.1,<1.1.2", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", @@ -7441,8 +7702,9 @@ "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.12", "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", + "phpmailer/phpmailer": "<6.1.6|>=6.1.8,<6.4.1", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", @@ -7467,6 +7729,7 @@ "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", @@ -7476,7 +7739,7 @@ "shopware/core": "<=6.3.5.2", "shopware/platform": "<=6.3.5.2", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<5.6.9", + "shopware/shopware": "<=5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", @@ -7521,20 +7784,21 @@ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/polyfill": ">=1,<1.10", "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -7564,6 +7828,7 @@ "wallabag/tcpdf": "<6.2.22", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", @@ -7573,7 +7838,9 @@ "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.1", "yourls/yourls": "<1.7.4", + "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -7598,7 +7865,8 @@ "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" }, "default-branch": true, "type": "metapackage", @@ -7633,30 +7901,30 @@ "type": "tidelift" } ], - "time": "2021-04-16T20:01:44+00:00" + "time": "2021-06-01T22:04:47+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.6", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "f2f94fd78379cdcdef09dd5025af791301913968" + "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f2f94fd78379cdcdef09dd5025af791301913968", - "reference": "f2f94fd78379cdcdef09dd5025af791301913968", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/15cab721487b7bf43ad545a1e7d0095782e26f8c", + "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3", + "symfony/deprecation-contracts": "^2.1" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" + "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0" }, "suggest": { @@ -7700,7 +7968,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.6" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.0" }, "funding": [ { @@ -7716,7 +7984,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T20:42:04+00:00" + "time": "2021-05-26T17:57:12+00:00" } ], "aliases": [], diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 386cbd5..2564f29 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -12,27 +12,20 @@ final class DocsController extends AbstractController { use FileSystemAwareTrait; - /** - * @Route("/", name="tle_home") - * @Route("/api/tle/docs", name="app_api_docs") - */ + #[Route("/", name: "tle_home")] + #[Route('/api/tle/docs', name: "app_api_docs")] public function docs(): Response { return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } - /** - * @Route("/api/tle.json", name="app_api_docs_json") - * @throws \JsonException - */ + #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { $path = $this->getProjectDir() . '/config/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); -// unset($docs['paths']['/api/tle/{id}/propagate']); - return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } diff --git a/symfony.lock b/symfony.lock index eec58c9..7b9341e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -32,6 +32,9 @@ "doctrine/dbal": { "version": "v2.10.0" }, + "doctrine/deprecations": { + "version": "v0.5.3" + }, "doctrine/doctrine-bundle": { "version": "2.0", "recipe": { @@ -357,6 +360,9 @@ "symfony/orm-pack": { "version": "v1.0.7" }, + "symfony/password-hasher": { + "version": "v5.3.0" + }, "symfony/phpunit-bridge": { "version": "4.3", "recipe": { @@ -391,6 +397,9 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-php81": { + "version": "v1.23.0" + }, "symfony/polyfill-uuid": { "version": "v1.22.1" }, diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6e53d75..6955955 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -19,9 +19,9 @@ public function test404(): void $response = $this->toArray($response); self::assertEquals( - 'No route found for "GET /noop"', + 'No route found for "GET http://localhost/noop"', $response['response']['message'], 'Assert correct response message' ); } -} \ No newline at end of file +} From b56926bb4d1395daeb865d9d8a4e856bf46ef00d Mon Sep 17 00:00:00 2001 From: Serbian Case For Space <72007267+serbiancaseforspace@users.noreply.github.com> Date: Sat, 5 Jun 2021 13:46:34 +0200 Subject: [PATCH 126/221] Update README.md --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7f82184..76aa52e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # TLE API -[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) + + ![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) -![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) @@ -14,20 +14,18 @@ API provides up to date two line element set records, the data is updated daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a given point in time. -For more information on TLE data format visit [Definition of -Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). ## Usage Further documentation and response examples are available at: -http://tle.ivanstanojevic.me/api/tle/docs +https://tle.ivanstanojevic.me/ -###Available endpoints +### Available endpoints The TLE API consists of two endpoints `GET http://tle.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| -| `GET /api/tle?search={q}` | Perform search by satellite name | -| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | +| `GET /api/tle?search={query}` | Perform search by satellite name | +| `GET /api/tle/{id}` | Retrieve a single TLE record where id is satellite number | Example query http://tle.ivanstanojevic.me/api/tle From 06225275f8dc38729b0db14d6dce92e0b52998ad Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:56:56 +0200 Subject: [PATCH 127/221] upgrade symfony 5.3 --- src/Controller/AbstractApiController.php | 5 ----- symfony.lock | 12 ------------ 2 files changed, 17 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 300c68c..979e594 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -20,12 +20,7 @@ abstract class AbstractApiController extends AbstractController protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; public const CORS_HEADERS = [ - 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', - 'Access-Control-Allow-Credentials' => 'true', - 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', - 'Access-Control-Max-Age' => 1728000, ]; protected const SORT_PARAM = 'sort'; diff --git a/symfony.lock b/symfony.lock index 7b9341e..19e818d 100644 --- a/symfony.lock +++ b/symfony.lock @@ -135,18 +135,6 @@ "myclabs/php-enum": { "version": "1.7.2" }, - "nelmio/cors-bundle": { - "version": "1.5", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.5", - "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" - }, - "files": [ - "config/packages/nelmio_cors.yaml" - ] - }, "ocramius/package-versions": { "version": "1.5.1" }, From bd01d64b010a293ba92d51b01dd6aac235dd5a14 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:20:15 +0200 Subject: [PATCH 128/221] upgrade symfony 5.3 --- public/.htaccess | 2 ++ src/Controller/AbstractApiController.php | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/public/.htaccess b/public/.htaccess index 9c8c42f..f98dab9 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -89,6 +89,8 @@ RewriteRule ^ %{ENV:BASE}/index.php [L] +Header add Access-Control-Allow-Origin "*" + # When mod_rewrite is not available, we instruct a temporary redirect of diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 979e594..172b434 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -19,10 +19,6 @@ abstract class AbstractApiController extends AbstractController protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; - public const CORS_HEADERS = [ - 'Access-Control-Allow-Origin' => '*', - ]; - protected const SORT_PARAM = 'sort'; protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; @@ -119,7 +115,6 @@ public function response(array $data): JsonResponse return new JsonResponse( $data, Response::HTTP_OK, - self::CORS_HEADERS, ); } } From f5c45f6d945ee1393240e1c64ea1355d21c7c8ab Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:21:18 +0200 Subject: [PATCH 129/221] upgrade symfony 5.3 --- src/Controller/StatisticsController.php | 1 - src/Event/ApiExceptionSubscriber.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 9be3a8e..a7f35fc 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -60,7 +60,6 @@ public function hits( return new JsonResponse( $response, Response::HTTP_OK, - self::CORS_HEADERS, ); } } diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index a2434b1..d2d5e8d 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -64,7 +64,6 @@ private function setJsonResponse(ExceptionEvent $event, array $response): void 'response' => $response ], Response::HTTP_OK, - AbstractApiController::CORS_HEADERS ) ); } From aa02e5995d2857282beb177f641c54e2d6f00d9c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:43:46 +0200 Subject: [PATCH 130/221] add referer --- src/Entity/Request.php | 15 ++++++++++ src/Event/StatisticSubscriber.php | 4 ++- src/Migrations/Version20210605124127.php | 35 ++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/Migrations/Version20210605124127.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 549ffad..c634689 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -37,6 +37,11 @@ class Request */ private string $ip; + /** + * @ORM\Column(name="referer", type="string", nullable=true) + */ + private ?string $referer; + /** * @ORM\PrePersist() * @ORM\PreUpdate() @@ -65,4 +70,14 @@ public function setIp(string $ip): void { $this->ip = $ip; } + + public function getReferer(): ?string + { + return $this->referer; + } + + public function setReferer(?string $referer): void + { + $this->referer = $referer; + } } diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 61d80b1..5c7dce5 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -7,6 +7,7 @@ use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\TerminateEvent; use Symfony\Component\HttpKernel\KernelEvents; class StatisticSubscriber implements EventSubscriberInterface @@ -29,7 +30,7 @@ public static function getSubscribedEvents(): array ]; } - public function onKernelTerminate($event): void + public function onKernelTerminate(TerminateEvent $event): void { if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { return; @@ -45,6 +46,7 @@ public function onKernelTerminate($event): void $request = new Request(); $request->setTle($tle); $request->setIp($event->getRequest()->getClientIp()); + $request->setReferer($event->getRequest()->headers->get('referer')); $this->em->persist($request); $this->em->flush(); diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php new file mode 100644 index 0000000..506a17e --- /dev/null +++ b/src/Migrations/Version20210605124127.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request ADD referer VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request DROP referer'); + } +} From c5bf59992de4634ce9b50e99a2b5642160af7308 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:46:43 +0200 Subject: [PATCH 131/221] upgrade symfony 5.3 --- src/Migrations/Version20210605124127.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php index 506a17e..e9a424a 100644 --- a/src/Migrations/Version20210605124127.php +++ b/src/Migrations/Version20210605124127.php @@ -12,9 +12,9 @@ */ final class Version20210605124127 extends AbstractMigration { - public function getDescription() : string + public function isTransactional(): bool { - return ''; + return false; } public function up(Schema $schema) : void From a3cbc1aecdc7bd7ba9effb5471f2018f2d2f3817 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 15:19:56 +0200 Subject: [PATCH 132/221] cleanup command --- src/Command/CleanupCommand.php | 33 +++++++++++++++++++++++++ src/Command/TleCalculate.php | 2 +- src/Controller/FlyOverController.php | 2 +- src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 2 +- src/Entity/Request.php | 2 +- src/Repository/RequestRepository.php | 27 ++++++++++++++++++++ 7 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/Command/CleanupCommand.php create mode 100644 src/Repository/RequestRepository.php diff --git a/src/Command/CleanupCommand.php b/src/Command/CleanupCommand.php new file mode 100644 index 0000000..4e6c05c --- /dev/null +++ b/src/Command/CleanupCommand.php @@ -0,0 +1,33 @@ +setName('cleanup') + ->setDescription('Performs periodic cleanup on unused data'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->repository->removeBefore( + (new \DateTime())->sub(new \DateInterval('P2M')) + ); + + return Command::SUCCESS; + } +} diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2850d50..2b083ed 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -10,7 +10,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -class TleCalculate extends Command +final class TleCalculate extends Command { protected const BATCH_SIZE = 20; protected const OPTION_TLE = 'tle'; diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 7109001..21be595 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -12,7 +12,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -class FlyOverController extends AbstractApiController +final class FlyOverController extends AbstractApiController { use TleHttpTrait; diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 60af093..a8f4b77 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -13,7 +13,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -class PropagateController extends AbstractApiController +final class PropagateController extends AbstractApiController { use TleHttpTrait; diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index a7f35fc..9d5b7a7 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -9,7 +9,7 @@ use Symfony\Component\Routing\Annotation\Route; #[Route("/api/tle")] -class StatisticsController extends AbstractApiController +final class StatisticsController extends AbstractApiController { protected const INTERVAL = 6; diff --git a/src/Entity/Request.php b/src/Entity/Request.php index c634689..9d75b84 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -7,7 +7,7 @@ use Doctrine\ORM\Mapping as ORM; /** - * @ORM\Entity() + * @ORM\Entity(repositoryClass="App\Repository\RequestRepository") * @ORM\HasLifecycleCallbacks() */ class Request diff --git a/src/Repository/RequestRepository.php b/src/Repository/RequestRepository.php new file mode 100644 index 0000000..b7d9a6e --- /dev/null +++ b/src/Repository/RequestRepository.php @@ -0,0 +1,27 @@ +_em->createQueryBuilder(); + + $builder + ->delete(Request::class, 'r') + ->where('r.createdAt < :date') + ->setParameter('date', $dateTime); + + $builder->getQuery()->execute(); + } +} From 46a156b3f436ca00156a788a6647d27f9d7e5b39 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 17:58:37 +0200 Subject: [PATCH 133/221] rate limiter --- .env | 6 ++ composer.json | 1 + composer.lock | 152 ++++++++++++++++++++++++++- config/packages/lock.yaml | 2 + config/packages/rate_limiter.yaml | 7 ++ src/Command/TleCalculate.php | 3 +- src/Event/ApiExceptionSubscriber.php | 1 + src/Event/ApiLimiterSubscriber.php | 70 ++++++++++++ src/Event/StatisticSubscriber.php | 13 +-- src/Service/FeatureFlag.php | 8 ++ src/Service/Route.php | 15 +++ symfony.lock | 15 +++ 12 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 config/packages/lock.yaml create mode 100644 config/packages/rate_limiter.yaml create mode 100644 src/Event/ApiLimiterSubscriber.php create mode 100644 src/Service/FeatureFlag.php create mode 100644 src/Service/Route.php diff --git a/.env b/.env index 628129e..a4744f6 100644 --- a/.env +++ b/.env @@ -31,3 +31,9 @@ DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###> sentry/sentry-symfony ### SENTRY_DSN= ###< sentry/sentry-symfony ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=semaphore +###< symfony/lock ### diff --git a/composer.json b/composer.json index f585d22..c47bcd3 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", "symfony/property-access": "5.3.*", + "symfony/rate-limiter": "5.3.*", "symfony/serializer": "5.3.*", "symfony/yaml": "5.3.*" }, diff --git a/composer.lock b/composer.lock index d38071b..1715c82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b41d3e11936a61ff068ced78f87c22a1", + "content-hash": "f253f5360f5a5801c6fa721bde0c08b5", "packages": [ { "name": "beberlei/doctrineextensions", @@ -5373,6 +5373,86 @@ ], "time": "2021-06-02T10:07:12+00:00" }, + { + "name": "symfony/lock", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/cf21749b2733508f0e1031c0a531cefa3efca0b8", + "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "doctrine/dbal": "<2.10" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "mongodb/mongodb": "~1.1", + "predis/predis": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v5.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-01T18:47:32+00:00" + }, { "name": "symfony/monolog-bridge", "version": "v5.3.0", @@ -6636,6 +6716,76 @@ ], "time": "2021-02-17T10:35:25+00:00" }, + { + "name": "symfony/rate-limiter", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "e9226c91163495ff0b655cdae0fff682e869640b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/e9226c91163495ff0b655cdae0fff682e869640b", + "reference": "e9226c91163495ff0b655cdae0fff682e869640b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/lock": "^5.2", + "symfony/options-resolver": "^5.1" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, { "name": "symfony/routing", "version": "v5.3.0", diff --git a/config/packages/lock.yaml b/config/packages/lock.yaml new file mode 100644 index 0000000..574879f --- /dev/null +++ b/config/packages/lock.yaml @@ -0,0 +1,2 @@ +framework: + lock: '%env(LOCK_DSN)%' diff --git a/config/packages/rate_limiter.yaml b/config/packages/rate_limiter.yaml new file mode 100644 index 0000000..a677d37 --- /dev/null +++ b/config/packages/rate_limiter.yaml @@ -0,0 +1,7 @@ +framework: + rate_limiter: + anonymous_api: + policy: 'sliding_window' + limit: 500 + interval: '60 minutes' + lock_factory: null diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2b083ed..8adb615 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -5,6 +5,7 @@ use App\Entity\Tle; use App\Entity\TleInformation; use Doctrine\ORM\EntityManagerInterface; +use Ivanstan\Tle\Specification\GeostationaryOrbitTleSpecification; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -60,7 +61,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); - $tleInformation->geostationary = $tleModel->isGeostationary(); + $tleInformation->geostationary = (new GeostationaryOrbitTleSpecification())->isSatisfiedBy($tleModel); $tleInformation->raan = $tleModel->raan(); $tleInformation->semiMajorAxis = $tleModel->semiMajorAxis(); diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index d2d5e8d..69bc8b3 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php new file mode 100644 index 0000000..5f098b7 --- /dev/null +++ b/src/Event/ApiLimiterSubscriber.php @@ -0,0 +1,70 @@ +limiter = $anonymousApiLimiter; + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => 'onRequest', + ]; + } + + public function onRequest(RequestEvent $event): void + { + $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); + + if (!FeatureFlag::API_RATE_LIMITER || $refererHost === Route::PRODUCTION_HOST || !Route::inArray($event->getRequest(), self::ROUTES)) { + return; + } + + $limit = $this->limiter->create($event->getRequest()->getClientIp())->consume(); + + if (false === $limit->isAccepted()) { + $headers = [ + 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), + 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format('c'), + 'X-RateLimit-Limit' => $limit->getLimit(), + ]; + + $event->setResponse( + new JsonResponse( + [ + 'response' => [ + 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format('c')), + 'limit' => $limit->getLimit(), + 'remaining' => $limit->getRemainingTokens(), + ], + ], + Response::HTTP_TOO_MANY_REQUESTS, + $headers + ), + ); + } + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 5c7dce5..3a04206 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Route; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\TerminateEvent; @@ -12,11 +13,11 @@ class StatisticSubscriber implements EventSubscriberInterface { - protected const TLE_ROUTES = [ - 'tle_record', - 'tle_propagate', - 'tle_flyover', - 'tle_flyover_details' + public const ROUTES = [ + 'tle_record', + 'tle_propagate', + 'tle_flyover', + 'tle_flyover_details', ]; public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) @@ -32,7 +33,7 @@ public static function getSubscribedEvents(): array public function onKernelTerminate(TerminateEvent $event): void { - if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { + if (!Route::inArray($event->getRequest(), self::ROUTES)) { return; } diff --git a/src/Service/FeatureFlag.php b/src/Service/FeatureFlag.php new file mode 100644 index 0000000..d061893 --- /dev/null +++ b/src/Service/FeatureFlag.php @@ -0,0 +1,8 @@ +get('_route'), $routes, false); + } +} diff --git a/symfony.lock b/symfony.lock index 19e818d..0f1f0e4 100644 --- a/symfony.lock +++ b/symfony.lock @@ -324,6 +324,18 @@ "symfony/http-kernel": { "version": "v5.0.1" }, + "symfony/lock": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "13350583a83fa636bf45a5fb62da3bdc73be52a1" + }, + "files": [ + "config/packages/lock.yaml" + ] + }, "symfony/monolog-bridge": { "version": "v5.2.5" }, @@ -400,6 +412,9 @@ "symfony/psr-http-message-bridge": { "version": "v2.1.0" }, + "symfony/rate-limiter": { + "version": "v5.3.0" + }, "symfony/routing": { "version": "4.2", "recipe": { From d895f004006e3145aa12476c258e50fdce46e26c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 6 Jun 2021 11:33:16 +0200 Subject: [PATCH 134/221] upgrade symfony 5.3 --- src/Controller/FlyOverController.php | 4 ++-- src/Serializer/ObserverNormalizer.php | 14 ++++++-------- src/ViewModel/LatLng.php | 2 +- src/ViewModel/Observer.php | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 21be595..f337cbe 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,7 +55,7 @@ public function flyover( $parameters['satelliteId'] = $id; - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); foreach ($members as $index => &$member) { $member = array_merge( @@ -122,7 +122,7 @@ public function flyoverDetails( return $this->response( array_merge( $data, - $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimezone(), 'details' => true]) ) ); } diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php index e498d69..15ccde1 100644 --- a/src/Serializer/ObserverNormalizer.php +++ b/src/Serializer/ObserverNormalizer.php @@ -22,14 +22,12 @@ public function __construct(protected ObjectNormalizer $normalizer) */ public function normalize($object, string $format = null, array $context = []): array { - $result = $this->normalizer->normalize($object); - - unset($result['timeZone']); - - $result['@type'] = 'Observer'; - $result['datetime'] = $object->datetime; - - return $result; + return array_merge( + [ + '@type' => 'Observer', + ], + $this->normalizer->normalize($object) + ); } public function supportsNormalization($data, string $format = null): bool diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php index 64fa7d0..f93a368 100644 --- a/src/ViewModel/LatLng.php +++ b/src/ViewModel/LatLng.php @@ -20,7 +20,7 @@ public function __construct(public float $latitude, public float $longitude) } } - public function getTimeZone(): ?string + public function getTimezone(): ?string { $diffs = []; foreach (DateTimeZone::listIdentifiers() as $timezoneID) { diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 93385a9..8fa4eeb 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -4,12 +4,12 @@ class Observer extends LatLng { - public \DateTime $datetime; + public \DateTime $date; public function __construct(float $latitude, float $longitude, public $altitude = 0, ?\DateTime $dateTime = null) { parent::__construct($latitude, $longitude); - $this->datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + $this->date = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimezone())); } } From 4fbf610251fd4a999983876a3e01acd4fe6b8096 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 7 Jun 2021 15:10:14 +0200 Subject: [PATCH 135/221] setup sentry filter --- config/packages/prod/sentry.yaml | 2 ++ src/Service/SentryCallbackBeforeSend.php | 26 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/Service/SentryCallbackBeforeSend.php diff --git a/config/packages/prod/sentry.yaml b/config/packages/prod/sentry.yaml index 342036f..a03c7fe 100644 --- a/config/packages/prod/sentry.yaml +++ b/config/packages/prod/sentry.yaml @@ -1,2 +1,4 @@ sentry: dsn: '%env(SENTRY_DSN)%' + options: + before_send: 'App\Service\SentryCallbackBeforeSend' diff --git a/src/Service/SentryCallbackBeforeSend.php b/src/Service/SentryCallbackBeforeSend.php new file mode 100644 index 0000000..a086de2 --- /dev/null +++ b/src/Service/SentryCallbackBeforeSend.php @@ -0,0 +1,26 @@ +getExceptions(); + + foreach ($exceptions as $exception) { + if (in_array($exception->getType(), self::SKIP)) { + return null; + } + } + + return $event; + } +} From 956c5a0419fcf632fd8d66d617cc4f3259f4d092 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 10 Jun 2021 11:35:47 +0200 Subject: [PATCH 136/221] upgrade symfony 5.3 --- deploy.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy.php b/deploy.php index 4a8d877..7834835 100644 --- a/deploy.php +++ b/deploy.php @@ -55,12 +55,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', +// 'deploy:vendors', 'deploy:writable', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'deploy:dump-env', - 'database:migrate', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'deploy:dump-env', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 512b02c60e9693790dbeccc5fbfe5927693b98fe Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 20:36:55 +0200 Subject: [PATCH 137/221] sentry test --- src/Controller/TleController.php | 1 - .../DocsControllerTest.php} | 81 ++++--- .../PropagateControllerTest.php | 223 +++++++++--------- .../StatisticsControllerTest.php | 31 +-- tests/{ => Controller}/TleControllerTest.php | 107 +++++---- tests/Service/SentryCallbackTest.php | 43 ++++ 6 files changed, 267 insertions(+), 219 deletions(-) rename tests/{DocumentationTest.php => Controller/DocsControllerTest.php} (80%) rename tests/{ => Controller}/PropagateControllerTest.php (97%) rename tests/{ => Controller}/StatisticsControllerTest.php (81%) rename tests/{ => Controller}/TleControllerTest.php (86%) create mode 100644 tests/Service/SentryCallbackTest.php diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index f763330..192af77 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -2,7 +2,6 @@ namespace App\Controller; -use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; diff --git a/tests/DocumentationTest.php b/tests/Controller/DocsControllerTest.php similarity index 80% rename from tests/DocumentationTest.php rename to tests/Controller/DocsControllerTest.php index 1878bb8..a322506 100644 --- a/tests/DocumentationTest.php +++ b/tests/Controller/DocsControllerTest.php @@ -1,37 +1,44 @@ -get('/api/tle.json'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); - - $response = $this->toArray($response); - - $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; - $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; - - $tle = TleFixtures::create(); - - $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); - - self::assertCount(\count($tleSchema), $response); - self::assertEquals(array_keys($tleSchema), array_keys($response)); - - $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); - - self::assertCount(\count($paginationSchema), $response['view']); - self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); - - self::assertCount(\count($response), $collectionSchema); - self::assertEquals(array_keys($response), array_keys($collectionSchema)); - } -} +get('/api/tle.json'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); + + $response = $this->toArray($response); + + $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; + $paginationSchema = $response['components']['schemas']['Pagination']['properties']; + $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; + + $tle = TleFixtures::create(); + + $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); + + self::assertCount(\count($tleSchema), $response); + self::assertEquals(array_keys($tleSchema), array_keys($response)); + + $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); + + self::assertCount(\count($paginationSchema), $response['view']); + self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); + + self::assertCount(\count($response), $collectionSchema); + self::assertEquals(array_keys($response), array_keys($collectionSchema)); + } + + public function testHomepage(): void { + $response = $this->get('/api/tle/docs'); + + self::assertEmpty($response->getContent()); + } +} diff --git a/tests/PropagateControllerTest.php b/tests/Controller/PropagateControllerTest.php similarity index 97% rename from tests/PropagateControllerTest.php rename to tests/Controller/PropagateControllerTest.php index ff3f655..44cd28b 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/Controller/PropagateControllerTest.php @@ -1,112 +1,111 @@ -get('/api/tle/0/propagate'); - - self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); - } - - public function testPropagateSGP4(): void - { - $tle = TleFixtures::create(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SGP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); - - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } - - public function testPropagateSDP4(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SDP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); - - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } -} +get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + + public function testPropagateSGP4(): void + { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} diff --git a/tests/StatisticsControllerTest.php b/tests/Controller/StatisticsControllerTest.php similarity index 81% rename from tests/StatisticsControllerTest.php rename to tests/Controller/StatisticsControllerTest.php index a2e95ab..86e91a4 100644 --- a/tests/StatisticsControllerTest.php +++ b/tests/Controller/StatisticsControllerTest.php @@ -1,15 +1,16 @@ -get('/api/tle/hits'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - } -} +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} diff --git a/tests/TleControllerTest.php b/tests/Controller/TleControllerTest.php similarity index 86% rename from tests/TleControllerTest.php rename to tests/Controller/TleControllerTest.php index 082b8d7..59f2470 100644 --- a/tests/TleControllerTest.php +++ b/tests/Controller/TleControllerTest.php @@ -1,54 +1,53 @@ - 'tle:calculate', - '--tle' => TleFixtures::createDeep()->getId(), - ] - ); - - $application = new Application(static::$kernel); - $application->setAutoExit(false); - $application->run($input, new BufferedOutput()); - } - - public function testTleExtraFieldsMissingData(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } - - public function testTleExtraFields(): void - { - $tle = TleFixtures::create(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } -} + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} diff --git a/tests/Service/SentryCallbackTest.php b/tests/Service/SentryCallbackTest.php new file mode 100644 index 0000000..5feac85 --- /dev/null +++ b/tests/Service/SentryCallbackTest.php @@ -0,0 +1,43 @@ +setExceptions( + [ + new ExceptionDataBag(new NotFoundHttpException()), + ] + ); + + self::assertNull($callback($event)); + } + + public function testOtherExceptionsForwarded(): void + { + $callback = new SentryCallbackBeforeSend(); + + $event = Event::createTransaction(); + + $event->setExceptions( + [ + new ExceptionDataBag(new \Exception()), + ] + ); + + /** @noinspection GetClassUsageInspection */ + self::assertEquals(Event::class, get_class($callback($event))); + } +} From d1d6fd0028a8cb2f14ec70b4f748199c97b43647 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 21:38:35 +0200 Subject: [PATCH 138/221] refactor --- src/Controller/AbstractApiController.php | 7 ++++++ src/Controller/PropagateController.php | 31 +++++++----------------- src/Enum/PropagatorAlgorithm.php | 11 +++++++++ 3 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 src/Enum/PropagatorAlgorithm.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 172b434..bc64fa9 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -117,4 +117,11 @@ public function response(array $data): JsonResponse Response::HTTP_OK, ); } + + protected function getDate(Request $request, string $name): \DateTime + { + $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + + return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + } } diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index a8f4b77..5791a12 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -2,13 +2,12 @@ namespace App\Controller; -use App\Entity\Tle; +use App\Enum\PropagatorAlgorithm; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -19,8 +18,11 @@ final class PropagateController extends AbstractApiController protected const DEEP_SATELLITE_PERIOD = 225; // minutes + protected \Predict_SGPSDP $propagator; + public function __construct(protected TleRepository $repository) { + $this->propagator = new \Predict_SGPSDP(); } #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] @@ -29,32 +31,17 @@ public function propagate( Request $request, NormalizerInterface $normalizer ): JsonResponse { - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } + $tle = $this->getTle($id); $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); - $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); - $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); - - $dateTimeUTC = clone $datetime; - $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); - $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + $datetime = $this->getDate($request, 'date'); + $deltaT = ($datetime->getTimestamp() - $tleModel->epochDateTime()->getTimestamp()) / 60; // minutes - $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + $algorithm = ($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD ? PropagatorAlgorithm::SDP4 : PropagatorAlgorithm::SGP4; - $propagator = new \Predict_SGPSDP(); - if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { - $propagator->SDP4($sat, $deltaT); - $algorithm = 'SDP4'; - } else { - $propagator->SGP4($sat, $deltaT); - $algorithm = 'SGP4'; - } + $this->propagator->$algorithm($sat, $deltaT); \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); diff --git a/src/Enum/PropagatorAlgorithm.php b/src/Enum/PropagatorAlgorithm.php new file mode 100644 index 0000000..9e92b79 --- /dev/null +++ b/src/Enum/PropagatorAlgorithm.php @@ -0,0 +1,11 @@ + Date: Fri, 11 Jun 2021 22:11:20 +0200 Subject: [PATCH 139/221] refactor --- config/packages/doctrine_migrations.yaml | 2 +- src/Command/TleCalculate.php | 2 +- src/Command/UpdateImportSources.php | 2 +- src/Controller/AbstractApiController.php | 5 +---- src/Controller/FlyOverController.php | 16 ++++++++++------ src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 5 +++-- src/Entity/Tle.php | 2 +- src/Event/ApiExceptionSubscriber.php | 2 -- src/Event/ApiLimiterSubscriber.php | 4 ++-- src/Migrations/Version20191217203053.php | 2 +- src/Migrations/Version20210308195105.php | 7 +------ src/Migrations/Version20210322151101.php | 7 +------ src/Migrations/Version20210331192030.php | 7 +------ src/Migrations/Version20210402050806.php | 7 +------ src/Migrations/Version20210420125645.php | 7 +------ src/Migrations/Version20210420170012.php | 7 +------ src/Migrations/Version20210426124814.php | 7 +------ src/Migrations/Version20210524103622.php | 7 +------ src/Migrations/Version20210605124127.php | 2 +- src/Serializer/SatellitePassNormalizer.php | 7 +++---- src/Serializer/TleModelNormalizer.php | 22 +++++++++++----------- src/ViewModel/Filter.php | 2 +- 23 files changed, 46 insertions(+), 87 deletions(-) diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index aa336b1..19b53d5 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,3 +1,3 @@ doctrine_migrations: migrations_paths: - 'DoctrineMigrations': '%kernel.project_dir%/src/Migrations' + App\Migrations: '%kernel.project_dir%/src/Migrations' diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 8adb615..784f15b 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -23,7 +23,7 @@ public function __construct(protected EntityManagerInterface $entityManager) parent::__construct(); } - protected function configure() + protected function configure(): void { $this->setDescription('Calculate and persist data in TleInformation entity'); $this->addOption(self::OPTION_TLE, 't', InputOption::VALUE_REQUIRED, 'Calculate only for specified record'); diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 6ce7e84..fe3713c 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -1,4 +1,4 @@ -get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTimeInterface::ATOM)); return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); } diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index f337cbe..7708290 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,10 +55,12 @@ public function flyover( $parameters['satelliteId'] = $id; - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); + $normalized = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); - foreach ($members as $index => &$member) { - $member = array_merge( + $members = []; + + foreach ($normalized as $index => $member) { + $members[] = [ [ '@id' => $this->generateUrl( 'tle_flyover_details', @@ -66,10 +68,12 @@ public function flyover( UrlGeneratorInterface::ABSOLUTE_URL ), ], - $member - ); + $member, + ]; } + $members = array_merge([], ...$members); + return $this->response( [ '@context' => self::HYDRA_CONTEXT, @@ -104,7 +108,7 @@ public function flyoverDetails( $pass = $results[$passId] ?? null; if ($pass === null) { - throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + throw new NotFoundHttpException('Unable to find requested flyover details'); } $url = $this->router->generate( diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 5791a12..d2befb8 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -52,7 +52,7 @@ public function propagate( $sat_geodetic->lon = rad2deg($sat_geodetic->lon); $parameters = [ - 'date' => $datetime->format(self::DATETIME_FORMAT), + 'date' => $datetime->format(\DateTimeInterface::ATOM), ]; $url = $this->router->generate( diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 9d5b7a7..ba3acd7 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -18,7 +18,7 @@ public function hits( EntityManagerInterface $em ): Response { $newerThan = new \DateTime('now'); - $newerThan->setTime(0, 0, 0); + $newerThan->setTime(0, 0); $newerThan->modify('-3 days'); $qb = $em->createQueryBuilder(); @@ -38,6 +38,7 @@ public function hits( ->groupBy('date, hour') ->setParameter('interval', self::INTERVAL); + /** @var Request[] $result */ $result = $qb->getQuery()->getResult(); $response = []; @@ -54,7 +55,7 @@ public function hits( $date = new \DateTime($item['date']); $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - $response[$date->format(self::DATETIME_FORMAT)] = $item['hits']; + $response[$date->format(\DateTimeInterface::ATOM)] = $item['hits']; } return new JsonResponse( diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 01ccef3..6ddfe45 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -22,7 +22,7 @@ class Tle /** * @OneToOne(targetEntity="TleInformation", mappedBy="tle") */ - private $info; + private ?TleInformation $info = null; /** * @ORM\Column(name="updated_at", type="datetime") diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 69bc8b3..6e83754 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -2,13 +2,11 @@ namespace App\Event; -use App\Controller\AbstractApiController; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpException; -use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php index 5f098b7..0159c8a 100644 --- a/src/Event/ApiLimiterSubscriber.php +++ b/src/Event/ApiLimiterSubscriber.php @@ -48,7 +48,7 @@ public function onRequest(RequestEvent $event): void if (false === $limit->isAccepted()) { $headers = [ 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), - 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format('c'), + 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format(\DateTimeInterface::ATOM), 'X-RateLimit-Limit' => $limit->getLimit(), ]; @@ -56,7 +56,7 @@ public function onRequest(RequestEvent $event): void new JsonResponse( [ 'response' => [ - 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format('c')), + 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format(\DateTimeInterface::ATOM)), 'limit' => $limit->getLimit(), 'remaining' => $limit->getRemainingTokens(), ], diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index f68c4e8..60949fe 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; diff --git a/src/Migrations/Version20210308195105.php b/src/Migrations/Version20210308195105.php index 49feca7..4d927e0 100644 --- a/src/Migrations/Version20210308195105.php +++ b/src/Migrations/Version20210308195105.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -23,11 +23,6 @@ public function down(Schema $schema): void $this->addSql('DROP TABLE statistic'); } - public function getDescription(): string - { - return ''; - } - public function isTransactional(): bool { return false; diff --git a/src/Migrations/Version20210322151101.php b/src/Migrations/Version20210322151101.php index 2d95f5d..94d1f08 100644 --- a/src/Migrations/Version20210322151101.php +++ b/src/Migrations/Version20210322151101.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210322151101 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210331192030.php b/src/Migrations/Version20210331192030.php index 0404c36..0af9a58 100644 --- a/src/Migrations/Version20210331192030.php +++ b/src/Migrations/Version20210331192030.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210331192030 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210402050806.php b/src/Migrations/Version20210402050806.php index 442c840..aa579bf 100644 --- a/src/Migrations/Version20210402050806.php +++ b/src/Migrations/Version20210402050806.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -17,11 +17,6 @@ public function isTransactional(): bool return false; } - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php index 0942a2c..ce2fa46 100644 --- a/src/Migrations/Version20210420125645.php +++ b/src/Migrations/Version20210420125645.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210420125645 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210420170012.php b/src/Migrations/Version20210420170012.php index 7755448..177a0cf 100644 --- a/src/Migrations/Version20210420170012.php +++ b/src/Migrations/Version20210420170012.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210420170012 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210426124814.php b/src/Migrations/Version20210426124814.php index 44a827e..8baa678 100644 --- a/src/Migrations/Version20210426124814.php +++ b/src/Migrations/Version20210426124814.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210426124814 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function isTransactional(): bool { return false; diff --git a/src/Migrations/Version20210524103622.php b/src/Migrations/Version20210524103622.php index 7c8a16c..ca8913c 100644 --- a/src/Migrations/Version20210524103622.php +++ b/src/Migrations/Version20210524103622.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210524103622 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php index e9a424a..4a4bae5 100644 --- a/src/Migrations/Version20210605124127.php +++ b/src/Migrations/Version20210605124127.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index d1979e1..7e59c35 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -2,7 +2,6 @@ namespace App\Serializer; -use App\Controller\AbstractApiController; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; @@ -28,21 +27,21 @@ public function normalize($object, string $format = null, array $context = []): '@type' => $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', 'aos' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_aos_az ?? null, 2), 'elevation' => round($object->visible_aos_el ?? null, 2), ], 'max' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_max_el_az ?? null, 2), 'elevation' => round($object->visible_max_el ?? null, 2), ], 'los' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), 'elevation' => round($object->visible_los_el ?? null, 2), diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 2357599..2e65c22 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -16,17 +16,17 @@ public function __construct(private UrlGeneratorInterface $router) } /** - * @param Tle $entity + * @param Tle $object * @param string|null $format * @param array $context * * @return array */ - public function normalize($entity, ?string $format = null, array $context = []): array + public function normalize($object, ?string $format = null, array $context = []): array { - $id = $this->router->generate('tle_record', ['id' => $entity->getId()], UrlGeneratorInterface::ABSOLUTE_URL); + $id = $this->router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); - $model = new TleModel($entity->getLine1(), $entity->getLine2(), $entity->getName()); + $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; @@ -35,19 +35,19 @@ public function normalize($entity, ?string $format = null, array $context = []): '@type' => 'TleModel', 'satelliteId' => $model->getId(), 'name' => $model->getName(), - 'date' => $model->getDate(), + 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), 'line1' => $model->getLine1(), 'line2' => $model->getLine2(), ]; - if ($isExtra && $entity->getInfo()) { + if ($isExtra && $object->getInfo()) { $extra = [ 'extra' => [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, - TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, - TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, - TleCollectionSortableFieldsEnum::RAAN => $entity->getInfo()->raan, - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $entity->getInfo()->semiMajorAxis, + TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, ], ]; diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index 4ad6d43..982c518 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -64,7 +64,7 @@ protected function validateOperator(): string /** * @noinspection CallableParameterUseCaseInTypeContextInspection */ - protected function validateValue(string $value): mixed + protected function validateValue(string $value): ?float { if ($this->type === self::FILTER_TYPE_FLOAT) { $value = (float)$value; From 6884e4b1794320eb4da368f7c9523750ad4ff249 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 22:16:40 +0200 Subject: [PATCH 140/221] update tests --- tests/AssertionTrait.php | 4 +- tests/Controller/PropagateControllerTest.php | 82 ++++++++++---------- tests/ErrorPageTest.php | 2 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index bdb68f2..c82a1b0 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -6,7 +6,7 @@ trait AssertionTrait { - public function assertTle(Tle $tle, array $response, bool $extra = false): void + public function assertTle(Tle $tle, array $response): void { $model = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); @@ -15,7 +15,7 @@ public function assertTle(Tle $tle, array $response, bool $extra = false): void self::assertEquals('TleModel', $response['@type']); self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); - self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($model->epochDateTime()->format(\DateTimeInterface::ATOM), $response['date']); self::assertEquals($tle->getLine1(), $response['line1']); self::assertEquals($tle->getLine2(), $response['line2']); } diff --git a/tests/Controller/PropagateControllerTest.php b/tests/Controller/PropagateControllerTest.php index 44cd28b..236e04e 100644 --- a/tests/Controller/PropagateControllerTest.php +++ b/tests/Controller/PropagateControllerTest.php @@ -16,7 +16,7 @@ public function testResourceNotFound(): void $response = $this->toArray($response); - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + self::assertEquals('Unable to find record with id 0', $response['response']['message']); } public function testPropagateSGP4(): void @@ -34,34 +34,34 @@ public function testPropagateSGP4(): void $response = $this->toArray($response); - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); self::assertArrayHasKey('tle', $response); - self::assertEquals($response['algorithm'], 'SGP4'); + self::assertEquals('SGP4', $response['algorithm']); - self::assertEquals($response['vector']['reference_frame'], 'ECI'); + self::assertEquals('ECI', $response['vector']['reference_frame']); - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); + self::assertEquals(3731.3677738358, $response['vector']['position']['x']); + self::assertEquals(-3929.0247024138, $response['vector']['position']['y']); + self::assertEquals(-3820.6175474185, $response['vector']['position']['z']); + self::assertEquals(6630.0421581948, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + self::assertEquals(2.2692661551689, $response['vector']['velocity']['x']); + self::assertEquals(6.1586427245624, $response['vector']['velocity']['y']); + self::assertEquals(-4.1239106928913, $response['vector']['velocity']['z']); + self::assertEquals(7.7514571852487, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + self::assertEquals(-35.362152001955, $response['geodetic']['latitude']); + self::assertEquals(221.21616992358, $response['geodetic']['longitude']); + self::assertEquals(259.03105001661, $response['geodetic']['altitude']); - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + self::assertEquals(43550, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); } public function testPropagateSDP4(): void @@ -79,33 +79,33 @@ public function testPropagateSDP4(): void $response = $this->toArray($response); - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); self::assertArrayHasKey('tle', $response); - self::assertEquals($response['algorithm'], 'SDP4'); + self::assertEquals('SDP4', $response['algorithm']); - self::assertEquals($response['vector']['reference_frame'], 'ECI'); + self::assertEquals('ECI', $response['vector']['reference_frame']); - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); + self::assertEquals(142825.54086031896, $response['vector']['position']['x']); + self::assertEquals(133973.34798843606, $response['vector']['position']['y']); + self::assertEquals(1303.6185230048, $response['vector']['position']['z']); + self::assertEquals(195830.7751976863, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + self::assertEquals(-0.51310326492624, $response['vector']['velocity']['x']); + self::assertEquals(0.5491989174236, $response['vector']['velocity']['y']); + self::assertEquals(0.60190735910381, $response['vector']['velocity']['z']); + self::assertEquals(0.96290543685273, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + self::assertEquals(0.38149611267203, $response['geodetic']['latitude']); + self::assertEquals(310.86248495862, $response['geodetic']['longitude']); + self::assertEquals(189452.64114393186, $response['geodetic']['altitude']); - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + self::assertEquals(22049, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); } } diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6955955..86481ab 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -11,8 +11,8 @@ public function test404(): void $response = $this->get('/noop'); self::assertEquals( - $response->getStatusCode(), Response::HTTP_NOT_FOUND, + $response->getStatusCode(), 'Assert page not found returns HTTP 404' ); From 79ddd6755293fccc273e8998f349539d627b46b9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 08:50:03 +0200 Subject: [PATCH 141/221] annotations --- src/Command/UpdateImportSources.php | 1 + src/Controller/AbstractApiController.php | 3 ++- src/Controller/DocsController.php | 3 +++ src/Repository/TleRepository.php | 4 ++++ src/ViewModel/Observer.php | 3 +++ tests/AbstractWebTestCase.php | 3 +++ tests/CollectionTest.php | 1 + 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index fe3713c..6206d61 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -103,6 +103,7 @@ protected function getSources(): array if ($extension === 'txt') { if (parse_url($href, PHP_URL_HOST) === null) { + /** @noinspection PhpArrayKeyDoesNotMatchArrayShapeInspection */ if ($path[0] === '/') { $scheme = parse_url($catalog, PHP_URL_SCHEME); $host = parse_url($catalog, PHP_URL_HOST); diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 17f2a28..eba101f 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Service\DateTimeService; use App\Service\Validator\RequestValidator; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; @@ -117,7 +118,7 @@ public function response(array $data): JsonResponse protected function getDate(Request $request, string $name): \DateTime { - $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTimeInterface::ATOM)); + $date = $request->get($name, DateTimeService::getCurrentUTC()->format(\DateTimeInterface::ATOM)); return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); } diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 2564f29..cb14e4d 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -19,6 +19,9 @@ public function docs(): Response return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } + /** + * @throws \JsonException + */ #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index ce57f58..404e5df 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -87,6 +87,10 @@ public function collection( return $collection; } + /** + * @throws \Doctrine\ORM\NoResultException + * @throws \Doctrine\ORM\NonUniqueResultException + */ private function getCount(QueryBuilder $builder): int { $builder = clone $builder; diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 8fa4eeb..9120b7a 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -6,6 +6,9 @@ class Observer extends LatLng { public \DateTime $date; + /** + * @throws \Exception + */ public function __construct(float $latitude, float $longitude, public $altitude = 0, ?\DateTime $dateTime = null) { parent::__construct($latitude, $longitude); diff --git a/tests/AbstractWebTestCase.php b/tests/AbstractWebTestCase.php index 71b7270..2ef9f49 100644 --- a/tests/AbstractWebTestCase.php +++ b/tests/AbstractWebTestCase.php @@ -23,6 +23,9 @@ protected function get(string $url, array $params = []): Response return self::$client->getResponse(); } + /** + * @throws \JsonException + */ protected function toArray(Response $response): array { return json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index bbe070a..61bf1b8 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -104,6 +104,7 @@ private function assertViewIsCorrect($expected, $actual): void } } + /** @noinspection PhpSameParameterValueInspection */ private function getCollectionContent(int $page, int $pageSize): array { return $this->toArray( From ca4b15848b528f7ccc44d3a3975abc39063144b3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 09:44:11 +0200 Subject: [PATCH 142/221] annotations --- src/Controller/FlyOverController.php | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 7708290..f754f91 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,24 +55,15 @@ public function flyover( $parameters['satelliteId'] = $id; - $normalized = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); - - $members = []; - - foreach ($normalized as $index => $member) { - $members[] = [ - [ - '@id' => $this->generateUrl( - 'tle_flyover_details', - ['id' => $id, 'passId' => $index], - UrlGeneratorInterface::ABSOLUTE_URL - ), - ], - $member, + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); + + foreach ($members as $index => &$member) { + $item = [ + '@id' => $this->generateUrl('tle_flyover_details', ['id' => $id, 'passId' => $index], UrlGeneratorInterface::ABSOLUTE_URL), ]; - } - $members = array_merge([], ...$members); + $member = $item + $member; + } return $this->response( [ From bb55d90b67350538fadfb0042e72cb55d30711ef Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 10:59:28 +0200 Subject: [PATCH 143/221] fix map arbitrary date --- src/Controller/FlyOverController.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index f754f91..af24873 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -30,10 +30,11 @@ public function flyover( ): JsonResponse { $observer = $this->getObserver($request); $onlyVisible = $request->get('only_visible', true); + $tle = $this->getTle($id); $this->service ->setObserver($observer) - ->setTle($this->getTle($id)); + ->setTle($tle); if ($onlyVisible) { $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); @@ -71,6 +72,7 @@ public function flyover( '@id' => $url, '@type' => 'SatelliteFlyOverCollection', 'observer' => $this->normalizer->normalize($observer), + 'tle' => $this->normalizer->normalize($tle), 'member' => $members, 'parameters' => $parameters, ] @@ -85,10 +87,11 @@ public function flyoverDetails( ): JsonResponse { $observer = $this->getObserver($request); $onlyVisible = $request->get('only_visible', true); + $tle = $this->getTle($id); $this->service ->setObserver($observer) - ->setTle($this->getTle($id)); + ->setTle($tle); if ($onlyVisible) { $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); @@ -112,6 +115,7 @@ public function flyoverDetails( '@context' => self::HYDRA_CONTEXT, '@id' => $url, 'observer' => $this->normalizer->normalize($observer), + 'tle' => $this->normalizer->normalize($tle), ]; return $this->response( From 46b5694ca47aa7b0d61d9bc03cbc3c8cc52470bd Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 17:38:06 +0200 Subject: [PATCH 144/221] fix deploy script --- deploy.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/deploy.php b/deploy.php index 7834835..2995177 100644 --- a/deploy.php +++ b/deploy.php @@ -11,6 +11,7 @@ set('writable_mode', 'chmod'); set('default_stage', 'production'); set('bin/composer', '~/bin/composer.phar'); +set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader'); add('shared_files', [ '.env', 'public/robots.txt', @@ -55,12 +56,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', 'deploy:writable', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'deploy:dump-env', -// 'database:migrate', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:dump-env', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 342f56088e806454199eb15aadfaaa9b06a634c9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 13 Jun 2021 21:29:15 +0200 Subject: [PATCH 145/221] fix deploy script --- src/Controller/TleController.php | 11 ++++++++++ src/Repository/TleRepository.php | 12 +++++++++++ src/Service/Validator/RequestValidator.php | 7 +++++++ src/ViewModel/Filter.php | 21 +++++++++++++++---- .../TleCollectionSortableFieldsEnum.php | 1 + 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 192af77..68caf42 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -28,6 +28,7 @@ final class TleController extends AbstractApiController TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::SATELLITE_ID => Filter::FILTER_TYPE_ARRAY, ]; public function __construct(protected TleRepository $repository) @@ -70,6 +71,8 @@ public function collection( $extra = (bool)$request->get(self::PARAM_EXTRA, false); + $satelliteIds = $request->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); @@ -96,9 +99,17 @@ public function collection( ]; foreach ($filters as $filter) { + if ($filter->filter === TleCollectionSortableFieldsEnum::SATELLITE_ID) { + continue; + } $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; } + foreach ($satelliteIds as $index => $satelliteId) { + $name = \sprintf('%s[%d]', TleCollectionSortableFieldsEnum::SATELLITE_ID, $index); + $parameters[$name] = $satelliteId; + } + $response = [ '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 404e5df..4b4ee39 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Tle; use App\Entity\TleInformation; +use App\ViewModel\Filter; use App\ViewModel\Model\PaginationCollection; use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; @@ -57,6 +58,16 @@ public function collection( // filters foreach ($filters as $index => $filter) { + if ($filter->type === Filter::FILTER_TYPE_ARRAY) { + $paramName = \sprintf('param_%d', $index); + + $builder + ->andWhere(\sprintf("%s IN (:%s)", $this->getSortTableColumnMapping($filter->filter), $paramName)) + ->setParameter($paramName, $filter->value); + + continue; + } + $placeholder = \sprintf('filter_%s_%d', $filter->filter, $index); $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $placeholder)); $builder->setParameter($placeholder, $filter->value); @@ -104,6 +115,7 @@ private function getSortTableColumnMapping(string $sort): ?string { return match ($sort) { TleCollectionSortableFieldsEnum::ID => 'tle.id', + TleCollectionSortableFieldsEnum::SATELLITE_ID => 'tle.id', TleCollectionSortableFieldsEnum::NAME => 'tle.name', TleCollectionSortableFieldsEnum::POPULARITY => null, TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 14d3519..9826dc4 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -3,6 +3,7 @@ namespace App\Service\Validator; use App\ViewModel\Filter; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -103,6 +104,12 @@ protected function assertFilter(Request $request, array $filters): array foreach ($filters as $filter => $type) { $values = $request->get($filter, []); + if ($type === Filter::FILTER_TYPE_ARRAY) { + $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); + + continue; + } + foreach ($values as $operator => $value) { $result[] = new Filter($filter, $type, $operator, $value); } diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index 982c518..808751c 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -7,7 +7,9 @@ class Filter { public const FILTER_TYPE_FLOAT = 'float'; + public const FILTER_TYPE_ARRAY = 'array'; + public const OPERATOR_EQUAL = '='; public const OPERATOR_GREATER_THEN = '>'; public const OPERATOR_GREATER_THEN_EQUAL = '>='; public const OPERATOR_LESS_THEN = '<'; @@ -58,13 +60,14 @@ protected function validateOperator(): string return $operators[$this->operator]; } + if ($this->type === self::FILTER_TYPE_ARRAY) { + return self::OPERATOR_EQUAL; + } + return ''; } - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function validateValue(string $value): ?float + protected function validateValue(mixed $value): mixed { if ($this->type === self::FILTER_TYPE_FLOAT) { $value = (float)$value; @@ -78,6 +81,16 @@ protected function validateValue(string $value): ?float return $value; } + if ($this->type === self::FILTER_TYPE_ARRAY) { + if (!is_array($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + return null; } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index ca3bc88..43a2469 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -13,5 +13,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const ECCENTRICITY = 'eccentricity'; public const PERIOD = 'period'; public const RAAN = 'raan'; + public const SATELLITE_ID = 'satellite_id'; public const SEMI_MAJOR_AXIS = 'semi_major_axis'; } From 1bf4a2bcf362b0986596d514664b17b963059d3e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 13 Jun 2021 21:34:52 +0200 Subject: [PATCH 146/221] bugfix --- src/Service/Validator/RequestValidator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 9826dc4..8cd5969 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -104,7 +104,7 @@ protected function assertFilter(Request $request, array $filters): array foreach ($filters as $filter => $type) { $values = $request->get($filter, []); - if ($type === Filter::FILTER_TYPE_ARRAY) { + if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); continue; From 8b573e9c28fb7d5d7fed9519ec2392b34b12eaeb Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 07:49:22 +0200 Subject: [PATCH 147/221] bugfix --- composer.json | 1 + config/custom/tle.json | 2 +- config/packages/prod/sentry.yaml | 5 +++++ config/parameters.yaml | 2 ++ src/Controller/DocsController.php | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c47bcd3..72e66ab 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,7 @@ "description": "TLE API backend", "type": "project", "license": "proprietary", + "version": "1.3.2", "require": { "php": "^8.0", "ext-ctype": "*", diff --git a/config/custom/tle.json b/config/custom/tle.json index 445957b..bf1ab25 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.2" + "version": "" }, "servers": [ { diff --git a/config/packages/prod/sentry.yaml b/config/packages/prod/sentry.yaml index a03c7fe..76704fc 100644 --- a/config/packages/prod/sentry.yaml +++ b/config/packages/prod/sentry.yaml @@ -2,3 +2,8 @@ sentry: dsn: '%env(SENTRY_DSN)%' options: before_send: 'App\Service\SentryCallbackBeforeSend' + environment: '%kernel.environment%' + release: '%env(string:key:version:json:file:COMPOSER_JSON)%' + messenger: + enabled: true # flushes Sentry messages at the end of each message handling + capture_soft_fails: true # captures exceptions marked for retry too diff --git a/config/parameters.yaml b/config/parameters.yaml index 05163a5..35e11fd 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -1 +1,3 @@ parameters: + env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" + version: '%env(string:key:version:json:file:COMPOSER_JSON)%' diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index cb14e4d..be1d7ca 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -29,6 +29,8 @@ public function getJson(): JsonResponse $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + $docs['info']['version'] = $this->getParameter('version'); + return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } From eb06f90cc1998db0912635c347c8b205c66a675a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 09:56:25 +0200 Subject: [PATCH 148/221] rename config to etc --- {config => etc}/bootstrap.php | 98 +- {config => etc}/bundles.php | 0 {config => etc}/custom/source.yaml | 0 {config => etc}/custom/tle.json | 1034 ++++++++--------- {config => etc}/packages/cache.yaml | 0 {config => etc}/packages/dev/monolog.yaml | 0 {config => etc}/packages/doctrine.yaml | 0 .../packages/doctrine_migrations.yaml | 0 {config => etc}/packages/framework.yaml | 0 {config => etc}/packages/lock.yaml | 0 .../packages/prod/deprecations.yaml | 0 {config => etc}/packages/prod/doctrine.yaml | 0 {config => etc}/packages/prod/monolog.yaml | 0 {config => etc}/packages/prod/routing.yaml | 0 {config => etc}/packages/prod/sentry.yaml | 0 {config => etc}/packages/rate_limiter.yaml | 0 {config => etc}/packages/routing.yaml | 0 {config => etc}/packages/test/framework.yaml | 0 {config => etc}/packages/test/monolog.yaml | 0 {config => etc}/parameters.yaml | 6 +- {config => etc}/routes.yaml | 0 {config => etc}/services.yaml | 60 +- public/index.php | 4 +- src/Controller/DocsController.php | 2 +- src/Kernel.php | 8 +- 25 files changed, 606 insertions(+), 606 deletions(-) rename {config => etc}/bootstrap.php (97%) rename {config => etc}/bundles.php (100%) rename {config => etc}/custom/source.yaml (100%) rename {config => etc}/custom/tle.json (96%) rename {config => etc}/packages/cache.yaml (100%) rename {config => etc}/packages/dev/monolog.yaml (100%) rename {config => etc}/packages/doctrine.yaml (100%) rename {config => etc}/packages/doctrine_migrations.yaml (100%) rename {config => etc}/packages/framework.yaml (100%) rename {config => etc}/packages/lock.yaml (100%) rename {config => etc}/packages/prod/deprecations.yaml (100%) rename {config => etc}/packages/prod/doctrine.yaml (100%) rename {config => etc}/packages/prod/monolog.yaml (100%) rename {config => etc}/packages/prod/routing.yaml (100%) rename {config => etc}/packages/prod/sentry.yaml (100%) rename {config => etc}/packages/rate_limiter.yaml (100%) rename {config => etc}/packages/routing.yaml (100%) rename {config => etc}/packages/test/framework.yaml (100%) rename {config => etc}/packages/test/monolog.yaml (100%) rename {config => etc}/parameters.yaml (97%) rename {config => etc}/routes.yaml (100%) rename {config => etc}/services.yaml (97%) diff --git a/config/bootstrap.php b/etc/bootstrap.php similarity index 97% rename from config/bootstrap.php rename to etc/bootstrap.php index 9b1b3e9..452a4fb 100644 --- a/config/bootstrap.php +++ b/etc/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/config/bundles.php b/etc/bundles.php similarity index 100% rename from config/bundles.php rename to etc/bundles.php diff --git a/config/custom/source.yaml b/etc/custom/source.yaml similarity index 100% rename from config/custom/source.yaml rename to etc/custom/source.yaml diff --git a/config/custom/tle.json b/etc/custom/tle.json similarity index 96% rename from config/custom/tle.json rename to etc/custom/tle.json index bf1ab25..18927df 100644 --- a/config/custom/tle.json +++ b/etc/custom/tle.json @@ -1,517 +1,517 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "TLE API", - "version": "" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": { - "/api/tle/{id}": { - "get": { - "summary": "Record", - "operationId": "record", - "description": "Return single TleModel for requested satellite id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Satellite id", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TleModel" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle": { - "get": { - "summary": "Collection", - "operationId": "collection", - "description": "Return collection of TleModels depending on requested parameters", - "parameters": [ - { - "$ref": "#/components/parameters/search" - }, - { - "name": "sort", - "in": "query", - "description": "Sort by", - "schema": { - "type": "string", - "default": "name", - "enum": [ - "id", - "name", - "popularity", - "inclination", - "eccentricity", - "period" - ] - } - }, - { - "$ref": "#/components/parameters/sortDirection" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "name": "eccentricity[gte]", - "in": "query", - "description": "Filter records with orbital eccentricity greater then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "eccentricity[lte]", - "in": "query", - "description": "Filter records with orbital eccentricity less then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "inclination[lt]", - "in": "query", - "description": "Filter records with posigrade orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "inclination[gt]", - "in": "query", - "description": "Filter records with retrograde orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "period[lt]", - "in": "query", - "description": "Filter records with orbital period less than specified", - "required": false, - "example": 255 - }, - { - "name": "period[gt]", - "in": "query", - "description": "Filter records with orbital period greater than specified", - "required": false, - "example": 255 - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "properties": { - "@context": { - "type": "string", - "example": "http://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle" - }, - "@type": { - "type": "string", - "example": "Collection" - }, - "totalItems": { - "type": "integer", - "example": 10414 - }, - "member": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TleModel" - } - }, - "parameters": { - "type": "object" - }, - "view": { - "type": "object", - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - } - } - }, - "type": "object" - } - } - } - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle/{id}/propagate": { - "get": { - "summary": "Propagate (experimental)", - "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", - "operationId": "propagate", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Target satellite id for which propagation is calculated", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - }, - { - "name": "date", - "in": "query", - "description": "Target date and time", - "required": false, - "schema": { - "type": "string", - "example": "2021-04-20T16:28:40+00:00" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Propagation" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - } - }, - "components": { - "schemas": { - "Pagination": { - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - }, - "type": "object" - }, - "Exception": { - "properties": { - "response": { - "properties": { - "message": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "TleModel": { - "allOf": [ - { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/43638" - }, - "@type": { - "type": "string", - "example": "TleModel" - }, - "satelliteId": { - "type": "integer", - "example": 43638 - }, - "name": { - "type": "string", - "example": "1998-067PN" - }, - "date": { - "type": "string", - "example": "2021-02-16T06:41:41+00:00" - }, - "line1": { - "type": "string", - "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" - }, - "line2": { - "type": "string", - "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" - } - }, - "type": "object" - } - ] - }, - "Propagation": { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" - }, - "@type": { - "type": "string", - "example": "SatellitePropagationResult" - }, - "tle": { - "$ref": "#/components/schemas/TleModel" - }, - "algorithm": { - "type": "string", - "enum": ["SGP4", "SDP4"], - "description": "Algorithm used for propagation. Determined based on mean motion.", - "example": "SGP4" - }, - "vector": { - "properties": { - "reference_frame": { - "type": "string", - "example": "ECI" - }, - "position": { - "properties": { - "x": { - "type": "number", - "example": -2450.396984017652 - }, - "y": { - "type": "number", - "example": 6101.198295995954 - }, - "z": { - "type": "number", - "example": -6032.216318229235 - }, - "r": { - "type": "number", - "example": 8922.819046481767 - }, - "unit": { - "type": "string", - "example": "km" - } - }, - "type": "object" - }, - - "velocity": { - "properties": { - "x": { - "type": "number", - "example": -0.1644949004552056 - }, - "y": { - "type": "number", - "example": 4.639904402973215 - }, - "z": { - "type": "number", - "example": 4.406398357056158 - }, - "r": { - "type": "number", - "example": 6.400946642651633 - }, - "unit": { - "type": "string", - "example": "km/s" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "geodetic": { - "properties": { - "latitude": { - "type": "number", - "example": -42.67210184042445 - }, - "longitude": { - "type": "number", - "example": 124.524923099869 - }, - "altitude": { - "type": "number", - "example": 2554.4740343929398 - } - }, - "type": "object" - }, - "parameters": { - "properties": { - "date": { - "type": "string", - "example": "2021-04-26T08:39:45+00:00" - }, - "satelliteId": { - "type": "string", - "example": "44859" - } - }, - "type": "object" - } - }, - "type": "object" - } - }, - "responses": { - "404": { - "description": "Resource not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Resource not found" - } - } - } - } - }, - "500": { - "description": "Server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Server has encountered an internal error" - } - } - } - } - } - }, - "parameters": { - "search": { - "name": "search", - "in": "query", - "description": "Search string", - "schema": { - "type": "string", - "default": "*" - } - }, - "sortDirection": { - "name": "sort-dir", - "in": "query", - "description": "Sort direction", - "schema": { - "type": "string", - "default": "asc", - "enum": [ - "asc", - "desc" - ] - } - }, - "pageNumber": { - "name": "page", - "in": "query", - "description": "Page number", - "schema": { - "type": "integer", - "default": 1, - "minimum": 1 - } - }, - "pageSize": { - "name": "page-size", - "in": "query", - "description": "Number of collection member per page", - "schema": { - "type": "integer", - "default": 20, - "minimum": 1, - "maximum": 100 - } - } - } - } -} +{ + "openapi": "3.0.0", + "info": { + "title": "TLE API", + "version": "" + }, + "servers": [ + { + "url": "/" + } + ], + "paths": { + "/api/tle/{id}": { + "get": { + "summary": "Record", + "operationId": "record", + "description": "Return single TleModel for requested satellite id", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Satellite id", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TleModel" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle": { + "get": { + "summary": "Collection", + "operationId": "collection", + "description": "Return collection of TleModels depending on requested parameters", + "parameters": [ + { + "$ref": "#/components/parameters/search" + }, + { + "name": "sort", + "in": "query", + "description": "Sort by", + "schema": { + "type": "string", + "default": "name", + "enum": [ + "id", + "name", + "popularity", + "inclination", + "eccentricity", + "period" + ] + } + }, + { + "$ref": "#/components/parameters/sortDirection" + }, + { + "$ref": "#/components/parameters/pageNumber" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "name": "eccentricity[gte]", + "in": "query", + "description": "Filter records with orbital eccentricity greater then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "eccentricity[lte]", + "in": "query", + "description": "Filter records with orbital eccentricity less then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "inclination[lt]", + "in": "query", + "description": "Filter records with posigrade orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "inclination[gt]", + "in": "query", + "description": "Filter records with retrograde orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "period[lt]", + "in": "query", + "description": "Filter records with orbital period less than specified", + "required": false, + "example": 255 + }, + { + "name": "period[gt]", + "in": "query", + "description": "Filter records with orbital period greater than specified", + "required": false, + "example": 255 + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "properties": { + "@context": { + "type": "string", + "example": "http://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle" + }, + "@type": { + "type": "string", + "example": "Collection" + }, + "totalItems": { + "type": "integer", + "example": 10414 + }, + "member": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TleModel" + } + }, + "parameters": { + "type": "object" + }, + "view": { + "type": "object", + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + } + } + }, + "type": "object" + } + } + } + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle/{id}/propagate": { + "get": { + "summary": "Propagate (experimental)", + "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", + "operationId": "propagate", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Target satellite id for which propagation is calculated", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "description": "Target date and time", + "required": false, + "schema": { + "type": "string", + "example": "2021-04-20T16:28:40+00:00" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Propagation" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + } + }, + "components": { + "schemas": { + "Pagination": { + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + }, + "type": "object" + }, + "Exception": { + "properties": { + "response": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "TleModel": { + "allOf": [ + { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/43638" + }, + "@type": { + "type": "string", + "example": "TleModel" + }, + "satelliteId": { + "type": "integer", + "example": 43638 + }, + "name": { + "type": "string", + "example": "1998-067PN" + }, + "date": { + "type": "string", + "example": "2021-02-16T06:41:41+00:00" + }, + "line1": { + "type": "string", + "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" + }, + "line2": { + "type": "string", + "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" + } + }, + "type": "object" + } + ] + }, + "Propagation": { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" + }, + "@type": { + "type": "string", + "example": "SatellitePropagationResult" + }, + "tle": { + "$ref": "#/components/schemas/TleModel" + }, + "algorithm": { + "type": "string", + "enum": ["SGP4", "SDP4"], + "description": "Algorithm used for propagation. Determined based on mean motion.", + "example": "SGP4" + }, + "vector": { + "properties": { + "reference_frame": { + "type": "string", + "example": "ECI" + }, + "position": { + "properties": { + "x": { + "type": "number", + "example": -2450.396984017652 + }, + "y": { + "type": "number", + "example": 6101.198295995954 + }, + "z": { + "type": "number", + "example": -6032.216318229235 + }, + "r": { + "type": "number", + "example": 8922.819046481767 + }, + "unit": { + "type": "string", + "example": "km" + } + }, + "type": "object" + }, + + "velocity": { + "properties": { + "x": { + "type": "number", + "example": -0.1644949004552056 + }, + "y": { + "type": "number", + "example": 4.639904402973215 + }, + "z": { + "type": "number", + "example": 4.406398357056158 + }, + "r": { + "type": "number", + "example": 6.400946642651633 + }, + "unit": { + "type": "string", + "example": "km/s" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "geodetic": { + "properties": { + "latitude": { + "type": "number", + "example": -42.67210184042445 + }, + "longitude": { + "type": "number", + "example": 124.524923099869 + }, + "altitude": { + "type": "number", + "example": 2554.4740343929398 + } + }, + "type": "object" + }, + "parameters": { + "properties": { + "date": { + "type": "string", + "example": "2021-04-26T08:39:45+00:00" + }, + "satelliteId": { + "type": "string", + "example": "44859" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "responses": { + "404": { + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Resource not found" + } + } + } + } + }, + "500": { + "description": "Server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Server has encountered an internal error" + } + } + } + } + } + }, + "parameters": { + "search": { + "name": "search", + "in": "query", + "description": "Search string", + "schema": { + "type": "string", + "default": "*" + } + }, + "sortDirection": { + "name": "sort-dir", + "in": "query", + "description": "Sort direction", + "schema": { + "type": "string", + "default": "asc", + "enum": [ + "asc", + "desc" + ] + } + }, + "pageNumber": { + "name": "page", + "in": "query", + "description": "Page number", + "schema": { + "type": "integer", + "default": 1, + "minimum": 1 + } + }, + "pageSize": { + "name": "page-size", + "in": "query", + "description": "Number of collection member per page", + "schema": { + "type": "integer", + "default": 20, + "minimum": 1, + "maximum": 100 + } + } + } + } +} diff --git a/config/packages/cache.yaml b/etc/packages/cache.yaml similarity index 100% rename from config/packages/cache.yaml rename to etc/packages/cache.yaml diff --git a/config/packages/dev/monolog.yaml b/etc/packages/dev/monolog.yaml similarity index 100% rename from config/packages/dev/monolog.yaml rename to etc/packages/dev/monolog.yaml diff --git a/config/packages/doctrine.yaml b/etc/packages/doctrine.yaml similarity index 100% rename from config/packages/doctrine.yaml rename to etc/packages/doctrine.yaml diff --git a/config/packages/doctrine_migrations.yaml b/etc/packages/doctrine_migrations.yaml similarity index 100% rename from config/packages/doctrine_migrations.yaml rename to etc/packages/doctrine_migrations.yaml diff --git a/config/packages/framework.yaml b/etc/packages/framework.yaml similarity index 100% rename from config/packages/framework.yaml rename to etc/packages/framework.yaml diff --git a/config/packages/lock.yaml b/etc/packages/lock.yaml similarity index 100% rename from config/packages/lock.yaml rename to etc/packages/lock.yaml diff --git a/config/packages/prod/deprecations.yaml b/etc/packages/prod/deprecations.yaml similarity index 100% rename from config/packages/prod/deprecations.yaml rename to etc/packages/prod/deprecations.yaml diff --git a/config/packages/prod/doctrine.yaml b/etc/packages/prod/doctrine.yaml similarity index 100% rename from config/packages/prod/doctrine.yaml rename to etc/packages/prod/doctrine.yaml diff --git a/config/packages/prod/monolog.yaml b/etc/packages/prod/monolog.yaml similarity index 100% rename from config/packages/prod/monolog.yaml rename to etc/packages/prod/monolog.yaml diff --git a/config/packages/prod/routing.yaml b/etc/packages/prod/routing.yaml similarity index 100% rename from config/packages/prod/routing.yaml rename to etc/packages/prod/routing.yaml diff --git a/config/packages/prod/sentry.yaml b/etc/packages/prod/sentry.yaml similarity index 100% rename from config/packages/prod/sentry.yaml rename to etc/packages/prod/sentry.yaml diff --git a/config/packages/rate_limiter.yaml b/etc/packages/rate_limiter.yaml similarity index 100% rename from config/packages/rate_limiter.yaml rename to etc/packages/rate_limiter.yaml diff --git a/config/packages/routing.yaml b/etc/packages/routing.yaml similarity index 100% rename from config/packages/routing.yaml rename to etc/packages/routing.yaml diff --git a/config/packages/test/framework.yaml b/etc/packages/test/framework.yaml similarity index 100% rename from config/packages/test/framework.yaml rename to etc/packages/test/framework.yaml diff --git a/config/packages/test/monolog.yaml b/etc/packages/test/monolog.yaml similarity index 100% rename from config/packages/test/monolog.yaml rename to etc/packages/test/monolog.yaml diff --git a/config/parameters.yaml b/etc/parameters.yaml similarity index 97% rename from config/parameters.yaml rename to etc/parameters.yaml index 35e11fd..1d32fae 100644 --- a/config/parameters.yaml +++ b/etc/parameters.yaml @@ -1,3 +1,3 @@ -parameters: - env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" - version: '%env(string:key:version:json:file:COMPOSER_JSON)%' +parameters: + env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" + version: '%env(string:key:version:json:file:COMPOSER_JSON)%' diff --git a/config/routes.yaml b/etc/routes.yaml similarity index 100% rename from config/routes.yaml rename to etc/routes.yaml diff --git a/config/services.yaml b/etc/services.yaml similarity index 97% rename from config/services.yaml rename to etc/services.yaml index 3235b01..6a1b3f7 100644 --- a/config/services.yaml +++ b/etc/services.yaml @@ -1,30 +1,30 @@ -# This file is the entry point to configure your own services. -# Files in the packages/ subdirectory configure your dependencies. - -# Put parameters here that don't need to change on each machine where the app is deployed -# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: - -services: - # default configuration for services in *this* file - _defaults: - autowire: true # Automatically injects dependencies in your services. - autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. - - # makes classes in src/ available to be used as services - # this creates a service per class whose id is the fully-qualified class name - App\: - resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - bind: - $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" - - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - - # add more service definitions when explicit configuration is needed - # please note that last definitions always *replace* previous ones +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + bind: + $env: '%kernel.environment%' + $projectDir: "%kernel.project_dir%" + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/public/index.php b/public/index.php index f094a9b..9ca9419 100644 --- a/public/index.php +++ b/public/index.php @@ -4,7 +4,7 @@ use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; -require dirname(__DIR__).'/config/bootstrap.php'; +require dirname(__DIR__).'/etc/bootstrap.php'; if ($_SERVER['APP_DEBUG']) { umask(0000); @@ -13,7 +13,7 @@ } if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { - Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); + Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_FOR ^ Request::HEADER_X_FORWARDED_HOST); } if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) { diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index be1d7ca..343af1f 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -25,7 +25,7 @@ public function docs(): Response #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - $path = $this->getProjectDir() . '/config/custom/tle.json'; + $path = $this->getProjectDir() . '/etc/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); diff --git a/src/Kernel.php b/src/Kernel.php index d842862..19c3e4c 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -24,7 +24,7 @@ class Kernel extends BaseKernel */ public function registerBundles(): iterable { - $contents = require $this->getProjectDir().'/config/bundles.php'; + $contents = require $this->getProjectDir().'/etc/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { yield new $class(); @@ -41,10 +41,10 @@ public function getProjectDir(): string /** @throws \Exception */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { - $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); + $container->addResource(new FileResource($this->getProjectDir().'/etc/bundles.php')); $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400); $container->setParameter('container.dumper.inline_factories', true); - $confDir = $this->getProjectDir().'/config'; + $confDir = $this->getProjectDir().'/etc'; $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); @@ -56,7 +56,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa /** @throws \Exception */ protected function configureRoutes(RoutingConfigurator $routes): void { - $confDir = $this->getProjectDir().'/config'; + $confDir = $this->getProjectDir().'/etc'; $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); From 8b16d57e168f0e0f1cf9fccffe81fcb205f6f6ee Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 10:03:07 +0200 Subject: [PATCH 149/221] rename config to etc --- src/Kernel.php | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Kernel.php b/src/Kernel.php index 19c3e4c..35824d9 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -9,22 +9,15 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; -/** - * @codeCoverageIgnore - */ class Kernel extends BaseKernel { use MicroKernelTrait; private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; - /** - * @noinspection UsingInclusionReturnValueInspection - * @noinspection PhpIncludeInspection - */ public function registerBundles(): iterable { - $contents = require $this->getProjectDir().'/etc/bundles.php'; + $contents = require $this->getConfigDir() . '/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { yield new $class(); @@ -32,31 +25,37 @@ public function registerBundles(): iterable } } - /** @noinspection PhpMissingParentCallCommonInspection */ public function getProjectDir(): string { return \dirname(__DIR__); } - /** @throws \Exception */ + public function getConfigDir(): string + { + return $this->getProjectDir() . '/etc'; + } + + /** + * @throws \Exception + */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { - $container->addResource(new FileResource($this->getProjectDir().'/etc/bundles.php')); + $confDir = $this->getConfigDir(); + + $container->addResource(new FileResource($confDir . '/bundles.php')); $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400); $container->setParameter('container.dumper.inline_factories', true); - $confDir = $this->getProjectDir().'/etc'; - $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{parameters}'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{packages}/' . $this->environment . '/*' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{parameters}' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); } - /** @throws \Exception */ protected function configureRoutes(RoutingConfigurator $routes): void { - $confDir = $this->getProjectDir().'/etc'; + $confDir = $this->getConfigDir(); $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); From 81dfa0d15e8b3fe1a8a68236f485d07cb9ebb1d6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 25 Jul 2021 15:03:16 +0200 Subject: [PATCH 150/221] add optional progress bar --- bin/console | 2 +- src/Command/ImportTleCommand.php | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/bin/console b/bin/console index 5d5c80f..a9fa7b0 100644 --- a/bin/console +++ b/bin/console @@ -27,7 +27,7 @@ if ($input->hasParameterOption('--no-debug', true)) { putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); } -require dirname(__DIR__).'/config/bootstrap.php'; +require dirname(__DIR__).'/etc/bootstrap.php'; if ($_SERVER['APP_DEBUG']) { umask(0000); diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 5ff15c0..e2692a3 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -13,6 +13,7 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Yaml\Yaml; @@ -21,7 +22,9 @@ final class ImportTleCommand extends Command use FileSystemAwareTrait; private const BATCH_SIZE = 50; - public const SOURCE = '/config/custom/source.yaml'; + private const OPTION_NO_PROGRESS = 'no-progress'; + + public const SOURCE = '/etc/custom/source.yaml'; private EntityManagerInterface $em; private TleRepository $repository; @@ -38,12 +41,15 @@ public function __construct(EntityManagerInterface $em, TleRepository $repositor /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { - $this->setName('import:tle'); + $this->setName('import:tle') + ->addOption(self::OPTION_NO_PROGRESS, null, InputOption::VALUE_OPTIONAL, 'Hide progress bar', false); } /** @noinspection PhpMissingParentCallCommonInspection */ protected function execute(InputInterface $input, OutputInterface $output): int { + $showProgress = $input->getOption(self::OPTION_NO_PROGRESS) === false; + $this->satellites = $this->repository->fetchAllIndexed(); $totalInsert = 0; @@ -51,12 +57,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int $sources = Yaml::parseFile($this->getProjectDir() . self::SOURCE); - $progressBar = new ProgressBar($output, \count($sources)); - $progressBar->start(); + if ($showProgress) { + $progressBar = new ProgressBar($output, \count($sources)); + $progressBar->start(); + } foreach ($sources as $uri) { /** @noinspection DisconnectedForeachInstructionInspection */ - $progressBar->advance(); + if (isset($progressBar)) { + $progressBar->advance(); + } try { $response = (new Client())->request('GET', $uri); @@ -96,7 +106,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int } - $progressBar->finish(); + if (isset($progressBar)) { + $progressBar->finish(); + } $output->writeln(''); $output->writeln(''); From e17cebb0a289159534664ff5eadded064c3a4663 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 13:00:14 +0200 Subject: [PATCH 151/221] upgrade --- .env | 78 +- composer.lock | 598 +++++----- deploy.php | 144 +-- etc/bootstrap.php | 98 +- etc/custom/tle.json | 1034 ++++++++--------- etc/packages/prod/sentry.yaml | 18 +- etc/packages/rate_limiter.yaml | 14 +- etc/parameters.yaml | 6 +- etc/services.yaml | 60 +- phpunit.xml.dist | 3 +- src/Command/CleanupCommand.php | 66 +- src/Enum/PropagatorAlgorithm.php | 22 +- src/Event/ApiLimiterSubscriber.php | 140 +-- src/Repository/RequestRepository.php | 54 +- src/Service/FeatureFlag.php | 16 +- src/Service/Route.php | 30 +- src/Service/SentryCallbackBeforeSend.php | 52 +- tests/Controller/DocsControllerTest.php | 88 +- tests/Controller/PropagateControllerTest.php | 222 ++-- tests/Controller/StatisticsControllerTest.php | 32 +- tests/Controller/TleControllerTest.php | 106 +- tests/Service/SentryCallbackTest.php | 86 +- 22 files changed, 1470 insertions(+), 1497 deletions(-) diff --git a/.env b/.env index a4744f6..672cdbd 100644 --- a/.env +++ b/.env @@ -1,39 +1,39 @@ -# In all environments, the following files are loaded if they exist, -# the latter taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration - -###> symfony/framework-bundle ### -APP_ENV=dev -APP_SECRET=c165ffa974b09ac4d1bd06daf956753b -#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -#TRUSTED_HOSTS='^localhost|example\.com$' -###< symfony/framework-bundle ### - -###> doctrine/doctrine-bundle ### -# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" -# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" -# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 -###< doctrine/doctrine-bundle ### - -###> sentry/sentry-symfony ### -SENTRY_DSN= -###< sentry/sentry-symfony ### - -###> symfony/lock ### -# Choose one of the stores below -# postgresql+advisory://db_user:db_password@localhost/db_name -LOCK_DSN=semaphore -###< symfony/lock ### +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=c165ffa974b09ac4d1bd06daf956753b +#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 +#TRUSTED_HOSTS='^localhost|example\.com$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 +###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=semaphore +###< symfony/lock ### diff --git a/composer.lock b/composer.lock index 1715c82..14f96bb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f253f5360f5a5801c6fa721bde0c08b5", + "content-hash": "71e846a8b6688a9e07c24696b2d0ad75", "packages": [ { "name": "beberlei/doctrineextensions", @@ -2294,16 +2294,16 @@ }, { "name": "myclabs/php-enum", - "version": "1.8.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "46cf3d8498b095bd33727b13fd5707263af99421" + "reference": "b942d263c641ddb5190929ff840c68f78713e937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/46cf3d8498b095bd33727b13fd5707263af99421", - "reference": "46cf3d8498b095bd33727b13fd5707263af99421", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", "shasum": "" }, "require": { @@ -2313,7 +2313,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.5.1" + "vimeo/psalm": "^4.6.2" }, "type": "library", "autoload": { @@ -2338,7 +2338,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.0" + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" }, "funding": [ { @@ -2350,7 +2350,7 @@ "type": "tidelift" } ], - "time": "2021-02-15T16:11:48+00:00" + "time": "2021-07-05T08:18:36+00:00" }, { "name": "php-http/client-common", @@ -3444,21 +3444,22 @@ }, { "name": "symfony/asset", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637" + "reference": "9bd222a8fdd13ecca91384e403247103198f80a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/4c8d354b8931788f2b07953cfe6846e5cda27637", - "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637", + "url": "https://api.github.com/repos/symfony/asset/zipball/9bd222a8fdd13ecca91384e403247103198f80a1", + "reference": "9bd222a8fdd13ecca91384e403247103198f80a1", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/http-foundation": "<5.3" @@ -3497,7 +3498,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.3.0" + "source": "https://github.com/symfony/asset/tree/v5.3.4" }, "funding": [ { @@ -3513,25 +3514,26 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734" + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/379984e25eee9811b0a25a2105e1a2b3b8d9b734", - "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c", + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0" + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/css-selector": "^4.4|^5.0", @@ -3568,7 +3570,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.3.0" + "source": "https://github.com/symfony/browser-kit/tree/v5.3.4" }, "funding": [ { @@ -3584,29 +3586,29 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/cache", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608" + "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/44fd0f97d1fb198d344f22379dfc56af2221e608", - "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608", + "url": "https://api.github.com/repos/symfony/cache/zipball/944db6004fc374fbe032d18e07cce51cc4e1e661", + "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1", + "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^1.1.7|^2", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -3664,7 +3666,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.3.0" + "source": "https://github.com/symfony/cache/tree/v5.3.4" }, "funding": [ { @@ -3680,7 +3682,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/cache-contracts", @@ -3763,16 +3765,16 @@ }, { "name": "symfony/config", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810" + "reference": "4268f3059c904c61636275182707f81645517a37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9f4a448c2d7fd2c90882dfff930b627ddbe16810", - "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810", + "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", + "reference": "4268f3059c904c61636275182707f81645517a37", "shasum": "" }, "require": { @@ -3780,7 +3782,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" }, "conflict": { @@ -3822,7 +3824,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.3.0" + "source": "https://github.com/symfony/config/tree/v5.3.4" }, "funding": [ { @@ -3838,20 +3840,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/console", - "version": "v5.3.0", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", + "url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "shasum": "" }, "require": { @@ -3859,11 +3861,12 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/string": "^5.1" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -3871,10 +3874,10 @@ "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", @@ -3920,7 +3923,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.0" + "source": "https://github.com/symfony/console/tree/v5.3.6" }, "funding": [ { @@ -3936,24 +3939,25 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-27T19:10:22+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", - "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -3985,7 +3989,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.0" + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" }, "funding": [ { @@ -4001,27 +4005,27 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:40:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4" + "reference": "5a825e4b386066167a8b55487091cb62beec74c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/94d973cb742d8c5c5dcf9534220e6b73b09af1d4", - "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a825e4b386066167a8b55487091cb62beec74c2", + "reference": "5a825e4b386066167a8b55487091cb62beec74c2", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -4073,7 +4077,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.3.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.4" }, "funding": [ { @@ -4089,7 +4093,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:57:12+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4160,16 +4164,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.3.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03" + "reference": "70bffec510b08e4830d851ad485a996b130fcd7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/29516dcc8165bc7e2339182a9360ea7d3471fb03", - "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/70bffec510b08e4830d851ad485a996b130fcd7c", + "reference": "70bffec510b08e4830d851ad485a996b130fcd7c", "shasum": "" }, "require": { @@ -4179,7 +4183,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2" }, "conflict": { @@ -4253,7 +4257,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.4" }, "funding": [ { @@ -4269,20 +4273,20 @@ "type": "tidelift" } ], - "time": "2021-06-01T15:43:02+00:00" + "time": "2021-07-21T13:18:10+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd" + "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/55fff62b19f413f897a752488ade1bc9c8a19cdd", - "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2dd8890bd01be59a5221999c05ccf0fcafcb354f", + "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f", "shasum": "" }, "require": { @@ -4290,7 +4294,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "masterminds/html5": "<2.6" @@ -4328,7 +4332,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.3.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.4" }, "funding": [ { @@ -4344,20 +4348,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/dotenv", - "version": "v5.3.0", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c" + "reference": "b6d44663cff8c9880ee64d232870293a11e14cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac423fcc9548709077f90aca26c733cdb7e6e5c", - "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/b6d44663cff8c9880ee64d232870293a11e14cd6", + "reference": "b6d44663cff8c9880ee64d232870293a11e14cd6", "shasum": "" }, "require": { @@ -4398,7 +4402,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.3.0" + "source": "https://github.com/symfony/dotenv/tree/v5.3.6" }, "funding": [ { @@ -4414,26 +4418,25 @@ "type": "tidelift" } ], - "time": "2021-05-26T12:52:38+00:00" + "time": "2021-07-29T06:20:01+00:00" }, { "name": "symfony/error-handler", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2" + "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/0e6768b8c0dcef26df087df2bbbaa143867a59b2", - "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/281f6c4660bcf5844bb0346fe3a4664722fe4c73", + "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", + "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -4467,7 +4470,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.0" + "source": "https://github.com/symfony/error-handler/tree/v5.3.4" }, "funding": [ { @@ -4483,27 +4486,27 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" + "reference": "f2fd2208157553874560f3645d4594303058c4bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f2fd2208157553874560f3645d4594303058c4bd", + "reference": "f2fd2208157553874560f3645d4594303058c4bd", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -4513,7 +4516,7 @@ "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", @@ -4552,7 +4555,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.4" }, "funding": [ { @@ -4568,7 +4571,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4651,21 +4654,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4693,7 +4697,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.0" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -4709,24 +4713,25 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + "reference": "17f50e06018baec41551a71a15731287dbaab186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", + "reference": "17f50e06018baec41551a71a15731287dbaab186", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4754,7 +4759,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" + "source": "https://github.com/symfony/finder/tree/v5.3.4" }, "funding": [ { @@ -4770,20 +4775,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T12:52:38+00:00" + "time": "2021-07-23T15:54:19+00:00" }, { "name": "symfony/flex", - "version": "v1.13.3", + "version": "v1.13.4", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7" + "reference": "d81196c3f3b544e32997b67e955fb8291fdfe770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/2597d0dda8042c43eed44a9cd07236b897e427d7", - "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7", + "url": "https://api.github.com/repos/symfony/flex/zipball/d81196c3f3b544e32997b67e955fb8291fdfe770", + "reference": "d81196c3f3b544e32997b67e955fb8291fdfe770", "shasum": "" }, "require": { @@ -4822,7 +4827,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.13.3" + "source": "https://github.com/symfony/flex/tree/v1.13.4" }, "funding": [ { @@ -4838,20 +4843,20 @@ "type": "tidelift" } ], - "time": "2021-05-19T07:19:15+00:00" + "time": "2021-08-03T08:14:48+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "99196372c703b8cc97ee61d63d98acbf9896d425" + "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/99196372c703b8cc97ee61d63d98acbf9896d425", - "reference": "99196372c703b8cc97ee61d63d98acbf9896d425", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", + "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", "shasum": "" }, "require": { @@ -4868,7 +4873,7 @@ "symfony/http-foundation": "^5.3", "symfony/http-kernel": "^5.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/routing": "^5.3" }, "conflict": { @@ -4906,67 +4911,35 @@ "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/allmysms-notifier": "^5.3", "symfony/asset": "^5.3", "symfony/browser-kit": "^4.4|^5.0", - "symfony/clickatell-notifier": "^5.3", "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", - "symfony/discord-notifier": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/dotenv": "^5.1", - "symfony/esendex-notifier": "^5.3", "symfony/expression-language": "^4.4|^5.0", - "symfony/fake-chat-notifier": "^5.3", - "symfony/fake-sms-notifier": "^5.3", - "symfony/firebase-notifier": "^5.3", "symfony/form": "^5.2", - "symfony/free-mobile-notifier": "^5.3", - "symfony/gatewayapi-notifier": "^5.3", - "symfony/gitter-notifier": "^5.3", - "symfony/google-chat-notifier": "^5.3", "symfony/http-client": "^4.4|^5.0", - "symfony/infobip-notifier": "^5.3", - "symfony/iqsms-notifier": "^5.3", - "symfony/light-sms-notifier": "^5.3", - "symfony/linked-in-notifier": "^5.3", "symfony/lock": "^4.4|^5.0", "symfony/mailer": "^5.2", - "symfony/mattermost-notifier": "^5.3", - "symfony/message-bird-notifier": "^5.3", "symfony/messenger": "^5.2", - "symfony/microsoft-teams-notifier": "^5.3", "symfony/mime": "^4.4|^5.0", - "symfony/mobyt-notifier": "^5.3", - "symfony/nexmo-notifier": "^5.3", "symfony/notifier": "^5.3", - "symfony/octopush-notifier": "^5.3", - "symfony/ovh-cloud-notifier": "^5.3", "symfony/phpunit-bridge": "^5.3", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", "symfony/rate-limiter": "^5.2", - "symfony/rocket-chat-notifier": "^5.3", "symfony/security-bundle": "^5.3", - "symfony/sendinblue-notifier": "^5.3", "symfony/serializer": "^5.2", - "symfony/sinch-notifier": "^5.3", - "symfony/slack-notifier": "^5.3", - "symfony/sms-biuras-notifier": "^5.3", - "symfony/smsapi-notifier": "^5.3", - "symfony/spot-hit-notifier": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/string": "^5.0", - "symfony/telegram-notifier": "^5.3", "symfony/translation": "^5.3", "symfony/twig-bundle": "^4.4|^5.0", - "symfony/twilio-notifier": "^5.3", "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", - "symfony/zulip-notifier": "^5.3", "twig/twig": "^2.10|^3.0" }, "suggest": { @@ -5005,7 +4978,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.3.0" + "source": "https://github.com/symfony/framework-bundle/tree/v5.3.4" }, "funding": [ { @@ -5021,29 +4994,29 @@ "type": "tidelift" } ], - "time": "2021-05-31T10:12:54+00:00" + "time": "2021-07-25T09:39:16+00:00" }, { "name": "symfony/http-client", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136" + "reference": "67c177d4df8601d9a71f9d615c52171c98d22d74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/ef85ca5fa7a4f9c57592fab49faeccdf22b13136", - "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136", + "url": "https://api.github.com/repos/symfony/http-client/zipball/67c177d4df8601d9a71f9d615c52171c98d22d74", + "reference": "67c177d4df8601d9a71f9d615c52171c98d22d74", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1.0", + "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.1", "symfony/http-client-contracts": "^2.4", "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.0|^2" }, "provide": { @@ -5092,7 +5065,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.3.0" + "source": "https://github.com/symfony/http-client/tree/v5.3.4" }, "funding": [ { @@ -5108,7 +5081,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/http-client-contracts", @@ -5190,23 +5163,23 @@ }, { "name": "symfony/http-foundation", - "version": "v5.3.1", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "8827b90cf8806e467124ad476acd15216c2fceb6" + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8827b90cf8806e467124ad476acd15216c2fceb6", - "reference": "8827b90cf8806e467124ad476acd15216c2fceb6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", @@ -5243,7 +5216,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.6" }, "funding": [ { @@ -5259,25 +5232,25 @@ "type": "tidelift" } ], - "time": "2021-06-02T09:32:00+00:00" + "time": "2021-07-27T17:08:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.1", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864" + "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/74eb022e3bac36b3d3a897951a98759f2b32b864", - "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/60030f209018356b3b553b9dbd84ad2071c1b7e0", + "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", @@ -5285,7 +5258,7 @@ "symfony/http-foundation": "^5.3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/browser-kit": "<4.4", @@ -5304,7 +5277,7 @@ "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", @@ -5355,7 +5328,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.1" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.6" }, "funding": [ { @@ -5371,27 +5344,27 @@ "type": "tidelift" } ], - "time": "2021-06-02T10:07:12+00:00" + "time": "2021-07-29T07:06:27+00:00" }, { "name": "symfony/lock", - "version": "v5.3.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8" + "reference": "a78fda52b1b6f74d60e642e91d0e0133b08a8546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/cf21749b2733508f0e1031c0a531cefa3efca0b8", - "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8", + "url": "https://api.github.com/repos/symfony/lock/zipball/a78fda52b1b6f74d60e642e91d0e0133b08a8546", + "reference": "a78fda52b1b6f74d60e642e91d0e0133b08a8546", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "doctrine/dbal": "<2.10" @@ -5435,7 +5408,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.3.1" + "source": "https://github.com/symfony/lock/tree/v5.3.4" }, "funding": [ { @@ -5451,20 +5424,20 @@ "type": "tidelift" } ], - "time": "2021-06-01T18:47:32+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "84841557874df015ef2843aa16ac63d09f97c7b9" + "reference": "a0d881165b902a04f41e873426aa52a068064ac4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/84841557874df015ef2843aa16ac63d09f97c7b9", - "reference": "84841557874df015ef2843aa16ac63d09f97c7b9", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/a0d881165b902a04f41e873426aa52a068064ac4", + "reference": "a0d881165b902a04f41e873426aa52a068064ac4", "shasum": "" }, "require": { @@ -5472,6 +5445,7 @@ "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^5.3", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2" }, "conflict": { @@ -5518,7 +5492,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.4" }, "funding": [ { @@ -5534,7 +5508,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/monolog-bundle", @@ -5619,23 +5593,23 @@ }, { "name": "symfony/options-resolver", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" + "reference": "a603e5701bd6e305cfc777a8b50bf081ef73105e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", - "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a603e5701bd6e305cfc777a8b50bf081ef73105e", + "reference": "a603e5701bd6e305cfc777a8b50bf081ef73105e", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5668,7 +5642,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.4" }, "funding": [ { @@ -5684,7 +5658,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/orm-pack", @@ -5734,16 +5708,16 @@ }, { "name": "symfony/password-hasher", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "d487faef0347d5351d3e361e123a73496595509f" + "reference": "61dd1e90fa0ebf6f4982787b1e033a9606357d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d487faef0347d5351d3e361e123a73496595509f", - "reference": "d487faef0347d5351d3e361e123a73496595509f", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/61dd1e90fa0ebf6f4982787b1e033a9606357d7e", + "reference": "61dd1e90fa0ebf6f4982787b1e033a9606357d7e", "shasum": "" }, "require": { @@ -5787,7 +5761,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.3.0" + "source": "https://github.com/symfony/password-hasher/tree/v5.3.4" }, "funding": [ { @@ -5803,20 +5777,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-06-30T13:49:12+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -5868,7 +5842,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, "funding": [ { @@ -5884,7 +5858,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6059,16 +6033,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -6119,7 +6093,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6135,7 +6109,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php73", @@ -6218,16 +6192,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6281,7 +6255,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -6297,7 +6271,7 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/polyfill-php81", @@ -6459,22 +6433,22 @@ }, { "name": "symfony/property-access", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb" + "reference": "098681253076af7070df7d9debe5f75733eea189" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/8988399a556cffb0fba9bb3603f8d1ba4543eceb", - "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb", + "url": "https://api.github.com/repos/symfony/property-access/zipball/098681253076af7070df7d9debe5f75733eea189", + "reference": "098681253076af7070df7d9debe5f75733eea189", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/property-info": "^5.2" }, "require-dev": { @@ -6520,7 +6494,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.3.0" + "source": "https://github.com/symfony/property-access/tree/v5.3.4" }, "funding": [ { @@ -6536,26 +6510,26 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/property-info", - "version": "v5.3.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf" + "reference": "0f42009150679a7a256eb6ee106401af5d974ed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/6f8bff281f215dbf41929c7ec6f8309cdc0912cf", - "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf", + "url": "https://api.github.com/repos/symfony/property-info/zipball/0f42009150679a7a256eb6ee106401af5d974ed2", + "reference": "0f42009150679a7a256eb6ee106401af5d974ed2", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/string": "^5.1" }, "conflict": { @@ -6610,7 +6584,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.3.1" + "source": "https://github.com/symfony/property-info/tree/v5.3.4" }, "funding": [ { @@ -6626,20 +6600,20 @@ "type": "tidelift" } ], - "time": "2021-05-31T12:40:48+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.1.0", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9012994c4b4fb23e7c57dd86b763a417a04feba", + "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba", "shasum": "" }, "require": { @@ -6649,7 +6623,7 @@ }, "require-dev": { "nyholm/psr7": "^1.1", - "psr/log": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", "symfony/browser-kit": "^4.4 || ^5.0", "symfony/config": "^4.4 || ^5.0", "symfony/event-dispatcher": "^4.4 || ^5.0", @@ -6698,7 +6672,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.1" }, "funding": [ { @@ -6714,20 +6688,20 @@ "type": "tidelift" } ], - "time": "2021-02-17T10:35:25+00:00" + "time": "2021-07-27T17:25:39+00:00" }, { "name": "symfony/rate-limiter", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "e9226c91163495ff0b655cdae0fff682e869640b" + "reference": "d00d756e2c9f9c8cc7964c19e619bfe19702559a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/e9226c91163495ff0b655cdae0fff682e869640b", - "reference": "e9226c91163495ff0b655cdae0fff682e869640b", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/d00d756e2c9f9c8cc7964c19e619bfe19702559a", + "reference": "d00d756e2c9f9c8cc7964c19e619bfe19702559a", "shasum": "" }, "require": { @@ -6768,7 +6742,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.3.0" + "source": "https://github.com/symfony/rate-limiter/tree/v5.3.4" }, "funding": [ { @@ -6784,26 +6758,26 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-15T22:22:12+00:00" }, { "name": "symfony/routing", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "368e81376a8e049c37cb80ae87dbfbf411279199" + "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/368e81376a8e049c37cb80ae87dbfbf411279199", - "reference": "368e81376a8e049c37cb80ae87dbfbf411279199", + "url": "https://api.github.com/repos/symfony/routing/zipball/0a35d2f57d73c46ab6d042ced783b81d09a624c4", + "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "doctrine/annotations": "<1.12", @@ -6813,7 +6787,7 @@ }, "require-dev": { "doctrine/annotations": "^1.12", - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^5.3", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", @@ -6858,7 +6832,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.3.0" + "source": "https://github.com/symfony/routing/tree/v5.3.4" }, "funding": [ { @@ -6874,20 +6848,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/security-core", - "version": "v5.3.1", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0" + "reference": "69b9a6a62d8914f10010646619bcd4485a71f119" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/22714af1f701937a0a0bd3e3ec2a761baed3f2d0", - "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0", + "url": "https://api.github.com/repos/symfony/security-core/zipball/69b9a6a62d8914f10010646619bcd4485a71f119", + "reference": "69b9a6a62d8914f10010646619bcd4485a71f119", "shasum": "" }, "require": { @@ -6895,7 +6869,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^1.1|^2", "symfony/password-hasher": "^5.3", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -6908,7 +6882,7 @@ "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.0|^2.0", - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/cache": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", @@ -6951,7 +6925,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.3.1" + "source": "https://github.com/symfony/security-core/tree/v5.3.6" }, "funding": [ { @@ -6967,27 +6941,27 @@ "type": "tidelift" } ], - "time": "2021-06-01T15:43:02+00:00" + "time": "2021-07-29T06:36:31+00:00" }, { "name": "symfony/serializer", - "version": "v5.3.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875" + "reference": "f04e368e3cb35948550c7e95cc8918cb7e761c0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/ebb3dc397af77a08d734eea7305e0b2ec8c5e875", - "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875", + "url": "https://api.github.com/repos/symfony/serializer/zipball/f04e368e3cb35948550c7e95cc8918cb7e761c0c", + "reference": "f04e368e3cb35948550c7e95cc8918cb7e761c0c", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "doctrine/annotations": "<1.12", @@ -7053,7 +7027,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.3.1" + "source": "https://github.com/symfony/serializer/tree/v5.3.4" }, "funding": [ { @@ -7069,7 +7043,7 @@ "type": "tidelift" } ], - "time": "2021-06-02T09:36:17+00:00" + "time": "2021-07-21T13:18:10+00:00" }, { "name": "symfony/service-contracts", @@ -7152,16 +7126,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", "shasum": "" }, "require": { @@ -7194,7 +7168,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" }, "funding": [ { @@ -7210,20 +7184,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-10T08:58:57+00:00" }, { "name": "symfony/string", - "version": "v5.3.0", + "version": "v5.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "shasum": "" }, "require": { @@ -7277,7 +7251,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.0" + "source": "https://github.com/symfony/string/tree/v5.3.3" }, "funding": [ { @@ -7293,26 +7267,26 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-06-27T11:44:38+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.3.0", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3" + "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1d3953e627fe4b5f6df503f356b6545ada6351f3", - "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", + "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -7365,7 +7339,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.6" }, "funding": [ { @@ -7381,25 +7355,25 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:28:50+00:00" + "time": "2021-07-27T01:56:02+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb" + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", - "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" @@ -7438,7 +7412,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.3.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.4" }, "funding": [ { @@ -7454,20 +7428,20 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:40:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.0", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", - "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { @@ -7513,7 +7487,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.0" + "source": "https://github.com/symfony/yaml/tree/v5.3.6" }, "funding": [ { @@ -7529,7 +7503,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-29T06:20:01+00:00" } ], "packages-dev": [ @@ -8055,16 +8029,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c" + "reference": "bc368b765a651424b19f5759953ce2873e7d448b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/15cab721487b7bf43ad545a1e7d0095782e26f8c", - "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bc368b765a651424b19f5759953ce2873e7d448b", + "reference": "bc368b765a651424b19f5759953ce2873e7d448b", "shasum": "" }, "require": { @@ -8118,7 +8092,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.4" }, "funding": [ { @@ -8134,7 +8108,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:57:12+00:00" + "time": "2021-07-15T21:37:44+00:00" } ], "aliases": [], diff --git a/deploy.php b/deploy.php index 2995177..11211ee 100644 --- a/deploy.php +++ b/deploy.php @@ -1,72 +1,72 @@ -user('glutenfr') - ->port(2233) - ->stage('production') - ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); - -task('test', function () { - set('symfony_env', 'dev'); - runLocally('bin/phpunit'); -}); - -task('deploy:dump-env', function () { - run('cd {{release_path}} && {{bin/composer}} dump-env prod'); -}); - -task( - 'deploy', - [ - 'deploy:info', - 'deploy:prepare', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:clear_paths', - 'deploy:create_cache_dir', - 'deploy:shared', - 'deploy:assets', - 'deploy:writable', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'deploy:dump-env', - 'database:migrate', - 'deploy:symlink', - 'deploy:unlock', - 'cleanup', - ] -); - -before('deploy', 'test'); -after('deploy:failed', 'deploy:unlock'); +user('glutenfr') + ->port(2233) + ->stage('production') + ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); + +task('test', function () { + set('symfony_env', 'dev'); + runLocally('bin/phpunit'); +}); + +task('deploy:dump-env', function () { + run('cd {{release_path}} && {{bin/composer}} dump-env prod'); +}); + +task( + 'deploy', + [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:writable', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:dump-env', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', + ] +); + +before('deploy', 'test'); +after('deploy:failed', 'deploy:unlock'); diff --git a/etc/bootstrap.php b/etc/bootstrap.php index 452a4fb..9b1b3e9 100644 --- a/etc/bootstrap.php +++ b/etc/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/etc/custom/tle.json b/etc/custom/tle.json index 18927df..bf1ab25 100644 --- a/etc/custom/tle.json +++ b/etc/custom/tle.json @@ -1,517 +1,517 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "TLE API", - "version": "" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": { - "/api/tle/{id}": { - "get": { - "summary": "Record", - "operationId": "record", - "description": "Return single TleModel for requested satellite id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Satellite id", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TleModel" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle": { - "get": { - "summary": "Collection", - "operationId": "collection", - "description": "Return collection of TleModels depending on requested parameters", - "parameters": [ - { - "$ref": "#/components/parameters/search" - }, - { - "name": "sort", - "in": "query", - "description": "Sort by", - "schema": { - "type": "string", - "default": "name", - "enum": [ - "id", - "name", - "popularity", - "inclination", - "eccentricity", - "period" - ] - } - }, - { - "$ref": "#/components/parameters/sortDirection" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "name": "eccentricity[gte]", - "in": "query", - "description": "Filter records with orbital eccentricity greater then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "eccentricity[lte]", - "in": "query", - "description": "Filter records with orbital eccentricity less then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "inclination[lt]", - "in": "query", - "description": "Filter records with posigrade orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "inclination[gt]", - "in": "query", - "description": "Filter records with retrograde orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "period[lt]", - "in": "query", - "description": "Filter records with orbital period less than specified", - "required": false, - "example": 255 - }, - { - "name": "period[gt]", - "in": "query", - "description": "Filter records with orbital period greater than specified", - "required": false, - "example": 255 - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "properties": { - "@context": { - "type": "string", - "example": "http://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle" - }, - "@type": { - "type": "string", - "example": "Collection" - }, - "totalItems": { - "type": "integer", - "example": 10414 - }, - "member": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TleModel" - } - }, - "parameters": { - "type": "object" - }, - "view": { - "type": "object", - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - } - } - }, - "type": "object" - } - } - } - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle/{id}/propagate": { - "get": { - "summary": "Propagate (experimental)", - "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", - "operationId": "propagate", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Target satellite id for which propagation is calculated", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - }, - { - "name": "date", - "in": "query", - "description": "Target date and time", - "required": false, - "schema": { - "type": "string", - "example": "2021-04-20T16:28:40+00:00" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Propagation" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - } - }, - "components": { - "schemas": { - "Pagination": { - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - }, - "type": "object" - }, - "Exception": { - "properties": { - "response": { - "properties": { - "message": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "TleModel": { - "allOf": [ - { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/43638" - }, - "@type": { - "type": "string", - "example": "TleModel" - }, - "satelliteId": { - "type": "integer", - "example": 43638 - }, - "name": { - "type": "string", - "example": "1998-067PN" - }, - "date": { - "type": "string", - "example": "2021-02-16T06:41:41+00:00" - }, - "line1": { - "type": "string", - "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" - }, - "line2": { - "type": "string", - "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" - } - }, - "type": "object" - } - ] - }, - "Propagation": { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" - }, - "@type": { - "type": "string", - "example": "SatellitePropagationResult" - }, - "tle": { - "$ref": "#/components/schemas/TleModel" - }, - "algorithm": { - "type": "string", - "enum": ["SGP4", "SDP4"], - "description": "Algorithm used for propagation. Determined based on mean motion.", - "example": "SGP4" - }, - "vector": { - "properties": { - "reference_frame": { - "type": "string", - "example": "ECI" - }, - "position": { - "properties": { - "x": { - "type": "number", - "example": -2450.396984017652 - }, - "y": { - "type": "number", - "example": 6101.198295995954 - }, - "z": { - "type": "number", - "example": -6032.216318229235 - }, - "r": { - "type": "number", - "example": 8922.819046481767 - }, - "unit": { - "type": "string", - "example": "km" - } - }, - "type": "object" - }, - - "velocity": { - "properties": { - "x": { - "type": "number", - "example": -0.1644949004552056 - }, - "y": { - "type": "number", - "example": 4.639904402973215 - }, - "z": { - "type": "number", - "example": 4.406398357056158 - }, - "r": { - "type": "number", - "example": 6.400946642651633 - }, - "unit": { - "type": "string", - "example": "km/s" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "geodetic": { - "properties": { - "latitude": { - "type": "number", - "example": -42.67210184042445 - }, - "longitude": { - "type": "number", - "example": 124.524923099869 - }, - "altitude": { - "type": "number", - "example": 2554.4740343929398 - } - }, - "type": "object" - }, - "parameters": { - "properties": { - "date": { - "type": "string", - "example": "2021-04-26T08:39:45+00:00" - }, - "satelliteId": { - "type": "string", - "example": "44859" - } - }, - "type": "object" - } - }, - "type": "object" - } - }, - "responses": { - "404": { - "description": "Resource not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Resource not found" - } - } - } - } - }, - "500": { - "description": "Server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Server has encountered an internal error" - } - } - } - } - } - }, - "parameters": { - "search": { - "name": "search", - "in": "query", - "description": "Search string", - "schema": { - "type": "string", - "default": "*" - } - }, - "sortDirection": { - "name": "sort-dir", - "in": "query", - "description": "Sort direction", - "schema": { - "type": "string", - "default": "asc", - "enum": [ - "asc", - "desc" - ] - } - }, - "pageNumber": { - "name": "page", - "in": "query", - "description": "Page number", - "schema": { - "type": "integer", - "default": 1, - "minimum": 1 - } - }, - "pageSize": { - "name": "page-size", - "in": "query", - "description": "Number of collection member per page", - "schema": { - "type": "integer", - "default": 20, - "minimum": 1, - "maximum": 100 - } - } - } - } -} +{ + "openapi": "3.0.0", + "info": { + "title": "TLE API", + "version": "" + }, + "servers": [ + { + "url": "/" + } + ], + "paths": { + "/api/tle/{id}": { + "get": { + "summary": "Record", + "operationId": "record", + "description": "Return single TleModel for requested satellite id", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Satellite id", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TleModel" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle": { + "get": { + "summary": "Collection", + "operationId": "collection", + "description": "Return collection of TleModels depending on requested parameters", + "parameters": [ + { + "$ref": "#/components/parameters/search" + }, + { + "name": "sort", + "in": "query", + "description": "Sort by", + "schema": { + "type": "string", + "default": "name", + "enum": [ + "id", + "name", + "popularity", + "inclination", + "eccentricity", + "period" + ] + } + }, + { + "$ref": "#/components/parameters/sortDirection" + }, + { + "$ref": "#/components/parameters/pageNumber" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "name": "eccentricity[gte]", + "in": "query", + "description": "Filter records with orbital eccentricity greater then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "eccentricity[lte]", + "in": "query", + "description": "Filter records with orbital eccentricity less then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "inclination[lt]", + "in": "query", + "description": "Filter records with posigrade orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "inclination[gt]", + "in": "query", + "description": "Filter records with retrograde orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "period[lt]", + "in": "query", + "description": "Filter records with orbital period less than specified", + "required": false, + "example": 255 + }, + { + "name": "period[gt]", + "in": "query", + "description": "Filter records with orbital period greater than specified", + "required": false, + "example": 255 + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "properties": { + "@context": { + "type": "string", + "example": "http://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle" + }, + "@type": { + "type": "string", + "example": "Collection" + }, + "totalItems": { + "type": "integer", + "example": 10414 + }, + "member": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TleModel" + } + }, + "parameters": { + "type": "object" + }, + "view": { + "type": "object", + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + } + } + }, + "type": "object" + } + } + } + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle/{id}/propagate": { + "get": { + "summary": "Propagate (experimental)", + "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", + "operationId": "propagate", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Target satellite id for which propagation is calculated", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "description": "Target date and time", + "required": false, + "schema": { + "type": "string", + "example": "2021-04-20T16:28:40+00:00" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Propagation" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + } + }, + "components": { + "schemas": { + "Pagination": { + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + }, + "type": "object" + }, + "Exception": { + "properties": { + "response": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "TleModel": { + "allOf": [ + { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/43638" + }, + "@type": { + "type": "string", + "example": "TleModel" + }, + "satelliteId": { + "type": "integer", + "example": 43638 + }, + "name": { + "type": "string", + "example": "1998-067PN" + }, + "date": { + "type": "string", + "example": "2021-02-16T06:41:41+00:00" + }, + "line1": { + "type": "string", + "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" + }, + "line2": { + "type": "string", + "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" + } + }, + "type": "object" + } + ] + }, + "Propagation": { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" + }, + "@type": { + "type": "string", + "example": "SatellitePropagationResult" + }, + "tle": { + "$ref": "#/components/schemas/TleModel" + }, + "algorithm": { + "type": "string", + "enum": ["SGP4", "SDP4"], + "description": "Algorithm used for propagation. Determined based on mean motion.", + "example": "SGP4" + }, + "vector": { + "properties": { + "reference_frame": { + "type": "string", + "example": "ECI" + }, + "position": { + "properties": { + "x": { + "type": "number", + "example": -2450.396984017652 + }, + "y": { + "type": "number", + "example": 6101.198295995954 + }, + "z": { + "type": "number", + "example": -6032.216318229235 + }, + "r": { + "type": "number", + "example": 8922.819046481767 + }, + "unit": { + "type": "string", + "example": "km" + } + }, + "type": "object" + }, + + "velocity": { + "properties": { + "x": { + "type": "number", + "example": -0.1644949004552056 + }, + "y": { + "type": "number", + "example": 4.639904402973215 + }, + "z": { + "type": "number", + "example": 4.406398357056158 + }, + "r": { + "type": "number", + "example": 6.400946642651633 + }, + "unit": { + "type": "string", + "example": "km/s" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "geodetic": { + "properties": { + "latitude": { + "type": "number", + "example": -42.67210184042445 + }, + "longitude": { + "type": "number", + "example": 124.524923099869 + }, + "altitude": { + "type": "number", + "example": 2554.4740343929398 + } + }, + "type": "object" + }, + "parameters": { + "properties": { + "date": { + "type": "string", + "example": "2021-04-26T08:39:45+00:00" + }, + "satelliteId": { + "type": "string", + "example": "44859" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "responses": { + "404": { + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Resource not found" + } + } + } + } + }, + "500": { + "description": "Server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Server has encountered an internal error" + } + } + } + } + } + }, + "parameters": { + "search": { + "name": "search", + "in": "query", + "description": "Search string", + "schema": { + "type": "string", + "default": "*" + } + }, + "sortDirection": { + "name": "sort-dir", + "in": "query", + "description": "Sort direction", + "schema": { + "type": "string", + "default": "asc", + "enum": [ + "asc", + "desc" + ] + } + }, + "pageNumber": { + "name": "page", + "in": "query", + "description": "Page number", + "schema": { + "type": "integer", + "default": 1, + "minimum": 1 + } + }, + "pageSize": { + "name": "page-size", + "in": "query", + "description": "Number of collection member per page", + "schema": { + "type": "integer", + "default": 20, + "minimum": 1, + "maximum": 100 + } + } + } + } +} diff --git a/etc/packages/prod/sentry.yaml b/etc/packages/prod/sentry.yaml index 76704fc..96bf6cc 100644 --- a/etc/packages/prod/sentry.yaml +++ b/etc/packages/prod/sentry.yaml @@ -1,9 +1,9 @@ -sentry: - dsn: '%env(SENTRY_DSN)%' - options: - before_send: 'App\Service\SentryCallbackBeforeSend' - environment: '%kernel.environment%' - release: '%env(string:key:version:json:file:COMPOSER_JSON)%' - messenger: - enabled: true # flushes Sentry messages at the end of each message handling - capture_soft_fails: true # captures exceptions marked for retry too +sentry: + dsn: '%env(SENTRY_DSN)%' + options: + before_send: 'App\Service\SentryCallbackBeforeSend' + environment: '%kernel.environment%' + release: '%env(string:key:version:json:file:COMPOSER_JSON)%' + messenger: + enabled: true # flushes Sentry messages at the end of each message handling + capture_soft_fails: true # captures exceptions marked for retry too diff --git a/etc/packages/rate_limiter.yaml b/etc/packages/rate_limiter.yaml index a677d37..476b216 100644 --- a/etc/packages/rate_limiter.yaml +++ b/etc/packages/rate_limiter.yaml @@ -1,7 +1,7 @@ -framework: - rate_limiter: - anonymous_api: - policy: 'sliding_window' - limit: 500 - interval: '60 minutes' - lock_factory: null +framework: + rate_limiter: + anonymous_api: + policy: 'sliding_window' + limit: 500 + interval: '60 minutes' + lock_factory: null diff --git a/etc/parameters.yaml b/etc/parameters.yaml index 1d32fae..35e11fd 100644 --- a/etc/parameters.yaml +++ b/etc/parameters.yaml @@ -1,3 +1,3 @@ -parameters: - env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" - version: '%env(string:key:version:json:file:COMPOSER_JSON)%' +parameters: + env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" + version: '%env(string:key:version:json:file:COMPOSER_JSON)%' diff --git a/etc/services.yaml b/etc/services.yaml index 6a1b3f7..3235b01 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -1,30 +1,30 @@ -# This file is the entry point to configure your own services. -# Files in the packages/ subdirectory configure your dependencies. - -# Put parameters here that don't need to change on each machine where the app is deployed -# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: - -services: - # default configuration for services in *this* file - _defaults: - autowire: true # Automatically injects dependencies in your services. - autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. - - # makes classes in src/ available to be used as services - # this creates a service per class whose id is the fully-qualified class name - App\: - resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - bind: - $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" - - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - - # add more service definitions when explicit configuration is needed - # please note that last definitions always *replace* previous ones +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + bind: + $env: '%kernel.environment%' + $projectDir: "%kernel.project_dir%" + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 47cc715..3f8ad84 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -3,9 +3,8 @@ diff --git a/src/Command/CleanupCommand.php b/src/Command/CleanupCommand.php index 4e6c05c..9465111 100644 --- a/src/Command/CleanupCommand.php +++ b/src/Command/CleanupCommand.php @@ -1,33 +1,33 @@ -setName('cleanup') - ->setDescription('Performs periodic cleanup on unused data'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $this->repository->removeBefore( - (new \DateTime())->sub(new \DateInterval('P2M')) - ); - - return Command::SUCCESS; - } -} +setName('cleanup') + ->setDescription('Performs periodic cleanup on unused data'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->repository->removeBefore( + (new \DateTime())->sub(new \DateInterval('P2M')) + ); + + return Command::SUCCESS; + } +} diff --git a/src/Enum/PropagatorAlgorithm.php b/src/Enum/PropagatorAlgorithm.php index 9e92b79..f3d2c50 100644 --- a/src/Enum/PropagatorAlgorithm.php +++ b/src/Enum/PropagatorAlgorithm.php @@ -1,11 +1,11 @@ -limiter = $anonymousApiLimiter; - } - - public static function getSubscribedEvents(): array - { - return [ - KernelEvents::REQUEST => 'onRequest', - ]; - } - - public function onRequest(RequestEvent $event): void - { - $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); - - if (!FeatureFlag::API_RATE_LIMITER || $refererHost === Route::PRODUCTION_HOST || !Route::inArray($event->getRequest(), self::ROUTES)) { - return; - } - - $limit = $this->limiter->create($event->getRequest()->getClientIp())->consume(); - - if (false === $limit->isAccepted()) { - $headers = [ - 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), - 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format(\DateTimeInterface::ATOM), - 'X-RateLimit-Limit' => $limit->getLimit(), - ]; - - $event->setResponse( - new JsonResponse( - [ - 'response' => [ - 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format(\DateTimeInterface::ATOM)), - 'limit' => $limit->getLimit(), - 'remaining' => $limit->getRemainingTokens(), - ], - ], - Response::HTTP_TOO_MANY_REQUESTS, - $headers - ), - ); - } - } -} +limiter = $anonymousApiLimiter; + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => 'onRequest', + ]; + } + + public function onRequest(RequestEvent $event): void + { + $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); + + if (!FeatureFlag::API_RATE_LIMITER || $refererHost === Route::PRODUCTION_HOST || !Route::inArray($event->getRequest(), self::ROUTES)) { + return; + } + + $limit = $this->limiter->create($event->getRequest()->getClientIp())->consume(); + + if (false === $limit->isAccepted()) { + $headers = [ + 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), + 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format(\DateTimeInterface::ATOM), + 'X-RateLimit-Limit' => $limit->getLimit(), + ]; + + $event->setResponse( + new JsonResponse( + [ + 'response' => [ + 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format(\DateTimeInterface::ATOM)), + 'limit' => $limit->getLimit(), + 'remaining' => $limit->getRemainingTokens(), + ], + ], + Response::HTTP_TOO_MANY_REQUESTS, + $headers + ), + ); + } + } +} diff --git a/src/Repository/RequestRepository.php b/src/Repository/RequestRepository.php index b7d9a6e..4ca6324 100644 --- a/src/Repository/RequestRepository.php +++ b/src/Repository/RequestRepository.php @@ -1,27 +1,27 @@ -_em->createQueryBuilder(); - - $builder - ->delete(Request::class, 'r') - ->where('r.createdAt < :date') - ->setParameter('date', $dateTime); - - $builder->getQuery()->execute(); - } -} +_em->createQueryBuilder(); + + $builder + ->delete(Request::class, 'r') + ->where('r.createdAt < :date') + ->setParameter('date', $dateTime); + + $builder->getQuery()->execute(); + } +} diff --git a/src/Service/FeatureFlag.php b/src/Service/FeatureFlag.php index d061893..7ce99f2 100644 --- a/src/Service/FeatureFlag.php +++ b/src/Service/FeatureFlag.php @@ -1,8 +1,8 @@ -get('_route'), $routes, false); - } -} +get('_route'), $routes, false); + } +} diff --git a/src/Service/SentryCallbackBeforeSend.php b/src/Service/SentryCallbackBeforeSend.php index a086de2..d645d06 100644 --- a/src/Service/SentryCallbackBeforeSend.php +++ b/src/Service/SentryCallbackBeforeSend.php @@ -1,26 +1,26 @@ -getExceptions(); - - foreach ($exceptions as $exception) { - if (in_array($exception->getType(), self::SKIP)) { - return null; - } - } - - return $event; - } -} +getExceptions(); + + foreach ($exceptions as $exception) { + if (in_array($exception->getType(), self::SKIP)) { + return null; + } + } + + return $event; + } +} diff --git a/tests/Controller/DocsControllerTest.php b/tests/Controller/DocsControllerTest.php index a322506..4c86c4b 100644 --- a/tests/Controller/DocsControllerTest.php +++ b/tests/Controller/DocsControllerTest.php @@ -1,44 +1,44 @@ -get('/api/tle.json'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); - - $response = $this->toArray($response); - - $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; - $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; - - $tle = TleFixtures::create(); - - $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); - - self::assertCount(\count($tleSchema), $response); - self::assertEquals(array_keys($tleSchema), array_keys($response)); - - $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); - - self::assertCount(\count($paginationSchema), $response['view']); - self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); - - self::assertCount(\count($response), $collectionSchema); - self::assertEquals(array_keys($response), array_keys($collectionSchema)); - } - - public function testHomepage(): void { - $response = $this->get('/api/tle/docs'); - - self::assertEmpty($response->getContent()); - } -} +get('/api/tle.json'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); + + $response = $this->toArray($response); + + $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; + $paginationSchema = $response['components']['schemas']['Pagination']['properties']; + $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; + + $tle = TleFixtures::create(); + + $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); + + self::assertCount(\count($tleSchema), $response); + self::assertEquals(array_keys($tleSchema), array_keys($response)); + + $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); + + self::assertCount(\count($paginationSchema), $response['view']); + self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); + + self::assertCount(\count($response), $collectionSchema); + self::assertEquals(array_keys($response), array_keys($collectionSchema)); + } + + public function testHomepage(): void { + $response = $this->get('/api/tle/docs'); + + self::assertEmpty($response->getContent()); + } +} diff --git a/tests/Controller/PropagateControllerTest.php b/tests/Controller/PropagateControllerTest.php index 236e04e..ef5fd1c 100644 --- a/tests/Controller/PropagateControllerTest.php +++ b/tests/Controller/PropagateControllerTest.php @@ -1,111 +1,111 @@ -get('/api/tle/0/propagate'); - - self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals('Unable to find record with id 0', $response['response']['message']); - } - - public function testPropagateSGP4(): void - { - $tle = TleFixtures::create(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); - self::assertEquals('http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); - self::assertEquals('SatellitePropagationResult', $response['@type']); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals('SGP4', $response['algorithm']); - - self::assertEquals('ECI', $response['vector']['reference_frame']); - - self::assertEquals(3731.3677738358, $response['vector']['position']['x']); - self::assertEquals(-3929.0247024138, $response['vector']['position']['y']); - self::assertEquals(-3820.6175474185, $response['vector']['position']['z']); - self::assertEquals(6630.0421581948, $response['vector']['position']['r']); - self::assertEquals('km', $response['vector']['position']['unit']); - - self::assertEquals(2.2692661551689, $response['vector']['velocity']['x']); - self::assertEquals(6.1586427245624, $response['vector']['velocity']['y']); - self::assertEquals(-4.1239106928913, $response['vector']['velocity']['z']); - self::assertEquals(7.7514571852487, $response['vector']['velocity']['r']); - self::assertEquals('km/s', $response['vector']['velocity']['unit']); - - self::assertEquals(-35.362152001955, $response['geodetic']['latitude']); - self::assertEquals(221.21616992358, $response['geodetic']['longitude']); - self::assertEquals(259.03105001661, $response['geodetic']['altitude']); - - self::assertEquals(43550, $response['parameters']['satelliteId']); - self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); - } - - public function testPropagateSDP4(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); - self::assertEquals('http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); - self::assertEquals('SatellitePropagationResult', $response['@type']); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals('SDP4', $response['algorithm']); - - self::assertEquals('ECI', $response['vector']['reference_frame']); - - self::assertEquals(142825.54086031896, $response['vector']['position']['x']); - self::assertEquals(133973.34798843606, $response['vector']['position']['y']); - self::assertEquals(1303.6185230048, $response['vector']['position']['z']); - self::assertEquals(195830.7751976863, $response['vector']['position']['r']); - self::assertEquals('km', $response['vector']['position']['unit']); - - self::assertEquals(-0.51310326492624, $response['vector']['velocity']['x']); - self::assertEquals(0.5491989174236, $response['vector']['velocity']['y']); - self::assertEquals(0.60190735910381, $response['vector']['velocity']['z']); - self::assertEquals(0.96290543685273, $response['vector']['velocity']['r']); - self::assertEquals('km/s', $response['vector']['velocity']['unit']); - - self::assertEquals(0.38149611267203, $response['geodetic']['latitude']); - self::assertEquals(310.86248495862, $response['geodetic']['longitude']); - self::assertEquals(189452.64114393186, $response['geodetic']['altitude']); - - self::assertEquals(22049, $response['parameters']['satelliteId']); - self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); - } -} +get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Unable to find record with id 0', $response['response']['message']); + } + + public function testPropagateSGP4(): void + { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals('SGP4', $response['algorithm']); + + self::assertEquals('ECI', $response['vector']['reference_frame']); + + self::assertEquals(3731.3677738358, $response['vector']['position']['x']); + self::assertEquals(-3929.0247024138, $response['vector']['position']['y']); + self::assertEquals(-3820.6175474185, $response['vector']['position']['z']); + self::assertEquals(6630.0421581948, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); + + self::assertEquals(2.2692661551689, $response['vector']['velocity']['x']); + self::assertEquals(6.1586427245624, $response['vector']['velocity']['y']); + self::assertEquals(-4.1239106928913, $response['vector']['velocity']['z']); + self::assertEquals(7.7514571852487, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); + + self::assertEquals(-35.362152001955, $response['geodetic']['latitude']); + self::assertEquals(221.21616992358, $response['geodetic']['longitude']); + self::assertEquals(259.03105001661, $response['geodetic']['altitude']); + + self::assertEquals(43550, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); + } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals('SDP4', $response['algorithm']); + + self::assertEquals('ECI', $response['vector']['reference_frame']); + + self::assertEquals(142825.54086031896, $response['vector']['position']['x']); + self::assertEquals(133973.34798843606, $response['vector']['position']['y']); + self::assertEquals(1303.6185230048, $response['vector']['position']['z']); + self::assertEquals(195830.7751976863, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); + + self::assertEquals(-0.51310326492624, $response['vector']['velocity']['x']); + self::assertEquals(0.5491989174236, $response['vector']['velocity']['y']); + self::assertEquals(0.60190735910381, $response['vector']['velocity']['z']); + self::assertEquals(0.96290543685273, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); + + self::assertEquals(0.38149611267203, $response['geodetic']['latitude']); + self::assertEquals(310.86248495862, $response['geodetic']['longitude']); + self::assertEquals(189452.64114393186, $response['geodetic']['altitude']); + + self::assertEquals(22049, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); + } +} diff --git a/tests/Controller/StatisticsControllerTest.php b/tests/Controller/StatisticsControllerTest.php index 86e91a4..c22977a 100644 --- a/tests/Controller/StatisticsControllerTest.php +++ b/tests/Controller/StatisticsControllerTest.php @@ -1,16 +1,16 @@ -get('/api/tle/hits'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - } -} +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} diff --git a/tests/Controller/TleControllerTest.php b/tests/Controller/TleControllerTest.php index 59f2470..bc3a783 100644 --- a/tests/Controller/TleControllerTest.php +++ b/tests/Controller/TleControllerTest.php @@ -1,53 +1,53 @@ - 'tle:calculate', - '--tle' => TleFixtures::createDeep()->getId(), - ] - ); - - $application = new Application(static::$kernel); - $application->setAutoExit(false); - $application->run($input, new BufferedOutput()); - } - - public function testTleExtraFieldsMissingData(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } - - public function testTleExtraFields(): void - { - $tle = TleFixtures::create(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } -} + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} diff --git a/tests/Service/SentryCallbackTest.php b/tests/Service/SentryCallbackTest.php index 5feac85..46ca773 100644 --- a/tests/Service/SentryCallbackTest.php +++ b/tests/Service/SentryCallbackTest.php @@ -1,43 +1,43 @@ -setExceptions( - [ - new ExceptionDataBag(new NotFoundHttpException()), - ] - ); - - self::assertNull($callback($event)); - } - - public function testOtherExceptionsForwarded(): void - { - $callback = new SentryCallbackBeforeSend(); - - $event = Event::createTransaction(); - - $event->setExceptions( - [ - new ExceptionDataBag(new \Exception()), - ] - ); - - /** @noinspection GetClassUsageInspection */ - self::assertEquals(Event::class, get_class($callback($event))); - } -} +setExceptions( + [ + new ExceptionDataBag(new NotFoundHttpException()), + ] + ); + + self::assertNull($callback($event)); + } + + public function testOtherExceptionsForwarded(): void + { + $callback = new SentryCallbackBeforeSend(); + + $event = Event::createTransaction(); + + $event->setExceptions( + [ + new ExceptionDataBag(new \Exception()), + ] + ); + + /** @noinspection GetClassUsageInspection */ + self::assertEquals(Event::class, get_class($callback($event))); + } +} From 57d147ec05e1404910404b90277d668807b84845 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 13:43:33 +0200 Subject: [PATCH 152/221] install symfony runtime --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 72e66ab..cc243ed 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "symfony/orm-pack": "^1.1", "symfony/property-access": "5.3.*", "symfony/rate-limiter": "5.3.*", + "symfony/runtime": "5.3.*", "symfony/serializer": "5.3.*", "symfony/yaml": "5.3.*" }, From e5b711051b7ce6d67e3496ba58314cb27fc13f11 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 13:56:29 +0200 Subject: [PATCH 153/221] install symfony runtime --- bin/console | 39 +++----------- composer.lock | 79 ++++++++++++++++++++++++++++- phpunit.xml.dist | 2 +- public/index.php | 26 ++-------- symfony.lock | 3 ++ {etc => tests}/bootstrap.php | 98 ++++++++++++++++++------------------ 6 files changed, 142 insertions(+), 105 deletions(-) rename {etc => tests}/bootstrap.php (97%) diff --git a/bin/console b/bin/console index a9fa7b0..6752a33 100644 --- a/bin/console +++ b/bin/console @@ -3,40 +3,15 @@ use App\Kernel; use Symfony\Bundle\FrameworkBundle\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\ErrorHandler\Debug; -if (false === in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.\PHP_SAPI.' SAPI'.\PHP_EOL; +if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) { + throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); } -set_time_limit(0); +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -require dirname(__DIR__).'/vendor/autoload.php'; +return static function (array $context) { + $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); -if (!class_exists(Application::class)) { - throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.'); -} - -$input = new ArgvInput(); -if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { - putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); -} - -if ($input->hasParameterOption('--no-debug', true)) { - putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); -} - -require dirname(__DIR__).'/etc/bootstrap.php'; - -if ($_SERVER['APP_DEBUG']) { - umask(0000); - - if (class_exists(Debug::class)) { - Debug::enable(); - } -} - -$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); -$application = new Application($kernel); -$application->run($input); + return new Application($kernel); +}; diff --git a/composer.lock b/composer.lock index 14f96bb..f38aea6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "71e846a8b6688a9e07c24696b2d0ad75", + "content-hash": "9bb34785d465a1fc0b8a007cd8d6cb8b", "packages": [ { "name": "beberlei/doctrineextensions", @@ -6850,6 +6850,83 @@ ], "time": "2021-07-23T15:55:36+00:00" }, + { + "name": "symfony/runtime", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "685a4a5491e25c7f2dd251d8fcca583b427ff290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/685a4a5491e25c7f2dd251d8fcca583b427ff290", + "reference": "685a4a5491e25c7f2dd251d8fcca583b427ff290", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dotenv": "<5.1" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^4.4|^5", + "symfony/dotenv": "^5.1", + "symfony/http-foundation": "^4.4|^5", + "symfony/http-kernel": "^4.4|^5" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/runtime/tree/v5.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-30T13:49:12+00:00" + }, { "name": "symfony/security-core", "version": "v5.3.6", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 3f8ad84..8317374 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -4,7 +4,7 @@ diff --git a/public/index.php b/public/index.php index 9ca9419..c0037a8 100644 --- a/public/index.php +++ b/public/index.php @@ -1,27 +1,9 @@ handle($request); -$response->send(); -$kernel->terminate($request, $response); +return static function (array $context) { + return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); +}; diff --git a/symfony.lock b/symfony.lock index 0f1f0e4..1b6e4de 100644 --- a/symfony.lock +++ b/symfony.lock @@ -429,6 +429,9 @@ "config/routes.yaml" ] }, + "symfony/runtime": { + "version": "v5.3.4" + }, "symfony/security-core": { "version": "v5.2.6" }, diff --git a/etc/bootstrap.php b/tests/bootstrap.php similarity index 97% rename from etc/bootstrap.php rename to tests/bootstrap.php index 9b1b3e9..452a4fb 100644 --- a/etc/bootstrap.php +++ b/tests/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; From 74f7f4b2940f07c79b8b70f55a955053f2910922 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 18:32:01 +0200 Subject: [PATCH 154/221] migrated doctrine to php attributes --- etc/packages/doctrine.yaml | 2 +- .../Attributes/TleOneToOneReference.php | 8 ++-- src/Entity/Request.php | 39 +++++++------------ src/Entity/Tle.php | 25 +++++------- src/Entity/TleInformation.php | 27 ++++--------- src/Field/IdField.php | 6 +-- src/Field/NameField.php | 4 +- src/Field/TleField.php | 8 +--- 8 files changed, 39 insertions(+), 80 deletions(-) diff --git a/etc/packages/doctrine.yaml b/etc/packages/doctrine.yaml index b5a2432..c554e70 100644 --- a/etc/packages/doctrine.yaml +++ b/etc/packages/doctrine.yaml @@ -15,7 +15,7 @@ doctrine: mappings: App: is_bundle: false - type: annotation + type: attribute dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App diff --git a/src/Entity/Attributes/TleOneToOneReference.php b/src/Entity/Attributes/TleOneToOneReference.php index 3b2dcda..4dc2d58 100644 --- a/src/Entity/Attributes/TleOneToOneReference.php +++ b/src/Entity/Attributes/TleOneToOneReference.php @@ -7,11 +7,9 @@ trait TleOneToOneReference { - /** - * @ORM\Id - * @ORM\OneToOne(targetEntity="Tle") - * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) - */ + #[ORM\Id] + #[ORM\OneToOne(targetEntity: Tle::class)] + #[ORM\JoinColumn(name: 'tle_id', referencedColumnName: 'id', nullable: false)] protected Tle $tle; public function getTle(): Tle diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 9d75b84..5510aff 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -3,49 +3,36 @@ namespace App\Entity; use App\Field\IdField; +use App\Repository\RequestRepository; use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass="App\Repository\RequestRepository") - * @ORM\HasLifecycleCallbacks() - */ +#[ORM\Entity(repositoryClass: RequestRepository::class)] +#[ORM\HasLifecycleCallbacks] class Request { use IdField; - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(name="id", type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(name: 'id', type: 'integer')] private int $id; - /** - * @ORM\ManyToOne(targetEntity="Tle") - * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) - */ + #[ORM\ManyToOne(targetEntity: Tle::class)] + #[ORM\JoinColumn(name: 'tle_id', referencedColumnName: 'id', nullable: false)] private Tle $tle; - /** - * @ORM\Column(name="created_at", type="datetime") - */ + #[ORM\Column(name: 'created_at', type: 'datetime')] private \DateTime $createdAt; - /** - * @ORM\Column(name="ip", type="string") - */ + #[ORM\Column(name: 'ip', type: 'string')] private string $ip; - /** - * @ORM\Column(name="referer", type="string", nullable=true) - */ + #[ORM\Column(name: 'referer', type: 'string', nullable: true)] private ?string $referer; - /** - * @ORM\PrePersist() - * @ORM\PreUpdate() - */ + #[ORM\PrePersist] + #[ORM\PreUpdate] public function update(): void { $this->createdAt = DateTimeService::getCurrentUTC(); diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 6ddfe45..a450357 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -5,40 +5,33 @@ use App\Field\IdField; use App\Field\NameField; use App\Field\TleField; +use App\Repository\TleRepository; use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; -use Doctrine\ORM\Mapping\OneToOne; -/** - * @ORM\Entity(repositoryClass="App\Repository\TleRepository") - * @ORM\HasLifecycleCallbacks() - */ +#[ORM\Entity(repositoryClass: TleRepository::class)] +#[ORM\HasLifecycleCallbacks] class Tle { use IdField; use NameField; use TleField; - /** - * @OneToOne(targetEntity="TleInformation", mappedBy="tle") - */ + #[ORM\OneToOne(mappedBy: 'tle', targetEntity: TleInformation::class)] private ?TleInformation $info = null; - /** - * @ORM\Column(name="updated_at", type="datetime") - */ + #[ORM\Column(name: 'updated_at', type: 'datetime')] private \DateTime $updatedAt; - /** - * @ORM\PrePersist() - * @ORM\PreUpdate() - */ + #[ORM\PrePersist] + #[ORM\PreUpdate] public function update(): void { $this->updatedAt = DateTimeService::getCurrentUTC(); } - public function getInfo(): ?TleInformation { + public function getInfo(): ?TleInformation + { return $this->info; } } diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index e0e55d4..4e5455e 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -3,47 +3,36 @@ namespace App\Entity; use App\Entity\Attributes\TleOneToOneReference; +use App\Repository\TleInformationRepository; use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass="App\Repository\TleInformationRepository") - */ +#[ORM\Entity(repositoryClass: TleInformationRepository::class)] class TleInformation { use TleOneToOneReference; - /** - * @ORM\Column(type="float", precision=14, scale=12, nullable=true) - */ + #[ORM\Column(type: 'float', precision: 14, scale: 12, nullable: true)] public ?float $eccentricity; - /** - * @ORM\Column(type="float", precision=16, scale=10, nullable=true) - */ + #[ORM\Column(type: 'float', precision: 16, scale: 10, nullable: true)] public ?float $inclination; - /** - * @ORM\Column(type="float", precision=16, scale=10, nullable=true) - */ + #[ORM\Column(type: 'float', precision: 16, scale: 10, nullable: true)] public ?float $raan; - /** - * @ORM\Column(type="float", precision=16, scale=10, nullable=true) - */ + #[ORM\Column(type: 'float', precision: 16, scale: 10, nullable: true)] public ?float $semiMajorAxis; /** * Period for complete orbit in seconds - * - * @ORM\Column(type="float", name="`period`", precision=24, scale=10, nullable=true) */ + #[ORM\Column(name: '`period`', type: 'float', precision: 24, scale: 10, nullable: true)] public ?float $period; /** * Period for complete orbit in seconds - * - * @ORM\Column(type="boolean", options={"default":"0"}) */ + #[ORM\Column(type: 'boolean', options: ['default' => 0])] public bool $geostationary = false; public function __construct(Tle $tle) diff --git a/src/Field/IdField.php b/src/Field/IdField.php index f45eadf..55754f5 100644 --- a/src/Field/IdField.php +++ b/src/Field/IdField.php @@ -6,10 +6,8 @@ trait IdField { - /** - * @ORM\Id() - * @ORM\Column(name="id", type="integer") - */ + #[ORM\Id] + #[ORM\Column(name: 'id', type: 'integer')] private int $id; public function getId(): int diff --git a/src/Field/NameField.php b/src/Field/NameField.php index d07f3a1..4dedf67 100644 --- a/src/Field/NameField.php +++ b/src/Field/NameField.php @@ -6,9 +6,7 @@ trait NameField { - /** - * @ORM\Column(name="name", type="string") - */ + #[ORM\Column(name: 'name', type: 'string')] private string $name; public function getName(): string diff --git a/src/Field/TleField.php b/src/Field/TleField.php index 4b7555b..3238f1c 100644 --- a/src/Field/TleField.php +++ b/src/Field/TleField.php @@ -6,14 +6,10 @@ trait TleField { - /** - * @ORM\Column(name="line1", type="string") - */ + #[ORM\Column(name: 'line1', type: 'string')] private string $line1; - /** - * @ORM\Column(name="line2", type="string") - */ + #[ORM\Column(name: 'line2', type: 'string')] private string $line2; public function getLine1(): string From ba6c611462de3c72967eac96b5aaaaec3a847407 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 18:35:52 +0200 Subject: [PATCH 155/221] use symfony required attribute --- src/Controller/AbstractApiController.php | 7 ++----- src/Service/Traits/FileSystemAwareTrait.php | 5 ++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index eba101f..811e5bc 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -10,6 +10,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouterInterface; +use Symfony\Contracts\Service\Attribute\Required; abstract class AbstractApiController extends AbstractController { @@ -26,11 +27,7 @@ abstract class AbstractApiController extends AbstractController protected RouterInterface $router; - /** - * @required - * - * @param RouterInterface $router - */ + #[Required] public function setRouter(RouterInterface $router): void { $this->router = $router; diff --git a/src/Service/Traits/FileSystemAwareTrait.php b/src/Service/Traits/FileSystemAwareTrait.php index d2a1959..a42107b 100644 --- a/src/Service/Traits/FileSystemAwareTrait.php +++ b/src/Service/Traits/FileSystemAwareTrait.php @@ -3,14 +3,13 @@ namespace App\Service\Traits; use App\Service\FileManager; +use Symfony\Contracts\Service\Attribute\Required; trait FileSystemAwareTrait { private FileManager $fileManager; - /** - * @required - */ + #[Required] public function setFileManager(FileManager $manager): void { $this->fileManager = $manager; From 4b044f014c68eba3ce107c540f83fef43adee75a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 18:42:11 +0200 Subject: [PATCH 156/221] fix deprecations --- etc/packages/doctrine.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/etc/packages/doctrine.yaml b/etc/packages/doctrine.yaml index c554e70..3ac9bfa 100644 --- a/etc/packages/doctrine.yaml +++ b/etc/packages/doctrine.yaml @@ -1,7 +1,6 @@ doctrine: dbal: url: '%env(resolve:DATABASE_URL)%' - override_url: true options: 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' From 6bd61a8eb40aff6d6a56f301772ac2933fc50631 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 20:05:40 +0200 Subject: [PATCH 157/221] more flexible query --- src/Repository/TleRepository.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 4b4ee39..f064e7f 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -106,7 +106,13 @@ private function getCount(QueryBuilder $builder): int { $builder = clone $builder; - $builder->select('count(tle.id)'); + $alias = $builder->getRootAliases()[0] ?? null; + $entity = $builder->getRootEntities()[0] ?? null; + + $meta = $builder->getEntityManager()->getClassMetadata($entity); + $identifier = $meta->identifier[0] ?? null; + + $builder->select("COUNT($alias.$identifier)"); return $builder->getQuery()->getSingleScalarResult(); } From d58fb7d01d1c5b09a7476a98879d68cb4358004e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 20:22:39 +0200 Subject: [PATCH 158/221] more flexible count query --- src/Repository/TleRepository.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index f064e7f..ecbde9c 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -10,6 +10,7 @@ use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; @@ -73,8 +74,6 @@ public function collection( $builder->setParameter($placeholder, $filter->value); } - $total = $this->getCount($builder); - // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { $before = (new \DateTime())->sub(new \DateInterval('P7D')); @@ -86,6 +85,8 @@ public function collection( $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } + $total = $this->getCount($builder); + // limit $builder->setMaxResults($pageSize); $builder->setFirstResult($offset); @@ -114,7 +115,13 @@ private function getCount(QueryBuilder $builder): int $builder->select("COUNT($alias.$identifier)"); - return $builder->getQuery()->getSingleScalarResult(); + try { + return $builder->getQuery()->getSingleScalarResult(); + } catch (NonUniqueResultException) { + $result = array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()); + + return array_sum($result); + } } private function getSortTableColumnMapping(string $sort): ?string From 4f758fbb7bd62389a19314a6d08d0eb73033605f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 20:29:15 +0200 Subject: [PATCH 159/221] decouple pagination from repository --- src/Controller/TleController.php | 18 +++++--- src/Repository/TleRepository.php | 42 +------------------ src/ViewModel/Model/PaginationCollection.php | 44 +++++++++++++------- 3 files changed, 44 insertions(+), 60 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 68caf42..e6dda68 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -5,6 +5,7 @@ use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; +use App\ViewModel\Model\PaginationCollection; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; @@ -81,15 +82,15 @@ public function collection( $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - $collection = $this->repository->collection( + $builder = $this->repository->collection( $search, $sort, $sortDir, - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize), $filters, ); + $pagination = new PaginationCollection($builder); + $parameters = [ self::SEARCH_PARAM => $search ?? '*', self::SORT_PARAM => $sort, @@ -110,14 +111,19 @@ public function collection( $parameters[$name] = $satelliteId; } + $total = $pagination->getTotal(); + $response = [ '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), + 'totalItems' => $total, + 'member' => $pagination->getCollection( + $pageSize, + $this->getPageOffset($this->getPage($request), $pageSize), + ), 'parameters' => $parameters, - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + 'view' => $this->getPagination($request, $total, $pageSize), ]; return $this->response( diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index ecbde9c..f3c53aa 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -36,10 +36,8 @@ public function collection( ?string $search, string $sort, string $sortDir, - int $pageSize, - int $offset, array $filters, - ): PaginationCollection { + ): QueryBuilder { $builder = $this->createQueryBuilder('tle'); $builder->select('tle'); @@ -85,43 +83,7 @@ public function collection( $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } - $total = $this->getCount($builder); - - // limit - $builder->setMaxResults($pageSize); - $builder->setFirstResult($offset); - - $collection = new PaginationCollection(); - - $collection->setCollection($builder->getQuery()->getResult()); - $collection->setTotal($total); - - return $collection; - } - - /** - * @throws \Doctrine\ORM\NoResultException - * @throws \Doctrine\ORM\NonUniqueResultException - */ - private function getCount(QueryBuilder $builder): int - { - $builder = clone $builder; - - $alias = $builder->getRootAliases()[0] ?? null; - $entity = $builder->getRootEntities()[0] ?? null; - - $meta = $builder->getEntityManager()->getClassMetadata($entity); - $identifier = $meta->identifier[0] ?? null; - - $builder->select("COUNT($alias.$identifier)"); - - try { - return $builder->getQuery()->getSingleScalarResult(); - } catch (NonUniqueResultException) { - $result = array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()); - - return array_sum($result); - } + return $builder; } private function getSortTableColumnMapping(string $sort): ?string diff --git a/src/ViewModel/Model/PaginationCollection.php b/src/ViewModel/Model/PaginationCollection.php index ff56696..66ddf53 100644 --- a/src/ViewModel/Model/PaginationCollection.php +++ b/src/ViewModel/Model/PaginationCollection.php @@ -2,29 +2,45 @@ namespace App\ViewModel\Model; +use Doctrine\ORM\NonUniqueResultException; +use Doctrine\ORM\QueryBuilder; + class PaginationCollection { - private array $collection = []; - - private int $total = 0; - - public function getCollection(): array + public function __construct(protected QueryBuilder $builder) { - return $this->collection; } - public function setCollection(array $collection): void - { - $this->collection = $collection; + public function getCollection( + int $pageSize, + int $offset + ): array { + $builder = clone $this->builder; + + $builder->setMaxResults($pageSize); + $builder->setFirstResult($offset); + + return $builder->getQuery()->getResult(); } public function getTotal(): int { - return $this->total; - } + $builder = clone $this->builder; - public function setTotal(int $total): void - { - $this->total = $total; + $alias = $builder->getRootAliases()[0] ?? null; + $entity = $builder->getRootEntities()[0] ?? null; + + $meta = $builder->getEntityManager()->getClassMetadata($entity); + $identifier = $meta->identifier[0] ?? null; + + $builder->select("COUNT($alias.$identifier)"); + + try { + return $builder->getQuery()->getSingleScalarResult(); + } catch (NonUniqueResultException) { + $result = array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()); + + return array_sum($result); + } } } From 5337a2ae646908085c12bb15e1f913440c8e1612 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 21:32:37 +0200 Subject: [PATCH 160/221] decouple pagination from repository --- src/Controller/AbstractApiController.php | 67 +---------- src/Controller/TleController.php | 18 ++- src/ViewModel/Model/PaginationCollection.php | 113 +++++++++++++++++-- 3 files changed, 114 insertions(+), 84 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 811e5bc..5900f30 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -8,7 +8,6 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\Service\Attribute\Required; @@ -38,71 +37,9 @@ public function getPage(Request $request): int return (int)$request->get(self::PAGE_PARAM, 1); } - public function getPageOffset(int $page, int $pageSize): int + public function getPageSize(Request $request, int $maxPageSize): int { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getPagination(Request $request, int $total, int $pageSize): array - { - $params = $request->query->all(); - - $page = $this->getPage($request); - $pages = max(1, ceil($total / $pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; + return (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); } public function response(array $data): JsonResponse diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index e6dda68..3c71256 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -80,7 +80,6 @@ public function collection( $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); - $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); $builder = $this->repository->collection( $search, @@ -90,13 +89,17 @@ public function collection( ); $pagination = new PaginationCollection($builder); + $pagination->setPageSize($this->getPageSize($request, self::MAX_PAGE_SIZE)); + $pagination->setCurrentPage( + $this->getPage($request) + ); $parameters = [ self::SEARCH_PARAM => $search ?? '*', self::SORT_PARAM => $sort, self::SORT_DIR_PARAM => $sortDir, self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, + self::PAGE_SIZE_PARAM => $this->getPageSize($request, self::MAX_PAGE_SIZE), ]; foreach ($filters as $filter) { @@ -111,19 +114,14 @@ public function collection( $parameters[$name] = $satelliteId; } - $total = $pagination->getTotal(); - $response = [ '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', - 'totalItems' => $total, - 'member' => $pagination->getCollection( - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize), - ), + 'totalItems' => $pagination->getTotal(), + 'member' => $pagination->getCollection(), 'parameters' => $parameters, - 'view' => $this->getPagination($request, $total, $pageSize), + 'view' => $pagination->getView($request, $this->router), ]; return $this->response( diff --git a/src/ViewModel/Model/PaginationCollection.php b/src/ViewModel/Model/PaginationCollection.php index 66ddf53..12532cd 100644 --- a/src/ViewModel/Model/PaginationCollection.php +++ b/src/ViewModel/Model/PaginationCollection.php @@ -4,27 +4,37 @@ use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\QueryBuilder; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Routing\RouterInterface; class PaginationCollection { + protected int|null $total = null; + + protected int $page = 1; + + protected int $pageSize = 20; + public function __construct(protected QueryBuilder $builder) { } - public function getCollection( - int $pageSize, - int $offset - ): array { + public function getCollection(): array { $builder = clone $this->builder; - $builder->setMaxResults($pageSize); - $builder->setFirstResult($offset); + $builder->setMaxResults($this->pageSize); + $builder->setFirstResult($this->getPageOffset($this->page, $this->pageSize)); return $builder->getQuery()->getResult(); } public function getTotal(): int { + if ($this->total !== null) { + return $this->total; + } + $builder = clone $this->builder; $alias = $builder->getRootAliases()[0] ?? null; @@ -36,11 +46,96 @@ public function getTotal(): int $builder->select("COUNT($alias.$identifier)"); try { - return $builder->getQuery()->getSingleScalarResult(); + $result = $builder->getQuery()->getSingleScalarResult(); } catch (NonUniqueResultException) { - $result = array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()); + $result = array_sum( + array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()) + ); + } + + $this->total = $result; + + return $result; + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getView(Request $request, RouterInterface $router): array + { + $params = $request->query->all(); + + $page = $this->page; + $pages = max(1, ceil($this->getTotal() / $this->pageSize)); - return array_sum($result); + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function setCurrentPage(int $page): PaginationCollection + { + $this->page = $page; + + return $this; + } + + public function setPageSize(int $pageSize): PaginationCollection + { + $this->pageSize = $pageSize; + + return $this; } } From ca705a90ae2129fd7029d04673689a083f2366b9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 21:36:31 +0200 Subject: [PATCH 161/221] decouple pagination from repository --- src/Controller/AbstractApiController.php | 2 +- src/Controller/TleController.php | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 5900f30..d15f141 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -21,7 +21,7 @@ abstract class AbstractApiController extends AbstractController protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; protected const PAGE_PARAM = 'page'; - protected const PAGE_SIZE = 50; + protected const PAGE_SIZE = 20; protected const SEARCH_PARAM = 'search'; protected RouterInterface $router; diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 3c71256..a1ed3e8 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -21,8 +21,6 @@ final class TleController extends AbstractApiController protected const MAX_PAGE_SIZE = 100; - protected const PAGE_SIZE = 20; - public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ From 392ac4cd67fce8a8958194b9ce381c420da3c742 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 4 Aug 2021 21:43:34 +0200 Subject: [PATCH 162/221] decouple pagination from repository --- etc/services.yaml | 2 +- src/ViewModel/SortDirectionEnum.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/services.yaml b/etc/services.yaml index 3235b01..43c61da 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -15,7 +15,7 @@ services: # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + exclude: '../src/{DependencyInjection,Entity,ViewModel,Enum,Migrations,Tests,Kernel.php}' bind: $env: '%kernel.environment%' $projectDir: "%kernel.project_dir%" diff --git a/src/ViewModel/SortDirectionEnum.php b/src/ViewModel/SortDirectionEnum.php index 33b65d1..ffb9f86 100644 --- a/src/ViewModel/SortDirectionEnum.php +++ b/src/ViewModel/SortDirectionEnum.php @@ -8,4 +8,4 @@ class SortDirectionEnum extends Enum { public const ASCENDING = 'asc'; public const DESCENDING = 'desc'; -} \ No newline at end of file +} From b446c72be7ce4a2f3778049bc9f9c2d73b1fddf2 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 5 Aug 2021 12:28:45 +0200 Subject: [PATCH 163/221] update commands --- src/Command/CleanupCommand.php | 16 ++++++--------- src/Command/DoctrineReloadCommand.php | 28 +++++++++++++++++---------- src/Command/ImportTleCommand.php | 19 ++++++++---------- src/Command/TleCalculate.php | 7 ++++--- src/Command/UpdateImportSources.php | 9 ++++----- 5 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/Command/CleanupCommand.php b/src/Command/CleanupCommand.php index 9465111..c2f9902 100644 --- a/src/Command/CleanupCommand.php +++ b/src/Command/CleanupCommand.php @@ -3,23 +3,19 @@ namespace App\Command; use App\Repository\RequestRepository; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand( + name: 'cleanup', description: 'Performs periodic cleanup on unused data' +)] final class CleanupCommand extends Command { - /** @noinspection PhpOptionalBeforeRequiredParametersInspection */ - public function __construct(string $name = null, private RequestRepository $repository) + public function __construct(private RequestRepository $repository) { - parent::__construct($name); - } - - protected function configure(): void - { - $this - ->setName('cleanup') - ->setDescription('Performs periodic cleanup on unused data'); + parent::__construct(); } protected function execute(InputInterface $input, OutputInterface $output): int diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 3529bfe..207615e 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -2,13 +2,18 @@ namespace App\Command; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ChoiceQuestion; use Symfony\Component\Console\Style\SymfonyStyle; +#[AsCommand( + name: 'doctrine:reload', description: 'Purge database, execute migrations and load fixtures' +)] final class DoctrineReloadCommand extends Command { private static array $choices = [ @@ -21,24 +26,24 @@ final class DoctrineReloadCommand extends Command 'test', ]; - private string $env; - - public function __construct($env) + public function __construct(private $env) { parent::__construct(); - $this->env = $env; } - /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { $this - ->setName('doctrine:reload') - ->setDescription('Purge database, execute migrations and load fixtures'); + ->addOption( + 'force', + 'f', + InputOption::VALUE_OPTIONAL, + 'Force execution even in production environment', + false + ); } /** - * @noinspection PhpMissingParentCallCommonInspection * @throws \Exception */ protected function execute(InputInterface $input, OutputInterface $output): int @@ -46,9 +51,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io = new SymfonyStyle($input, $output); $helper = $this->getHelper('question'); $question = new ChoiceQuestion('All data will be lost. Do you wish to continue?', self::$choices, false); + $force = $input->getOption('force') !== false; - if (!\in_array($this->env, self::$envs, true)) { - $io->warning('This is intended only for use in dev or test environment.'); + if (!$force && !\in_array($this->env, self::$envs, true)) { + $io->warning( + 'This is intended for use only in dev or test environment. Run with -f parameter to execute regardless of environment.' + ); return Command::FAILURE; } diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index e2692a3..ef9cbf7 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -9,6 +9,7 @@ use GuzzleHttp\Client; use Ivanstan\Tle\Model\Tle as TleModel; use Ivanstan\Tle\Model\TleFile; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; @@ -17,6 +18,9 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Yaml\Yaml; +#[AsCommand( + name: 'import:tle', description: 'Update TLE database' +)] final class ImportTleCommand extends Command { use FileSystemAwareTrait; @@ -26,23 +30,17 @@ final class ImportTleCommand extends Command public const SOURCE = '/etc/custom/source.yaml'; - private EntityManagerInterface $em; - private TleRepository $repository; - private array $satellites = []; - public function __construct(EntityManagerInterface $em, TleRepository $repository) + public function __construct(private EntityManagerInterface $em, private TleRepository $repository) { parent::__construct(); - $this->em = $em; - $this->repository = $repository; } /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { - $this->setName('import:tle') - ->addOption(self::OPTION_NO_PROGRESS, null, InputOption::VALUE_OPTIONAL, 'Hide progress bar', false); + $this->addOption(self::OPTION_NO_PROGRESS, null, InputOption::VALUE_OPTIONAL, 'Hide progress bar', false); } /** @noinspection PhpMissingParentCallCommonInspection */ @@ -103,7 +101,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->flush($insert, true); $this->flush($update); - } if (isset($progressBar)) { @@ -115,8 +112,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $table = new Table($output); $table ->setHeaders([ - 'Output' - ]) + 'Output' + ]) ->setStyle('box') ->setRows( [ diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 784f15b..5c378d8 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -6,18 +6,20 @@ use App\Entity\TleInformation; use Doctrine\ORM\EntityManagerInterface; use Ivanstan\Tle\Specification\GeostationaryOrbitTleSpecification; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand( + name: 'tle:calculate', description: 'Calculate and persist data in TleInformation entity' +)] final class TleCalculate extends Command { protected const BATCH_SIZE = 20; protected const OPTION_TLE = 'tle'; - protected static $defaultName = 'tle:calculate'; - public function __construct(protected EntityManagerInterface $entityManager) { parent::__construct(); @@ -25,7 +27,6 @@ public function __construct(protected EntityManagerInterface $entityManager) protected function configure(): void { - $this->setDescription('Calculate and persist data in TleInformation entity'); $this->addOption(self::OPTION_TLE, 't', InputOption::VALUE_REQUIRED, 'Calculate only for specified record'); } diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 6206d61..f6ccfa1 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -5,6 +5,7 @@ use App\Service\Traits\FileSystemAwareTrait; use DOMElement; use GuzzleHttp\Client; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -12,6 +13,9 @@ use Symfony\Component\DomCrawler\Crawler; use Symfony\Component\Yaml\Yaml; +#[AsCommand( + name: 'tle:source', description: 'Update TLE sources' +)] final class UpdateImportSources extends Command { use FileSystemAwareTrait; @@ -44,11 +48,6 @@ final class UpdateImportSources extends Command private SymfonyStyle $io; private array $sources = []; - protected function configure(): void - { - $this->setName('tle:source'); - } - protected function execute(InputInterface $input, OutputInterface $output): int { $this->io = new SymfonyStyle($input, $output); From 41b67710ad71030829c4a6ffb228bb84fd846af1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 5 Aug 2021 13:09:38 +0200 Subject: [PATCH 164/221] update commands --- src/Controller/TleController.php | 15 +- src/Repository/TleRepository.php | 2 - ...llection.php => QueryBuilderPaginator.php} | 299 +++++++++--------- 3 files changed, 162 insertions(+), 154 deletions(-) rename src/ViewModel/Model/{PaginationCollection.php => QueryBuilderPaginator.php} (76%) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index a1ed3e8..bebb550 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -5,7 +5,7 @@ use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; -use App\ViewModel\Model\PaginationCollection; +use App\ViewModel\Model\QueryBuilderPaginator; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; @@ -86,7 +86,7 @@ public function collection( $filters, ); - $pagination = new PaginationCollection($builder); + $pagination = new QueryBuilderPaginator($builder); $pagination->setPageSize($this->getPageSize($request, self::MAX_PAGE_SIZE)); $pagination->setCurrentPage( $this->getPage($request) @@ -112,15 +112,8 @@ public function collection( $parameters[$name] = $satelliteId; } - $response = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $pagination->getTotal(), - 'member' => $pagination->getCollection(), - 'parameters' => $parameters, - 'view' => $pagination->getView($request, $this->router), - ]; + $response = $pagination->getCollection($request, $this->router); + $response['parameters'] = $parameters; return $this->response( $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index f3c53aa..a7b76b3 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -6,11 +6,9 @@ use App\Entity\Tle; use App\Entity\TleInformation; use App\ViewModel\Filter; -use App\ViewModel\Model\PaginationCollection; use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; diff --git a/src/ViewModel/Model/PaginationCollection.php b/src/ViewModel/Model/QueryBuilderPaginator.php similarity index 76% rename from src/ViewModel/Model/PaginationCollection.php rename to src/ViewModel/Model/QueryBuilderPaginator.php index 12532cd..73f12cf 100644 --- a/src/ViewModel/Model/PaginationCollection.php +++ b/src/ViewModel/Model/QueryBuilderPaginator.php @@ -1,141 +1,158 @@ -builder; - - $builder->setMaxResults($this->pageSize); - $builder->setFirstResult($this->getPageOffset($this->page, $this->pageSize)); - - return $builder->getQuery()->getResult(); - } - - public function getTotal(): int - { - if ($this->total !== null) { - return $this->total; - } - - $builder = clone $this->builder; - - $alias = $builder->getRootAliases()[0] ?? null; - $entity = $builder->getRootEntities()[0] ?? null; - - $meta = $builder->getEntityManager()->getClassMetadata($entity); - $identifier = $meta->identifier[0] ?? null; - - $builder->select("COUNT($alias.$identifier)"); - - try { - $result = $builder->getQuery()->getSingleScalarResult(); - } catch (NonUniqueResultException) { - $result = array_sum( - array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()) - ); - } - - $this->total = $result; - - return $result; - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getView(Request $request, RouterInterface $router): array - { - $params = $request->query->all(); - - $page = $this->page; - $pages = max(1, ceil($this->getTotal() / $this->pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function setCurrentPage(int $page): PaginationCollection - { - $this->page = $page; - - return $this; - } - - public function setPageSize(int $pageSize): PaginationCollection - { - $this->pageSize = $pageSize; - - return $this; - } -} +getRootEntities()[0] ?? null; + + $this->meta = $builder->getEntityManager()->getClassMetadata($entity); + } + + public function getCollection(Request $request, RouterInterface $router): array + { + return [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $router->generate($request->attributes->get('_route'), [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $this->getTotal(), + 'member' => $this->getCurrentPageResult(), + 'parameters' => array_merge($request->request->all(), $request->query->all()), + 'view' => $this->getView($request, $router), + ]; + } + + public function getCurrentPageResult(): array + { + $builder = clone $this->builder; + + $builder->setMaxResults($this->pageSize); + $builder->setFirstResult($this->getPageOffset($this->page, $this->pageSize)); + + return $builder->getQuery()->getResult(); + } + + public function getTotal(): int + { + if ($this->total !== null) { + return $this->total; + } + + $builder = clone $this->builder; + + $alias = $builder->getRootAliases()[0] ?? null; + $identifier = $this->meta->identifier[0] ?? null; + + $builder->select("COUNT($alias.$identifier)"); + + try { + $result = $builder->getQuery()->getSingleScalarResult(); + } catch (NonUniqueResultException) { + $result = array_sum( + array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()) + ); + } + + $this->total = $result; + + return $result; + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getView(Request $request, RouterInterface $router): array + { + $params = $request->query->all(); + + $page = $this->page; + $pages = max(1, ceil($this->getTotal() / $this->pageSize)); + + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; + } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function setCurrentPage(int $page): QueryBuilderPaginator + { + $this->page = $page; + + return $this; + } + + public function setPageSize(int $pageSize): QueryBuilderPaginator + { + $this->pageSize = $pageSize; + + return $this; + } +} From cff175f0a375e5ff31d713faf1fb71fcee9987dc Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 10 Aug 2021 09:37:03 +0200 Subject: [PATCH 165/221] add colors --- bin/console | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/bin/console b/bin/console index 6752a33..8fe9d49 100644 --- a/bin/console +++ b/bin/console @@ -3,15 +3,41 @@ use App\Kernel; use Symfony\Bundle\FrameworkBundle\Console\Application; +use Symfony\Component\Console\Input\ArgvInput; +use Symfony\Component\Dotenv\Dotenv; +use Symfony\Component\ErrorHandler\Debug; -if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) { - throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); +if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL; } -require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; +set_time_limit(0); -return static function (array $context) { - $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); +require dirname(__DIR__).'/vendor/autoload.php'; - return new Application($kernel); -}; +if (!class_exists(Application::class) || !class_exists(Dotenv::class)) { + throw new LogicException('You need to add "symfony/framework-bundle" and "symfony/dotenv" as Composer dependencies.'); +} + +$input = new ArgvInput(); +if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); From 6c432b946a4b33a7959a06eff775bdd605c71d38 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 12 Aug 2021 20:57:25 +0200 Subject: [PATCH 166/221] add executables deploy --- deploy.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deploy.php b/deploy.php index 11211ee..422976c 100644 --- a/deploy.php +++ b/deploy.php @@ -44,6 +44,10 @@ run('cd {{release_path}} && {{bin/composer}} dump-env prod'); }); +task('deploy:executable', function () { + run('chmod +x {{release_path}}/bin/console'); +}); + task( 'deploy', [ @@ -58,6 +62,7 @@ 'deploy:assets', 'deploy:writable', 'deploy:vendors', + 'deploy:executable', 'deploy:cache:clear', 'deploy:cache:warmup', 'deploy:dump-env', From 282ebbf331bd0a8f21b4e8d2b01f37127dd6c7d9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 21 Sep 2021 09:19:21 +0200 Subject: [PATCH 167/221] bugfix --- src/ViewModel/Model/QueryBuilderPaginator.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ViewModel/Model/QueryBuilderPaginator.php b/src/ViewModel/Model/QueryBuilderPaginator.php index 73f12cf..4970bb9 100644 --- a/src/ViewModel/Model/QueryBuilderPaginator.php +++ b/src/ViewModel/Model/QueryBuilderPaginator.php @@ -3,6 +3,7 @@ namespace App\ViewModel\Model; use Doctrine\ORM\NonUniqueResultException; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -68,6 +69,8 @@ public function getTotal(): int $result = array_sum( array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()) ); + } catch (NoResultException) { + $result = 0; } $this->total = $result; From 5a012e0aac4e2c58303f140c71e94b74241c78a3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 23 Sep 2021 18:57:56 +0200 Subject: [PATCH 168/221] request validator --- composer.json | 2 + composer.lock | 202 ++++++++++++++++++++++- src/Attributes/RequestValidator.php | 11 ++ src/Controller/TleController.php | 11 +- src/Event/RequestValidatorSubscriber.php | 62 +++++++ symfony.lock | 16 ++ 6 files changed, 296 insertions(+), 8 deletions(-) create mode 100644 src/Attributes/RequestValidator.php create mode 100644 src/Event/RequestValidatorSubscriber.php diff --git a/composer.json b/composer.json index cc243ed..8e78286 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "ext-iconv": "*", "ext-json": "*", "beberlei/doctrineextensions": "^1.3", + "doctrine/annotations": "^1.13", "ivanstan/tle-php": "dev-master", "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", @@ -28,6 +29,7 @@ "symfony/rate-limiter": "5.3.*", "symfony/runtime": "5.3.*", "symfony/serializer": "5.3.*", + "symfony/validator": "5.3.*", "symfony/yaml": "5.3.*" }, "require-dev": { diff --git a/composer.lock b/composer.lock index f38aea6..19b972d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9bb34785d465a1fc0b8a007cd8d6cb8b", + "content-hash": "d3928b12306646ebd1a541f0c6ffb016", "packages": [ { "name": "beberlei/doctrineextensions", @@ -204,16 +204,16 @@ }, { "name": "doctrine/annotations", - "version": "1.13.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { @@ -270,9 +270,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.2" }, - "time": "2021-05-16T18:07:53+00:00" + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/cache", @@ -7346,6 +7346,194 @@ ], "time": "2021-06-27T11:44:38+00:00" }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/validator", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "916a7c6cf3ede36eb0e4097500e0a12dcff520a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/916a7c6cf3ede36eb0e4097500e0a12dcff520a7", + "reference": "916a7c6cf3ede36eb0e4097500e0a12dcff520a7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/lexer": "<1.0.2", + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/expression-language": "<5.1", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/property-info": "<5.3", + "symfony/translation": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "doctrine/cache": "^1.0|^2.0", + "egulias/email-validator": "^2.1.10|^3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^5.1", + "symfony/finder": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^5.3", + "symfony/translation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-26T08:22:53+00:00" + }, { "name": "symfony/var-dumper", "version": "v5.3.6", diff --git a/src/Attributes/RequestValidator.php b/src/Attributes/RequestValidator.php new file mode 100644 index 0000000..14c4a26 --- /dev/null +++ b/src/Attributes/RequestValidator.php @@ -0,0 +1,11 @@ + "\d+"])] + #[RequestValidator([ + self::PARAM_EXTRA => [ + Assert\Choice::class => [ + 'choices' => ['0', '1'], + 'message' => 'Invalid request value {{ value }}. Allowed values are {{ choices }}.', + ], + ], + ])] public function record( int $id, NormalizerInterface $normalizer, diff --git a/src/Event/RequestValidatorSubscriber.php b/src/Event/RequestValidatorSubscriber.php new file mode 100644 index 0000000..f84630c --- /dev/null +++ b/src/Event/RequestValidatorSubscriber.php @@ -0,0 +1,62 @@ + 'onController', + ]; + } + + public function onController(ControllerEvent $event): void + { + $controller = $event->getController(); + + $reflection = new ReflectionClass($controller[0]::class); + $attributes = $reflection->getMethod($controller[1])->getAttributes(); + + foreach ($attributes as $attribute) { + if ($attribute->getName() === RequestValidator::class) { + $this->validate($event->getRequest(), $attribute->getArguments()); + } + } + } + + public function validate(Request $request, array $arguments): void { + $validator = Validation::createValidator(); + $constraints = $arguments[0] ?? []; + + $violations = new ConstraintViolationList(); + + foreach ($request->query->all() as $name => $value) { + if (!isset($constraints[$name])) { + continue; + } + + $validators = []; + + foreach ($constraints[$name] as $class => $params) { + $validators[] = new $class($params); + } + + $violations->addAll($validator->validate($value, $validators)); + } + + if ($violations->has(0)) { + throw new BadRequestHttpException($violations->get(0)->getMessage()); + } + } +} diff --git a/symfony.lock b/symfony.lock index 1b6e4de..86c774d 100644 --- a/symfony.lock +++ b/symfony.lock @@ -447,9 +447,25 @@ "symfony/string": { "version": "v5.2.3" }, + "symfony/translation-contracts": { + "version": "v2.4.0" + }, "symfony/twig-pack": { "version": "v1.0.2" }, + "symfony/validator": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "3eb8df139ec05414489d55b97603c5f6ca0c44cb" + }, + "files": [ + "config/packages/test/validator.yaml", + "config/packages/validator.yaml" + ] + }, "symfony/var-dumper": { "version": "v5.0.1" }, From 55c3ddc37b04831ed535f6c5d9c266e23687d024 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 29 Sep 2021 15:03:24 +0200 Subject: [PATCH 169/221] move classes enum --- config/packages/test/validator.yaml | 3 ++ config/packages/validator.yaml | 8 +++++ src/Controller/TleController.php | 4 +-- src/{ViewModel => Enum}/SortDirectionEnum.php | 22 ++++++------ .../TleCollectionSortableFieldsEnum.php | 36 +++++++++---------- src/Repository/TleRepository.php | 2 +- src/Serializer/TleModelNormalizer.php | 2 +- src/Service/Validator/RequestValidator.php | 1 - 8 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 config/packages/test/validator.yaml create mode 100644 config/packages/validator.yaml rename src/{ViewModel => Enum}/SortDirectionEnum.php (80%) rename src/{ViewModel => Enum}/TleCollectionSortableFieldsEnum.php (91%) diff --git a/config/packages/test/validator.yaml b/config/packages/test/validator.yaml new file mode 100644 index 0000000..1e5ab78 --- /dev/null +++ b/config/packages/test/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + not_compromised_password: false diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 index 0000000..350786a --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,8 @@ +framework: + validation: + email_validation_mode: html5 + + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 728b747..502aa40 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -3,12 +3,12 @@ namespace App\Controller; use App\Attributes\RequestValidator; +use App\Enum\SortDirectionEnum; +use App\Enum\TleCollectionSortableFieldsEnum; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; use App\ViewModel\Model\QueryBuilderPaginator; -use App\ViewModel\SortDirectionEnum; -use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; diff --git a/src/ViewModel/SortDirectionEnum.php b/src/Enum/SortDirectionEnum.php similarity index 80% rename from src/ViewModel/SortDirectionEnum.php rename to src/Enum/SortDirectionEnum.php index ffb9f86..bb04242 100644 --- a/src/ViewModel/SortDirectionEnum.php +++ b/src/Enum/SortDirectionEnum.php @@ -1,11 +1,11 @@ - Date: Thu, 30 Sep 2021 16:48:59 +0200 Subject: [PATCH 170/221] add validator config --- {config => etc}/packages/test/validator.yaml | 0 {config => etc}/packages/validator.yaml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {config => etc}/packages/test/validator.yaml (100%) rename {config => etc}/packages/validator.yaml (100%) diff --git a/config/packages/test/validator.yaml b/etc/packages/test/validator.yaml similarity index 100% rename from config/packages/test/validator.yaml rename to etc/packages/test/validator.yaml diff --git a/config/packages/validator.yaml b/etc/packages/validator.yaml similarity index 100% rename from config/packages/validator.yaml rename to etc/packages/validator.yaml From f339d9f8825dd539d3fa8883429244a10efc8031 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 16 Nov 2021 14:04:58 +0100 Subject: [PATCH 171/221] upgrade --- composer.json | 5 +- composer.lock | 1319 +++++++++++----------- etc/bundles.php | 20 +- src/Attributes/RequestValidator.php | 11 - src/Controller/TleController.php | 10 - src/Event/RequestValidatorSubscriber.php | 62 - symfony.lock | 3 - 7 files changed, 648 insertions(+), 782 deletions(-) delete mode 100644 src/Attributes/RequestValidator.php delete mode 100644 src/Event/RequestValidatorSubscriber.php diff --git a/composer.json b/composer.json index 8e78286..34550bc 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,11 @@ "ext-iconv": "*", "ext-json": "*", "beberlei/doctrineextensions": "^1.3", + "composer/package-versions-deprecated": "1.11.99.4", "doctrine/annotations": "^1.13", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2", "ivanstan/tle-php": "dev-master", "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", @@ -24,7 +28,6 @@ "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.3.*", "symfony/monolog-bundle": "^3.7", - "symfony/orm-pack": "^1.1", "symfony/property-access": "5.3.*", "symfony/rate-limiter": "5.3.*", "symfony/runtime": "5.3.*", diff --git a/composer.lock b/composer.lock index 19b972d..52163e9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d3928b12306646ebd1a541f0c6ffb016", + "content-hash": "36741392d9ac539d410848a591f03225", "packages": [ { "name": "beberlei/doctrineextensions", @@ -131,16 +131,16 @@ }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.2", + "version": "1.11.99.4", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c" + "reference": "b174585d1fe49ceed21928a945138948cb394600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c", - "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", "shasum": "" }, "require": { @@ -184,7 +184,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" }, "funding": [ { @@ -200,7 +200,7 @@ "type": "tidelift" } ], - "time": "2021-05-24T07:46:03+00:00" + "time": "2021-09-13T08:41:34+00:00" }, { "name": "doctrine/annotations", @@ -276,24 +276,23 @@ }, { "name": "doctrine/cache", - "version": "1.11.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "3bb5588cec00a0268829cc4a518490df6741af9d" + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/3bb5588cec00a0268829cc4a518490df6741af9d", - "reference": "3bb5588cec00a0268829cc4a518490df6741af9d", + "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4", - "psr/cache": ">=3" + "doctrine/common": ">2.2,<2.4" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", @@ -302,8 +301,9 @@ "mongodb/mongodb": "^1.1", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", "predis/predis": "~1.0", - "psr/cache": "^1.0 || ^2.0", - "symfony/cache": "^4.4 || ^5.2" + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" @@ -355,7 +355,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.11.3" + "source": "https://github.com/doctrine/cache/tree/2.1.1" }, "funding": [ { @@ -371,30 +371,30 @@ "type": "tidelift" } ], - "time": "2021-05-25T09:01:55+00:00" + "time": "2021-07-17T14:49:29+00:00" }, { "name": "doctrine/collections", - "version": "1.6.7", + "version": "1.6.8", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", "shasum": "" }, "require": { "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.2.1" }, "type": "library", "autoload": { @@ -438,22 +438,22 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" + "source": "https://github.com/doctrine/collections/tree/1.6.8" }, - "time": "2020-07-27T17:53:49+00:00" + "time": "2021-08-10T18:51:53+00:00" }, { "name": "doctrine/common", - "version": "3.1.2", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" + "reference": "6d970a11479275300b5144e9373ce5feacfa9b91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", - "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "url": "https://api.github.com/repos/doctrine/common/zipball/6d970a11479275300b5144e9373ce5feacfa9b91", + "reference": "6d970a11479275300b5144e9373ce5feacfa9b91", "shasum": "" }, "require": { @@ -514,7 +514,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.2" + "source": "https://github.com/doctrine/common/tree/3.2.0" }, "funding": [ { @@ -530,37 +530,39 @@ "type": "tidelift" } ], - "time": "2021-02-10T20:18:51+00:00" + "time": "2021-10-19T06:47:22+00:00" }, { "name": "doctrine/dbal", - "version": "2.13.1", + "version": "2.13.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9" + "reference": "d92ddb260547c2a7b650ff140f744eb6f395d8fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c800380457948e65bbd30ba92cc17cda108bf8c9", - "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/d92ddb260547c2a7b650ff140f744eb6f395d8fc", + "reference": "d92ddb260547c2a7b650ff140f744eb6f395d8fc", "shasum": "" }, "require": { - "doctrine/cache": "^1.0", + "doctrine/cache": "^1.0|^2.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "ext-pdo": "*", "php": "^7.1 || ^8" }, "require-dev": { - "doctrine/coding-standard": "8.2.0", - "jetbrains/phpstorm-stubs": "2020.2", - "phpstan/phpstan": "0.12.81", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", - "squizlabs/php_codesniffer": "3.6.0", + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.1.1", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.10", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.1", + "symfony/cache": "^4.4", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.6.4" + "vimeo/psalm": "4.12.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -621,7 +623,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.1" + "source": "https://github.com/doctrine/dbal/tree/2.13.5" }, "funding": [ { @@ -637,7 +639,7 @@ "type": "tidelift" } ], - "time": "2021-04-17T17:30:19+00:00" + "time": "2021-11-11T16:27:36+00:00" }, { "name": "doctrine/deprecations", @@ -684,19 +686,20 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.4.1", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2" + "reference": "62a188ce2192e6b3b7a2019c26c5001778818b83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/7f472cc85eba050a83fcf38cece87b868877d7e2", - "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/62a188ce2192e6b3b7a2019c26c5001778818b83", + "reference": "62a188ce2192e6b3b7a2019c26c5001778818b83", "shasum": "" }, "require": { + "doctrine/annotations": "^1", "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^2.9.0|^3.0", "doctrine/persistence": "^1.3.3|^2.0", @@ -776,7 +779,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.1" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.3" }, "funding": [ { @@ -792,20 +795,20 @@ "type": "tidelift" } ], - "time": "2021-06-01T18:38:32+00:00" + "time": "2021-09-11T21:20:34+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.2.2", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "85f0b847174daf243362c7da80efe1539be64f47" + "reference": "0a081b55a88259a887af7be654743a8c5f703e99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/85f0b847174daf243362c7da80efe1539be64f47", - "reference": "85f0b847174daf243362c7da80efe1539be64f47", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/0a081b55a88259a887af7be654743a8c5f703e99", + "reference": "0a081b55a88259a887af7be654743a8c5f703e99", "shasum": "" }, "require": { @@ -822,11 +825,6 @@ "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\MigrationsBundle\\": "" @@ -862,7 +860,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.3" }, "funding": [ { @@ -878,7 +876,7 @@ "type": "tidelift" } ], - "time": "2020-12-23T15:06:17+00:00" + "time": "2021-03-18T20:55:50+00:00" }, { "name": "doctrine/event-manager", @@ -976,34 +974,30 @@ }, { "name": "doctrine/inflector", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" @@ -1051,7 +1045,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.x" + "source": "https://github.com/doctrine/inflector/tree/2.0.4" }, "funding": [ { @@ -1067,7 +1061,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T15:13:26+00:00" + "time": "2021-10-22T20:16:43+00:00" }, { "name": "doctrine/instantiator", @@ -1220,16 +1214,16 @@ }, { "name": "doctrine/migrations", - "version": "2.3.3", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa" + "reference": "6d87c9a0baa6a4725b4c4e1a45b2a39f53bf1859" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/c4c46f7064f6e7795bd7f26549579918b46790fa", - "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/6d87c9a0baa6a4725b4c4e1a45b2a39f53bf1859", + "reference": "6d87c9a0baa6a4725b4c4e1a45b2a39f53bf1859", "shasum": "" }, "require": { @@ -1262,11 +1256,6 @@ "bin/doctrine-migrations" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" @@ -1300,7 +1289,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.3.3" + "source": "https://github.com/doctrine/migrations/tree/2.3.4" }, "funding": [ { @@ -1316,48 +1305,55 @@ "type": "tidelift" } ], - "time": "2021-03-14T10:22:48+00:00" + "time": "2021-04-10T07:56:08+00:00" }, { "name": "doctrine/orm", - "version": "2.9.2", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1" + "reference": "81d472f6f96b8b571cafefe8d2fef89ed9446a62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", - "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", + "url": "https://api.github.com/repos/doctrine/orm/zipball/81d472f6f96b8b571cafefe8d2fef89ed9446a62", + "reference": "81d472f6f96b8b571cafefe8d2fef89ed9446a62", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.13", - "doctrine/cache": "^1.11.3|^2.0.3", + "doctrine/cache": "^1.12.1 || ^2.1.1", "doctrine/collections": "^1.5", "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.0", + "doctrine/dbal": "^2.13.1 || ^3.1.1", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.1", - "doctrine/inflector": "^1.4|^2.0", + "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3", "doctrine/lexer": "^1.0", "doctrine/persistence": "^2.2", + "ext-ctype": "*", "ext-pdo": "*", - "php": "^7.1|^8.0", + "php": "^7.1 ||^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^3.0|^4.0|^5.0|^6.0" + "symfony/console": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 2.0" }, "require-dev": { + "doctrine/annotations": "^1.13", "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^0.12.83", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "squizlabs/php_codesniffer": "3.6.0", - "symfony/cache": "^4.4|^5.2", - "symfony/yaml": "^3.4|^4.0|^5.0|^6.0", - "vimeo/psalm": "4.7.0" + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/phpstan": "0.12.99", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "squizlabs/php_codesniffer": "3.6.1", + "symfony/cache": "^4.4 || ^5.2", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", + "vimeo/psalm": "4.10.0" }, "suggest": { "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", @@ -1406,22 +1402,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.9.2" + "source": "https://github.com/doctrine/orm/tree/2.10.2" }, - "time": "2021-05-31T09:53:14+00:00" + "time": "2021-10-21T17:57:02+00:00" }, { "name": "doctrine/persistence", - "version": "2.2.1", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "d138f3ab5f761055cab1054070377cfd3222e368" + "reference": "5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/d138f3ab5f761055cab1054070377cfd3222e368", - "reference": "d138f3ab5f761055cab1054070377cfd3222e368", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee", + "reference": "5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee", "shasum": "" }, "require": { @@ -1493,22 +1489,22 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.2.1" + "source": "https://github.com/doctrine/persistence/tree/2.2.3" }, - "time": "2021-05-19T07:07:01+00:00" + "time": "2021-10-25T19:59:10+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "56070bebac6e77230ed7d306ad13528e60732871" + "reference": "20c39c2de286a9d3262cc8ed282a4ae60e265894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", - "reference": "56070bebac6e77230ed7d306ad13528e60732871", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/20c39c2de286a9d3262cc8ed282a4ae60e265894", + "reference": "20c39c2de286a9d3262cc8ed282a4ae60e265894", "shasum": "" }, "require": { @@ -1521,11 +1517,6 @@ "bin/sql-formatter" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\SqlFormatter\\": "src" @@ -1550,9 +1541,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.2" }, - "time": "2020-07-30T16:57:33+00:00" + "time": "2021-11-05T11:11:14+00:00" }, { "name": "friendsofphp/proxy-manager-lts", @@ -1709,16 +1700,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.4.1", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", "shasum": "" }, "require": { @@ -1730,7 +1721,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -1746,10 +1737,25 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", @@ -1758,22 +1764,36 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.1" + "source": "https://github.com/guzzle/promises/tree/1.5.1" }, - "time": "2021-03-07T09:25:29+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:56:57+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.2", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", "shasum": "" }, "require": { @@ -1810,13 +1830,34 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], @@ -1833,34 +1874,52 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.2" + "source": "https://github.com/guzzle/psr7/tree/1.8.3" }, - "time": "2021-04-26T09:17:50+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-10-05T13:56:00+00:00" }, { "name": "http-interop/http-factory-guzzle", - "version": "1.0.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", "shasum": "" }, "require": { - "guzzlehttp/psr7": "^1.4.2", + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", "psr/http-factory": "^1.0" }, "provide": { "psr/http-factory-implementation": "^1.0" }, "require-dev": { - "http-interop/http-factory-tests": "^0.5", - "phpunit/phpunit": "^6.5" + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" }, "type": "library", "autoload": { @@ -1887,9 +1946,9 @@ ], "support": { "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" }, - "time": "2018-07-31T19:32:56+00:00" + "time": "2021-07-21T13:50:14+00:00" }, { "name": "ivanstan/tle-php", @@ -1897,12 +1956,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "45255e18e2730938e8428f4f232d1943b9893991" + "reference": "41ddb95c5c0cb98ef5f0aa28016d0e5cf7664094" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/45255e18e2730938e8428f4f232d1943b9893991", - "reference": "45255e18e2730938e8428f4f232d1943b9893991", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/41ddb95c5c0cb98ef5f0aa28016d0e5cf7664094", + "reference": "41ddb95c5c0cb98ef5f0aa28016d0e5cf7664094", "shasum": "" }, "require": { @@ -1936,20 +1995,20 @@ "issues": "https://github.com/ivanstan/tle-php/issues", "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-05-27T19:24:24+00:00" + "time": "2021-06-05T16:45:49+00:00" }, { "name": "jean85/pretty-package-versions", - "version": "2.0.4", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "694492c653c518456af2805f04eec445b997ed1f" + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/694492c653c518456af2805f04eec445b997ed1f", - "reference": "694492c653c518456af2805f04eec445b997ed1f", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", "shasum": "" }, "require": { @@ -1993,34 +2052,30 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.4" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" }, - "time": "2021-05-26T08:46:42+00:00" + "time": "2021-10-08T21:21:46+00:00" }, { "name": "laminas/laminas-code", - "version": "4.3.0", + "version": "4.4.3", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "1beb4447f9efd26041eba7eff50614e798c353fd" + "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1beb4447f9efd26041eba7eff50614e798c353fd", - "reference": "1beb4447f9efd26041eba7eff50614e798c353fd", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/bb324850d09dd437b6acb142c13e64fdc725b0e1", + "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1", "shasum": "" }, "require": { - "laminas/laminas-eventmanager": "^3.3", "php": "^7.4 || ~8.0.0" }, "conflict": { "phpspec/prophecy": "<1.9.0" }, - "replace": { - "zendframework/zend-code": "self.version" - }, "require-dev": { "doctrine/annotations": "^1.10.4", "ext-phar": "*", @@ -2066,156 +2121,28 @@ "type": "community_bridge" } ], - "time": "2021-05-12T12:41:03+00:00" - }, - { - "name": "laminas/laminas-eventmanager", - "version": "3.3.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "966c859b67867b179fde1eff0cd38df51472ce4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/966c859b67867b179fde1eff0cd38df51472ce4a", - "reference": "966c859b67867b179fde1eff0cd38df51472ce4a", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.3 || ^8.0" - }, - "replace": { - "zendframework/zend-eventmanager": "^3.2.1" - }, - "require-dev": { - "container-interop/container-interop": "^1.1", - "laminas/laminas-coding-standard": "~1.0.0", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "container-interop/container-interop": "^1.1, to use the lazy listeners feature", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://laminas.dev", - "keywords": [ - "event", - "eventmanager", - "events", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-eventmanager/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-eventmanager/issues", - "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", - "source": "https://github.com/laminas/laminas-eventmanager" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2021-03-08T15:24:29+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32", - "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "psalm/plugin-phpunit": "^0.15.1", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.6" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2021-02-25T21:54:58+00:00" + "time": "2021-09-21T13:40:23+00:00" }, { "name": "monolog/monolog", - "version": "2.2.0", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", "shasum": "" }, "require": { "php": ">=7.2", - "psr/log": "^1.0.1" + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0" + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", @@ -2223,14 +2150,14 @@ "elasticsearch/elasticsearch": "^7", "graylog2/gelf-php": "^1.4.2", "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4", + "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.59", + "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <7.0.1", + "ruflin/elastica": ">=0.90@dev", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { @@ -2238,8 +2165,11 @@ "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", @@ -2278,7 +2208,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" }, "funding": [ { @@ -2290,7 +2220,7 @@ "type": "tidelift" } ], - "time": "2020-12-14T13:15:25+00:00" + "time": "2021-10-01T21:08:31+00:00" }, { "name": "myclabs/php-enum", @@ -2354,16 +2284,16 @@ }, { "name": "php-http/client-common", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "e37e46c610c87519753135fb893111798c69076a" + "reference": "29e0c60d982f04017069483e832b92074d0a90b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", - "reference": "e37e46c610c87519753135fb893111798c69076a", + "url": "https://api.github.com/repos/php-http/client-common/zipball/29e0c60d982f04017069483e832b92074d0a90b2", + "reference": "29e0c60d982f04017069483e832b92074d0a90b2", "shasum": "" }, "require": { @@ -2423,22 +2353,22 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.3.0" + "source": "https://github.com/php-http/client-common/tree/2.4.0" }, - "time": "2020-07-21T10:04:13+00:00" + "time": "2021-07-05T08:19:25+00:00" }, { "name": "php-http/discovery", - "version": "1.14.0", + "version": "1.14.1", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb" + "reference": "de90ab2b41d7d61609f504e031339776bc8c7223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/778f722e29250c1fac0bbdef2c122fa5d038c9eb", - "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb", + "url": "https://api.github.com/repos/php-http/discovery/zipball/de90ab2b41d7d61609f504e031339776bc8c7223", + "reference": "de90ab2b41d7d61609f504e031339776bc8c7223", "shasum": "" }, "require": { @@ -2491,9 +2421,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.0" + "source": "https://github.com/php-http/discovery/tree/1.14.1" }, - "time": "2021-06-01T14:30:21+00:00" + "time": "2021-09-18T07:57:46+00:00" }, { "name": "php-http/httplug", @@ -2559,16 +2489,16 @@ }, { "name": "php-http/message", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "887734d9c515ad9a564f6581a682fff87a6253cc" + "reference": "39eb7548be982a81085fe5a6e2a44268cd586291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/887734d9c515ad9a564f6581a682fff87a6253cc", - "reference": "887734d9c515ad9a564f6581a682fff87a6253cc", + "url": "https://api.github.com/repos/php-http/message/zipball/39eb7548be982a81085fe5a6e2a44268cd586291", + "reference": "39eb7548be982a81085fe5a6e2a44268cd586291", "shasum": "" }, "require": { @@ -2627,9 +2557,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.11.1" + "source": "https://github.com/php-http/message/tree/1.12.0" }, - "time": "2021-05-24T18:11:08+00:00" + "time": "2021-08-29T09:13:12+00:00" }, { "name": "php-http/message-factory", @@ -2793,20 +2723,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -2835,9 +2765,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/event-dispatcher", @@ -3051,30 +2981,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3095,9 +3025,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/2.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:41:46+00:00" }, { "name": "ralouphie/getallheaders", @@ -3201,23 +3131,23 @@ }, { "name": "sentry/sentry", - "version": "3.3.0", + "version": "3.3.4", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047" + "reference": "ecbd09ea5d053a202cf773cb24ab28af820831bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/3bb122f9fc2bc43a4646e37db79eaf115b35b047", - "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/ecbd09ea5d053a202cf773cb24ab28af820831bd", + "reference": "ecbd09ea5d053a202cf773cb24ab28af820831bd", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", + "guzzlehttp/psr7": "^1.7|^2.0", "jean85/pretty-package-versions": "^1.5|^2.0.1", "php": "^7.2|^8.0", "php-http/async-client-implementation": "^1.0", @@ -3227,8 +3157,8 @@ "php-http/message": "^1.5", "psr/http-factory": "^1.0", "psr/http-message-implementation": "^1.0", - "psr/log": "^1.0", - "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0", "symfony/polyfill-php80": "^1.17", "symfony/polyfill-uuid": "^1.13.1" }, @@ -3245,8 +3175,8 @@ "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5.13|^9.4", - "symfony/phpunit-bridge": "^5.2", + "phpunit/phpunit": "^8.5.14|^9.4", + "symfony/phpunit-bridge": "^5.2|^6.0", "vimeo/psalm": "^4.2" }, "suggest": { @@ -3289,7 +3219,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.3.0" + "source": "https://github.com/getsentry/sentry-php/tree/3.3.4" }, "funding": [ { @@ -3301,20 +3231,20 @@ "type": "custom" } ], - "time": "2021-05-25T18:32:24+00:00" + "time": "2021-11-08T08:44:00+00:00" }, { "name": "sentry/sentry-symfony", - "version": "4.1.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "d0b85df21f65499db87341648541a526a1f7960d" + "reference": "cbd486cdf5b9d1933e0dad1c72a84269397ca931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/d0b85df21f65499db87341648541a526a1f7960d", - "reference": "d0b85df21f65499db87341648541a526a1f7960d", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cbd486cdf5b9d1933e0dad1c72a84269397ca931", + "reference": "cbd486cdf5b9d1933e0dad1c72a84269397ca931", "shasum": "" }, "require": { @@ -3322,7 +3252,7 @@ "php": "^7.2||^8.0", "php-http/discovery": "^1.11", "sentry/sdk": "^3.1", - "symfony/cache-contracts": "^2.4", + "symfony/cache-contracts": "^1.1||^2.4", "symfony/config": "^3.4.44||^4.4.20||^5.0.11", "symfony/console": "^3.4.44||^4.4.20||^5.0.11", "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11", @@ -3333,7 +3263,7 @@ "symfony/security-core": "^3.4.44||^4.4.20||^5.0.11" }, "require-dev": { - "doctrine/dbal": "^2.10||^3.0", + "doctrine/dbal": "^2.13||^3.0", "doctrine/doctrine-bundle": "^1.12||^2.0", "friendsofphp/php-cs-fixer": "^2.18", "jangregor/phpstan-prophecy": "^0.8", @@ -3364,7 +3294,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "4.x-dev", + "dev-master": "4.2.x-dev", "releases/3.2.x": "3.2.x-dev", "releases/2.x": "2.x-dev", "releases/1.x": "1.x-dev" @@ -3402,7 +3332,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.1.3" + "source": "https://github.com/getsentry/sentry-symfony/tree/4.2.4" }, "funding": [ { @@ -3414,7 +3344,7 @@ "type": "custom" } ], - "time": "2021-05-31T07:54:49+00:00" + "time": "2021-10-20T07:42:14+00:00" }, { "name": "symfony/apache-pack", @@ -3590,16 +3520,16 @@ }, { "name": "symfony/cache", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661" + "reference": "2056f2123f47c9f63102a8b92974c362f4fba568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/944db6004fc374fbe032d18e07cce51cc4e1e661", - "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661", + "url": "https://api.github.com/repos/symfony/cache/zipball/2056f2123f47c9f63102a8b92974c362f4fba568", + "reference": "2056f2123f47c9f63102a8b92974c362f4fba568", "shasum": "" }, "require": { @@ -3608,6 +3538,7 @@ "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^1.1.7|^2", "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" @@ -3666,7 +3597,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.3.4" + "source": "https://github.com/symfony/cache/tree/v5.3.10" }, "funding": [ { @@ -3682,7 +3613,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-10-11T15:41:55+00:00" }, { "name": "symfony/cache-contracts", @@ -3765,16 +3696,16 @@ }, { "name": "symfony/config", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4268f3059c904c61636275182707f81645517a37" + "reference": "ac23c2f24d5634966d665d836c3933d54347e5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", - "reference": "4268f3059c904c61636275182707f81645517a37", + "url": "https://api.github.com/repos/symfony/config/zipball/ac23c2f24d5634966d665d836c3933d54347e5d4", + "reference": "ac23c2f24d5634966d665d836c3933d54347e5d4", "shasum": "" }, "require": { @@ -3824,7 +3755,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.3.4" + "source": "https://github.com/symfony/config/tree/v5.3.10" }, "funding": [ { @@ -3840,20 +3771,20 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-10-22T09:06:52+00:00" }, { "name": "symfony/console", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", - "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", "shasum": "" }, "require": { @@ -3923,7 +3854,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.6" + "source": "https://github.com/symfony/console/tree/v5.3.10" }, "funding": [ { @@ -3939,7 +3870,7 @@ "type": "tidelift" } ], - "time": "2021-07-27T19:10:22+00:00" + "time": "2021-10-26T09:30:15+00:00" }, { "name": "symfony/css-selector", @@ -4009,16 +3940,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5a825e4b386066167a8b55487091cb62beec74c2" + "reference": "be833dd336c248ef2bdabf24665351455f52afdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a825e4b386066167a8b55487091cb62beec74c2", - "reference": "5a825e4b386066167a8b55487091cb62beec74c2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be833dd336c248ef2bdabf24665351455f52afdb", + "reference": "be833dd336c248ef2bdabf24665351455f52afdb", "shasum": "" }, "require": { @@ -4077,7 +4008,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.3.4" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.10" }, "funding": [ { @@ -4093,7 +4024,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-10-22T18:11:05+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4164,16 +4095,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "70bffec510b08e4830d851ad485a996b130fcd7c" + "reference": "212521017d81686bdc84a132fb5de2b03867a7e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/70bffec510b08e4830d851ad485a996b130fcd7c", - "reference": "70bffec510b08e4830d851ad485a996b130fcd7c", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/212521017d81686bdc84a132fb5de2b03867a7e7", + "reference": "212521017d81686bdc84a132fb5de2b03867a7e7", "shasum": "" }, "require": { @@ -4188,6 +4119,7 @@ }, "conflict": { "doctrine/dbal": "<2.10", + "doctrine/orm": "<2.7.3", "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", "symfony/form": "<5.1", @@ -4257,7 +4189,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.4" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.8" }, "funding": [ { @@ -4273,20 +4205,20 @@ "type": "tidelift" } ], - "time": "2021-07-21T13:18:10+00:00" + "time": "2021-09-11T18:11:56+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f" + "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2dd8890bd01be59a5221999c05ccf0fcafcb354f", - "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", + "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", "shasum": "" }, "require": { @@ -4332,7 +4264,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.3.4" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.7" }, "funding": [ { @@ -4348,20 +4280,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-08-29T19:32:13+00:00" }, { "name": "symfony/dotenv", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "b6d44663cff8c9880ee64d232870293a11e14cd6" + "reference": "97ffd3846f8a782086e82c1b5fdefb3f3ad078db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/b6d44663cff8c9880ee64d232870293a11e14cd6", - "reference": "b6d44663cff8c9880ee64d232870293a11e14cd6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/97ffd3846f8a782086e82c1b5fdefb3f3ad078db", + "reference": "97ffd3846f8a782086e82c1b5fdefb3f3ad078db", "shasum": "" }, "require": { @@ -4402,7 +4334,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.3.6" + "source": "https://github.com/symfony/dotenv/tree/v5.3.10" }, "funding": [ { @@ -4418,20 +4350,20 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2021-10-28T21:34:29+00:00" }, { "name": "symfony/error-handler", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73" + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/281f6c4660bcf5844bb0346fe3a4664722fe4c73", - "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", "shasum": "" }, "require": { @@ -4470,7 +4402,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.4" + "source": "https://github.com/symfony/error-handler/tree/v5.3.7" }, "funding": [ { @@ -4486,20 +4418,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-08-28T15:07:08+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f2fd2208157553874560f3645d4594303058c4bd" + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f2fd2208157553874560f3645d4594303058c4bd", - "reference": "f2fd2208157553874560f3645d4594303058c4bd", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", "shasum": "" }, "require": { @@ -4555,7 +4487,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" }, "funding": [ { @@ -4571,7 +4503,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4717,16 +4649,16 @@ }, { "name": "symfony/finder", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "17f50e06018baec41551a71a15731287dbaab186" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", - "reference": "17f50e06018baec41551a71a15731287dbaab186", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { @@ -4759,7 +4691,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.4" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -4775,20 +4707,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:54:19+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/flex", - "version": "v1.13.4", + "version": "v1.17.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "d81196c3f3b544e32997b67e955fb8291fdfe770" + "reference": "0170279814f86648c62aede39b100a343ea29962" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/d81196c3f3b544e32997b67e955fb8291fdfe770", - "reference": "d81196c3f3b544e32997b67e955fb8291fdfe770", + "url": "https://api.github.com/repos/symfony/flex/zipball/0170279814f86648c62aede39b100a343ea29962", + "reference": "0170279814f86648c62aede39b100a343ea29962", "shasum": "" }, "require": { @@ -4799,13 +4731,13 @@ "composer/composer": "^1.0.2|^2.0", "symfony/dotenv": "^4.4|^5.0", "symfony/filesystem": "^4.4|^5.0", - "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4.12|^5.0", "symfony/process": "^3.4|^4.4|^5.0" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-main": "1.13-dev" + "dev-main": "1.17-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -4827,7 +4759,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.13.4" + "source": "https://github.com/symfony/flex/tree/v1.17.2" }, "funding": [ { @@ -4843,20 +4775,20 @@ "type": "tidelift" } ], - "time": "2021-08-03T08:14:48+00:00" + "time": "2021-10-21T08:39:19+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8" + "reference": "2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", - "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe", + "reference": "2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe", "shasum": "" }, "require": { @@ -4915,7 +4847,7 @@ "symfony/browser-kit": "^4.4|^5.0", "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4.30|^5.3.7", "symfony/dotenv": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/form": "^5.2", @@ -4978,7 +4910,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.3.4" + "source": "https://github.com/symfony/framework-bundle/tree/v5.3.10" }, "funding": [ { @@ -4994,20 +4926,20 @@ "type": "tidelift" } ], - "time": "2021-07-25T09:39:16+00:00" + "time": "2021-10-26T11:54:54+00:00" }, { "name": "symfony/http-client", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "67c177d4df8601d9a71f9d615c52171c98d22d74" + "reference": "710b69ed4bc9469900ec5ae5c3807b0509bee0dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/67c177d4df8601d9a71f9d615c52171c98d22d74", - "reference": "67c177d4df8601d9a71f9d615c52171c98d22d74", + "url": "https://api.github.com/repos/symfony/http-client/zipball/710b69ed4bc9469900ec5ae5c3807b0509bee0dc", + "reference": "710b69ed4bc9469900ec5ae5c3807b0509bee0dc", "shasum": "" }, "require": { @@ -5065,7 +4997,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.3.4" + "source": "https://github.com/symfony/http-client/tree/v5.3.10" }, "funding": [ { @@ -5081,7 +5013,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-10-19T08:32:53+00:00" }, { "name": "symfony/http-client-contracts", @@ -5163,16 +5095,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75" + "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", - "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", + "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", "shasum": "" }, "require": { @@ -5216,7 +5148,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.6" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.10" }, "funding": [ { @@ -5232,20 +5164,20 @@ "type": "tidelift" } ], - "time": "2021-07-27T17:08:17+00:00" + "time": "2021-10-11T15:41:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0" + "reference": "703e4079920468e9522b72cf47fd76ce8d795e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/60030f209018356b3b553b9dbd84ad2071c1b7e0", - "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/703e4079920468e9522b72cf47fd76ce8d795e86", + "reference": "703e4079920468e9522b72cf47fd76ce8d795e86", "shasum": "" }, "require": { @@ -5255,7 +5187,7 @@ "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^5.3", + "symfony/http-foundation": "^5.3.7", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16" @@ -5328,7 +5260,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.6" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.10" }, "funding": [ { @@ -5344,20 +5276,20 @@ "type": "tidelift" } ], - "time": "2021-07-29T07:06:27+00:00" + "time": "2021-10-29T08:36:48+00:00" }, { "name": "symfony/lock", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "a78fda52b1b6f74d60e642e91d0e0133b08a8546" + "reference": "18b2db648a3b394353800a52d34cd7605125a333" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/a78fda52b1b6f74d60e642e91d0e0133b08a8546", - "reference": "a78fda52b1b6f74d60e642e91d0e0133b08a8546", + "url": "https://api.github.com/repos/symfony/lock/zipball/18b2db648a3b394353800a52d34cd7605125a333", + "reference": "18b2db648a3b394353800a52d34cd7605125a333", "shasum": "" }, "require": { @@ -5408,7 +5340,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.3.4" + "source": "https://github.com/symfony/lock/tree/v5.3.10" }, "funding": [ { @@ -5424,20 +5356,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-10-19T14:25:16+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "a0d881165b902a04f41e873426aa52a068064ac4" + "reference": "4ace41087254f099b6743333155071438bfb12c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/a0d881165b902a04f41e873426aa52a068064ac4", - "reference": "a0d881165b902a04f41e873426aa52a068064ac4", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/4ace41087254f099b6743333155071438bfb12c3", + "reference": "4ace41087254f099b6743333155071438bfb12c3", "shasum": "" }, "require": { @@ -5492,7 +5424,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.4" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.7" }, "funding": [ { @@ -5508,34 +5440,34 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-08-13T15:54:02+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v3.7.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4" + "reference": "fde12fc628162787a4e53877abadc30047fd868b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/4054b2e940a25195ae15f0a49ab0c51718922eb4", - "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/fde12fc628162787a4e53877abadc30047fd868b", + "reference": "fde12fc628162787a4e53877abadc30047fd868b", "shasum": "" }, "require": { "monolog/monolog": "~1.22 || ~2.0", "php": ">=7.1.3", - "symfony/config": "~4.4 || ^5.0", - "symfony/dependency-injection": "^4.4 || ^5.0", - "symfony/http-kernel": "~4.4 || ^5.0", - "symfony/monolog-bridge": "~4.4 || ^5.0" + "symfony/config": "~4.4 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0", + "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0", + "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0" }, "require-dev": { - "symfony/console": "~4.4 || ^5.0", - "symfony/phpunit-bridge": "^5.1", - "symfony/yaml": "~4.4 || ^5.0" + "symfony/console": "~4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.2 || ^6.0", + "symfony/yaml": "~4.4 || ^5.0 || ^6.0" }, "type": "symfony-bundle", "extra": { @@ -5573,7 +5505,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.7.0" + "source": "https://github.com/symfony/monolog-bundle/tree/v3.7.1" }, "funding": [ { @@ -5589,20 +5521,20 @@ "type": "tidelift" } ], - "time": "2021-03-31T07:20:47+00:00" + "time": "2021-11-05T10:34:29+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a603e5701bd6e305cfc777a8b50bf081ef73105e" + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a603e5701bd6e305cfc777a8b50bf081ef73105e", - "reference": "a603e5701bd6e305cfc777a8b50bf081ef73105e", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", + "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", "shasum": "" }, "require": { @@ -5642,53 +5574,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-23T15:55:36+00:00" - }, - { - "name": "symfony/orm-pack", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/7dd2ed9ba6d7af79f90bdc77522605d40463e533", - "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533", - "shasum": "" - }, - "require": { - "composer/package-versions-deprecated": "*", - "doctrine/doctrine-bundle": "^2", - "doctrine/doctrine-migrations-bundle": "^2", - "doctrine/orm": "^2" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A pack for the Doctrine ORM", - "support": { - "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/master" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" }, "funding": [ { @@ -5704,20 +5590,20 @@ "type": "tidelift" } ], - "time": "2020-07-08T14:31:54+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/password-hasher", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "61dd1e90fa0ebf6f4982787b1e033a9606357d7e" + "reference": "4bdaa0cca1fb3521bc1825160f3b5490c130bbda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/61dd1e90fa0ebf6f4982787b1e033a9606357d7e", - "reference": "61dd1e90fa0ebf6f4982787b1e033a9606357d7e", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/4bdaa0cca1fb3521bc1825160f3b5490c130bbda", + "reference": "4bdaa0cca1fb3521bc1825160f3b5490c130bbda", "shasum": "" }, "require": { @@ -5761,7 +5647,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.3.4" + "source": "https://github.com/symfony/password-hasher/tree/v5.3.8" }, "funding": [ { @@ -5777,7 +5663,7 @@ "type": "tidelift" } ], - "time": "2021-06-30T13:49:12+00:00" + "time": "2021-09-03T12:22:16+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6433,16 +6319,16 @@ }, { "name": "symfony/property-access", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "098681253076af7070df7d9debe5f75733eea189" + "reference": "2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/098681253076af7070df7d9debe5f75733eea189", - "reference": "098681253076af7070df7d9debe5f75733eea189", + "url": "https://api.github.com/repos/symfony/property-access/zipball/2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66", + "reference": "2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66", "shasum": "" }, "require": { @@ -6494,7 +6380,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.3.4" + "source": "https://github.com/symfony/property-access/tree/v5.3.8" }, "funding": [ { @@ -6510,20 +6396,20 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-09-10T11:55:24+00:00" }, { "name": "symfony/property-info", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "0f42009150679a7a256eb6ee106401af5d974ed2" + "reference": "39de5bed8c036f76ec0457ec52908e45d5497947" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/0f42009150679a7a256eb6ee106401af5d974ed2", - "reference": "0f42009150679a7a256eb6ee106401af5d974ed2", + "url": "https://api.github.com/repos/symfony/property-info/zipball/39de5bed8c036f76ec0457ec52908e45d5497947", + "reference": "39de5bed8c036f76ec0457ec52908e45d5497947", "shasum": "" }, "require": { @@ -6584,7 +6470,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.3.4" + "source": "https://github.com/symfony/property-info/tree/v5.3.8" }, "funding": [ { @@ -6600,36 +6486,36 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-09-07T07:41:40+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.1.1", + "version": "v2.1.2", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba" + "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9012994c4b4fb23e7c57dd86b763a417a04feba", - "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", + "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34", "shasum": "" }, "require": { "php": ">=7.1", "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0" + "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0" }, "require-dev": { "nyholm/psr7": "^1.1", "psr/log": "^1.1 || ^2 || ^3", - "symfony/browser-kit": "^4.4 || ^5.0", - "symfony/config": "^4.4 || ^5.0", - "symfony/event-dispatcher": "^4.4 || ^5.0", - "symfony/framework-bundle": "^4.4 || ^5.0", - "symfony/http-kernel": "^4.4 || ^5.0", - "symfony/phpunit-bridge": "^4.4.19 || ^5.2" + "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0", + "symfony/config": "^4.4 || ^5.0 || ^6.0", + "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0", + "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0", + "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4@dev || ^6.0" }, "suggest": { "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" @@ -6672,7 +6558,7 @@ ], "support": { "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.1" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.2" }, "funding": [ { @@ -6688,7 +6574,7 @@ "type": "tidelift" } ], - "time": "2021-07-27T17:25:39+00:00" + "time": "2021-11-05T13:13:39+00:00" }, { "name": "symfony/rate-limiter", @@ -6762,16 +6648,16 @@ }, { "name": "symfony/routing", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4" + "reference": "be865017746fe869007d94220ad3f5297951811b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0a35d2f57d73c46ab6d042ced783b81d09a624c4", - "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4", + "url": "https://api.github.com/repos/symfony/routing/zipball/be865017746fe869007d94220ad3f5297951811b", + "reference": "be865017746fe869007d94220ad3f5297951811b", "shasum": "" }, "require": { @@ -6832,7 +6718,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.3.4" + "source": "https://github.com/symfony/routing/tree/v5.3.7" }, "funding": [ { @@ -6848,20 +6734,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-08-04T21:42:42+00:00" }, { "name": "symfony/runtime", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "685a4a5491e25c7f2dd251d8fcca583b427ff290" + "reference": "115eebbe287b35d65bd7b062bf3362e135941a59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/685a4a5491e25c7f2dd251d8fcca583b427ff290", - "reference": "685a4a5491e25c7f2dd251d8fcca583b427ff290", + "url": "https://api.github.com/repos/symfony/runtime/zipball/115eebbe287b35d65bd7b062bf3362e135941a59", + "reference": "115eebbe287b35d65bd7b062bf3362e135941a59", "shasum": "" }, "require": { @@ -6909,7 +6795,7 @@ "description": "Enables decoupling PHP applications from global state", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/runtime/tree/v5.3.4" + "source": "https://github.com/symfony/runtime/tree/v5.3.10" }, "funding": [ { @@ -6925,20 +6811,20 @@ "type": "tidelift" } ], - "time": "2021-06-30T13:49:12+00:00" + "time": "2021-10-22T08:45:15+00:00" }, { "name": "symfony/security-core", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "69b9a6a62d8914f10010646619bcd4485a71f119" + "reference": "eb0421ce78603ba72e1de6eeeb8dd33e832ea605" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/69b9a6a62d8914f10010646619bcd4485a71f119", - "reference": "69b9a6a62d8914f10010646619bcd4485a71f119", + "url": "https://api.github.com/repos/symfony/security-core/zipball/eb0421ce78603ba72e1de6eeeb8dd33e832ea605", + "reference": "eb0421ce78603ba72e1de6eeeb8dd33e832ea605", "shasum": "" }, "require": { @@ -7002,7 +6888,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.3.6" + "source": "https://github.com/symfony/security-core/tree/v5.3.10" }, "funding": [ { @@ -7018,20 +6904,20 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:36:31+00:00" + "time": "2021-10-25T13:34:14+00:00" }, { "name": "symfony/serializer", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "f04e368e3cb35948550c7e95cc8918cb7e761c0c" + "reference": "5d7f068253ac3e7c62964ebdda491b06d401059a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f04e368e3cb35948550c7e95cc8918cb7e761c0c", - "reference": "f04e368e3cb35948550c7e95cc8918cb7e761c0c", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5d7f068253ac3e7c62964ebdda491b06d401059a", + "reference": "5d7f068253ac3e7c62964ebdda491b06d401059a", "shasum": "" }, "require": { @@ -7104,7 +6990,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.3.4" + "source": "https://github.com/symfony/serializer/tree/v5.3.10" }, "funding": [ { @@ -7120,7 +7006,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T13:18:10+00:00" + "time": "2021-09-29T17:19:25+00:00" }, { "name": "symfony/service-contracts", @@ -7265,16 +7151,16 @@ }, { "name": "symfony/string", - "version": "v5.3.3", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", - "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", "shasum": "" }, "require": { @@ -7328,7 +7214,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.3" + "source": "https://github.com/symfony/string/tree/v5.3.10" }, "funding": [ { @@ -7344,7 +7230,7 @@ "type": "tidelift" } ], - "time": "2021-06-27T11:44:38+00:00" + "time": "2021-10-27T18:21:46+00:00" }, { "name": "symfony/translation-contracts", @@ -7426,16 +7312,16 @@ }, { "name": "symfony/validator", - "version": "v5.3.7", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "916a7c6cf3ede36eb0e4097500e0a12dcff520a7" + "reference": "a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/916a7c6cf3ede36eb0e4097500e0a12dcff520a7", - "reference": "916a7c6cf3ede36eb0e4097500e0a12dcff520a7", + "url": "https://api.github.com/repos/symfony/validator/zipball/a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5", + "reference": "a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5", "shasum": "" }, "require": { @@ -7516,7 +7402,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v5.3.7" + "source": "https://github.com/symfony/validator/tree/v5.3.10" }, "funding": [ { @@ -7532,20 +7418,20 @@ "type": "tidelift" } ], - "time": "2021-08-26T08:22:53+00:00" + "time": "2021-10-28T19:22:18+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.3.6", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0" + "reference": "875432adb5f5570fff21036fd22aee244636b7d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", - "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/875432adb5f5570fff21036fd22aee244636b7d1", + "reference": "875432adb5f5570fff21036fd22aee244636b7d1", "shasum": "" }, "require": { @@ -7604,7 +7490,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.6" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.10" }, "funding": [ { @@ -7620,20 +7506,20 @@ "type": "tidelift" } ], - "time": "2021-07-27T01:56:02+00:00" + "time": "2021-10-26T09:30:15+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0" + "reference": "a7604de14bcf472fe8e33f758e9e5b7bf07d3b91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", - "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/a7604de14bcf472fe8e33f758e9e5b7bf07d3b91", + "reference": "a7604de14bcf472fe8e33f758e9e5b7bf07d3b91", "shasum": "" }, "require": { @@ -7677,7 +7563,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.8" }, "funding": [ { @@ -7693,7 +7579,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2021-08-31T12:49:16+00:00" }, { "name": "symfony/yaml", @@ -7774,16 +7660,16 @@ "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" + "reference": "f18adf13f6c81c67a88360dca359ad474523f8e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", - "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f18adf13f6c81c67a88360dca359ad474523f8e3", + "reference": "f18adf13f6c81c67a88360dca359ad474523f8e3", "shasum": "" }, "require": { @@ -7795,8 +7681,8 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^8.2", - "doctrine/dbal": "^2.5.4", + "doctrine/coding-standard": "^9.0", + "doctrine/dbal": "^2.5.4 || ^3.0", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", "ext-sqlite3": "*", @@ -7831,7 +7717,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.1" }, "funding": [ { @@ -7847,20 +7733,20 @@ "type": "tidelift" } ], - "time": "2021-01-23T10:20:43+00:00" + "time": "2021-09-20T21:51:43+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.4.0", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "870189619a7770f468ffb0b80925302e065a3b34" + "reference": "31ba202bebce0b66fe830f49f96228dcdc1503e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", - "reference": "870189619a7770f468ffb0b80925302e065a3b34", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/31ba202bebce0b66fe830f49f96228dcdc1503e7", + "reference": "31ba202bebce0b66fe830f49f96228dcdc1503e7", "shasum": "" }, "require": { @@ -7869,16 +7755,18 @@ "doctrine/orm": "^2.6.0", "doctrine/persistence": "^1.3.7|^2.0", "php": "^7.1 || ^8.0", - "symfony/config": "^3.4|^4.3|^5.0", - "symfony/console": "^3.4|^4.3|^5.0", - "symfony/dependency-injection": "^3.4|^4.3|^5.0", - "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", - "symfony/http-kernel": "^3.4|^4.3|^5.0" + "symfony/config": "^3.4|^4.3|^5.0|^6.0", + "symfony/console": "^3.4|^4.3|^5.0|^6.0", + "symfony/dependency-injection": "^3.4.47|^4.3|^5.0|^6.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0|^6.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0|^6.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12.99", "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", - "symfony/phpunit-bridge": "^4.1|^5.0" + "symfony/phpunit-bridge": "^4.1|^5.0|^6.0", + "vimeo/psalm": "^4.10" }, "type": "symfony-bundle", "autoload": { @@ -7912,7 +7800,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.1" }, "funding": [ { @@ -7928,7 +7816,7 @@ "type": "tidelift" } ], - "time": "2020-11-14T09:36:49+00:00" + "time": "2021-10-28T05:46:28+00:00" }, { "name": "roave/security-advisories", @@ -7936,45 +7824,57 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "9460a22455b82b353d2212fecedebcf73b141baa" + "reference": "3780dea9bb7ff2da83a08d662e1accb6f5f86976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9460a22455b82b353d2212fecedebcf73b141baa", - "reference": "9460a22455b82b353d2212fecedebcf73b141baa", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/3780dea9bb7ff2da83a08d662e1accb6f5f86976", + "reference": "3780dea9bb7ff2da83a08d662e1accb6f5f86976", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", + "akaunting/akaunting": "<2.1.13", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "area17/twill": "<=2.5.2", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", + "baserproject/basercms": "<=4.5", + "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", + "buddypress/buddypress": "<7.2.1", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cachethq/cachet": "<2.5.1", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cardgate/magento2": "<2.0.33", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "catfan/medoo": "<1.7.5", + "centreon/centreon": "<20.10.7", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.23|>=2-alpha.1,<2.1.9", + "concrete5/concrete5": "<8.5.5", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.7.14", + "croogo/croogo": "<3.0.7", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", @@ -7982,64 +7882,80 @@ "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.0.99|>=3.1,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<11.0.4", + "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", - "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", "ezsystems/demobundle": ">=5.4,<5.4.6.1", "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", - "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "facade/ignition": "<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=0.1.3", "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<5.8.3", + "forkcms/forkcms": "<=5.9.2", "fossar/tcpdf-parser": "<6.2.22", "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7.11", - "getkirby/cms": "<3.5.4", + "getgrav/grav": "<=1.7.24", + "getkirby/cms": "<=3.5.6", "getkirby/panel": "<2.5.14", + "gilacms/gila": "<=1.11.4", + "globalpayments/php-sdk": "<2", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.6.3", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "helloxz/imgurl": "<=2.31", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "ibexa/post-install": "<=1.0.4", + "icecoder/icecoder": "<=8", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", "impresscms/impresscms": "<=1.4.2", + "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "intelliants/subrion": "<=4.2.1", "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", + "james-heinrich/getid3": "<1.9.21", "joomla/archive": "<1.1.10", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", @@ -8048,52 +7964,69 @@ "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-http": "<2.14.2", "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "lavalite/cms": "<=5.8", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<21.1", + "librenms/librenms": "<=21.10.2", + "limesurvey/limesurvey": "<3.27.19", "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<3.3.2|= 2.13.1", + "mautic/core": "<4|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "microweber/microweber": "<1.2.8", + "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", + "modx/revolution": "<2.8", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2", "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", + "nukeviet/nukeviet": "<4.3.4", "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", - "october/october": ">=1.0.319,<1.0.466", + "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.472|>=1.1.1,<1.1.5|>=2.1,<2.1.12", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", + "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", "paragonie/random_compat": "<2", "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.12", + "pear/archive_tar": "<1.4.14", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6|>=6.1.8,<6.4.1", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", @@ -8102,7 +8035,7 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.8.8", + "pimcore/pimcore": "<10.1.3", "pocketmine/pocketmine-mp": "<3.15.4", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -8111,10 +8044,11 @@ "prestashop/productcomments": ">=4,<4.2.1", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6|>=1,<1.6.3", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", @@ -8125,17 +8059,18 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.5.2", - "shopware/platform": "<=6.3.5.2", + "shopware/core": "<=6.4.3", + "shopware/platform": "<=6.4.3", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.6.9", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "shopware/shopware": "<5.7.6", + "showdoc/showdoc": "<=2.9.12", + "silverstripe/admin": "<4.8.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", "silverstripe/subsites": ">=2,<2.1.1", @@ -8148,23 +8083,27 @@ "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.39", + "snipe/snipe-it": "<=5.3.1", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", + "ssddanbrown/bookstack": "<21.0.3", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", + "studio-42/elfinder": "<2.1.59", + "subrion/cms": "<=4.2.1", + "sulu/sulu": "<1.6.43|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0,<4", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", @@ -8185,25 +8124,30 @@ "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", + "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", + "topthink/think": "<=6.0.9", + "topthink/thinkphp": "<=3.2.3", + "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", @@ -8212,23 +8156,28 @@ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "wp-cli/wp-cli": "<2.5", + "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", - "yoast-seo-for-typo3/yoast_seo": "<7.2.1", - "yourls/yourls": "<1.7.4", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -8247,7 +8196,7 @@ "zendframework/zend-validator": ">=2.3,<2.3.6", "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework": "<=3", "zendframework/zendframework1": "<1.12.20", "zendframework/zendopenid": ">=2,<2.0.2", "zendframework/zendxml": ">=1,<1.0.1", @@ -8290,20 +8239,20 @@ "type": "tidelift" } ], - "time": "2021-06-01T22:04:47+00:00" + "time": "2021-11-16T00:48:52+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.3.4", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "bc368b765a651424b19f5759953ce2873e7d448b" + "reference": "325aaf6302501ed3673cffbd3ba88db5949de8ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bc368b765a651424b19f5759953ce2873e7d448b", - "reference": "bc368b765a651424b19f5759953ce2873e7d448b", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/325aaf6302501ed3673cffbd3ba88db5949de8ae", + "reference": "325aaf6302501ed3673cffbd3ba88db5949de8ae", "shasum": "" }, "require": { @@ -8357,7 +8306,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.10" }, "funding": [ { @@ -8373,7 +8322,7 @@ "type": "tidelift" } ], - "time": "2021-07-15T21:37:44+00:00" + "time": "2021-10-28T19:22:18+00:00" } ], "aliases": [], diff --git a/etc/bundles.php b/etc/bundles.php index 190f48c..7421948 100644 --- a/etc/bundles.php +++ b/etc/bundles.php @@ -1,10 +1,10 @@ - ['all' => true], - Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Sentry\SentryBundle\SentryBundle::class => ['prod' => true], -]; + ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Sentry\SentryBundle\SentryBundle::class => ['prod' => true], +]; diff --git a/src/Attributes/RequestValidator.php b/src/Attributes/RequestValidator.php deleted file mode 100644 index 14c4a26..0000000 --- a/src/Attributes/RequestValidator.php +++ /dev/null @@ -1,11 +0,0 @@ - "\d+"])] - #[RequestValidator([ - self::PARAM_EXTRA => [ - Assert\Choice::class => [ - 'choices' => ['0', '1'], - 'message' => 'Invalid request value {{ value }}. Allowed values are {{ choices }}.', - ], - ], - ])] public function record( int $id, NormalizerInterface $normalizer, diff --git a/src/Event/RequestValidatorSubscriber.php b/src/Event/RequestValidatorSubscriber.php deleted file mode 100644 index f84630c..0000000 --- a/src/Event/RequestValidatorSubscriber.php +++ /dev/null @@ -1,62 +0,0 @@ - 'onController', - ]; - } - - public function onController(ControllerEvent $event): void - { - $controller = $event->getController(); - - $reflection = new ReflectionClass($controller[0]::class); - $attributes = $reflection->getMethod($controller[1])->getAttributes(); - - foreach ($attributes as $attribute) { - if ($attribute->getName() === RequestValidator::class) { - $this->validate($event->getRequest(), $attribute->getArguments()); - } - } - } - - public function validate(Request $request, array $arguments): void { - $validator = Validation::createValidator(); - $constraints = $arguments[0] ?? []; - - $violations = new ConstraintViolationList(); - - foreach ($request->query->all() as $name => $value) { - if (!isset($constraints[$name])) { - continue; - } - - $validators = []; - - foreach ($constraints[$name] as $class => $params) { - $validators[] = new $class($params); - } - - $violations->addAll($validator->validate($value, $validators)); - } - - if ($violations->has(0)) { - throw new BadRequestHttpException($violations->get(0)->getMessage()); - } - } -} diff --git a/symfony.lock b/symfony.lock index 86c774d..7d72348 100644 --- a/symfony.lock +++ b/symfony.lock @@ -357,9 +357,6 @@ "symfony/options-resolver": { "version": "v5.2.4" }, - "symfony/orm-pack": { - "version": "v1.0.7" - }, "symfony/password-hasher": { "version": "v5.3.0" }, From 37014a615da1a5c4ee7003ddaa710b012c2c8ac0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 16:07:47 +0100 Subject: [PATCH 172/221] add validator config --- etc/services.yaml | 4 ++ src/Controller/AbstractApiController.php | 12 ------ src/Controller/TleController.php | 45 +++++++++-------------- src/Request/AbstractRequest.php | 45 +++++++++++++++++++++++ src/Request/CollectionRequest.php | 41 +++++++++++++++++++++ src/Request/TleCollectionRequest.php | 8 ++++ src/Request/TleRequest.php | 20 ++++++++++ src/Request/TleRequestTrait.php | 11 ++++++ src/Request/ValidatedRequestInterface.php | 8 ++++ src/Service/CustomRequestResolver.php | 25 +++++++++++++ 10 files changed, 179 insertions(+), 40 deletions(-) create mode 100644 src/Request/AbstractRequest.php create mode 100644 src/Request/CollectionRequest.php create mode 100644 src/Request/TleCollectionRequest.php create mode 100644 src/Request/TleRequest.php create mode 100644 src/Request/TleRequestTrait.php create mode 100644 src/Request/ValidatedRequestInterface.php create mode 100644 src/Service/CustomRequestResolver.php diff --git a/etc/services.yaml b/etc/services.yaml index 43c61da..ea1f9aa 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -28,3 +28,7 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + + App\Service\CustomRequestResolver: + tags: + - { name: controller.argument_value_resolver, priority: 50 } diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index d15f141..fdb096e 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -21,8 +21,6 @@ abstract class AbstractApiController extends AbstractController protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; protected const PAGE_PARAM = 'page'; - protected const PAGE_SIZE = 20; - protected const SEARCH_PARAM = 'search'; protected RouterInterface $router; @@ -32,16 +30,6 @@ public function setRouter(RouterInterface $router): void $this->router = $router; } - public function getPage(Request $request): int - { - return (int)$request->get(self::PAGE_PARAM, 1); - } - - public function getPageSize(Request $request, int $maxPageSize): int - { - return (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); - } - public function response(array $data): JsonResponse { return new JsonResponse( diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index fdfd0c4..0f0ed3d 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -5,11 +5,13 @@ use App\Enum\SortDirectionEnum; use App\Enum\TleCollectionSortableFieldsEnum; use App\Repository\TleRepository; +use App\Request\CollectionRequest; +use App\Request\TleCollectionRequest; +use App\Request\TleRequest; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; use App\ViewModel\Model\QueryBuilderPaginator; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -35,26 +37,21 @@ public function __construct(protected TleRepository $repository) #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( - int $id, NormalizerInterface $normalizer, - Request $request, + TleRequest $request, ): JsonResponse { - $this->assertParamIsBoolean($request, self::PARAM_EXTRA); - - $extra = (bool)$request->get(self::PARAM_EXTRA, false); - $data = [ '@context' => self::HYDRA_CONTEXT, ]; return $this->response( - array_merge($data, $normalizer->normalize($this->getTle($id), null, [self::PARAM_EXTRA => $extra])), + array_merge($data, $normalizer->normalize($this->getTle($request->getId()), null, [self::PARAM_EXTRA => $request->getExtra()])), ); } #[Route("/", name: "tle_collection")] public function collection( - Request $request, + TleCollectionRequest $request, NormalizerInterface $normalizer ): JsonResponse { $this @@ -67,36 +64,28 @@ public function collection( ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()) ->assertParamIsBoolean($request, self::PARAM_EXTRA); - $extra = (bool)$request->get(self::PARAM_EXTRA, false); - $satelliteIds = $request->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); - $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); - $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); - $builder = $this->repository->collection( - $search, - $sort, - $sortDir, + $request->getSearch(), + $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), + $request->getSortDirection(), $filters, ); $pagination = new QueryBuilderPaginator($builder); - $pagination->setPageSize($this->getPageSize($request, self::MAX_PAGE_SIZE)); - $pagination->setCurrentPage( - $this->getPage($request) - ); + $pagination->setPageSize($request->getPageSize()); + $pagination->setCurrentPage($request->getPage()); $parameters = [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $this->getPageSize($request, self::MAX_PAGE_SIZE), + CollectionRequest::SEARCH_PARAM => $request->getSearch() ?? '*', + CollectionRequest::SORT_PARAM => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), + CollectionRequest::SORT_DIR_PARAM => $request->getSortDirection(), + CollectionRequest::PAGE_PARAM => $request->getPage(), + CollectionRequest::PAGE_SIZE_PARAM => $request->getPageSize(), ]; foreach ($filters as $filter) { @@ -115,7 +104,7 @@ public function collection( $response['parameters'] = $parameters; return $this->response( - $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) + $normalizer->normalize($response, null, [self::PARAM_EXTRA => $request->getExtra()]) ); } } diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php new file mode 100644 index 0000000..5a4663b --- /dev/null +++ b/src/Request/AbstractRequest.php @@ -0,0 +1,45 @@ +validate(); + } + + public function validate(): void + { + } + + protected function assertParamIsBoolean(Request $request, string $name): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!in_array($param, Filter::BOOLEAN_VALUES, true)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be boolean. Supported values are %s.', $name, implode(' or ', Filter::BOOLEAN_VALUES)) + ); + } + + return $this; + } +} diff --git a/src/Request/CollectionRequest.php b/src/Request/CollectionRequest.php new file mode 100644 index 0000000..f10c4e5 --- /dev/null +++ b/src/Request/CollectionRequest.php @@ -0,0 +1,41 @@ +get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + } + + public function getSort(string $default = null): ?string + { + return $this->get(self::SORT_PARAM, $default); + } + + public function getSearch(): ?string + { + return $this->get(self::SEARCH_PARAM); + } + + public function getPage(): int + { + return (int)$this->get(self::PAGE_PARAM, 1); + } + + public function getPageSize(int $maxPageSize = self::PAGE_MAX_SIZE): int + { + return (int)min($this->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); + } +} diff --git a/src/Request/TleCollectionRequest.php b/src/Request/TleCollectionRequest.php new file mode 100644 index 0000000..22c9aa2 --- /dev/null +++ b/src/Request/TleCollectionRequest.php @@ -0,0 +1,8 @@ +attributes->get('id'); + } + + public function validate(): void + { + $this->assertParamIsBoolean($this, self::EXTRA_PARAM); + } +} diff --git a/src/Request/TleRequestTrait.php b/src/Request/TleRequestTrait.php new file mode 100644 index 0000000..324f929 --- /dev/null +++ b/src/Request/TleRequestTrait.php @@ -0,0 +1,11 @@ +get(TleRequest::EXTRA_PARAM, false); + } +} diff --git a/src/Request/ValidatedRequestInterface.php b/src/Request/ValidatedRequestInterface.php new file mode 100644 index 0000000..266f0f8 --- /dev/null +++ b/src/Request/ValidatedRequestInterface.php @@ -0,0 +1,8 @@ +getType() || is_subclass_of($argument->getType(), Request::class); + } + + public function resolve(Request $request, ArgumentMetadata $argument): iterable + { + /** @var AbstractRequest $customRequest */ + $customRequest = forward_static_call([$argument->getType(), 'createFromGlobals']); + $customRequest->attributes = $request->attributes; + + yield $customRequest; + } +} From d238b064b313b00e3308c7d9834ce203f66e3622 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 16:58:35 +0100 Subject: [PATCH 173/221] add validator config --- src/Request/AbstractRequest.php | 38 +++-------------------- src/Request/CollectionRequest.php | 25 ++++++++------- src/Request/TleRequest.php | 13 ++++++-- src/Request/TleRequestTrait.php | 20 ++++++++++++ src/Request/ValidatedRequestInterface.php | 5 ++- src/Service/CustomRequestResolver.php | 21 +++++++++++++ 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php index 5a4663b..2eb1207 100644 --- a/src/Request/AbstractRequest.php +++ b/src/Request/AbstractRequest.php @@ -2,44 +2,14 @@ namespace App\Request; -use App\ViewModel\Filter; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; class AbstractRequest extends Request implements ValidatedRequestInterface { - public function __construct( - array $query = [], - array $request = [], - array $attributes = [], - array $cookies = [], - array $files = [], - array $server = [], - $content = null - ) { - parent::__construct($query, $request, $attributes, $cookies, $files, $server, $content); - - $this->validate(); - } - - public function validate(): void + public function validate(ValidatorInterface $validator): ?ConstraintViolationListInterface { - } - - protected function assertParamIsBoolean(Request $request, string $name): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!in_array($param, Filter::BOOLEAN_VALUES, true)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be boolean. Supported values are %s.', $name, implode(' or ', Filter::BOOLEAN_VALUES)) - ); - } - - return $this; + return null; } } diff --git a/src/Request/CollectionRequest.php b/src/Request/CollectionRequest.php index f10c4e5..a0928d8 100644 --- a/src/Request/CollectionRequest.php +++ b/src/Request/CollectionRequest.php @@ -6,36 +6,39 @@ class CollectionRequest extends AbstractRequest { + /** @var int ToDo: use late static binding */ public const PAGE_MAX_SIZE = 100; public const PAGE_PARAM = 'page'; public const PAGE_SIZE = 20; public const PAGE_SIZE_PARAM = 'page-size'; - public const SEARCH_PARAM = 'search'; + public const SORT_DIR_PARAM = 'sort-dir'; public const SORT_PARAM = 'sort'; - public function getSortDirection(): string + public const SEARCH_PARAM = 'search'; + + public function getPage(): int { - return $this->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + return (int)$this->get(self::PAGE_PARAM, 1); } - public function getSort(string $default = null): ?string + public function getPageSize(int $maxPageSize = self::PAGE_MAX_SIZE): int { - return $this->get(self::SORT_PARAM, $default); + return (int)min($this->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); } - public function getSearch(): ?string + public function getSortDirection(): string { - return $this->get(self::SEARCH_PARAM); + return $this->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); } - public function getPage(): int + public function getSort(string $default = null): ?string { - return (int)$this->get(self::PAGE_PARAM, 1); + return $this->get(self::SORT_PARAM, $default); } - public function getPageSize(int $maxPageSize = self::PAGE_MAX_SIZE): int + public function getSearch(): ?string { - return (int)min($this->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); + return $this->get(self::SEARCH_PARAM); } } diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index 4dd3c51..8ede7eb 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -2,19 +2,26 @@ namespace App\Request; +use App\ViewModel\Filter; +use Symfony\Component\Validator\Constraints as Assert; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; + class TleRequest extends AbstractRequest { public const EXTRA_PARAM = 'extra'; - use TleRequestTrait; + use TleRequestTrait { + validate as validateExtraParam; + } public function getId(): int { return $this->attributes->get('id'); } - public function validate(): void + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface { - $this->assertParamIsBoolean($this, self::EXTRA_PARAM); + return $this->validateExtraParam($validator); } } diff --git a/src/Request/TleRequestTrait.php b/src/Request/TleRequestTrait.php index 324f929..54b5594 100644 --- a/src/Request/TleRequestTrait.php +++ b/src/Request/TleRequestTrait.php @@ -2,10 +2,30 @@ namespace App\Request; +use App\ViewModel\Filter; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Component\Validator\Constraints as Assert; + trait TleRequestTrait { public function getExtra(): bool { return (bool)$this->get(TleRequest::EXTRA_PARAM, false); } + + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface + { + return $validator->validate( + $this->query->all(), + new Assert\Collection( + [ + 'allowMissingFields' => true, + 'fields' => [ + 'extra' => new Assert\Optional(new Assert\Choice(Filter::BOOLEAN_VALUES)), + ], + ] + ) + ); + } } diff --git a/src/Request/ValidatedRequestInterface.php b/src/Request/ValidatedRequestInterface.php index 266f0f8..6ef21b0 100644 --- a/src/Request/ValidatedRequestInterface.php +++ b/src/Request/ValidatedRequestInterface.php @@ -2,7 +2,10 @@ namespace App\Request; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; + interface ValidatedRequestInterface { - public function validate(): void; + public function validate(ValidatorInterface $validator): ?ConstraintViolationListInterface; } diff --git a/src/Service/CustomRequestResolver.php b/src/Service/CustomRequestResolver.php index 9ba95bb..348a679 100644 --- a/src/Service/CustomRequestResolver.php +++ b/src/Service/CustomRequestResolver.php @@ -6,9 +6,15 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\Validator\Validator\ValidatorInterface; class CustomRequestResolver implements ArgumentValueResolverInterface { + public function __construct(protected ValidatorInterface $validator) + { + } + public function supports(Request $request, ArgumentMetadata $argument): bool { return Request::class === $argument->getType() || is_subclass_of($argument->getType(), Request::class); @@ -20,6 +26,21 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable $customRequest = forward_static_call([$argument->getType(), 'createFromGlobals']); $customRequest->attributes = $request->attributes; + if (method_exists($customRequest, 'validate')) { + $violations = $customRequest->validate($this->validator); + + /** + * ToDo: Messages should be combined and well formatted. + */ + if ($violations !== null && $violations->has(0)) { + $violation = $violations->get(0); + + $message = $violation->getPropertyPath() . ' ' . $violation->getMessage(); + + throw new BadRequestHttpException($message); + } + } + yield $customRequest; } } From 980bde5cd2bd9ef89922729376b153546ef60411 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 16:58:46 +0100 Subject: [PATCH 174/221] add validator config --- src/Request/TleRequest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index 8ede7eb..0d0c3bb 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -2,8 +2,6 @@ namespace App\Request; -use App\ViewModel\Filter; -use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; From aa4d79232ee9381fe2caddd8b6d7bd29a93b5f55 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 17:37:00 +0100 Subject: [PATCH 175/221] add validator config --- src/Controller/TleController.php | 27 ++----- src/Request/AbstractRequest.php | 5 +- src/Request/CollectionRequest.php | 67 ++++++++++++---- src/Request/TleCollectionRequest.php | 27 ++++++- src/Request/TleRequest.php | 5 +- src/Request/TleRequestTrait.php | 3 +- src/Request/ValidatedRequestInterface.php | 2 +- src/Service/Validator/RequestValidator.php | 89 ---------------------- 8 files changed, 97 insertions(+), 128 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 0f0ed3d..a3dab78 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -20,8 +20,6 @@ final class TleController extends AbstractApiController { use TleHttpTrait; - protected const MAX_PAGE_SIZE = 100; - public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ @@ -54,16 +52,6 @@ public function collection( TleCollectionRequest $request, NormalizerInterface $normalizer ): JsonResponse { - $this - ->assertParamIsInteger($request, self::PAGE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) - ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) - ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) - ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) - ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()) - ->assertParamIsBoolean($request, self::PARAM_EXTRA); - $satelliteIds = $request->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); /** @var Filter[] $filters */ @@ -77,15 +65,16 @@ public function collection( ); $pagination = new QueryBuilderPaginator($builder); - $pagination->setPageSize($request->getPageSize()); - $pagination->setCurrentPage($request->getPage()); + $pagination + ->setPageSize($request->getPageSize()) + ->setCurrentPage($request->getPage()); $parameters = [ - CollectionRequest::SEARCH_PARAM => $request->getSearch() ?? '*', - CollectionRequest::SORT_PARAM => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), - CollectionRequest::SORT_DIR_PARAM => $request->getSortDirection(), - CollectionRequest::PAGE_PARAM => $request->getPage(), - CollectionRequest::PAGE_SIZE_PARAM => $request->getPageSize(), + CollectionRequest::$searchParam => $request->getSearch() ?? '*', + CollectionRequest::$sortParam => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), + CollectionRequest::$sortDirParam => $request->getSortDirection(), + CollectionRequest::$pageParam => $request->getPage(), + CollectionRequest::$pageSizeParam => $request->getPageSize(), ]; foreach ($filters as $filter) { diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php index 2eb1207..0b84b39 100644 --- a/src/Request/AbstractRequest.php +++ b/src/Request/AbstractRequest.php @@ -3,13 +3,14 @@ namespace App\Request; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Validator\ConstraintViolationList; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; class AbstractRequest extends Request implements ValidatedRequestInterface { - public function validate(ValidatorInterface $validator): ?ConstraintViolationListInterface + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface { - return null; + return new ConstraintViolationList(); } } diff --git a/src/Request/CollectionRequest.php b/src/Request/CollectionRequest.php index a0928d8..3942556 100644 --- a/src/Request/CollectionRequest.php +++ b/src/Request/CollectionRequest.php @@ -3,42 +3,81 @@ namespace App\Request; use App\Enum\SortDirectionEnum; +use Symfony\Component\Validator\Constraints as Assert; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; class CollectionRequest extends AbstractRequest { - /** @var int ToDo: use late static binding */ - public const PAGE_MAX_SIZE = 100; - public const PAGE_PARAM = 'page'; - public const PAGE_SIZE = 20; - public const PAGE_SIZE_PARAM = 'page-size'; + public static string $pageParam = 'page'; + public static string $pageSizeParam = 'page-size'; + public static int $defaultPageSize = 20; + public static int $maxPageSize = 100; - public const SORT_DIR_PARAM = 'sort-dir'; - public const SORT_PARAM = 'sort'; + public static string $sortDirParam = 'sort-dir'; + public static string $sortParam = 'sort'; + public static array $sortFields = []; - public const SEARCH_PARAM = 'search'; + public static string $searchParam = 'search'; public function getPage(): int { - return (int)$this->get(self::PAGE_PARAM, 1); + return (int)$this->get(static::$pageParam, 1); } - public function getPageSize(int $maxPageSize = self::PAGE_MAX_SIZE): int + public function getPageSize(): int { - return (int)min($this->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), $maxPageSize); + return (int)min($this->get(static::$pageSizeParam, static::$defaultPageSize), static::$maxPageSize); } public function getSortDirection(): string { - return $this->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + return $this->get(static::$sortDirParam, SortDirectionEnum::ASCENDING); } public function getSort(string $default = null): ?string { - return $this->get(self::SORT_PARAM, $default); + return $this->get(static::$sortParam, $default); } public function getSearch(): ?string { - return $this->get(self::SEARCH_PARAM); + return $this->get(static::$searchParam); + } + + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface + { + return $validator->validate( + $this->query->all(), + new Assert\Collection( + [ + 'allowExtraFields' => true, + 'allowMissingFields' => true, + 'fields' => [ + static::$pageParam => new Assert\Optional( + new Assert\Sequentially( + [ + new Assert\Type('numeric'), + new Assert\GreaterThanOrEqual(0), + ] + ) + ), + static::$pageSizeParam => new Assert\Optional( + new Assert\Sequentially( + [ + new Assert\GreaterThanOrEqual(1), + new Assert\LessThanOrEqual(static::$maxPageSize), + ] + ) + ), + static::$searchParam => new Assert\Optional(new Assert\Type('string')), + static::$sortParam => new Assert\Optional(new Assert\Choice(static::$sortFields)), + static::$sortDirParam => new Assert\Optional( + new Assert\Choice([SortDirectionEnum::ASCENDING, SortDirectionEnum::DESCENDING]) + ), + ], + ] + ) + ); } } diff --git a/src/Request/TleCollectionRequest.php b/src/Request/TleCollectionRequest.php index 22c9aa2..fd60aee 100644 --- a/src/Request/TleCollectionRequest.php +++ b/src/Request/TleCollectionRequest.php @@ -2,7 +2,32 @@ namespace App\Request; +use Symfony\Component\Validator\ConstraintViolationListInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; + class TleCollectionRequest extends CollectionRequest { - use TleRequestTrait; + use TleRequestTrait { + validate as validateExtraParam; + } + + public static array $sortFields = [ + 'id', + 'name', + 'popularity', + 'inclination', + 'eccentricity', + 'period', + 'raan', + 'satellite_id', + 'semi_major_axis', + ]; + + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface + { + $violations = $this->validateExtraParam($validator); + $violations->addAll(parent::validate($validator)); + + return $violations; + } } diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index 0d0c3bb..984e507 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -20,6 +20,9 @@ public function getId(): int public function validate(ValidatorInterface $validator): ConstraintViolationListInterface { - return $this->validateExtraParam($validator); + $violations = $this->validateExtraParam($validator); + $violations->addAll(parent::validate($validator)); + + return $violations; } } diff --git a/src/Request/TleRequestTrait.php b/src/Request/TleRequestTrait.php index 54b5594..d34b681 100644 --- a/src/Request/TleRequestTrait.php +++ b/src/Request/TleRequestTrait.php @@ -20,9 +20,10 @@ public function validate(ValidatorInterface $validator): ConstraintViolationList $this->query->all(), new Assert\Collection( [ + 'allowExtraFields' => true, 'allowMissingFields' => true, 'fields' => [ - 'extra' => new Assert\Optional(new Assert\Choice(Filter::BOOLEAN_VALUES)), + TleRequest::EXTRA_PARAM => new Assert\Optional(new Assert\Choice(Filter::BOOLEAN_VALUES)), ], ] ) diff --git a/src/Request/ValidatedRequestInterface.php b/src/Request/ValidatedRequestInterface.php index 6ef21b0..22c5aba 100644 --- a/src/Request/ValidatedRequestInterface.php +++ b/src/Request/ValidatedRequestInterface.php @@ -7,5 +7,5 @@ interface ValidatedRequestInterface { - public function validate(ValidatorInterface $validator): ?ConstraintViolationListInterface; + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface; } diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 73f7962..1f0c36e 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -4,98 +4,9 @@ use App\ViewModel\Filter; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; trait RequestValidator { - protected function assertParamIsBoolean(Request $request, string $name): self { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!in_array($param, Filter::BOOLEAN_VALUES, true)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be boolean. Supported values are %s.', $name, implode(' or ', Filter::BOOLEAN_VALUES)) - ); - } - - return $this; - } - - protected function assertParamIsInteger(Request $request, string $name): self - { - $param = (int)$request->get($name); - - if ($param === null) { - return $this; - } - - if (!preg_match('/^\d+$/', $param)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be integer.', $name) - ); - } - - return $this; - } - - protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param > $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamIsLessThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param <= $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamInEnum(Request $request, string $name, array $values): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!\in_array($param, $values, true)) { - throw new BadRequestHttpException( - \sprintf( - 'Parameter \'%s\' must be one of the following: %s', - $name, - '\'' . implode('\', \'', $values) . '\'', - ) - ); - } - - return $this; - } - protected function assertFilter(Request $request, array $filters): array { $result = []; From 65a0d55c62ddf5bb6caaa0452f1b0283eba39247 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 19:14:26 +0100 Subject: [PATCH 176/221] bugfixes --- src/Request/CollectionRequest.php | 4 ++-- src/Service/CustomRequestResolver.php | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Request/CollectionRequest.php b/src/Request/CollectionRequest.php index 3942556..ba72f09 100644 --- a/src/Request/CollectionRequest.php +++ b/src/Request/CollectionRequest.php @@ -32,7 +32,7 @@ public function getPageSize(): int public function getSortDirection(): string { - return $this->get(static::$sortDirParam, SortDirectionEnum::ASCENDING); + return $this->get(static::$sortDirParam, SortDirectionEnum::DESCENDING); } public function getSort(string $default = null): ?string @@ -58,7 +58,7 @@ public function validate(ValidatorInterface $validator): ConstraintViolationList new Assert\Sequentially( [ new Assert\Type('numeric'), - new Assert\GreaterThanOrEqual(0), + new Assert\GreaterThanOrEqual(1), ] ) ), diff --git a/src/Service/CustomRequestResolver.php b/src/Service/CustomRequestResolver.php index 348a679..32f4ae7 100644 --- a/src/Service/CustomRequestResolver.php +++ b/src/Service/CustomRequestResolver.php @@ -25,6 +25,9 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable /** @var AbstractRequest $customRequest */ $customRequest = forward_static_call([$argument->getType(), 'createFromGlobals']); $customRequest->attributes = $request->attributes; + $customRequest->query = $request->query; + $customRequest->files = $request->files; + $customRequest->request = $request->request; if (method_exists($customRequest, 'validate')) { $violations = $customRequest->validate($this->validator); From 79d021a6c31579818e65fb8e6f6ace01537c9d2f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 19:23:13 +0100 Subject: [PATCH 177/221] bugfixes --- etc/services.yaml | 1 - src/Controller/AbstractApiController.php | 30 +++++++++++++++------ src/Service/FileManager.php | 18 ------------- src/Service/Traits/FileSystemAwareTrait.php | 10 +++---- src/Service/Validator/RequestValidator.php | 30 --------------------- 5 files changed, 27 insertions(+), 62 deletions(-) delete mode 100644 src/Service/FileManager.php delete mode 100644 src/Service/Validator/RequestValidator.php diff --git a/etc/services.yaml b/etc/services.yaml index ea1f9aa..15fbab0 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -18,7 +18,6 @@ services: exclude: '../src/{DependencyInjection,Entity,ViewModel,Enum,Migrations,Tests,Kernel.php}' bind: $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index fdb096e..cf64611 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -3,7 +3,7 @@ namespace App\Controller; use App\Service\DateTimeService; -use App\Service\Validator\RequestValidator; +use App\ViewModel\Filter; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; @@ -13,15 +13,8 @@ abstract class AbstractApiController extends AbstractController { - use RequestValidator; - protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; - protected const SORT_PARAM = 'sort'; - protected const SORT_DIR_PARAM = 'sort-dir'; - protected const PAGE_SIZE_PARAM = 'page-size'; - protected const PAGE_PARAM = 'page'; - protected RouterInterface $router; #[Required] @@ -44,4 +37,25 @@ protected function getDate(Request $request, string $name): \DateTime return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); } + + protected function assertFilter(Request $request, array $filters): array + { + $result = []; + + foreach ($filters as $filter => $type) { + $values = $request->get($filter, []); + + if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { + $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); + + continue; + } + + foreach ($values as $operator => $value) { + $result[] = new Filter($filter, $type, $operator, $value); + } + } + + return $result; + } } diff --git a/src/Service/FileManager.php b/src/Service/FileManager.php deleted file mode 100644 index 7a3f044..0000000 --- a/src/Service/FileManager.php +++ /dev/null @@ -1,18 +0,0 @@ -projectDir = $projectDir; - } - - public function getProjectDir(): string - { - return $this->projectDir; - } -} diff --git a/src/Service/Traits/FileSystemAwareTrait.php b/src/Service/Traits/FileSystemAwareTrait.php index a42107b..7d09867 100644 --- a/src/Service/Traits/FileSystemAwareTrait.php +++ b/src/Service/Traits/FileSystemAwareTrait.php @@ -2,21 +2,21 @@ namespace App\Service\Traits; -use App\Service\FileManager; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Contracts\Service\Attribute\Required; trait FileSystemAwareTrait { - private FileManager $fileManager; + private ParameterBagInterface $parameters; #[Required] - public function setFileManager(FileManager $manager): void + public function setFileManager(ParameterBagInterface $parameters): void { - $this->fileManager = $manager; + $this->parameters = $parameters; } public function getProjectDir(): string { - return $this->fileManager->getProjectDir(); + return $this->parameters->get('kernel.project_dir'); } } diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php deleted file mode 100644 index 1f0c36e..0000000 --- a/src/Service/Validator/RequestValidator.php +++ /dev/null @@ -1,30 +0,0 @@ - $type) { - $values = $request->get($filter, []); - - if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { - $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); - - continue; - } - - foreach ($values as $operator => $value) { - $result[] = new Filter($filter, $type, $operator, $value); - } - } - - return $result; - } -} From 3f2e42675b31adcd308eb484f18e93da0bcf2e5a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 16 Nov 2021 19:47:53 +0100 Subject: [PATCH 178/221] fix deprecations --- etc/packages/test/framework.yaml | 2 +- src/Controller/DocsController.php | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/etc/packages/test/framework.yaml b/etc/packages/test/framework.yaml index d051c84..acb6be9 100644 --- a/etc/packages/test/framework.yaml +++ b/etc/packages/test/framework.yaml @@ -1,4 +1,4 @@ framework: test: true session: - storage_id: session.storage.mock_file + storage_factory_id: session.storage.factory.mock_file diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 343af1f..df71008 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -25,12 +25,10 @@ public function docs(): Response #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - $path = $this->getProjectDir() . '/etc/custom/tle.json'; - - $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + $docs = json_decode(file_get_contents($this->getProjectDir() . '/etc/custom/tle.json'), true, flags: JSON_THROW_ON_ERROR); $docs['info']['version'] = $this->getParameter('version'); - return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*']); } } From df76c8259aedaa9f97bb89e8d9419fc21a7f39b5 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 18 Nov 2021 14:07:03 +0100 Subject: [PATCH 179/221] add ivanstan/symfony-support --- composer.json | 3 + composer.lock | 437 +++++++++++++++++++++- etc/bundles.php | 1 + etc/services.yaml | 8 +- src/Controller/TleController.php | 14 +- src/Entity/Tle.php | 2 +- src/Enum/SortDirectionEnum.php | 11 - src/Field/NameField.php | 21 -- src/Request/AbstractRequest.php | 16 - src/Request/CollectionRequest.php | 83 ---- src/Request/TleCollectionRequest.php | 1 + src/Request/TleRequest.php | 1 + src/Request/ValidatedRequestInterface.php | 11 - src/Service/CustomRequestResolver.php | 49 --- symfony.lock | 24 ++ 15 files changed, 475 insertions(+), 207 deletions(-) delete mode 100644 src/Enum/SortDirectionEnum.php delete mode 100644 src/Field/NameField.php delete mode 100644 src/Request/AbstractRequest.php delete mode 100644 src/Request/CollectionRequest.php delete mode 100644 src/Request/ValidatedRequestInterface.php delete mode 100644 src/Service/CustomRequestResolver.php diff --git a/composer.json b/composer.json index 34550bc..08f2d95 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,8 @@ "type": "project", "license": "proprietary", "version": "1.3.2", + "minimum-stability": "dev", + "prefer-stable": true, "require": { "php": "^8.0", "ext-ctype": "*", @@ -16,6 +18,7 @@ "doctrine/doctrine-bundle": "^2", "doctrine/doctrine-migrations-bundle": "^2", "doctrine/orm": "^2", + "ivanstan/symfony-support": "dev-master", "ivanstan/tle-php": "dev-master", "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", diff --git a/composer.lock b/composer.lock index 52163e9..4e03c45 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "36741392d9ac539d410848a591f03225", + "content-hash": "ef8fa37418ac24eeb5b41d1f59f02d89", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1950,6 +1950,56 @@ }, "time": "2021-07-21T13:50:14+00:00" }, + { + "name": "ivanstan/symfony-support", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ivanstan/symfony-support.git", + "reference": "79517573dd72b056425a3d002e0ed005fd6850b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/79517573dd72b056425a3d002e0ed005fd6850b9", + "reference": "79517573dd72b056425a3d002e0ed005fd6850b9", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "symfony/console": "^5.3", + "symfony/framework-bundle": "^5.3", + "symfony/orm-pack": "^2.1", + "symfony/serializer-pack": "^1.0", + "symfony/validator": "^5.3" + }, + "require-dev": { + "phpunit/php-code-coverage": "^9.2", + "phpunit/phpunit": "^9" + }, + "default-branch": true, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Ivanstan\\SymfonySupport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivan Stanojevic", + "email": "ivanstan@gmail.com" + } + ], + "description": "Symfony support API toolkit", + "support": { + "issues": "https://github.com/ivanstan/symfony-support/issues", + "source": "https://github.com/ivanstan/symfony-support/tree/master" + }, + "time": "2021-11-18T13:02:19+00:00" + }, { "name": "ivanstan/tle-php", "version": "dev-master", @@ -2672,6 +2722,166 @@ }, "time": "2020-07-07T09:29:14+00:00" }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" + }, { "name": "psr/cache", "version": "2.0.0", @@ -5592,6 +5802,53 @@ ], "time": "2021-08-04T21:20:46+00:00" }, + { + "name": "symfony/orm-pack", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/orm-pack.git", + "reference": "357f6362067b1ebb94af321b79f8939fc9118751" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/357f6362067b1ebb94af321b79f8939fc9118751", + "reference": "357f6362067b1ebb94af321b79f8939fc9118751", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "*", + "doctrine/doctrine-bundle": "*", + "doctrine/doctrine-migrations-bundle": "*", + "doctrine/orm": "*", + "symfony/proxy-manager-bridge": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "support": { + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-12-22T16:33:52+00:00" + }, { "name": "symfony/password-hasher", "version": "v5.3.8", @@ -6488,6 +6745,74 @@ ], "time": "2021-09-07T07:41:40+00:00" }, + { + "name": "symfony/proxy-manager-bridge", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/76e61f33f6a34a340bf6e02211214f466e8e1dba", + "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=7.2.5", + "symfony/dependency-injection": "^5.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\ProxyManager\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for ProxyManager with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v5.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-21T12:38:00+00:00" + }, { "name": "symfony/psr-http-message-bridge", "version": "v2.1.2", @@ -7008,6 +7333,53 @@ ], "time": "2021-09-29T17:19:25+00:00" }, + { + "name": "symfony/serializer-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer-pack.git", + "reference": "61173947057d5e1bf1c79e2a6ab6a8430be0602e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/61173947057d5e1bf1c79e2a6ab6a8430be0602e", + "reference": "61173947057d5e1bf1c79e2a6ab6a8430be0602e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "phpdocumentor/reflection-docblock": "*", + "symfony/property-access": "*", + "symfony/property-info": "*", + "symfony/serializer": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony serializer", + "support": { + "issues": "https://github.com/symfony/serializer-pack/issues", + "source": "https://github.com/symfony/serializer-pack/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-19T08:52:16+00:00" + }, { "name": "symfony/service-contracts", "version": "v2.4.0", @@ -7655,6 +8027,64 @@ } ], "time": "2021-07-29T06:20:01+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" } ], "packages-dev": [ @@ -8326,12 +8756,13 @@ } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "dev", "stability-flags": { + "ivanstan/symfony-support": 20, "ivanstan/tle-php": 20, "roave/security-advisories": 20 }, - "prefer-stable": false, + "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.0", diff --git a/etc/bundles.php b/etc/bundles.php index 7421948..fb4c815 100644 --- a/etc/bundles.php +++ b/etc/bundles.php @@ -7,4 +7,5 @@ Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Sentry\SentryBundle\SentryBundle::class => ['prod' => true], + \Ivanstan\SymfonySupport\SymfonySupportBundle::class => ['all' => true], ]; diff --git a/etc/services.yaml b/etc/services.yaml index 15fbab0..a1e6836 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -23,11 +23,11 @@ services: # as action arguments even if you don't extend any base controller class App\Controller\: resource: '../src/Controller' - tags: ['controller.service_arguments'] + tags: [ 'controller.service_arguments' ] # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones - App\Service\CustomRequestResolver: - tags: - - { name: controller.argument_value_resolver, priority: 50 } + Ivanstan\SymfonySupport\Services\CustomRequestResolver: + tags: + - { name: controller.argument_value_resolver, priority: 50 } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index a3dab78..df2b0bb 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -2,10 +2,8 @@ namespace App\Controller; -use App\Enum\SortDirectionEnum; use App\Enum\TleCollectionSortableFieldsEnum; use App\Repository\TleRepository; -use App\Request\CollectionRequest; use App\Request\TleCollectionRequest; use App\Request\TleRequest; use App\Service\Traits\TleHttpTrait; @@ -35,8 +33,8 @@ public function __construct(protected TleRepository $repository) #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( - NormalizerInterface $normalizer, TleRequest $request, + NormalizerInterface $normalizer, ): JsonResponse { $data = [ '@context' => self::HYDRA_CONTEXT, @@ -70,11 +68,11 @@ public function collection( ->setCurrentPage($request->getPage()); $parameters = [ - CollectionRequest::$searchParam => $request->getSearch() ?? '*', - CollectionRequest::$sortParam => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), - CollectionRequest::$sortDirParam => $request->getSortDirection(), - CollectionRequest::$pageParam => $request->getPage(), - CollectionRequest::$pageSizeParam => $request->getPageSize(), + TleCollectionRequest::$searchParam => $request->getSearch() ?? '*', + TleCollectionRequest::$sortParam => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), + TleCollectionRequest::$sortDirParam => $request->getSortDirection(), + TleCollectionRequest::$pageParam => $request->getPage(), + TleCollectionRequest::$pageSizeParam => $request->getPageSize(), ]; foreach ($filters as $filter) { diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index a450357..1bb7479 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -3,11 +3,11 @@ namespace App\Entity; use App\Field\IdField; -use App\Field\NameField; use App\Field\TleField; use App\Repository\TleRepository; use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; +use Ivanstan\SymfonySupport\Field\NameField; #[ORM\Entity(repositoryClass: TleRepository::class)] #[ORM\HasLifecycleCallbacks] diff --git a/src/Enum/SortDirectionEnum.php b/src/Enum/SortDirectionEnum.php deleted file mode 100644 index bb04242..0000000 --- a/src/Enum/SortDirectionEnum.php +++ /dev/null @@ -1,11 +0,0 @@ -name; - } - - public function setName(string $name): void - { - $this->name = $name; - } -} diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php deleted file mode 100644 index 0b84b39..0000000 --- a/src/Request/AbstractRequest.php +++ /dev/null @@ -1,16 +0,0 @@ -get(static::$pageParam, 1); - } - - public function getPageSize(): int - { - return (int)min($this->get(static::$pageSizeParam, static::$defaultPageSize), static::$maxPageSize); - } - - public function getSortDirection(): string - { - return $this->get(static::$sortDirParam, SortDirectionEnum::DESCENDING); - } - - public function getSort(string $default = null): ?string - { - return $this->get(static::$sortParam, $default); - } - - public function getSearch(): ?string - { - return $this->get(static::$searchParam); - } - - public function validate(ValidatorInterface $validator): ConstraintViolationListInterface - { - return $validator->validate( - $this->query->all(), - new Assert\Collection( - [ - 'allowExtraFields' => true, - 'allowMissingFields' => true, - 'fields' => [ - static::$pageParam => new Assert\Optional( - new Assert\Sequentially( - [ - new Assert\Type('numeric'), - new Assert\GreaterThanOrEqual(1), - ] - ) - ), - static::$pageSizeParam => new Assert\Optional( - new Assert\Sequentially( - [ - new Assert\GreaterThanOrEqual(1), - new Assert\LessThanOrEqual(static::$maxPageSize), - ] - ) - ), - static::$searchParam => new Assert\Optional(new Assert\Type('string')), - static::$sortParam => new Assert\Optional(new Assert\Choice(static::$sortFields)), - static::$sortDirParam => new Assert\Optional( - new Assert\Choice([SortDirectionEnum::ASCENDING, SortDirectionEnum::DESCENDING]) - ), - ], - ] - ) - ); - } -} diff --git a/src/Request/TleCollectionRequest.php b/src/Request/TleCollectionRequest.php index fd60aee..3ed58ec 100644 --- a/src/Request/TleCollectionRequest.php +++ b/src/Request/TleCollectionRequest.php @@ -2,6 +2,7 @@ namespace App\Request; +use Ivanstan\SymfonySupport\Request\CollectionRequest; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index 984e507..a98ff9d 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -2,6 +2,7 @@ namespace App\Request; +use Ivanstan\SymfonySupport\Request\AbstractRequest; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; diff --git a/src/Request/ValidatedRequestInterface.php b/src/Request/ValidatedRequestInterface.php deleted file mode 100644 index 22c5aba..0000000 --- a/src/Request/ValidatedRequestInterface.php +++ /dev/null @@ -1,11 +0,0 @@ -getType() || is_subclass_of($argument->getType(), Request::class); - } - - public function resolve(Request $request, ArgumentMetadata $argument): iterable - { - /** @var AbstractRequest $customRequest */ - $customRequest = forward_static_call([$argument->getType(), 'createFromGlobals']); - $customRequest->attributes = $request->attributes; - $customRequest->query = $request->query; - $customRequest->files = $request->files; - $customRequest->request = $request->request; - - if (method_exists($customRequest, 'validate')) { - $violations = $customRequest->validate($this->validator); - - /** - * ToDo: Messages should be combined and well formatted. - */ - if ($violations !== null && $violations->has(0)) { - $violation = $violations->get(0); - - $message = $violation->getPropertyPath() . ' ' . $violation->getMessage(); - - throw new BadRequestHttpException($message); - } - } - - yield $customRequest; - } -} diff --git a/symfony.lock b/symfony.lock index 7d72348..fde5b33 100644 --- a/symfony.lock +++ b/symfony.lock @@ -111,6 +111,9 @@ "http-interop/http-factory-guzzle": { "version": "1.0.0" }, + "ivanstan/symfony-support": { + "version": "dev-master" + }, "ivanstan/tle-php": { "version": "1.0" }, @@ -162,6 +165,15 @@ "php-http/promise": { "version": "1.1.0" }, + "phpdocumentor/reflection-common": { + "version": "2.2.0" + }, + "phpdocumentor/reflection-docblock": { + "version": "5.3.0" + }, + "phpdocumentor/type-resolver": { + "version": "1.5.1" + }, "psr/cache": { "version": "1.0.1" }, @@ -357,6 +369,9 @@ "symfony/options-resolver": { "version": "v5.2.4" }, + "symfony/orm-pack": { + "version": "v2.1.0" + }, "symfony/password-hasher": { "version": "v5.3.0" }, @@ -406,6 +421,9 @@ "symfony/property-info": { "version": "v5.2.4" }, + "symfony/proxy-manager-bridge": { + "version": "v5.3.4" + }, "symfony/psr-http-message-bridge": { "version": "v2.1.0" }, @@ -435,6 +453,9 @@ "symfony/serializer": { "version": "v5.0.2" }, + "symfony/serializer-pack": { + "version": "v1.0.4" + }, "symfony/service-contracts": { "version": "v2.0.1" }, @@ -475,6 +496,9 @@ "webimpress/safe-writer": { "version": "2.0.0" }, + "webmozart/assert": { + "version": "1.10.0" + }, "zendframework/zend-code": { "version": "3.4.1" }, From 6ae97d12acee12ac49a86bc54c3d65e8d6207f9a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 18 Nov 2021 14:14:22 +0100 Subject: [PATCH 180/221] use sub bundle --- src/Controller/AbstractApiController.php | 2 +- src/Entity/Request.php | 2 +- src/Entity/Tle.php | 2 +- .../ObserverNormalizer.php | 74 +++++----- .../SatellitePassNormalizer.php | 134 +++++++++--------- .../TleModelNormalizer.php | 128 ++++++++--------- src/Service/DateTimeService.php | 13 -- 7 files changed, 171 insertions(+), 184 deletions(-) rename src/{Serializer => Normalizer}/ObserverNormalizer.php (93%) rename src/{Serializer => Normalizer}/SatellitePassNormalizer.php (96%) rename src/{Serializer => Normalizer}/TleModelNormalizer.php (95%) delete mode 100644 src/Service/DateTimeService.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index cf64611..f325e48 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -2,8 +2,8 @@ namespace App\Controller; -use App\Service\DateTimeService; use App\ViewModel\Filter; +use Ivanstan\SymfonySupport\Services\DateTimeService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 5510aff..1614fdb 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -4,8 +4,8 @@ use App\Field\IdField; use App\Repository\RequestRepository; -use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; +use Ivanstan\SymfonySupport\Services\DateTimeService; #[ORM\Entity(repositoryClass: RequestRepository::class)] #[ORM\HasLifecycleCallbacks] diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 1bb7479..fe91f61 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -5,9 +5,9 @@ use App\Field\IdField; use App\Field\TleField; use App\Repository\TleRepository; -use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; use Ivanstan\SymfonySupport\Field\NameField; +use Ivanstan\SymfonySupport\Services\DateTimeService; #[ORM\Entity(repositoryClass: TleRepository::class)] #[ORM\HasLifecycleCallbacks] diff --git a/src/Serializer/ObserverNormalizer.php b/src/Normalizer/ObserverNormalizer.php similarity index 93% rename from src/Serializer/ObserverNormalizer.php rename to src/Normalizer/ObserverNormalizer.php index 15ccde1..879e3f9 100644 --- a/src/Serializer/ObserverNormalizer.php +++ b/src/Normalizer/ObserverNormalizer.php @@ -1,37 +1,37 @@ - 'Observer', - ], - $this->normalizer->normalize($object) - ); - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Observer; - } -} + 'Observer', + ], + $this->normalizer->normalize($object) + ); + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Normalizer/SatellitePassNormalizer.php similarity index 96% rename from src/Serializer/SatellitePassNormalizer.php rename to src/Normalizer/SatellitePassNormalizer.php index 7e59c35..1291b0b 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Normalizer/SatellitePassNormalizer.php @@ -1,67 +1,67 @@ - $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', - 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_aos_az ?? null, 2), - 'elevation' => round($object->visible_aos_el ?? null, 2), - ], - 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_max_el_az ?? null, 2), - 'elevation' => round($object->visible_max_el ?? null, 2), - ], - 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), - 'elevation' => round($object->visible_los_el ?? null, 2), - ], - ]; - - if ($details) { - foreach ($object->details as $item) { - $result['details'][] = [ - 'azimuth' => $item->az, - 'elevation' => $item->el - ]; - } - } - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof \Predict_Pass; - } -} + $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), + ], + ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/Serializer/TleModelNormalizer.php b/src/Normalizer/TleModelNormalizer.php similarity index 95% rename from src/Serializer/TleModelNormalizer.php rename to src/Normalizer/TleModelNormalizer.php index 31c38b0..b09a91f 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Normalizer/TleModelNormalizer.php @@ -1,64 +1,64 @@ -router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); - - $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); - - $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; - - $normalized = [ - '@id' => $id, - '@type' => 'TleModel', - 'satelliteId' => $model->getId(), - 'name' => $model->getName(), - 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), - 'line1' => $model->getLine1(), - 'line2' => $model->getLine2(), - ]; - - if ($isExtra && $object->getInfo()) { - $extra = [ - 'extra' => [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, - TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, - TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, - TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, - ], - ]; - - $normalized = array_merge($normalized, $extra); - } - - return $normalized; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Tle; - } -} +router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); + + $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); + + $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; + + $normalized = [ + '@id' => $id, + '@type' => 'TleModel', + 'satelliteId' => $model->getId(), + 'name' => $model->getName(), + 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), + 'line1' => $model->getLine1(), + 'line2' => $model->getLine2(), + ]; + + if ($isExtra && $object->getInfo()) { + $extra = [ + 'extra' => [ + TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, + ], + ]; + + $normalized = array_merge($normalized, $extra); + } + + return $normalized; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Tle; + } +} diff --git a/src/Service/DateTimeService.php b/src/Service/DateTimeService.php deleted file mode 100644 index b0245b6..0000000 --- a/src/Service/DateTimeService.php +++ /dev/null @@ -1,13 +0,0 @@ - Date: Fri, 19 Nov 2021 19:59:41 +0100 Subject: [PATCH 181/221] move logic to bundle --- etc/packages/support.yaml | 4 + etc/services.yaml | 4 - src/Command/DoctrineReloadCommand.php | 92 ---------- src/Controller/TleController.php | 8 +- src/Event/ApiExceptionSubscriber.php | 79 --------- src/ViewModel/Model/QueryBuilderPaginator.php | 161 ------------------ 6 files changed, 7 insertions(+), 341 deletions(-) create mode 100644 etc/packages/support.yaml delete mode 100644 src/Command/DoctrineReloadCommand.php delete mode 100644 src/Event/ApiExceptionSubscriber.php delete mode 100644 src/ViewModel/Model/QueryBuilderPaginator.php diff --git a/etc/packages/support.yaml b/etc/packages/support.yaml new file mode 100644 index 0000000..54b238f --- /dev/null +++ b/etc/packages/support.yaml @@ -0,0 +1,4 @@ +symfony_support: + exception_subscriber: + paths: + - / diff --git a/etc/services.yaml b/etc/services.yaml index a1e6836..5ec7c01 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -27,7 +27,3 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones - - Ivanstan\SymfonySupport\Services\CustomRequestResolver: - tags: - - { name: controller.argument_value_resolver, priority: 50 } diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php deleted file mode 100644 index 207615e..0000000 --- a/src/Command/DoctrineReloadCommand.php +++ /dev/null @@ -1,92 +0,0 @@ - 'Yes', - 'n' => 'No', - ]; - - private static array $envs = [ - 'dev', - 'test', - ]; - - public function __construct(private $env) - { - parent::__construct(); - } - - protected function configure(): void - { - $this - ->addOption( - 'force', - 'f', - InputOption::VALUE_OPTIONAL, - 'Force execution even in production environment', - false - ); - } - - /** - * @throws \Exception - */ - protected function execute(InputInterface $input, OutputInterface $output): int - { - $io = new SymfonyStyle($input, $output); - $helper = $this->getHelper('question'); - $question = new ChoiceQuestion('All data will be lost. Do you wish to continue?', self::$choices, false); - $force = $input->getOption('force') !== false; - - if (!$force && !\in_array($this->env, self::$envs, true)) { - $io->warning( - 'This is intended for use only in dev or test environment. Run with -f parameter to execute regardless of environment.' - ); - - return Command::FAILURE; - } - - $application = $this->getApplication(); - - if ($application === null) { - throw new \RuntimeException('Application instance not found.'); - } - - if ($input->getOption('no-interaction') || $helper->ask($input, $output, $question) === 'y') { - $application->setAutoExit(false); - - $io->writeln('Drop database'); - $options = ['command' => 'doctrine:database:drop', '--force' => true]; - $application->run(new ArrayInput($options)); - - $io->writeln('Create database'); - $options = ['command' => 'doctrine:database:create', '--if-not-exists' => true]; - $application->run(new ArrayInput($options)); - - $io->writeln('Execute migrations'); - $options = ['command' => 'doctrine:migration:migrate', '--no-interaction' => true]; - $application->run(new ArrayInput($options)); - - $io->writeln('Load fixtures'); - $options = ['command' => 'doctrine:fixtures:load', '--no-interaction' => true]; - $application->run(new ArrayInput($options)); - } - - return Command::SUCCESS; - } -} diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index df2b0bb..579557a 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -8,7 +8,7 @@ use App\Request\TleRequest; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; -use App\ViewModel\Model\QueryBuilderPaginator; +use Ivanstan\SymfonySupport\Services\QueryBuilderPaginator; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -87,11 +87,9 @@ public function collection( $parameters[$name] = $satelliteId; } - $response = $pagination->getCollection($request, $this->router); + $response = $normalizer->normalize($pagination, null, [self::PARAM_EXTRA => $request->getExtra()]); $response['parameters'] = $parameters; - return $this->response( - $normalizer->normalize($response, null, [self::PARAM_EXTRA => $request->getExtra()]) - ); + return $this->response($response); } } diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php deleted file mode 100644 index 6e83754..0000000 --- a/src/Event/ApiExceptionSubscriber.php +++ /dev/null @@ -1,79 +0,0 @@ -env = $env; - } - - public static function getSubscribedEvents(): array - { - return [ - KernelEvents::EXCEPTION => 'onException', - ]; - } - - public function onException(ExceptionEvent $event): void - { - if (!str_contains($event->getRequest()->getPathInfo(), self::API_PATH)) { - return; - } - - $exception = $event->getThrowable(); - - $response = ['message' => 'Unspecified error']; - - if ($this->env === 'dev' || $this->env === 'test') { - $response['message'] = $exception->getMessage(); - $response['exception'] = $this->throwableToArray($exception); - } - - if ($exception instanceof HttpException) { - $response['message'] = $exception->getMessage(); - - $this->setJsonResponse($event, $response); - return; - } - - $this->setJsonResponse($event, $response); - } - - private function setJsonResponse(ExceptionEvent $event, array $response): void - { - $event->setResponse( - new JsonResponse( - [ - 'response' => $response - ], - Response::HTTP_OK, - ) - ); - } - - private function throwableToArray(\Throwable $throwable): array - { - return [ - 'code' => $throwable->getCode(), - 'file' => $throwable->getFile() . ':' . $throwable->getLine(), - 'message' => $throwable->getMessage(), - 'trace' => $throwable->getTrace(), - ]; - } -} diff --git a/src/ViewModel/Model/QueryBuilderPaginator.php b/src/ViewModel/Model/QueryBuilderPaginator.php deleted file mode 100644 index 4970bb9..0000000 --- a/src/ViewModel/Model/QueryBuilderPaginator.php +++ /dev/null @@ -1,161 +0,0 @@ -getRootEntities()[0] ?? null; - - $this->meta = $builder->getEntityManager()->getClassMetadata($entity); - } - - public function getCollection(Request $request, RouterInterface $router): array - { - return [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $router->generate($request->attributes->get('_route'), [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $this->getTotal(), - 'member' => $this->getCurrentPageResult(), - 'parameters' => array_merge($request->request->all(), $request->query->all()), - 'view' => $this->getView($request, $router), - ]; - } - - public function getCurrentPageResult(): array - { - $builder = clone $this->builder; - - $builder->setMaxResults($this->pageSize); - $builder->setFirstResult($this->getPageOffset($this->page, $this->pageSize)); - - return $builder->getQuery()->getResult(); - } - - public function getTotal(): int - { - if ($this->total !== null) { - return $this->total; - } - - $builder = clone $this->builder; - - $alias = $builder->getRootAliases()[0] ?? null; - $identifier = $this->meta->identifier[0] ?? null; - - $builder->select("COUNT($alias.$identifier)"); - - try { - $result = $builder->getQuery()->getSingleScalarResult(); - } catch (NonUniqueResultException) { - $result = array_sum( - array_map(static fn($item) => (int)$item, $builder->getQuery()->getScalarResult()) - ); - } catch (NoResultException) { - $result = 0; - } - - $this->total = $result; - - return $result; - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getView(Request $request, RouterInterface $router): array - { - $params = $request->query->all(); - - $page = $this->page; - $pages = max(1, ceil($this->getTotal() / $this->pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function setCurrentPage(int $page): QueryBuilderPaginator - { - $this->page = $page; - - return $this; - } - - public function setPageSize(int $pageSize): QueryBuilderPaginator - { - $this->pageSize = $pageSize; - - return $this; - } -} From 827f9f5ca28baa6ba52f24e398bbc25ebc4a3f8f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 19 Nov 2021 20:29:31 +0100 Subject: [PATCH 182/221] use sub bundle --- composer.json | 9 ++++++ composer.lock | 35 +++++++++++---------- src/Command/ImportTleCommand.php | 2 +- src/Command/UpdateImportSources.php | 2 +- src/Controller/DocsController.php | 2 +- src/Service/Traits/FileSystemAwareTrait.php | 22 ------------- 6 files changed, 30 insertions(+), 42 deletions(-) delete mode 100644 src/Service/Traits/FileSystemAwareTrait.php diff --git a/composer.json b/composer.json index 08f2d95..96a3850 100644 --- a/composer.json +++ b/composer.json @@ -114,5 +114,14 @@ "allow-contrib": false, "require": "5.3.*" } + }, + "repositories": { + "ivanstan/symfony-support": { + "type": "path", + "url": "../symfony-support", + "options": { + "symlink": true + } + } } } diff --git a/composer.lock b/composer.lock index 4e03c45..39d0e8d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ef8fa37418ac24eeb5b41d1f59f02d89", + "content-hash": "c44a426e031d9a87bcef3c2de7cb8c69", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1953,16 +1953,10 @@ { "name": "ivanstan/symfony-support", "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/ivanstan/symfony-support.git", - "reference": "79517573dd72b056425a3d002e0ed005fd6850b9" - }, "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/79517573dd72b056425a3d002e0ed005fd6850b9", - "reference": "79517573dd72b056425a3d002e0ed005fd6850b9", - "shasum": "" + "type": "path", + "url": "../symfony-support", + "reference": "0b97e2f544596d9b37d1499ed6d853d4f406b71e" }, "require": { "php": ">=8.0", @@ -1976,14 +1970,22 @@ "phpunit/php-code-coverage": "^9.2", "phpunit/phpunit": "^9" }, - "default-branch": true, "type": "symfony-bundle", "autoload": { "psr-4": { "Ivanstan\\SymfonySupport\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", + "autoload-dev": { + "psr-4": { + "Ivanstan\\SymfonyRest\\Tests\\": "tests/" + } + }, + "scripts": { + "test": [ + "php -dxdebug.mode=coverage ./vendor/bin/phpunit --coverage-text --coverage-html tests/coverage" + ] + }, "license": [ "MIT" ], @@ -1994,11 +1996,10 @@ } ], "description": "Symfony support API toolkit", - "support": { - "issues": "https://github.com/ivanstan/symfony-support/issues", - "source": "https://github.com/ivanstan/symfony-support/tree/master" - }, - "time": "2021-11-18T13:02:19+00:00" + "transport-options": { + "symlink": true, + "relative": true + } }, { "name": "ivanstan/tle-php", diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index ef9cbf7..35ca506 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -4,9 +4,9 @@ use App\Entity\Tle; use App\Repository\TleRepository; -use App\Service\Traits\FileSystemAwareTrait; use Doctrine\ORM\EntityManagerInterface; use GuzzleHttp\Client; +use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Ivanstan\Tle\Model\TleFile; use Symfony\Component\Console\Attribute\AsCommand; diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index f6ccfa1..2f2aaff 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -2,9 +2,9 @@ namespace App\Command; -use App\Service\Traits\FileSystemAwareTrait; use DOMElement; use GuzzleHttp\Client; +use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index df71008..c305cd9 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -2,7 +2,7 @@ namespace App\Controller; -use App\Service\Traits\FileSystemAwareTrait; +use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; diff --git a/src/Service/Traits/FileSystemAwareTrait.php b/src/Service/Traits/FileSystemAwareTrait.php deleted file mode 100644 index 7d09867..0000000 --- a/src/Service/Traits/FileSystemAwareTrait.php +++ /dev/null @@ -1,22 +0,0 @@ -parameters = $parameters; - } - - public function getProjectDir(): string - { - return $this->parameters->get('kernel.project_dir'); - } -} From 05277946825df3e26f6afd2d036bf7cd8ba7e066 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 19 Nov 2021 20:31:58 +0100 Subject: [PATCH 183/221] use sub bundle --- src/Controller/TleController.php | 6 ++---- src/Normalizer/TleModelNormalizer.php | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 579557a..1103866 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -18,8 +18,6 @@ final class TleController extends AbstractApiController { use TleHttpTrait; - public const PARAM_EXTRA = 'extra'; - protected const COLLECTION_FILTERS = [ TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, @@ -41,7 +39,7 @@ public function record( ]; return $this->response( - array_merge($data, $normalizer->normalize($this->getTle($request->getId()), null, [self::PARAM_EXTRA => $request->getExtra()])), + array_merge($data, $normalizer->normalize($this->getTle($request->getId()), null, [TleRequest::EXTRA_PARAM => $request->getExtra()])), ); } @@ -87,7 +85,7 @@ public function collection( $parameters[$name] = $satelliteId; } - $response = $normalizer->normalize($pagination, null, [self::PARAM_EXTRA => $request->getExtra()]); + $response = $normalizer->normalize($pagination, null, [TleRequest::EXTRA_PARAM => $request->getExtra()]); $response['parameters'] = $parameters; return $this->response($response); diff --git a/src/Normalizer/TleModelNormalizer.php b/src/Normalizer/TleModelNormalizer.php index b09a91f..103b574 100644 --- a/src/Normalizer/TleModelNormalizer.php +++ b/src/Normalizer/TleModelNormalizer.php @@ -2,9 +2,9 @@ namespace App\Normalizer; -use App\Controller\TleController; use App\Entity\Tle; use App\Enum\TleCollectionSortableFieldsEnum; +use App\Request\TleRequest; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -28,7 +28,7 @@ public function normalize($object, ?string $format = null, array $context = []): $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); - $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; + $isExtra = ($context[TleRequest::EXTRA_PARAM] ?? null) === true; $normalized = [ '@id' => $id, From f45334ad590a7008b9f9008834c02e86e00a64d4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 19 Nov 2021 20:34:48 +0100 Subject: [PATCH 184/221] use sub bundle --- src/Controller/TleController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 1103866..d1118dc 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -61,9 +61,7 @@ public function collection( ); $pagination = new QueryBuilderPaginator($builder); - $pagination - ->setPageSize($request->getPageSize()) - ->setCurrentPage($request->getPage()); + $pagination->setFromRequest($request); $parameters = [ TleCollectionRequest::$searchParam => $request->getSearch() ?? '*', From 1ea74422331e348366b56ac2136dc3f120aacd46 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 20 Nov 2021 15:16:16 +0100 Subject: [PATCH 185/221] use sub bundle --- src/Repository/TleRepository.php | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index a554206..7dfef00 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -12,8 +12,9 @@ use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; +use Ivanstan\SymfonySupport\Repository\EntityRepository; -class TleRepository extends ServiceEntityRepository +class TleRepository extends EntityRepository { public function __construct(ManagerRegistry $registry) { @@ -41,17 +42,7 @@ public function collection( $builder->select('tle'); $builder->leftJoin(TleInformation::class, 'info', Expr\Join::WITH, 'info.tle = tle.id'); - // search - if ($search) { - $builder - ->where( - $builder->expr()->orX( - $builder->expr()->like('tle.id', ':search'), - $builder->expr()->like('tle.name', ':search') - ) - ) - ->setParameter('search', '%' . $search . '%'); - } + $builder = $this->search($builder, ['tle.id', 'tle.name'], $search); // filters foreach ($filters as $index => $filter) { From 97ebb4819cefadab71937b51017f4fb4826f15e9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 5 Jan 2022 16:27:34 +0100 Subject: [PATCH 186/221] use sub bundle --- .env | 78 +- .gitignore | 6 +- bin/console | 40 +- bin/phpunit | 20 +- composer.json | 47 +- composer.lock | 2095 ++++++++++++------------- etc/packages/doctrine_migrations.yaml | 1 + etc/packages/framework.yaml | 10 +- etc/packages/routing.yaml | 5 + etc/packages/test/doctrine.yaml | 4 + etc/routes.yaml | 4 + etc/routes/annotations.yaml | 7 + etc/routes/framework.yaml | 4 + etc/services.yaml | 2 +- phpunit.xml.dist | 9 +- public/.htaccess | 4 +- src/Controller/TleController.php | 9 +- src/Event/ApiLimiterSubscriber.php | 6 +- src/Kernel.php | 52 +- src/Normalizer/ObserverNormalizer.php | 10 +- src/Repository/TleRepository.php | 2 +- symfony.lock | 85 +- tests/TleTest.php | 2 +- tests/bootstrap.php | 32 +- 24 files changed, 1239 insertions(+), 1295 deletions(-) create mode 100644 etc/packages/test/doctrine.yaml create mode 100644 etc/routes/annotations.yaml create mode 100644 etc/routes/framework.yaml diff --git a/.env b/.env index 672cdbd..a4744f6 100644 --- a/.env +++ b/.env @@ -1,39 +1,39 @@ -# In all environments, the following files are loaded if they exist, -# the latter taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration - -###> symfony/framework-bundle ### -APP_ENV=dev -APP_SECRET=c165ffa974b09ac4d1bd06daf956753b -#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -#TRUSTED_HOSTS='^localhost|example\.com$' -###< symfony/framework-bundle ### - -###> doctrine/doctrine-bundle ### -# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" -# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" -# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 -###< doctrine/doctrine-bundle ### - -###> sentry/sentry-symfony ### -SENTRY_DSN= -###< sentry/sentry-symfony ### - -###> symfony/lock ### -# Choose one of the stores below -# postgresql+advisory://db_user:db_password@localhost/db_name -LOCK_DSN=semaphore -###< symfony/lock ### +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=c165ffa974b09ac4d1bd06daf956753b +#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 +#TRUSTED_HOSTS='^localhost|example\.com$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 +###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=semaphore +###< symfony/lock ### diff --git a/.gitignore b/.gitignore index e108fb4..b5db415 100644 --- a/.gitignore +++ b/.gitignore @@ -5,16 +5,16 @@ /.env.local.php /.env.*.local /config/secrets/prod/prod.decrypt.private.php -/public/bundles/ +/./public/bundles/ /var/ /vendor/ ###< symfony/framework-bundle ### ###> symfony/phpunit-bridge ### -.phpunit .phpunit.result.cache /phpunit.xml -coverage ###< symfony/phpunit-bridge ### public/index.html +coverage +bin/.phpunit diff --git a/bin/console b/bin/console index 8fe9d49..c933dc5 100644 --- a/bin/console +++ b/bin/console @@ -3,41 +3,15 @@ use App\Kernel; use Symfony\Bundle\FrameworkBundle\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Dotenv\Dotenv; -use Symfony\Component\ErrorHandler\Debug; -if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL; +if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) { + throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); } -set_time_limit(0); +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -require dirname(__DIR__).'/vendor/autoload.php'; +return function (array $context) { + $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); -if (!class_exists(Application::class) || !class_exists(Dotenv::class)) { - throw new LogicException('You need to add "symfony/framework-bundle" and "symfony/dotenv" as Composer dependencies.'); -} - -$input = new ArgvInput(); -if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { - putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); -} - -if ($input->hasParameterOption('--no-debug', true)) { - putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); -} - -(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); - -if ($_SERVER['APP_DEBUG']) { - umask(0000); - - if (class_exists(Debug::class)) { - Debug::enable(); - } -} - -$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); -$application = new Application($kernel); -$application->run($input); + return new Application($kernel); +}; diff --git a/bin/phpunit b/bin/phpunit index 4d1ed05..f26f2c7 100644 --- a/bin/phpunit +++ b/bin/phpunit @@ -1,13 +1,19 @@ #!/usr/bin/env php =8.0", - "symfony/console": "^5.3", - "symfony/framework-bundle": "^5.3", + "symfony/console": "^5.3|^6.0", + "symfony/framework-bundle": "^5.3|^6.0", "symfony/orm-pack": "^2.1", "symfony/serializer-pack": "^1.0", - "symfony/validator": "^5.3" + "symfony/validator": "^5.3|^6.0" }, "require-dev": { "phpunit/php-code-coverage": "^9.2", "phpunit/phpunit": "^9" }, + "default-branch": true, "type": "symfony-bundle", "autoload": { "psr-4": { "Ivanstan\\SymfonySupport\\": "src/" } }, - "autoload-dev": { - "psr-4": { - "Ivanstan\\SymfonyRest\\Tests\\": "tests/" - } - }, - "scripts": { - "test": [ - "php -dxdebug.mode=coverage ./vendor/bin/phpunit --coverage-text --coverage-html tests/coverage" - ] - }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1996,10 +2011,11 @@ } ], "description": "Symfony support API toolkit", - "transport-options": { - "symlink": true, - "relative": true - } + "support": { + "issues": "https://github.com/ivanstan/symfony-support/issues", + "source": "https://github.com/ivanstan/symfony-support/tree/master" + }, + "time": "2022-01-05T14:45:52+00:00" }, { "name": "ivanstan/tle-php", @@ -2109,43 +2125,42 @@ }, { "name": "laminas/laminas-code", - "version": "4.4.3", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1" + "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/bb324850d09dd437b6acb142c13e64fdc725b0e1", - "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/6fd96d4d913571a2cd056a27b123fa28cb90ac4e", + "reference": "6fd96d4d913571a2cd056a27b123fa28cb90ac4e", "shasum": "" }, "require": { - "php": "^7.4 || ~8.0.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" + "php": ">=7.4, <8.2" }, "require-dev": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.13.2", "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.1.4", - "laminas/laminas-stdlib": "^3.3.0", - "phpunit/phpunit": "^9.4.2", - "psalm/plugin-phpunit": "^0.14.0", - "vimeo/psalm": "^4.3.1" + "laminas/laminas-coding-standard": "^2.3.0", + "laminas/laminas-stdlib": "^3.6.1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.13.1" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component", - "laminas/laminas-zendframework-bridge": "A bridge with Zend Framework" + "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", "autoload": { "psr-4": { "Laminas\\Code\\": "src/" - } + }, + "files": [ + "polyfill/ReflectionEnumPolyfill.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2172,7 +2187,7 @@ "type": "community_bridge" } ], - "time": "2021-09-21T13:40:23+00:00" + "time": "2021-12-19T18:06:55+00:00" }, { "name": "monolog/monolog", @@ -2335,16 +2350,16 @@ }, { "name": "php-http/client-common", - "version": "2.4.0", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "29e0c60d982f04017069483e832b92074d0a90b2" + "reference": "d135751167d57e27c74de674d6a30cef2dc8e054" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/29e0c60d982f04017069483e832b92074d0a90b2", - "reference": "29e0c60d982f04017069483e832b92074d0a90b2", + "url": "https://api.github.com/repos/php-http/client-common/zipball/d135751167d57e27c74de674d6a30cef2dc8e054", + "reference": "d135751167d57e27c74de674d6a30cef2dc8e054", "shasum": "" }, "require": { @@ -2355,14 +2370,14 @@ "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0", - "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { "doctrine/instantiator": "^1.1", "guzzlehttp/psr7": "^1.4", "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" }, @@ -2404,9 +2419,9 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.4.0" + "source": "https://github.com/php-http/client-common/tree/2.5.0" }, - "time": "2021-07-05T08:19:25+00:00" + "time": "2021-11-26T15:01:24+00:00" }, { "name": "php-http/discovery", @@ -2835,16 +2850,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.5.1", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", "shasum": "" }, "require": { @@ -2879,22 +2894,71 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + }, + "time": "2022-01-04T19:58:01+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" }, - "time": "2021-10-02T14:08:47+00:00" + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" + }, + "time": "2021-09-16T20:46:02+00:00" }, { "name": "psr/cache", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { @@ -2928,28 +2992,33 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/2.0.0" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2021-02-03T23:23:37+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -2976,9 +3045,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -3192,16 +3261,16 @@ }, { "name": "psr/log", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { @@ -3210,7 +3279,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -3236,9 +3305,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-07-14T16:41:46+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "ralouphie/getallheaders", @@ -3286,22 +3355,22 @@ }, { "name": "sentry/sdk", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" + "reference": "2de7de3233293f80d1e244bd950adb2121a3731c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/2de7de3233293f80d1e244bd950adb2121a3731c", + "reference": "2de7de3233293f80d1e244bd950adb2121a3731c", "shasum": "" }, "require": { "http-interop/http-factory-guzzle": "^1.0", "sentry/sentry": "^3.1", - "symfony/http-client": "^4.3|^5.0" + "symfony/http-client": "^4.3|^5.0|^6.0" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -3326,7 +3395,7 @@ "sentry" ], "support": { - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.1" }, "funding": [ { @@ -3338,20 +3407,20 @@ "type": "custom" } ], - "time": "2020-12-01T10:31:45+00:00" + "time": "2021-11-30T11:54:41+00:00" }, { "name": "sentry/sentry", - "version": "3.3.4", + "version": "3.3.5", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "ecbd09ea5d053a202cf773cb24ab28af820831bd" + "reference": "c186c44c32899ad0cf5b4e942d71035f01b87b64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/ecbd09ea5d053a202cf773cb24ab28af820831bd", - "reference": "ecbd09ea5d053a202cf773cb24ab28af820831bd", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c186c44c32899ad0cf5b4e942d71035f01b87b64", + "reference": "c186c44c32899ad0cf5b4e942d71035f01b87b64", "shasum": "" }, "require": { @@ -3359,7 +3428,7 @@ "ext-mbstring": "*", "guzzlehttp/promises": "^1.4", "guzzlehttp/psr7": "^1.7|^2.0", - "jean85/pretty-package-versions": "^1.5|^2.0.1", + "jean85/pretty-package-versions": "^1.5|^2.0.4", "php": "^7.2|^8.0", "php-http/async-client-implementation": "^1.0", "php-http/client-common": "^1.5|^2.0", @@ -3430,7 +3499,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.3.4" + "source": "https://github.com/getsentry/sentry-php/tree/3.3.5" }, "funding": [ { @@ -3442,20 +3511,20 @@ "type": "custom" } ], - "time": "2021-11-08T08:44:00+00:00" + "time": "2021-12-27T12:31:24+00:00" }, { "name": "sentry/sentry-symfony", - "version": "4.2.4", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "cbd486cdf5b9d1933e0dad1c72a84269397ca931" + "reference": "2d3016484d83291a5da137d1a9347e70f0fe526a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cbd486cdf5b9d1933e0dad1c72a84269397ca931", - "reference": "cbd486cdf5b9d1933e0dad1c72a84269397ca931", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/2d3016484d83291a5da137d1a9347e70f0fe526a", + "reference": "2d3016484d83291a5da137d1a9347e70f0fe526a", "shasum": "" }, "require": { @@ -3464,18 +3533,18 @@ "php-http/discovery": "^1.11", "sentry/sdk": "^3.1", "symfony/cache-contracts": "^1.1||^2.4", - "symfony/config": "^3.4.44||^4.4.20||^5.0.11", - "symfony/console": "^3.4.44||^4.4.20||^5.0.11", - "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11", - "symfony/event-dispatcher": "^3.4.44||^4.4.20||^5.0.11", - "symfony/http-kernel": "^3.4.44||^4.4.20||^5.0.11", + "symfony/config": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/console": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/event-dispatcher": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/http-kernel": "^3.4.44||^4.4.20||^5.0.11||^6.0", "symfony/polyfill-php80": "^1.22", "symfony/psr-http-message-bridge": "^1.2||^2.0", - "symfony/security-core": "^3.4.44||^4.4.20||^5.0.11" + "symfony/security-core": "^3.4.44||^4.4.20||^5.0.11||^6.0" }, "require-dev": { "doctrine/dbal": "^2.13||^3.0", - "doctrine/doctrine-bundle": "^1.12||^2.0", + "doctrine/doctrine-bundle": "^1.12||^2.5", "friendsofphp/php-cs-fixer": "^2.18", "jangregor/phpstan-prophecy": "^0.8", "monolog/monolog": "^1.3||^2.0", @@ -3484,16 +3553,17 @@ "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5||^9.0", - "symfony/browser-kit": "^3.4.44||^4.4.20||^5.0.11", - "symfony/cache": "^3.4.44||^4.4.20||^5.0.11", - "symfony/dom-crawler": "^3.4.44||^4.4.20||^5.0.11", - "symfony/framework-bundle": "^3.4.44||^4.4.20||^5.0.11", - "symfony/messenger": "^4.4.20||^5.0.11", + "phpunit/phpunit": "^8.5.14||^9.3.9", + "symfony/browser-kit": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/cache": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/dom-crawler": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/framework-bundle": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/messenger": "^4.4.20||^5.0.11||^6.0", "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.2.6", - "symfony/twig-bundle": "^3.4.44||^4.4.20||^5.0.11", - "symfony/yaml": "^3.4.44||^4.4.20||^5.0.11", + "symfony/phpunit-bridge": "^5.2.6||^6.0", + "symfony/process": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/twig-bundle": "^3.4.44||^4.4.20||^5.0.11||^6.0", + "symfony/yaml": "^3.4.44||^4.4.20||^5.0.11||^6.0", "vimeo/psalm": "^4.3" }, "suggest": { @@ -3543,7 +3613,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.2.4" + "source": "https://github.com/getsentry/sentry-symfony/tree/4.2.5" }, "funding": [ { @@ -3555,7 +3625,7 @@ "type": "custom" } ], - "time": "2021-10-20T07:42:14+00:00" + "time": "2021-12-13T08:52:25+00:00" }, { "name": "symfony/apache-pack", @@ -3585,30 +3655,28 @@ }, { "name": "symfony/asset", - "version": "v5.3.4", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "9bd222a8fdd13ecca91384e403247103198f80a1" + "reference": "98cc78b2fd6f00191596bc91f72d7301e8ac88dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/9bd222a8fdd13ecca91384e403247103198f80a1", - "reference": "9bd222a8fdd13ecca91384e403247103198f80a1", + "url": "https://api.github.com/repos/symfony/asset/zipball/98cc78b2fd6f00191596bc91f72d7301e8ac88dd", + "reference": "98cc78b2fd6f00191596bc91f72d7301e8ac88dd", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "conflict": { - "symfony/http-foundation": "<5.3" + "symfony/http-foundation": "<5.4" }, "require-dev": { - "symfony/http-client": "^4.4|^5.0", - "symfony/http-foundation": "^5.3", - "symfony/http-kernel": "^4.4|^5.0" + "symfony/http-client": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0" }, "suggest": { "symfony/http-foundation": "" @@ -3639,7 +3707,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.3.4" + "source": "https://github.com/symfony/asset/tree/v6.0.1" }, "funding": [ { @@ -3655,32 +3723,31 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-12-08T15:13:44+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.3.4", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c" + "reference": "3e2f1610a25edc2afc2f5f37cc421049d6bef208" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c", - "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3e2f1610a25edc2afc2f5f37cc421049d6bef208", + "reference": "3e2f1610a25edc2afc2f5f37cc421049d6bef208", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/dom-crawler": "^5.4|^6.0" }, "require-dev": { - "symfony/css-selector": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0" + "symfony/css-selector": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "suggest": { "symfony/process": "" @@ -3711,7 +3778,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.3.4" + "source": "https://github.com/symfony/browser-kit/tree/v6.0.1" }, "funding": [ { @@ -3727,56 +3794,52 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-12-08T15:13:44+00:00" }, { "name": "symfony/cache", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "2056f2123f47c9f63102a8b92974c362f4fba568" + "reference": "41bdcb2d067c68f338b0cfd46a86abd8309b4153" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/2056f2123f47c9f63102a8b92974c362f4fba568", - "reference": "2056f2123f47c9f63102a8b92974c362f4fba568", + "url": "https://api.github.com/repos/symfony/cache/zipball/41bdcb2d067c68f338b0cfd46a86abd8309b4153", + "reference": "41bdcb2d067c68f338b0cfd46a86abd8309b4153", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", + "php": ">=8.0.2", + "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^5.4|^6.0" }, "conflict": { - "doctrine/dbal": "<2.10", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" }, "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0|2.0" + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.10|^3.0", + "doctrine/dbal": "^2.13.1|^3.0", "predis/predis": "^1.1", - "psr/simple-cache": "^1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -3808,7 +3871,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.3.10" + "source": "https://github.com/symfony/cache/tree/v6.0.2" }, "funding": [ { @@ -3824,20 +3887,20 @@ "type": "tidelift" } ], - "time": "2021-10-11T15:41:55+00:00" + "time": "2021-12-29T13:00:11+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" + "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", - "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", + "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", "shasum": "" }, "require": { @@ -3850,7 +3913,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -3887,7 +3950,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.0" }, "funding": [ { @@ -3903,39 +3966,38 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-08-17T14:20:01+00:00" }, { "name": "symfony/config", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ac23c2f24d5634966d665d836c3933d54347e5d4" + "reference": "990e6d603da7b9556645e5689c7b082f564790e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ac23c2f24d5634966d665d836c3933d54347e5d4", - "reference": "ac23c2f24d5634966d665d836c3933d54347e5d4", + "url": "https://api.github.com/repos/symfony/config/zipball/990e6d603da7b9556645e5689c7b082f564790e7", + "reference": "990e6d603da7b9556645e5689c7b082f564790e7", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" }, "conflict": { "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -3966,7 +4028,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.3.10" + "source": "https://github.com/symfony/config/tree/v6.0.2" }, "funding": [ { @@ -3982,50 +4044,46 @@ "type": "tidelift" } ], - "time": "2021-10-22T09:06:52+00:00" + "time": "2021-12-28T14:01:53+00:00" }, { "name": "symfony/console", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + "reference": "dd434fa8d69325e5d210f63070014d889511fcb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", - "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "url": "https://api.github.com/repos/symfony/console/zipball/dd434fa8d69325e5d210f63070014d889511fcb3", + "reference": "dd434fa8d69325e5d210f63070014d889511fcb3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.0.2", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -4065,7 +4123,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.10" + "source": "https://github.com/symfony/console/tree/v6.0.2" }, "funding": [ { @@ -4081,25 +4139,24 @@ "type": "tidelift" } ], - "time": "2021-10-26T09:30:15+00:00" + "time": "2021-12-27T21:05:08+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "380f86c1a9830226f42a08b5926f18aed4195f25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/380f86c1a9830226f42a08b5926f18aed4195f25", + "reference": "380f86c1a9830226f42a08b5926f18aed4195f25", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "type": "library", "autoload": { @@ -4131,7 +4188,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + "source": "https://github.com/symfony/css-selector/tree/v6.0.2" }, "funding": [ { @@ -4147,44 +4204,44 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "be833dd336c248ef2bdabf24665351455f52afdb" + "reference": "a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be833dd336c248ef2bdabf24665351455f52afdb", - "reference": "be833dd336c248ef2bdabf24665351455f52afdb", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8", + "reference": "a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" + "php": ">=8.0.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2.0|^3.0" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^5.3", - "symfony/expression-language": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/config": "", @@ -4219,7 +4276,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.3.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.0.2" }, "funding": [ { @@ -4235,29 +4292,29 @@ "type": "tidelift" } ], - "time": "2021-10-22T18:11:05+00:00" + "time": "2021-12-29T10:14:09+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -4286,7 +4343,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" }, "funding": [ { @@ -4302,69 +4359,70 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-11-01T23:48:49+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.3.8", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "212521017d81686bdc84a132fb5de2b03867a7e7" + "reference": "edc5491594d2f69d5704118d255c6f597167813d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/212521017d81686bdc84a132fb5de2b03867a7e7", - "reference": "212521017d81686bdc84a132fb5de2b03867a7e7", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/edc5491594d2f69d5704118d255c6f597167813d", + "reference": "edc5491594d2f69d5704118d255c6f597167813d", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", "doctrine/persistence": "^2", - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3" }, "conflict": { - "doctrine/dbal": "<2.10", - "doctrine/orm": "<2.7.3", + "doctrine/dbal": "<2.13.1", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.7.4", "phpunit/phpunit": "<5.4.3", - "symfony/dependency-injection": "<4.4", - "symfony/form": "<5.1", - "symfony/http-kernel": "<5", - "symfony/messenger": "<4.4", - "symfony/property-info": "<5", - "symfony/security-bundle": "<5", - "symfony/security-core": "<5.3", - "symfony/validator": "<5.2" + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/form": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<5.4", + "symfony/property-info": "<5.4", + "symfony/security-bundle": "<5.4", + "symfony/security-core": "<6.0", + "symfony/validator": "<5.4" }, "require-dev": { - "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.10.4", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^2.10|^3.0", - "doctrine/orm": "^2.7.3", - "symfony/cache": "^5.1", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/doctrine-messenger": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.1.3", - "symfony/http-kernel": "^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/property-info": "^5.0", - "symfony/proxy-manager-bridge": "^4.4|^5.0", - "symfony/security-core": "^5.3", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/uid": "^5.1", - "symfony/validator": "^5.2", - "symfony/var-dumper": "^4.4|^5.0" + "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/orm": "^2.7.4", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/doctrine-messenger": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/form": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/proxy-manager-bridge": "^5.4|^6.0", + "symfony/security-core": "^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "suggest": { "doctrine/data-fixtures": "", @@ -4400,7 +4458,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.8" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.0.2" }, "funding": [ { @@ -4416,35 +4474,33 @@ "type": "tidelift" } ], - "time": "2021-09-11T18:11:56+00:00" + "time": "2021-12-25T20:10:03+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.3.7", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c" + "reference": "bf704b7d995c4908d9906d687b9d4cbfecf01b2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", - "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bf704b7d995c4908d9906d687b9d4cbfecf01b2c", + "reference": "bf704b7d995c4908d9906d687b9d4cbfecf01b2c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "masterminds/html5": "<2.6" }, "require-dev": { "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" + "symfony/css-selector": "^5.4|^6.0" }, "suggest": { "symfony/css-selector": "" @@ -4475,7 +4531,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.3.7" + "source": "https://github.com/symfony/dom-crawler/tree/v6.0.2" }, "funding": [ { @@ -4491,28 +4547,28 @@ "type": "tidelift" } ], - "time": "2021-08-29T19:32:13+00:00" + "time": "2021-12-28T17:22:37+00:00" }, { "name": "symfony/dotenv", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "97ffd3846f8a782086e82c1b5fdefb3f3ad078db" + "reference": "5c43c5515e549a8c2c426be36d40f47daf196968" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/97ffd3846f8a782086e82c1b5fdefb3f3ad078db", - "reference": "97ffd3846f8a782086e82c1b5fdefb3f3ad078db", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/5c43c5515e549a8c2c426be36d40f47daf196968", + "reference": "5c43c5515e549a8c2c426be36d40f47daf196968", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "php": ">=8.0.2" }, "require-dev": { - "symfony/process": "^4.4|^5.0" + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -4545,7 +4601,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.3.10" + "source": "https://github.com/symfony/dotenv/tree/v6.0.2" }, "funding": [ { @@ -4561,32 +4617,35 @@ "type": "tidelift" } ], - "time": "2021-10-28T21:34:29+00:00" + "time": "2021-12-16T22:05:41+00:00" }, { "name": "symfony/error-handler", - "version": "v5.3.7", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" + "reference": "3e677f0c14a529bc542025c96cfa9638227b4cc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", - "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3e677f0c14a529bc542025c96cfa9638227b4cc6", + "reference": "3e677f0c14a529bc542025c96cfa9638227b4cc6", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^5.4|^6.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { @@ -4613,7 +4672,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.7" + "source": "https://github.com/symfony/error-handler/tree/v6.0.2" }, "funding": [ { @@ -4629,44 +4688,42 @@ "type": "tidelift" } ], - "time": "2021-08-28T15:07:08+00:00" + "time": "2021-12-21T13:16:58+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.7", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130" + "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", - "reference": "ce7b20d69c66a20939d8952b617506a44d102130", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7093f25359e2750bfe86842c80c4e4a6a852d05c", + "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -4698,7 +4755,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.2" }, "funding": [ { @@ -4714,24 +4771,24 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-12-21T10:43:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", - "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "psr/event-dispatcher": "^1" }, "suggest": { @@ -4740,7 +4797,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -4777,7 +4834,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" }, "funding": [ { @@ -4793,26 +4850,26 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-07-15T12:33:35+00:00" }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "52b3c9cce673b014915445a432339f282e002ce6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", + "reference": "52b3c9cce673b014915445a432339f282e002ce6", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -4840,7 +4897,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v6.0.0" }, "funding": [ { @@ -4856,25 +4913,24 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-10-29T07:35:21+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "03d2833e677d48317cac852f9c0287fb048c3c5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/03d2833e677d48317cac852f9c0287fb048c3c5c", + "reference": "03d2833e677d48317cac852f9c0287fb048c3c5c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "type": "library", "autoload": { @@ -4902,7 +4958,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v6.0.2" }, "funding": [ { @@ -4918,20 +4974,20 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-12-20T16:21:45+00:00" }, { "name": "symfony/flex", - "version": "v1.17.2", + "version": "v1.17.6", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "0170279814f86648c62aede39b100a343ea29962" + "reference": "7a79135e1dc66b30042b4d968ecba0908f9374bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/0170279814f86648c62aede39b100a343ea29962", - "reference": "0170279814f86648c62aede39b100a343ea29962", + "url": "https://api.github.com/repos/symfony/flex/zipball/7a79135e1dc66b30042b4d968ecba0908f9374bc", + "reference": "7a79135e1dc66b30042b4d968ecba0908f9374bc", "shasum": "" }, "require": { @@ -4940,16 +4996,13 @@ }, "require-dev": { "composer/composer": "^1.0.2|^2.0", - "symfony/dotenv": "^4.4|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/phpunit-bridge": "^4.4.12|^5.0", - "symfony/process": "^3.4|^4.4|^5.0" + "symfony/dotenv": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-main": "1.17-dev" - }, "class": "Symfony\\Flex\\Flex" }, "autoload": { @@ -4970,7 +5023,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.17.2" + "source": "https://github.com/symfony/flex/tree/v1.17.6" }, "funding": [ { @@ -4986,103 +5039,102 @@ "type": "tidelift" } ], - "time": "2021-10-21T08:39:19+00:00" + "time": "2021-11-29T15:39:37+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe" + "reference": "d0598be96b193c4c2e5abab56af512a8e10b3540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe", - "reference": "2ff74f86abf2f67f2d0b53e23ab7a268b105dcfe", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/d0598be96b193c4c2e5abab56af512a8e10b3540", + "reference": "d0598be96b193c4c2e5abab56af512a8e10b3540", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=7.2.5", - "symfony/cache": "^5.2", - "symfony/config": "^5.3", - "symfony/dependency-injection": "^5.3", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/event-dispatcher": "^5.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^5.3", - "symfony/http-kernel": "^5.3", + "php": ">=8.0.2", + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/routing": "^5.3" + "symfony/polyfill-php81": "^1.22", + "symfony/routing": "^5.4|^6.0" }, "conflict": { + "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.3", - "symfony/browser-kit": "<4.4", - "symfony/console": "<5.2.5", - "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/form": "<5.2", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<5.2", - "symfony/messenger": "<4.4", - "symfony/mime": "<4.4", - "symfony/property-access": "<5.3", - "symfony/property-info": "<4.4", - "symfony/security-core": "<5.3", - "symfony/security-csrf": "<5.3", - "symfony/serializer": "<5.2", - "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.3", - "symfony/twig-bridge": "<4.4", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<5.2", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<5.2" + "symfony/asset": "<5.4", + "symfony/console": "<5.4", + "symfony/dom-crawler": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/lock": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/mime": "<5.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/security-core": "<5.4", + "symfony/security-csrf": "<5.4", + "symfony/serializer": "<5.4", + "symfony/stopwatch": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<5.4", + "symfony/web-profiler-bundle": "<5.4", + "symfony/workflow": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", + "doctrine/annotations": "^1.13.1", "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.3", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^5.2", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4.30|^5.3.7", - "symfony/dotenv": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.2", - "symfony/http-client": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^5.2", - "symfony/messenger": "^5.2", - "symfony/mime": "^4.4|^5.0", - "symfony/notifier": "^5.3", - "symfony/phpunit-bridge": "^5.3", + "symfony/asset": "^5.4|^6.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/dotenv": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/form": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/mailer": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/notifier": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^4.4|^5.0", - "symfony/property-info": "^4.4|^5.0", - "symfony/rate-limiter": "^5.2", - "symfony/security-bundle": "^5.3", - "symfony/serializer": "^5.2", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "^5.0", - "symfony/translation": "^5.3", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^5.2", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^5.2", - "symfony/yaml": "^4.4|^5.0", + "symfony/process": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/rate-limiter": "^5.4|^6.0", + "symfony/security-bundle": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/string": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/twig-bundle": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", + "symfony/web-link": "^5.4|^6.0", + "symfony/workflow": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0", "twig/twig": "^2.10|^3.0" }, "suggest": { @@ -5121,7 +5173,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.3.10" + "source": "https://github.com/symfony/framework-bundle/tree/v6.0.2" }, "funding": [ { @@ -5137,36 +5189,33 @@ "type": "tidelift" } ], - "time": "2021-10-26T11:54:54+00:00" + "time": "2021-12-22T00:01:56+00:00" }, { "name": "symfony/http-client", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "710b69ed4bc9469900ec5ae5c3807b0509bee0dc" + "reference": "7f1cbd44590cb0acc6208c1711a52733e9a91663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/710b69ed4bc9469900ec5ae5c3807b0509bee0dc", - "reference": "710b69ed4bc9469900ec5ae5c3807b0509bee0dc", + "url": "https://api.github.com/repos/symfony/http-client/zipball/7f1cbd44590cb0acc6208c1711a52733e9a91663", + "reference": "7f1cbd44590cb0acc6208c1711a52733e9a91663", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1", - "symfony/http-client-contracts": "^2.4", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.0|^2" + "symfony/http-client-contracts": "^3", + "symfony/service-contracts": "^1.0|^2|^3" }, "provide": { "php-http/async-client-implementation": "*", "php-http/client-implementation": "*", "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.4" + "symfony/http-client-implementation": "3.0" }, "require-dev": { "amphp/amp": "^2.5", @@ -5177,10 +5226,10 @@ "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/http-kernel": "^4.4.13|^5.1.5", - "symfony/process": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5208,7 +5257,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.3.10" + "source": "https://github.com/symfony/http-client/tree/v6.0.2" }, "funding": [ { @@ -5224,24 +5273,24 @@ "type": "tidelift" } ], - "time": "2021-10-19T08:32:53+00:00" + "time": "2021-12-29T10:14:09+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" + "reference": "265f03fed057044a8e4dc159aa33596d0f48ed3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", - "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/265f03fed057044a8e4dc159aa33596d0f48ed3f", + "reference": "265f03fed057044a8e4dc159aa33596d0f48ed3f", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.0.2" }, "suggest": { "symfony/http-client-implementation": "" @@ -5249,7 +5298,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -5286,7 +5335,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.0.0" }, "funding": [ { @@ -5302,33 +5351,32 @@ "type": "tidelift" } ], - "time": "2021-04-11T23:07:08+00:00" + "time": "2021-11-03T13:44:55+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c" + "reference": "ac1cd9b84bdea9a3a06cd2127e910afc8b276798" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", - "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ac1cd9b84bdea9a3a06cd2127e910afc8b276798", + "reference": "ac1cd9b84bdea9a3a06cd2127e910afc8b276798", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" + "symfony/cache": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -5359,7 +5407,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.0.2" }, "funding": [ { @@ -5375,68 +5423,65 @@ "type": "tidelift" } ], - "time": "2021-10-11T15:41:55+00:00" + "time": "2021-12-28T17:22:37+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "703e4079920468e9522b72cf47fd76ce8d795e86" + "reference": "00743bc336421a9be4f3e04464969ba8ef3517ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/703e4079920468e9522b72cf47fd76ce8d795e86", - "reference": "703e4079920468e9522b72cf47fd76ce8d795e86", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/00743bc336421a9be4f3e04464969ba8ef3517ad", + "reference": "00743bc336421a9be4f3e04464969ba8ef3517ad", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^5.3.7", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "psr/log": "^1|^2|^3", + "symfony/error-handler": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<4.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^5.3", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -5471,7 +5516,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.0.2" }, "funding": [ { @@ -5487,34 +5532,31 @@ "type": "tidelift" } ], - "time": "2021-10-29T08:36:48+00:00" + "time": "2021-12-29T14:07:16+00:00" }, { "name": "symfony/lock", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "18b2db648a3b394353800a52d34cd7605125a333" + "reference": "7d1425626631ddabc18eaa303af60273806df8d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/18b2db648a3b394353800a52d34cd7605125a333", - "reference": "18b2db648a3b394353800a52d34cd7605125a333", + "url": "https://api.github.com/repos/symfony/lock/zipball/7d1425626631ddabc18eaa303af60273806df8d2", + "reference": "7d1425626631ddabc18eaa303af60273806df8d2", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "psr/log": "^1|^2|^3" }, "conflict": { - "doctrine/dbal": "<2.10" + "doctrine/dbal": "<2.13" }, "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "mongodb/mongodb": "~1.1", + "doctrine/dbal": "^2.13|^3.0", "predis/predis": "~1.0" }, "type": "library", @@ -5551,7 +5593,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.3.10" + "source": "https://github.com/symfony/lock/tree/v6.0.2" }, "funding": [ { @@ -5567,42 +5609,41 @@ "type": "tidelift" } ], - "time": "2021-10-19T14:25:16+00:00" + "time": "2021-12-29T10:14:09+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.3.7", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "4ace41087254f099b6743333155071438bfb12c3" + "reference": "fcdd5ddb18114457ad53be75540a45d96450a9e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/4ace41087254f099b6743333155071438bfb12c3", - "reference": "4ace41087254f099b6743333155071438bfb12c3", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/fcdd5ddb18114457ad53be75540a45d96450a9e6", + "reference": "fcdd5ddb18114457ad53be75540a45d96450a9e6", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2", - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^5.3", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "php": ">=8.0.2", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" }, "conflict": { - "symfony/console": "<4.4", - "symfony/http-foundation": "<5.3" + "symfony/console": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/security-core": "<6.0" }, "require-dev": { - "symfony/console": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/mailer": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/security-core": "^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "suggest": { "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", @@ -5635,7 +5676,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.7" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.0.1" }, "funding": [ { @@ -5651,7 +5692,7 @@ "type": "tidelift" } ], - "time": "2021-08-13T15:54:02+00:00" + "time": "2021-12-09T12:41:48+00:00" }, { "name": "symfony/monolog-bundle", @@ -5736,23 +5777,21 @@ }, { "name": "symfony/options-resolver", - "version": "v5.3.7", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e" + "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4b78e55b179003a42523a362cc0e8327f7a69b5e", - "reference": "4b78e55b179003a42523a362cc0e8327f7a69b5e", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/be0facf48a42a232d6c0daadd76e4eb5657a4798", + "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.1|^3" }, "type": "library", "autoload": { @@ -5785,7 +5824,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.3.7" + "source": "https://github.com/symfony/options-resolver/tree/v6.0.0" }, "funding": [ { @@ -5801,7 +5840,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-11-23T19:05:29+00:00" }, { "name": "symfony/orm-pack", @@ -5852,28 +5891,27 @@ }, { "name": "symfony/password-hasher", - "version": "v5.3.8", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "4bdaa0cca1fb3521bc1825160f3b5490c130bbda" + "reference": "84a702edf57cdccd25c43b0c80c130a8b3d6c82d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/4bdaa0cca1fb3521bc1825160f3b5490c130bbda", - "reference": "4bdaa0cca1fb3521bc1825160f3b5490c130bbda", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/84a702edf57cdccd25c43b0c80c130a8b3d6c82d", + "reference": "84a702edf57cdccd25c43b0c80c130a8b3d6c82d", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "php": ">=8.0.2" }, "conflict": { - "symfony/security-core": "<5.3" + "symfony/security-core": "<5.4" }, "require-dev": { "symfony/console": "^5", - "symfony/security-core": "^5.3" + "symfony/security-core": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5905,7 +5943,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.3.8" + "source": "https://github.com/symfony/password-hasher/tree/v6.0.2" }, "funding": [ { @@ -5921,20 +5959,20 @@ "type": "tidelift" } ], - "time": "2021-09-03T12:22:16+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", + "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", "shasum": "" }, "require": { @@ -5986,7 +6024,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0" }, "funding": [ { @@ -6002,20 +6040,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2021-11-23T21:10:46+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + "reference": "749045c69efb97c70d25d7463abba812e91f3a44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", + "reference": "749045c69efb97c70d25d7463abba812e91f3a44", "shasum": "" }, "require": { @@ -6073,7 +6111,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.0" }, "funding": [ { @@ -6089,11 +6127,11 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-09-14T14:02:44+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -6157,7 +6195,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0" }, "funding": [ { @@ -6177,21 +6215,24 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", + "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, @@ -6237,7 +6278,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0" }, "funding": [ { @@ -6253,99 +6294,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-11-30T18:21:41+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", "shasum": "" }, "require": { @@ -6399,7 +6361,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" }, "funding": [ { @@ -6415,20 +6377,20 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2021-09-13T13:58:33+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", "shasum": "" }, "require": { @@ -6478,7 +6440,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0" }, "funding": [ { @@ -6494,25 +6456,28 @@ "type": "tidelift" } ], - "time": "2021-05-21T13:25:03+00:00" + "time": "2021-09-13T13:58:11+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.23.0", + "version": "v1.24.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9" + "reference": "7529922412d23ac44413d0f308861d50cf68d3ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9165effa2eb8a31bb3fa608df9d529920d21ddd9", - "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/7529922412d23ac44413d0f308861d50cf68d3ee", + "reference": "7529922412d23ac44413d0f308861d50cf68d3ee", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-uuid": "*" + }, "suggest": { "ext-uuid": "For best performance" }, @@ -6557,7 +6522,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.24.0" }, "funding": [ { @@ -6573,30 +6538,28 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-10-20T20:35:02+00:00" }, { "name": "symfony/property-access", - "version": "v5.3.8", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66" + "reference": "3f237ffd38a54592181ac62f63c6cabbca00051f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66", - "reference": "2fbab5f95ddb6b8e85f38a6a8a04a17c0acc4d66", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3f237ffd38a54592181ac62f63c6cabbca00051f", + "reference": "3f237ffd38a54592181ac62f63c6cabbca00051f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16", - "symfony/property-info": "^5.2" + "php": ">=8.0.2", + "symfony/property-info": "^5.4|^6.0" }, "require-dev": { - "symfony/cache": "^4.4|^5.0" + "symfony/cache": "^5.4|^6.0" }, "suggest": { "psr/cache-implementation": "To cache access methods." @@ -6638,7 +6601,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.3.8" + "source": "https://github.com/symfony/property-access/tree/v6.0.2" }, "funding": [ { @@ -6654,39 +6617,38 @@ "type": "tidelift" } ], - "time": "2021-09-10T11:55:24+00:00" + "time": "2021-12-11T16:36:28+00:00" }, { "name": "symfony/property-info", - "version": "v5.3.8", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "39de5bed8c036f76ec0457ec52908e45d5497947" + "reference": "fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/39de5bed8c036f76ec0457ec52908e45d5497947", - "reference": "39de5bed8c036f76ec0457ec52908e45d5497947", + "url": "https://api.github.com/repos/symfony/property-info/zipball/fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf", + "reference": "fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16", - "symfony/string": "^5.1" + "php": ">=8.0.2", + "symfony/string": "^5.4|^6.0" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.10.4", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/cache": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" }, "suggest": { "phpdocumentor/reflection-docblock": "To use the PHPDoc", @@ -6728,7 +6690,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.3.8" + "source": "https://github.com/symfony/property-info/tree/v6.0.2" }, "funding": [ { @@ -6744,31 +6706,29 @@ "type": "tidelift" } ], - "time": "2021-09-07T07:41:40+00:00" + "time": "2021-12-27T21:05:08+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v5.3.4", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba" + "reference": "9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/76e61f33f6a34a340bf6e02211214f466e8e1dba", - "reference": "76e61f33f6a34a340bf6e02211214f466e8e1dba", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb", + "reference": "9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8", "friendsofphp/proxy-manager-lts": "^1.0.2", - "php": ">=7.2.5", - "symfony/dependency-injection": "^5.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/dependency-injection": "^5.4|^6.0" }, "require-dev": { - "symfony/config": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0" }, "type": "symfony-bridge", "autoload": { @@ -6796,7 +6756,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v5.3.4" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.0.2" }, "funding": [ { @@ -6812,7 +6772,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2021-12-25T20:10:03+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6904,22 +6864,22 @@ }, { "name": "symfony/rate-limiter", - "version": "v5.3.4", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "d00d756e2c9f9c8cc7964c19e619bfe19702559a" + "reference": "a721a4ce81aaeb76d629112c62c38a0c7770b3fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/d00d756e2c9f9c8cc7964c19e619bfe19702559a", - "reference": "d00d756e2c9f9c8cc7964c19e619bfe19702559a", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/a721a4ce81aaeb76d629112c62c38a0c7770b3fb", + "reference": "a721a4ce81aaeb76d629112c62c38a0c7770b3fb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/lock": "^5.2", - "symfony/options-resolver": "^5.1" + "php": ">=8.0.2", + "symfony/lock": "^5.4|^6.0", + "symfony/options-resolver": "^5.4|^6.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0" @@ -6954,7 +6914,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.3.4" + "source": "https://github.com/symfony/rate-limiter/tree/v6.0.2" }, "funding": [ { @@ -6970,41 +6930,39 @@ "type": "tidelift" } ], - "time": "2021-07-15T22:22:12+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/routing", - "version": "v5.3.7", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "be865017746fe869007d94220ad3f5297951811b" + "reference": "362bc14e1187deaef12d1ca0e04bd919580e8e49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/be865017746fe869007d94220ad3f5297951811b", - "reference": "be865017746fe869007d94220ad3f5297951811b", + "url": "https://api.github.com/repos/symfony/routing/zipball/362bc14e1187deaef12d1ca0e04bd919580e8e49", + "reference": "362bc14e1187deaef12d1ca0e04bd919580e8e49", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/config": "For using the all-in-one router or any loader", @@ -7044,7 +7002,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.3.7" + "source": "https://github.com/symfony/routing/tree/v6.0.1" }, "funding": [ { @@ -7060,36 +7018,35 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:42:42+00:00" + "time": "2021-12-08T15:13:44+00:00" }, { "name": "symfony/runtime", - "version": "v5.3.10", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "115eebbe287b35d65bd7b062bf3362e135941a59" + "reference": "7ae279ba1eae28ac3f5d7098bd94f2ead498e458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/115eebbe287b35d65bd7b062bf3362e135941a59", - "reference": "115eebbe287b35d65bd7b062bf3362e135941a59", + "url": "https://api.github.com/repos/symfony/runtime/zipball/7ae279ba1eae28ac3f5d7098bd94f2ead498e458", + "reference": "7ae279ba1eae28ac3f5d7098bd94f2ead498e458", "shasum": "" }, "require": { "composer-plugin-api": "^1.0|^2.0", - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "php": ">=8.0.2" }, "conflict": { - "symfony/dotenv": "<5.1" + "symfony/dotenv": "<5.4" }, "require-dev": { "composer/composer": "^1.0.2|^2.0", - "symfony/console": "^4.4|^5", - "symfony/dotenv": "^5.1", - "symfony/http-foundation": "^4.4|^5", - "symfony/http-kernel": "^4.4|^5" + "symfony/console": "^5.4|^6.0", + "symfony/dotenv": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0" }, "type": "composer-plugin", "extra": { @@ -7121,7 +7078,7 @@ "description": "Enables decoupling PHP applications from global state", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/runtime/tree/v5.3.10" + "source": "https://github.com/symfony/runtime/tree/v6.0.0" }, "funding": [ { @@ -7137,48 +7094,46 @@ "type": "tidelift" } ], - "time": "2021-10-22T08:45:15+00:00" + "time": "2021-11-07T13:29:17+00:00" }, { "name": "symfony/security-core", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "eb0421ce78603ba72e1de6eeeb8dd33e832ea605" + "reference": "5580d791d999ae500367780612c6210f03716b6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/eb0421ce78603ba72e1de6eeeb8dd33e832ea605", - "reference": "eb0421ce78603ba72e1de6eeeb8dd33e832ea605", + "url": "https://api.github.com/repos/symfony/security-core/zipball/5580d791d999ae500367780612c6210f03716b6c", + "reference": "5580d791d999ae500367780612c6210f03716b6c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^1.1|^2", - "symfony/password-hasher": "^5.3", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^1.1|^2|^3", + "symfony/password-hasher": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.6|^2|^3" }, "conflict": { - "symfony/event-dispatcher": "<4.4", - "symfony/http-foundation": "<5.3", - "symfony/ldap": "<4.4", - "symfony/security-guard": "<4.4", - "symfony/validator": "<5.2" + "symfony/event-dispatcher": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/ldap": "<5.4", + "symfony/security-guard": "<5.4", + "symfony/validator": "<5.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "psr/container": "^1.0|^2.0", + "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^5.3", - "symfony/ldap": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.2" + "symfony/cache": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/ldap": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0" }, "suggest": { "psr/container-implementation": "To instantiate the Security class", @@ -7214,7 +7169,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.3.10" + "source": "https://github.com/symfony/security-core/tree/v6.0.2" }, "funding": [ { @@ -7230,56 +7185,55 @@ "type": "tidelift" } ], - "time": "2021-10-25T13:34:14+00:00" + "time": "2021-12-29T10:31:56+00:00" }, { "name": "symfony/serializer", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "5d7f068253ac3e7c62964ebdda491b06d401059a" + "reference": "2282e7512a3264ef964cefce0a4a8037cd1044e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/5d7f068253ac3e7c62964ebdda491b06d401059a", - "reference": "5d7f068253ac3e7c62964ebdda491b06d401059a", + "url": "https://api.github.com/repos/symfony/serializer/zipball/2282e7512a3264ef964cefce0a4a8037cd1044e5", + "reference": "2282e7512a3264ef964cefce0a4a8037cd1044e5", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<4.4", - "symfony/property-access": "<4.4", - "symfony/property-info": "<5.3", - "symfony/yaml": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/uid": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^4.4.9|^5.0.9", - "symfony/property-info": "^5.3", - "symfony/uid": "^5.1", - "symfony/validator": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0", - "symfony/var-exporter": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/form": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0", + "symfony/var-exporter": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "psr/cache-implementation": "For using the metadata cache.", @@ -7316,7 +7270,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.3.10" + "source": "https://github.com/symfony/serializer/tree/v6.0.2" }, "funding": [ { @@ -7332,29 +7286,33 @@ "type": "tidelift" } ], - "time": "2021-09-29T17:19:25+00:00" + "time": "2021-12-25T20:10:03+00:00" }, { "name": "symfony/serializer-pack", - "version": "v1.0.4", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/serializer-pack.git", - "reference": "61173947057d5e1bf1c79e2a6ab6a8430be0602e" + "reference": "d6b1aca1e4f853d0d1ad3da24576e4dd9ab22510" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/61173947057d5e1bf1c79e2a6ab6a8430be0602e", - "reference": "61173947057d5e1bf1c79e2a6ab6a8430be0602e", + "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/d6b1aca1e4f853d0d1ad3da24576e4dd9ab22510", + "reference": "d6b1aca1e4f853d0d1ad3da24576e4dd9ab22510", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", "phpdocumentor/reflection-docblock": "*", + "phpstan/phpdoc-parser": "*", "symfony/property-access": "*", "symfony/property-info": "*", "symfony/serializer": "*" }, + "conflict": { + "symfony/property-info": "<5.4" + }, "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7363,7 +7321,7 @@ "description": "A pack for the Symfony serializer", "support": { "issues": "https://github.com/symfony/serializer-pack/issues", - "source": "https://github.com/symfony/serializer-pack/tree/v1.0.4" + "source": "https://github.com/symfony/serializer-pack/tree/v1.1.0" }, "funding": [ { @@ -7379,25 +7337,28 @@ "type": "tidelift" } ], - "time": "2020-10-19T08:52:16+00:00" + "time": "2021-11-30T16:37:42+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/36715ebf9fb9db73db0cb24263c79077c6fe8603", + "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -7405,7 +7366,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -7442,7 +7403,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.0.0" }, "funding": [ { @@ -7458,25 +7419,25 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2021-11-04T17:53:12+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.3.4", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" + "reference": "0e0ed55d1ffdfadd03af180443fbdca9876483b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e0ed55d1ffdfadd03af180443fbdca9876483b3", + "reference": "0e0ed55d1ffdfadd03af180443fbdca9876483b3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" + "php": ">=8.0.2", + "symfony/service-contracts": "^1|^2|^3" }, "type": "library", "autoload": { @@ -7504,7 +7465,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" + "source": "https://github.com/symfony/stopwatch/tree/v6.0.0" }, "funding": [ { @@ -7520,35 +7481,37 @@ "type": "tidelift" } ], - "time": "2021-07-10T08:58:57+00:00" + "time": "2021-11-23T19:05:29+00:00" }, { "name": "symfony/string", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + "reference": "bae261d0c3ac38a1f802b4dfed42094296100631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "url": "https://api.github.com/repos/symfony/string/zipball/bae261d0c3ac38a1f802b4dfed42094296100631", + "reference": "bae261d0c3ac38a1f802b4dfed42094296100631", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -7587,7 +7550,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.10" + "source": "https://github.com/symfony/string/tree/v6.0.2" }, "funding": [ { @@ -7603,24 +7566,24 @@ "type": "tidelift" } ], - "time": "2021-10-27T18:21:46+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", - "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.0.2" }, "suggest": { "symfony/translation-implementation": "" @@ -7628,7 +7591,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -7665,7 +7628,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0" }, "funding": [ { @@ -7681,61 +7644,58 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-09-07T12:43:40+00:00" }, { "name": "symfony/validator", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5" + "reference": "550557c0074d9abf70133c9df20f479e55961553" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5", - "reference": "a85f3ba9e1c883253fc00a2e3d111e6e82a0baf5", + "url": "https://api.github.com/repos/symfony/validator/zipball/550557c0074d9abf70133c9df20f479e55961553", + "reference": "550557c0074d9abf70133c9df20f479e55961553", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1|^2" + "symfony/translation-contracts": "^1.1|^2|^3" }, "conflict": { - "doctrine/lexer": "<1.0.2", + "doctrine/annotations": "<1.13", + "doctrine/lexer": "<1.1", "phpunit/phpunit": "<5.4.3", - "symfony/dependency-injection": "<4.4", - "symfony/expression-language": "<5.1", - "symfony/http-kernel": "<4.4", - "symfony/intl": "<4.4", - "symfony/property-info": "<5.3", - "symfony/translation": "<4.4", - "symfony/yaml": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/expression-language": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/intl": "<5.4", + "symfony/property-info": "<5.4", + "symfony/translation": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "^1.0|^2.0", + "doctrine/annotations": "^1.13", "egulias/email-validator": "^2.1.10|^3", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^5.1", - "symfony/finder": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/intl": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/property-info": "^5.3", - "symfony/translation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "egulias/email-validator": "Strict (RFC compliant) email validation", @@ -7775,7 +7735,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v5.3.10" + "source": "https://github.com/symfony/validator/tree/v6.0.2" }, "funding": [ { @@ -7791,35 +7751,35 @@ "type": "tidelift" } ], - "time": "2021-10-28T19:22:18+00:00" + "time": "2021-12-21T13:16:58+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "875432adb5f5570fff21036fd22aee244636b7d1" + "reference": "41e46f64084a205459a862751158ce2190bd5cb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/875432adb5f5570fff21036fd22aee244636b7d1", - "reference": "875432adb5f5570fff21036fd22aee244636b7d1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41e46f64084a205459a862751158ce2190bd5cb5", + "reference": "41e46f64084a205459a862751158ce2190bd5cb5", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -7863,7 +7823,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.0.2" }, "funding": [ { @@ -7879,28 +7839,27 @@ "type": "tidelift" } ], - "time": "2021-10-26T09:30:15+00:00" + "time": "2021-12-29T10:14:09+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.3.8", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "a7604de14bcf472fe8e33f758e9e5b7bf07d3b91" + "reference": "32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/a7604de14bcf472fe8e33f758e9e5b7bf07d3b91", - "reference": "a7604de14bcf472fe8e33f758e9e5b7bf07d3b91", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af", + "reference": "32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9" + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -7936,7 +7895,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.3.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.0.0" }, "funding": [ { @@ -7952,32 +7911,31 @@ "type": "tidelift" } ], - "time": "2021-08-31T12:49:16+00:00" + "time": "2021-11-22T10:44:58+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.6", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" + "reference": "ed602f38b8636a2ea21af760d2578f3d2f92fc60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ed602f38b8636a2ea21af760d2578f3d2f92fc60", + "reference": "ed602f38b8636a2ea21af760d2578f3d2f92fc60", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.0.2", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.4|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -8011,7 +7969,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.6" + "source": "https://github.com/symfony/yaml/tree/v6.0.2" }, "funding": [ { @@ -8027,7 +7985,7 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "webmozart/assert", @@ -8255,12 +8213,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "3780dea9bb7ff2da83a08d662e1accb6f5f86976" + "reference": "edf8130e5a476c92217f43ec8580d712b5a9df56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/3780dea9bb7ff2da83a08d662e1accb6f5f86976", - "reference": "3780dea9bb7ff2da83a08d662e1accb6f5f86976", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/edf8130e5a476c92217f43ec8580d712b5a9df56", + "reference": "edf8130e5a476c92217f43ec8580d712b5a9df56", "shasum": "" }, "conflict": { @@ -8273,13 +8231,13 @@ "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "area17/twill": "<=2.5.2", + "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<=4.5", + "baserproject/basercms": "<4.5.4", "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", @@ -8297,9 +8255,11 @@ "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", + "codeigniter4/framework": "<4.1.6", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.23|>=2-alpha.1,<2.1.9", "concrete5/concrete5": "<8.5.5", + "concrete5/core": "<8.5.7", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", @@ -8313,7 +8273,7 @@ "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.0.99|>=3.1,<3.1.4", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", @@ -8325,6 +8285,7 @@ "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", + "elgg/elgg": "<3.3.23|>=4,<4.0.5", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", @@ -8334,17 +8295,18 @@ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<=1.5.25", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<2.4.2|>=2.5,<2.5.2", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=0.1.3", "firebase/php-jwt": "<2", @@ -8355,7 +8317,7 @@ "fooman/tcpdf": "<6.2.22", "forkcms/forkcms": "<=5.9.2", "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<6.5.1", + "francoisjacquet/rosariosis": "<8.1.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", @@ -8363,14 +8325,14 @@ "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", "getgrav/grav": "<=1.7.24", - "getkirby/cms": "<=3.5.6", + "getkirby/cms": "<3.5.8", "getkirby/panel": "<2.5.14", "gilacms/gila": "<=1.11.4", "globalpayments/php-sdk": "<2", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.6.3", + "grumpydictator/firefly-iii": "<5.6.5", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "helloxz/imgurl": "<=2.31", "hjue/justwriting": "<=1", @@ -8379,31 +8341,33 @@ "icecoder/icecoder": "<=8", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<8.40", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "impresscms/impresscms": "<=1.4.2", "in2code/femanager": "<5.5.1|>=6,<6.3.1", "intelliants/subrion": "<=4.2.1", "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", "james-heinrich/getid3": "<1.9.21", "joomla/archive": "<1.1.10", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kevinpapst/kimai2": "<1.16.7", "kitodo/presentation": "<3.1.2", "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", "laminas/laminas-http": "<2.14.2", - "laravel/framework": "<6.20.26|>=7,<8.40", + "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "lavalite/cms": "<=5.8", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<=21.10.2", + "librenms/librenms": "<=21.11", "limesurvey/limesurvey": "<3.27.19", "livewire/livewire": ">2.2.4,<2.2.6", "lms/routes": "<2.1.1", @@ -8444,7 +8408,7 @@ "openid/php-openid": "<2.3", "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", - "oro/crm": ">=1.7,<1.7.4", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", @@ -8463,15 +8427,17 @@ "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", + "phpservermon/phpservermon": "<=3.5.2", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.1.3", - "pocketmine/pocketmine-mp": "<3.15.4", + "pimcore/pimcore": "<10.2.6", + "pocketmine/pocketmine-mp": "<4.0.3", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": ">=1.7.5,<=1.7.8.1", "prestashop/productcomments": ">=4,<4.2.1", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", @@ -8479,10 +8445,11 @@ "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6|>=1,<1.6.3", + "pterodactyl/panel": "<1.6.6", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "remdex/livehelperchat": "<=3.90", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -8490,12 +8457,12 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.3", - "shopware/platform": "<=6.4.3", + "shopware/core": "<=6.4.6", + "shopware/platform": "<=6.4.6", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<5.7.6", - "showdoc/showdoc": "<=2.9.12", - "silverstripe/admin": "<4.8.1", + "showdoc/showdoc": "<=2.9.13", + "silverstripe/admin": ">=1,<1.8.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", @@ -8514,16 +8481,16 @@ "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.39", - "snipe/snipe-it": "<=5.3.1", + "snipe/snipe-it": "<5.3.5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<21.0.3", + "ssddanbrown/bookstack": "<21.11.3", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", "subrion/cms": "<=4.2.1", - "sulu/sulu": "<1.6.43|>=2,<2.0.10|>=2.1,<2.1.1", + "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", @@ -8541,7 +8508,7 @@ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", @@ -8551,13 +8518,13 @@ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -8571,6 +8538,7 @@ "theonedemon/phpwhois": "<=4.2.5", "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", + "topthink/framework": "<6.0.9", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", "tribalsystems/zenario": "<8.8.53370", @@ -8597,6 +8565,7 @@ "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "wp-cli/wp-cli": "<2.5", + "yetiforce/yetiforce-crm": "<=6.3", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", @@ -8670,31 +8639,31 @@ "type": "tidelift" } ], - "time": "2021-11-16T00:48:52+00:00" + "time": "2022-01-05T10:16:58+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.3.10", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "325aaf6302501ed3673cffbd3ba88db5949de8ae" + "reference": "59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/325aaf6302501ed3673cffbd3ba88db5949de8ae", - "reference": "325aaf6302501ed3673cffbd3ba88db5949de8ae", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c", + "reference": "59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c", "shasum": "" }, "require": { "php": ">=7.1.3", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0" + "symfony/error-handler": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -8737,7 +8706,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.10" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.0" }, "funding": [ { @@ -8753,7 +8722,7 @@ "type": "tidelift" } ], - "time": "2021-10-28T19:22:18+00:00" + "time": "2021-11-29T15:30:56+00:00" } ], "aliases": [], @@ -8773,5 +8742,5 @@ "ext-json": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.2.0" } diff --git a/etc/packages/doctrine_migrations.yaml b/etc/packages/doctrine_migrations.yaml index 19b53d5..c2fde9d 100644 --- a/etc/packages/doctrine_migrations.yaml +++ b/etc/packages/doctrine_migrations.yaml @@ -1,3 +1,4 @@ doctrine_migrations: migrations_paths: App\Migrations: '%kernel.project_dir%/src/Migrations' + enable_profiler: '%kernel.debug%' diff --git a/etc/packages/framework.yaml b/etc/packages/framework.yaml index 6089f4b..9ed2ebc 100644 --- a/etc/packages/framework.yaml +++ b/etc/packages/framework.yaml @@ -1,7 +1,8 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html framework: secret: '%env(APP_SECRET)%' #csrf_protection: true - #http_method_override: true + http_method_override: true # Enables session support. Note that the session will ONLY be started if you read or write from it. # Remove or comment this section to explicitly disable session support. @@ -9,8 +10,15 @@ framework: handler_id: null cookie_secure: auto cookie_samesite: lax + storage_factory_id: session.storage.factory.native #esi: true #fragments: true php_errors: log: true + +when@test: + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/etc/packages/routing.yaml b/etc/packages/routing.yaml index 7e97762..60a7991 100644 --- a/etc/packages/routing.yaml +++ b/etc/packages/routing.yaml @@ -1,3 +1,8 @@ framework: router: utf8: true + +when@prod: + framework: + router: + strict_requirements: null diff --git a/etc/packages/test/doctrine.yaml b/etc/packages/test/doctrine.yaml new file mode 100644 index 0000000..34c2ebc --- /dev/null +++ b/etc/packages/test/doctrine.yaml @@ -0,0 +1,4 @@ +doctrine: + dbal: + # "TEST_TOKEN" is typically set by ParaTest + dbname_suffix: '_test%env(default::TEST_TOKEN)%' diff --git a/etc/routes.yaml b/etc/routes.yaml index a9bbdc3..1c43a26 100644 --- a/etc/routes.yaml +++ b/etc/routes.yaml @@ -1,3 +1,7 @@ controllers: resource: ../src/Controller/ type: annotation + +kernel: + resource: ../src/Kernel.php + type: annotation diff --git a/etc/routes/annotations.yaml b/etc/routes/annotations.yaml new file mode 100644 index 0000000..e92efc5 --- /dev/null +++ b/etc/routes/annotations.yaml @@ -0,0 +1,7 @@ +controllers: + resource: ../../src/Controller/ + type: annotation + +kernel: + resource: ../../src/Kernel.php + type: annotation diff --git a/etc/routes/framework.yaml b/etc/routes/framework.yaml new file mode 100644 index 0000000..0fc74bb --- /dev/null +++ b/etc/routes/framework.yaml @@ -0,0 +1,4 @@ +when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error diff --git a/etc/services.yaml b/etc/services.yaml index 5ec7c01..2955f68 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -14,7 +14,7 @@ services: # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App\: - resource: '../src/*' + resource: '../src/' exclude: '../src/{DependencyInjection,Entity,ViewModel,Enum,Migrations,Tests,Kernel.php}' bind: $env: '%kernel.environment%' diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 8317374..c439d12 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,12 +1,15 @@ - + + @@ -22,7 +25,7 @@ - ./src + src diff --git a/public/.htaccess b/public/.htaccess index f98dab9..02aea7f 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -3,13 +3,13 @@ # mod_rewrite). Additionally, this reduces the matching process for the # start page (path "/") because otherwise Apache will apply the rewriting rules # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). -#DirectoryIndex index.php +DirectoryIndex index.php # By default, Apache does not evaluate symbolic links if you did not enable this # feature in your server configuration. Uncomment the following line if you # install assets as symlinks or if you experience problems related to symlinks # when compiling LESS/Sass/CoffeScript assets. -# Options FollowSymlinks +# Options +FollowSymlinks # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve # to the front controller "/index.php" but be rewritten to "/index.php/index". diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index d1118dc..2ef9616 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -34,12 +34,11 @@ public function record( TleRequest $request, NormalizerInterface $normalizer, ): JsonResponse { - $data = [ - '@context' => self::HYDRA_CONTEXT, - ]; - return $this->response( - array_merge($data, $normalizer->normalize($this->getTle($request->getId()), null, [TleRequest::EXTRA_PARAM => $request->getExtra()])), + [ + '@context' => self::HYDRA_CONTEXT, + ...$normalizer->normalize($this->getTle($request->getId()), null, [TleRequest::EXTRA_PARAM => $request->getExtra()]), + ] ); } diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php index aa60b95..a4e15d2 100644 --- a/src/Event/ApiLimiterSubscriber.php +++ b/src/Event/ApiLimiterSubscriber.php @@ -37,7 +37,11 @@ public static function getSubscribedEvents(): array public function onRequest(RequestEvent $event): void { - $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); + $refererHost = null; + + if ($event->getRequest()->headers->has('referer')) { + $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); + } if (!FeatureFlag::API_RATE_LIMITER || $refererHost === Route::PRODUCTION_HOST || !Route::inArray($event->getRequest(), self::ROUTES)) { return; diff --git a/src/Kernel.php b/src/Kernel.php index 35824d9..e0b31e6 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -3,62 +3,14 @@ namespace App; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; -use Symfony\Component\Config\Loader\LoaderInterface; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel as BaseKernel; -use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; class Kernel extends BaseKernel { use MicroKernelTrait; - private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; - - public function registerBundles(): iterable - { - $contents = require $this->getConfigDir() . '/bundles.php'; - foreach ($contents as $class => $envs) { - if ($envs[$this->environment] ?? $envs['all'] ?? false) { - yield new $class(); - } - } - } - - public function getProjectDir(): string - { - return \dirname(__DIR__); - } - - public function getConfigDir(): string - { - return $this->getProjectDir() . '/etc'; - } - - /** - * @throws \Exception - */ - protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void - { - $confDir = $this->getConfigDir(); - - $container->addResource(new FileResource($confDir . '/bundles.php')); - $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400); - $container->setParameter('container.dumper.inline_factories', true); - - $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); - $loader->load($confDir . '/{packages}/' . $this->environment . '/*' . self::CONFIG_EXTS, 'glob'); - $loader->load($confDir . '/{parameters}' . self::CONFIG_EXTS, 'glob'); - $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob'); - $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); - } - - protected function configureRoutes(RoutingConfigurator $routes): void + private function getConfigDir(): string { - $confDir = $this->getConfigDir(); - - $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); - $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); - $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS); + return $this->getProjectDir().'/etc'; } } diff --git a/src/Normalizer/ObserverNormalizer.php b/src/Normalizer/ObserverNormalizer.php index 879e3f9..cef72bb 100644 --- a/src/Normalizer/ObserverNormalizer.php +++ b/src/Normalizer/ObserverNormalizer.php @@ -22,12 +22,10 @@ public function __construct(protected ObjectNormalizer $normalizer) */ public function normalize($object, string $format = null, array $context = []): array { - return array_merge( - [ - '@type' => 'Observer', - ], - $this->normalizer->normalize($object) - ); + return [ + '@type' => 'Observer', + ...$this->normalizer->normalize($object), + ]; } public function supportsNormalization($data, string $format = null): bool diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 7dfef00..b283c8d 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -24,7 +24,7 @@ public function __construct(ManagerRegistry $registry) /** * @return Tle[]|Collection */ - public function fetchAllIndexed(): array|Collection + public function fetchAllIndexed(): array|Collection { return $this->createQueryBuilder('tle', 'tle.id') ->getQuery() diff --git a/symfony.lock b/symfony.lock index fde5b33..ef29ac2 100644 --- a/symfony.lock +++ b/symfony.lock @@ -5,13 +5,16 @@ "clue/stream-filter": { "version": "v1.5.0" }, + "composer/package-versions-deprecated": { + "version": "1.11.99.4" + }, "doctrine/annotations": { - "version": "1.0", + "version": "1.13", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", "version": "1.0", - "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" + "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" }, "files": [ "config/routes/annotations.yaml" @@ -36,43 +39,44 @@ "version": "v0.5.3" }, "doctrine/doctrine-bundle": { - "version": "2.0", + "version": "2.5", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "2.0", - "ref": "a9f2463b9f73efe74482f831f03a204a41328555" + "version": "2.4", + "ref": "f98f1affe028f8153a459d15f220ada3826b5aa2" }, "files": [ "config/packages/doctrine.yaml", "config/packages/prod/doctrine.yaml", + "config/packages/test/doctrine.yaml", "src/Entity/.gitignore", "src/Repository/.gitignore" ] }, "doctrine/doctrine-fixtures-bundle": { - "version": "3.0", + "version": "3.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", "version": "3.0", - "ref": "fc52d86631a6dfd9fdf3381d0b7e3df2069e51b3" + "ref": "1f5514cfa15b947298df4d771e694e578d4c204d" }, "files": [ "src/DataFixtures/AppFixtures.php" ] }, "doctrine/doctrine-migrations-bundle": { - "version": "1.2", + "version": "3.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "1.2", - "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + "version": "3.1", + "ref": "ee609429c9ee23e22d6fa5728211768f51ed2818" }, "files": [ "config/packages/doctrine_migrations.yaml", - "src/Migrations/.gitignore" + "migrations/.gitignore" ] }, "doctrine/event-manager": { @@ -99,6 +103,9 @@ "doctrine/sql-formatter": { "version": "1.1.1" }, + "friendsofphp/proxy-manager-lts": { + "version": "v1.0.5" + }, "guzzlehttp/guzzle": { "version": "6.5.2" }, @@ -174,6 +181,9 @@ "phpdocumentor/type-resolver": { "version": "1.5.1" }, + "phpstan/phpdoc-parser": { + "version": "1.2.0" + }, "psr/cache": { "version": "1.0.1" }, @@ -225,10 +235,10 @@ "repo": "github.com/symfony/recipes-contrib", "branch": "master", "version": "1.0", - "ref": "410b9325a37ef86f1e47262c61738f6202202bca" + "ref": "9d254a22efca7264203eea98b866f16f944b2f09" }, "files": [ - ".htaccess" + "public/.htaccess" ] }, "symfony/asset": { @@ -247,16 +257,15 @@ "version": "v5.0.1" }, "symfony/console": { - "version": "4.4", + "version": "6.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "4.4", - "ref": "fead3ab2e80622c61d13dac0d21a3430a45efae8" + "version": "5.3", + "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047" }, "files": [ - "bin/console", - "config/bootstrap.php" + "bin/console" ] }, "symfony/css-selector": { @@ -293,31 +302,30 @@ "version": "v5.0.1" }, "symfony/flex": { - "version": "1.0", + "version": "1.17", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", "version": "1.0", - "ref": "19fa03bacd9a6619583d1e4939da4388df22984d" + "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e" }, "files": [ ".env" ] }, "symfony/framework-bundle": { - "version": "4.4", + "version": "6.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "4.4", - "ref": "23ecaccc551fe2f74baf613811ae529eb07762fa" + "version": "5.4", + "ref": "d4131812e20853626928e73d3effef44014944c0" }, "files": [ - "config/bootstrap.php", "config/packages/cache.yaml", "config/packages/framework.yaml", - "config/packages/test/framework.yaml", - "config/routes/dev/framework.yaml", + "config/preload.php", + "config/routes/framework.yaml", "config/services.yaml", "public/index.php", "src/Controller/.gitignore", @@ -337,12 +345,12 @@ "version": "v5.0.1" }, "symfony/lock": { - "version": "5.2", + "version": "6.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", "version": "5.2", - "ref": "13350583a83fa636bf45a5fb62da3bdc73be52a1" + "ref": "a1c8800e40ae735206bb14586fdd6c4630a51b8d" }, "files": [ "config/packages/lock.yaml" @@ -357,7 +365,7 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "3.7", - "ref": "f4adb4379ee437f91ecb1bd5a41c1de6286b9a04" + "ref": "a7bace7dbc5a7ed5608dbe2165e0774c87175fe6" }, "files": [ "config/packages/dev/monolog.yaml", @@ -376,19 +384,18 @@ "version": "v5.3.0" }, "symfony/phpunit-bridge": { - "version": "4.3", + "version": "5.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "4.3", - "ref": "170be6250b77b421f02e986e2853df86c7bd6516" + "version": "5.3", + "ref": "97cb3dc7b0f39c7cfc4b7553504c9d7b7795de96" }, "files": [ ".env.test", "bin/phpunit", - "config/bootstrap.php", "phpunit.xml.dist", - "tests/.gitignore" + "tests/bootstrap.php" ] }, "symfony/polyfill-intl-grapheme": { @@ -403,9 +410,6 @@ "symfony/polyfill-mbstring": { "version": "v1.13.1" }, - "symfony/polyfill-php73": { - "version": "v1.13.1" - }, "symfony/polyfill-php80": { "version": "v1.20.0" }, @@ -431,15 +435,14 @@ "version": "v5.3.0" }, "symfony/routing": { - "version": "4.2", + "version": "6.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "4.2", - "ref": "683dcb08707ba8d41b7e34adb0344bfd68d248a7" + "version": "6.0", + "ref": "ab9ad892b7bba7ac584f6dc2ccdb659d358c63c5" }, "files": [ - "config/packages/prod/routing.yaml", "config/packages/routing.yaml", "config/routes.yaml" ] diff --git a/tests/TleTest.php b/tests/TleTest.php index 0630b22..948843b 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -60,7 +60,7 @@ public function testTleCollectionRecord(): void self::assertEquals('http://localhost/api/tle/', $response['@id']); self::assertArrayHasKey('@type', $response); - self::assertEquals('Collection', $response['@type']); + self::assertEquals('Tle[]', $response['@type']); self::assertArrayHasKey('totalItems', $response); self::assertEquals(11, $response['totalItems']); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 452a4fb..46b4452 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,7 +1,7 @@ bootEnv(dirname(__DIR__).'/.env'); +//} + // Load cached env vars if the .env.local.php file exists // Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') @@ -28,18 +34,18 @@ $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel $kernel->boot(); - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); +// $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); +// (new Application($kernel))->add($command); + +// $command->run( +// new ArrayInput( +// [ +// 'command' => 'doctrine:reload', +// '--no-interaction' => true, +// ] +// ), +// new ConsoleOutput() +// ); } $_SERVER += $_ENV; From 918bf0b0ce282757e32194adc9a0c695d8f38105 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 7 Jan 2022 17:29:56 +0100 Subject: [PATCH 187/221] use sub bundle --- etc/preload.php | 5 +++++ migrations/.gitignore | 0 2 files changed, 5 insertions(+) create mode 100644 etc/preload.php create mode 100644 migrations/.gitignore diff --git a/etc/preload.php b/etc/preload.php new file mode 100644 index 0000000..5ebcdb2 --- /dev/null +++ b/etc/preload.php @@ -0,0 +1,5 @@ + Date: Sun, 9 Jan 2022 17:22:42 +0100 Subject: [PATCH 188/221] use sub bundle --- src/Entity/TleInformation.php | 3 --- src/Normalizer/TleModelNormalizer.php | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 4e5455e..c8c84e8 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -29,9 +29,6 @@ class TleInformation #[ORM\Column(name: '`period`', type: 'float', precision: 24, scale: 10, nullable: true)] public ?float $period; - /** - * Period for complete orbit in seconds - */ #[ORM\Column(type: 'boolean', options: ['default' => 0])] public bool $geostationary = false; diff --git a/src/Normalizer/TleModelNormalizer.php b/src/Normalizer/TleModelNormalizer.php index 103b574..bb533eb 100644 --- a/src/Normalizer/TleModelNormalizer.php +++ b/src/Normalizer/TleModelNormalizer.php @@ -32,7 +32,7 @@ public function normalize($object, ?string $format = null, array $context = []): $normalized = [ '@id' => $id, - '@type' => 'TleModel', + '@type' => 'Tle', 'satelliteId' => $model->getId(), 'name' => $model->getName(), 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), @@ -41,17 +41,17 @@ public function normalize($object, ?string $format = null, array $context = []): ]; if ($isExtra && $object->getInfo()) { - $extra = [ - 'extra' => [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, - TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, - TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, - TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, - ], + $normalized['extra'] = [ + TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, ]; - $normalized = array_merge($normalized, $extra); + $normalized['orbit'] = [ + 'geostationary' => $object->getInfo()->geostationary, + ]; } return $normalized; From 42baa298a158a526ca432bd15c7f6d205b9a94dd Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 9 Jan 2022 17:51:40 +0100 Subject: [PATCH 189/221] use sub bundle --- composer.lock | 76 ++++++------ etc/packages/support.yaml | 8 +- etc/services.yaml | 3 +- src/Controller/DocsController.php | 7 +- src/Normalizer/ObserverNormalizer.php | 68 +++++------ src/Normalizer/SatellitePassNormalizer.php | 132 ++++++++++----------- src/Normalizer/TleModelNormalizer.php | 128 ++++++++++---------- src/Request/TleRequest.php | 58 ++++----- src/Request/TleRequestTrait.php | 64 +++++----- tests/AssertionTrait.php | 2 +- tests/TleTest.php | 2 +- tests/bootstrap.php | 111 ++++++++--------- 12 files changed, 337 insertions(+), 322 deletions(-) diff --git a/composer.lock b/composer.lock index 8dcedd3..d4d47f1 100644 --- a/composer.lock +++ b/composer.lock @@ -534,16 +534,16 @@ }, { "name": "doctrine/dbal", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "5d54f63541d7bed1156cb5c9b79274ced61890e4" + "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5d54f63541d7bed1156cb5c9b79274ced61890e4", - "reference": "5d54f63541d7bed1156cb5c9b79274ced61890e4", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/4caf37acf14b513a91dd4f087f7eda424fa25542", + "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542", "shasum": "" }, "require": { @@ -558,14 +558,14 @@ "require-dev": { "doctrine/coding-standard": "9.0.0", "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.2.0", + "phpstan/phpstan": "1.3.0", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "9.5.10", + "phpunit/phpunit": "9.5.11", "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.1", + "squizlabs/php_codesniffer": "3.6.2", "symfony/cache": "^5.2|^6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", - "vimeo/psalm": "4.13.0" + "vimeo/psalm": "4.16.1" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -625,7 +625,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.2.0" + "source": "https://github.com/doctrine/dbal/tree/3.2.1" }, "funding": [ { @@ -641,7 +641,7 @@ "type": "tidelift" } ], - "time": "2021-11-26T21:00:12+00:00" + "time": "2022-01-05T08:52:06+00:00" }, { "name": "doctrine/deprecations", @@ -688,16 +688,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.5.4", + "version": "2.5.5", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "f6191c50600bad1c0195638413f53aee6158b909" + "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f6191c50600bad1c0195638413f53aee6158b909", - "reference": "f6191c50600bad1c0195638413f53aee6158b909", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5c086cbbe5327937dd6f90da075f7d421b0f28bc", + "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc", "shasum": "" }, "require": { @@ -710,7 +710,7 @@ "symfony/cache": "^4.3.3|^5.0|^6.0", "symfony/config": "^4.4.3|^5.0|^6.0", "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", - "symfony/dependency-injection": "^4.3.3|^5.0|^6.0", + "symfony/dependency-injection": "^4.4.18|^5.0|^6.0", "symfony/deprecation-contracts": "^2.1|^3", "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", @@ -781,7 +781,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.5.4" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.5.5" }, "funding": [ { @@ -797,7 +797,7 @@ "type": "tidelift" } ], - "time": "2021-12-30T18:43:28+00:00" + "time": "2022-01-06T08:56:31+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1973,12 +1973,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/symfony-support.git", - "reference": "bc5dbffd1c82cdf1eae436a527779dc4e8c96376" + "reference": "ed65c006a88b09e43eaa5fdc286432cccf6a0695" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/bc5dbffd1c82cdf1eae436a527779dc4e8c96376", - "reference": "bc5dbffd1c82cdf1eae436a527779dc4e8c96376", + "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/ed65c006a88b09e43eaa5fdc286432cccf6a0695", + "reference": "ed65c006a88b09e43eaa5fdc286432cccf6a0695", "shasum": "" }, "require": { @@ -2015,7 +2015,7 @@ "issues": "https://github.com/ivanstan/symfony-support/issues", "source": "https://github.com/ivanstan/symfony-support/tree/master" }, - "time": "2022-01-05T14:45:52+00:00" + "time": "2022-01-09T16:22:41+00:00" }, { "name": "ivanstan/tle-php", @@ -8213,12 +8213,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "edf8130e5a476c92217f43ec8580d712b5a9df56" + "reference": "11696ae4d8970456cbd1919c17e6bb2ddb63553a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/edf8130e5a476c92217f43ec8580d712b5a9df56", - "reference": "edf8130e5a476c92217f43ec8580d712b5a9df56", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11696ae4d8970456cbd1919c17e6bb2ddb63553a", + "reference": "11696ae4d8970456cbd1919c17e6bb2ddb63553a", "shasum": "" }, "conflict": { @@ -8230,6 +8230,7 @@ "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", @@ -8242,6 +8243,7 @@ "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", + "bottelet/flarepoint": "<2.2.1", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<7.2.1", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", @@ -8285,7 +8287,7 @@ "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", - "elgg/elgg": "<3.3.23|>=4,<4.0.5", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", @@ -8324,6 +8326,7 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", + "gaoming13/wechat-php-sdk": "<=1.10.2", "getgrav/grav": "<=1.7.24", "getkirby/cms": "<3.5.8", "getkirby/panel": "<2.5.14", @@ -8335,6 +8338,7 @@ "grumpydictator/firefly-iii": "<5.6.5", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "helloxz/imgurl": "<=2.31", + "hillelcoren/invoice-ninja": "<5.3.35", "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", "ibexa/post-install": "<=1.0.4", @@ -8362,6 +8366,7 @@ "laminas/laminas-http": "<2.14.2", "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", "lavalite/cms": "<=5.8", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", @@ -8384,13 +8389,14 @@ "mittwald/typo3_forum": "<1.2.1", "modx/revolution": "<2.8", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2", + "moodle/moodle": "<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2", "namshi/jose": "<2.2", "neoan3-apps/template": "<1.1.1", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<=2.1.27.36", @@ -8409,7 +8415,7 @@ "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", - "oro/platform": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.21|>=4.1,<4.1.14|>=4.2,<4.2.8", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", "pagekit/pagekit": "<=1.0.18", @@ -8431,8 +8437,8 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.2.6", - "pocketmine/pocketmine-mp": "<4.0.3", + "pimcore/pimcore": "<10.2.7", + "pocketmine/pocketmine-mp": "<4.0.5", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", @@ -8449,7 +8455,7 @@ "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", - "remdex/livehelperchat": "<=3.90", + "remdex/livehelperchat": "<3.91", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -8460,8 +8466,8 @@ "shopware/core": "<=6.4.6", "shopware/platform": "<=6.4.6", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<5.7.6", - "showdoc/showdoc": "<=2.9.13", + "shopware/shopware": "<5.7.7", + "showdoc/showdoc": "<2.10", "silverstripe/admin": ">=1,<1.8.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", @@ -8486,7 +8492,7 @@ "socialiteproviders/steam": "<1.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<21.11.3", + "ssddanbrown/bookstack": "<21.12.1", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", "subrion/cms": "<=4.2.1", @@ -8554,6 +8560,8 @@ "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", + "unisharp/laravel-filemanager": "<=2.3", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", @@ -8639,7 +8647,7 @@ "type": "tidelift" } ], - "time": "2022-01-05T10:16:58+00:00" + "time": "2022-01-08T00:53:14+00:00" }, { "name": "symfony/phpunit-bridge", diff --git a/etc/packages/support.yaml b/etc/packages/support.yaml index 54b238f..a6bca74 100644 --- a/etc/packages/support.yaml +++ b/etc/packages/support.yaml @@ -1,4 +1,4 @@ -symfony_support: - exception_subscriber: - paths: - - / +symfony_support: + exception_subscriber: + paths: + - / diff --git a/etc/services.yaml b/etc/services.yaml index 2955f68..38aa0fc 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -3,7 +3,8 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: +imports: + - { resource: parameters.yaml } services: # default configuration for services in *this* file diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index c305cd9..f3c2a23 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -25,7 +25,12 @@ public function docs(): Response #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - $docs = json_decode(file_get_contents($this->getProjectDir() . '/etc/custom/tle.json'), true, flags: JSON_THROW_ON_ERROR); + $docs = json_decode( + file_get_contents($this->getProjectDir().'/etc/custom/tle.json'), + true, + JSON_THROW_ON_ERROR, + JSON_THROW_ON_ERROR + ); $docs['info']['version'] = $this->getParameter('version'); diff --git a/src/Normalizer/ObserverNormalizer.php b/src/Normalizer/ObserverNormalizer.php index cef72bb..0d2f424 100644 --- a/src/Normalizer/ObserverNormalizer.php +++ b/src/Normalizer/ObserverNormalizer.php @@ -1,35 +1,35 @@ - 'Observer', - ...$this->normalizer->normalize($object), - ]; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Observer; - } -} + { + return [ + '@type' => 'Observer', + ...$this->normalizer->normalize($object), + ]; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Normalizer/SatellitePassNormalizer.php b/src/Normalizer/SatellitePassNormalizer.php index 1291b0b..0df752e 100644 --- a/src/Normalizer/SatellitePassNormalizer.php +++ b/src/Normalizer/SatellitePassNormalizer.php @@ -1,67 +1,67 @@ - $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', - 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_aos_az ?? null, 2), - 'elevation' => round($object->visible_aos_el ?? null, 2), - ], - 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_max_el_az ?? null, 2), - 'elevation' => round($object->visible_max_el ?? null, 2), - ], - 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - \DateTimeInterface::ATOM - ), - 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), - 'elevation' => round($object->visible_los_el ?? null, 2), - ], - ]; - - if ($details) { - foreach ($object->details as $item) { - $result['details'][] = [ - 'azimuth' => $item->az, - 'elevation' => $item->el - ]; - } - } - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof \Predict_Pass; - } -} + { + $timezone = $context['timezone'] ?? 'UTC'; + $details = $context['details'] ?? false; + + $result = [ + '@type' => $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( + \DateTimeInterface::ATOM + ), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), + ], + ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/Normalizer/TleModelNormalizer.php b/src/Normalizer/TleModelNormalizer.php index bb533eb..16e03d7 100644 --- a/src/Normalizer/TleModelNormalizer.php +++ b/src/Normalizer/TleModelNormalizer.php @@ -1,64 +1,64 @@ -router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); - - $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); - - $isExtra = ($context[TleRequest::EXTRA_PARAM] ?? null) === true; - - $normalized = [ - '@id' => $id, - '@type' => 'Tle', - 'satelliteId' => $model->getId(), - 'name' => $model->getName(), - 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), - 'line1' => $model->getLine1(), - 'line2' => $model->getLine2(), - ]; - - if ($isExtra && $object->getInfo()) { - $normalized['extra'] = [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, - TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, - TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, - TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, - ]; - - $normalized['orbit'] = [ - 'geostationary' => $object->getInfo()->geostationary, - ]; - } - - return $normalized; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Tle; - } -} +router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); + + $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); + + $isExtra = ($context[TleRequest::EXTRA_PARAM] ?? null) === true; + + $normalized = [ + '@id' => $id, + '@type' => 'Tle', + 'satelliteId' => $model->getId(), + 'name' => $model->getName(), + 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), + 'line1' => $model->getLine1(), + 'line2' => $model->getLine2(), + ]; + + if ($isExtra && $object->getInfo()) { + $normalized['extra'] = [ + TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, + ]; + + $normalized['orbit'] = [ + 'geostationary' => $object->getInfo()->geostationary, + ]; + } + + return $normalized; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Tle; + } +} diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index a98ff9d..9a0aa54 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -1,29 +1,29 @@ -attributes->get('id'); - } - - public function validate(ValidatorInterface $validator): ConstraintViolationListInterface - { - $violations = $this->validateExtraParam($validator); - $violations->addAll(parent::validate($validator)); - - return $violations; - } -} +attributes->get('id'); + } + + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface + { + $violations = $this->validateExtraParam($validator); + $violations->addAll(parent::validate($validator)); + + return $violations; + } +} diff --git a/src/Request/TleRequestTrait.php b/src/Request/TleRequestTrait.php index d34b681..8ea777e 100644 --- a/src/Request/TleRequestTrait.php +++ b/src/Request/TleRequestTrait.php @@ -1,32 +1,32 @@ -get(TleRequest::EXTRA_PARAM, false); - } - - public function validate(ValidatorInterface $validator): ConstraintViolationListInterface - { - return $validator->validate( - $this->query->all(), - new Assert\Collection( - [ - 'allowExtraFields' => true, - 'allowMissingFields' => true, - 'fields' => [ - TleRequest::EXTRA_PARAM => new Assert\Optional(new Assert\Choice(Filter::BOOLEAN_VALUES)), - ], - ] - ) - ); - } -} +get(TleRequest::EXTRA_PARAM, false); + } + + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface + { + return $validator->validate( + $this->query->all(), + new Assert\Collection( + [ + 'allowExtraFields' => true, + 'allowMissingFields' => true, + 'fields' => [ + TleRequest::EXTRA_PARAM => new Assert\Optional(new Assert\Choice(Filter::BOOLEAN_VALUES)), + ], + ] + ) + ); + } +} diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index c82a1b0..46fa0b1 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -12,7 +12,7 @@ public function assertTle(Tle $tle, array $response): void self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); - self::assertEquals('TleModel', $response['@type']); + self::assertEquals('Tle', $response['@type']); self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals($model->epochDateTime()->format(\DateTimeInterface::ATOM), $response['date']); diff --git a/tests/TleTest.php b/tests/TleTest.php index 948843b..a2310ee 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -25,7 +25,7 @@ public function testTleSingleRecord(): void self::assertArrayHasKey('line2', $response); self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); - self::assertEquals('TleModel', $response['@type']); + self::assertEquals('Tle', $response['@type']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals(TleFixtures::$date, $response['date']); self::assertEquals($tle->getLine1(), $response['line1']); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 46b4452..635aed9 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,55 +1,56 @@ -bootEnv(dirname(__DIR__).'/.env'); -//} - -// Load cached env vars if the .env.local.php file exists -// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - -// $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); -// (new Application($kernel))->add($command); - -// $command->run( -// new ArrayInput( -// [ -// 'command' => 'doctrine:reload', -// '--no-interaction' => true, -// ] -// ), -// new ConsoleOutput() -// ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +bootEnv(dirname(__DIR__).'/.env'); +//} + +// Load cached env vars if the .env.local.php file exists +// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand(new ParameterBag(['kernel.environment' => $_SERVER['APP_ENV']])); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; From a72511dc1f29bde4a1093684f8ea75527003e6e1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 9 Jan 2022 19:22:48 +0100 Subject: [PATCH 190/221] use sub bundle --- composer.json | 2 +- composer.lock | 8 +-- src/Controller/FlyOverController.php | 3 ++ tests/Controller/FlyOverControllerTest.php | 60 ++++++++++++++++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 tests/Controller/FlyOverControllerTest.php diff --git a/composer.json b/composer.json index 945b325..36f93e5 100644 --- a/composer.json +++ b/composer.json @@ -108,7 +108,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "php bin/phpunit --coverage-text", + "test": "XDEBUG_MODE=coverage php bin/phpunit --coverage-text", "deploy": "dep deploy" }, "conflict": { diff --git a/composer.lock b/composer.lock index d4d47f1..6a26e59 100644 --- a/composer.lock +++ b/composer.lock @@ -1973,12 +1973,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/symfony-support.git", - "reference": "ed65c006a88b09e43eaa5fdc286432cccf6a0695" + "reference": "5b31f82016b4f082c70cf2c97afd37c359f27e32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/ed65c006a88b09e43eaa5fdc286432cccf6a0695", - "reference": "ed65c006a88b09e43eaa5fdc286432cccf6a0695", + "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/5b31f82016b4f082c70cf2c97afd37c359f27e32", + "reference": "5b31f82016b4f082c70cf2c97afd37c359f27e32", "shasum": "" }, "require": { @@ -2015,7 +2015,7 @@ "issues": "https://github.com/ivanstan/symfony-support/issues", "source": "https://github.com/ivanstan/symfony-support/tree/master" }, - "time": "2022-01-09T16:22:41+00:00" + "time": "2022-01-09T17:59:36+00:00" }, { "name": "ivanstan/tle-php", diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index af24873..e624b06 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -12,6 +12,9 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +/** + * ToDo: currently available only for current time, accept date from request + */ final class FlyOverController extends AbstractApiController { use TleHttpTrait; diff --git a/tests/Controller/FlyOverControllerTest.php b/tests/Controller/FlyOverControllerTest.php new file mode 100644 index 0000000..82fcfa0 --- /dev/null +++ b/tests/Controller/FlyOverControllerTest.php @@ -0,0 +1,60 @@ +format(\DateTimeInterface::ATOM); + + $response = $this->get( + '/api/tle/'.$tle->getId().'/flyover', + [ + 'latitude' => 0, + 'longitude' => 0, +// 'date' => '2022-01-09T18:16:04+00:00' + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals( + [ + '@type' => 'Observer', + 'timezone' => 'UTC', + 'date' => $date, + 'altitude' => 0, + 'latitude' => 0, + 'longitude' => 0, + ], + $response['observer'] + ); + + // ToDo: additional assertions + + return $response; + } + + /** + * @depends testFlyOverForSatellite + */ + public function testFlyOverDetails(array $data): void + { + $response = $this->get($data['member'][0]['@id']); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + // ToDo: additional assertions + } +} From c7b65881efa67f710de85eb05d76ca031f565644 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 9 Jan 2022 20:33:17 +0100 Subject: [PATCH 191/221] use sub bundle --- composer.json | 2 +- etc/packages/rate_limiter.yaml | 14 +- tests/AbstractWebTestCase.php | 3 - tests/{ => Controller}/CollectionTest.php | 250 ++++++++++----------- tests/Controller/FlyOverControllerTest.php | 72 ++++++ tests/TleTest.php | 59 +++++ 6 files changed, 264 insertions(+), 136 deletions(-) rename tests/{ => Controller}/CollectionTest.php (97%) diff --git a/composer.json b/composer.json index 36f93e5..b58224a 100644 --- a/composer.json +++ b/composer.json @@ -108,7 +108,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "XDEBUG_MODE=coverage php bin/phpunit --coverage-text", + "test": "XDEBUG_MODE=coverage php bin/phpunit --coverage-text --coverage-html ./coverage", "deploy": "dep deploy" }, "conflict": { diff --git a/etc/packages/rate_limiter.yaml b/etc/packages/rate_limiter.yaml index 476b216..a677d37 100644 --- a/etc/packages/rate_limiter.yaml +++ b/etc/packages/rate_limiter.yaml @@ -1,7 +1,7 @@ -framework: - rate_limiter: - anonymous_api: - policy: 'sliding_window' - limit: 500 - interval: '60 minutes' - lock_factory: null +framework: + rate_limiter: + anonymous_api: + policy: 'sliding_window' + limit: 500 + interval: '60 minutes' + lock_factory: null diff --git a/tests/AbstractWebTestCase.php b/tests/AbstractWebTestCase.php index 2ef9f49..71b7270 100644 --- a/tests/AbstractWebTestCase.php +++ b/tests/AbstractWebTestCase.php @@ -23,9 +23,6 @@ protected function get(string $url, array $params = []): Response return self::$client->getResponse(); } - /** - * @throws \JsonException - */ protected function toArray(Response $response): array { return json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); diff --git a/tests/CollectionTest.php b/tests/Controller/CollectionTest.php similarity index 97% rename from tests/CollectionTest.php rename to tests/Controller/CollectionTest.php index 61bf1b8..fece02d 100644 --- a/tests/CollectionTest.php +++ b/tests/Controller/CollectionTest.php @@ -1,125 +1,125 @@ - 1, - 'expected' => [ - '@id' => 'http://localhost/api/tle/?page=1&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle/?page=1&page-size=2', - 'next' => 'http://localhost/api/tle/?page=2&page-size=2', - 'last' => 'http://localhost/api/tle/?page=6&page-size=2' - ] - ], - [ - 'page' => 3, - 'expected' => [ - '@id' => 'http://localhost/api/tle/?page=3&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle/?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', - 'next' => 'http://localhost/api/tle/?page=4&page-size=2', - 'last' => 'http://localhost/api/tle/?page=6&page-size=2' - ] - ], - [ - 'page' => 5, - 'expected' => [ - '@id' => 'http://localhost/api/tle/?page=5&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle/?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', - 'next' => 'http://localhost/api/tle/?page=6&page-size=2', - 'last' => 'http://localhost/api/tle/?page=6&page-size=2' - ] - ], - [ - 'page' => 7, - 'expected' => [ - '@id' => 'http://localhost/api/tle/?page=7&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle/?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', - 'last' => 'http://localhost/api/tle/?page=6&page-size=2' - ] - ] - ]; - - public function testPaginationWorks(): void - { - foreach (self::TEST as $test) { - $response = $this->getCollectionContent($test['page'], 2); - - self::assertArrayHasKey('view', $response); - - $this->assertViewIsCorrect( - $test['expected'], - $response['view'] - ); - } - } - - public function testPaginationError(): void - { - $response = $this->getCollection(-1, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page -1' - ); - - $response = $this->getCollection(0, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page 0' - ); - - $response = $this->getCollection(1, -1); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size -1' - ); - - $response = $this->getCollection(1, 0); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size 0' - ); - } - - private function assertViewIsCorrect($expected, $actual): void - { - foreach ($actual as $key => $value) { - self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); - self::assertEquals($expected[$key], $value , \sprintf('Assert value of key %s is correct', $key)); - } - } - - /** @noinspection PhpSameParameterValueInspection */ - private function getCollectionContent(int $page, int $pageSize): array - { - return $this->toArray( - $this->getCollection($page, $pageSize) - ); - } - - private function getCollection(int $page, int $pageSize): Response - { - return $this->get( - '/api/tle/', - [ - 'page' => $page, - 'page-size' => $pageSize, - ] - ); - } -} + 1, + 'expected' => [ + '@id' => 'http://localhost/api/tle/?page=1&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'next' => 'http://localhost/api/tle/?page=2&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' + ] + ], + [ + 'page' => 3, + 'expected' => [ + '@id' => 'http://localhost/api/tle/?page=3&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', + 'next' => 'http://localhost/api/tle/?page=4&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' + ] + ], + [ + 'page' => 5, + 'expected' => [ + '@id' => 'http://localhost/api/tle/?page=5&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', + 'next' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' + ] + ], + [ + 'page' => 7, + 'expected' => [ + '@id' => 'http://localhost/api/tle/?page=7&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' + ] + ] + ]; + + public function testPaginationWorks(): void + { + foreach (self::TEST as $test) { + $response = $this->getCollectionContent($test['page'], 2); + + self::assertArrayHasKey('view', $response); + + $this->assertViewIsCorrect( + $test['expected'], + $response['view'] + ); + } + } + + public function testPaginationError(): void + { + $response = $this->getCollection(-1, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page -1' + ); + + $response = $this->getCollection(0, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page 0' + ); + + $response = $this->getCollection(1, -1); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size -1' + ); + + $response = $this->getCollection(1, 0); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size 0' + ); + } + + private function assertViewIsCorrect($expected, $actual): void + { + foreach ($actual as $key => $value) { + self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); + self::assertEquals($expected[$key], $value , \sprintf('Assert value of key %s is correct', $key)); + } + } + + /** @noinspection PhpSameParameterValueInspection */ + private function getCollectionContent(int $page, int $pageSize): array + { + return $this->toArray( + $this->getCollection($page, $pageSize) + ); + } + + private function getCollection(int $page, int $pageSize): Response + { + return $this->get( + '/api/tle/', + [ + 'page' => $page, + 'page-size' => $pageSize, + ] + ); + } +} diff --git a/tests/Controller/FlyOverControllerTest.php b/tests/Controller/FlyOverControllerTest.php index 82fcfa0..c9401c0 100644 --- a/tests/Controller/FlyOverControllerTest.php +++ b/tests/Controller/FlyOverControllerTest.php @@ -57,4 +57,76 @@ public function testFlyOverDetails(array $data): void // ToDo: additional assertions } + + public function testLatitudeAbove90(): void { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/'.$tle->getId().'/flyover', + [ + 'latitude' => 100, + 'longitude' => 0, + ] + ); + + self::assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Invalid latitude value', $response['response']['message']); + } + + public function testLatitudeBellow90(): void { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/'.$tle->getId().'/flyover', + [ + 'latitude' => -100, + 'longitude' => 0, + ] + ); + + self::assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Invalid latitude value', $response['response']['message']); + } + + public function testLongitudeAbove180(): void { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/'.$tle->getId().'/flyover', + [ + 'latitude' => 0, + 'longitude' => 190, + ] + ); + + self::assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Invalid longitude value', $response['response']['message']); + } + + public function testLongitudeBellow180(): void { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/'.$tle->getId().'/flyover', + [ + 'latitude' => 0, + 'longitude' => -190, + ] + ); + + self::assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Invalid longitude value', $response['response']['message']); + } } diff --git a/tests/TleTest.php b/tests/TleTest.php index a2310ee..0f39038 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -86,4 +86,63 @@ public function testTleCollectionRecord(): void self::assertArrayHasKey('page-size', $parameters); self::assertEquals($parameters['page-size'], $pageSize); } + + public function testTleCollectionExtra(): void + { + $response = $this->get( + '/api/tle/', + [ + 'extra' => 1, + 'search' => 22049, + ] + ); + + $response = $this->toArray($response); + + self::assertArrayHasKey('extra', $response['member'][0]); + } + + public function testFloatFilter(): void + { + $response = $this->get( + '/api/tle/', + [ + 'extra' => 1, + 'eccentricity[gt]' => .2, + ] + ); + + $response = $this->toArray($response); + + self::assertEquals(.2, $response['parameters']['eccentricity[gt]']); + self::assertGreaterThan(.2, $response['member'][0]['extra']['eccentricity']); + } + + public function testInvalidFloatFilterOperator(): void + { + $response = $this->get( + '/api/tle/', + [ + 'eccentricity[=>]' => .2, + ] + ); + + $response = $this->toArray($response); + + self::assertEquals("Operator for filter 'eccentricity' should be one of the following gt, gte, lt, lte, '=>' provided", $response['response']['message']); + } + + public function testArrayFilter(): void + { + $response = $this->get( + '/api/tle/', + [ + 'satellite_id[]' => 22049, + ] + ); + + $response = $this->toArray($response); + + self::assertEquals(22049, $response['member'][0]['satelliteId']); + } } From 3e4c3d432451be8bc4ed5199d5e1f43daf586650 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 9 Jan 2022 20:46:56 +0100 Subject: [PATCH 192/221] use sub bundle --- src/Controller/FlyOverController.php | 27 ++++++++++++++------------- src/Service/Traits/TleHttpTrait.php | 5 ++++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index e624b06..77b6037 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -53,7 +53,7 @@ public function flyover( $url = $this->router->generate( 'tle_flyover', - array_merge($request->request->all(), $parameters, ['id' => $id]), + ['id' => $id, ...$parameters, ...$request->request->all()], UrlGeneratorInterface::ABSOLUTE_URL ); @@ -110,22 +110,23 @@ public function flyoverDetails( $url = $this->router->generate( 'tle_flyover_details', - array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), + [ + ...$request->request->all(), + 'id' => $id, + 'passId' => $passId, + ], UrlGeneratorInterface::ABSOLUTE_URL ); - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - 'observer' => $this->normalizer->normalize($observer), - 'tle' => $this->normalizer->normalize($tle), - ]; - return $this->response( - array_merge( - $data, - $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimezone(), 'details' => true]) - ) + [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + 'observer' => $this->normalizer->normalize($observer), + 'tle' => $this->normalizer->normalize($tle), + ...$this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimezone(), 'details' => true] + ), + ] ); } diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index a87d0a5..ff48e48 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -25,7 +25,10 @@ protected function getTle(int $id): Tle protected function getObserver(Request $request): Observer { try { - return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + return new Observer( + (float)$request->get('latitude', 0), + (float)$request->get('longitude', 0), + ); } catch (\InvalidArgumentException $exception) { throw new BadRequestHttpException($exception->getMessage()); } From 2c4e0f621f99a20b3718cc74255c8e4852ede817 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 9 Jan 2022 21:17:02 +0100 Subject: [PATCH 193/221] use sub bundle --- src/Controller/AbstractApiController.php | 28 ---------- src/Controller/PropagateController.php | 7 ++- src/Controller/TleController.php | 36 +----------- src/Request/DateTimeDependantRequest.php | 16 ++++++ src/Request/TleCollectionRequest.php | 71 ++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 65 deletions(-) create mode 100644 src/Request/DateTimeDependantRequest.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index f325e48..22448c3 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -30,32 +30,4 @@ public function response(array $data): JsonResponse Response::HTTP_OK, ); } - - protected function getDate(Request $request, string $name): \DateTime - { - $date = $request->get($name, DateTimeService::getCurrentUTC()->format(\DateTimeInterface::ATOM)); - - return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); - } - - protected function assertFilter(Request $request, array $filters): array - { - $result = []; - - foreach ($filters as $filter => $type) { - $values = $request->get($filter, []); - - if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { - $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); - - continue; - } - - foreach ($values as $operator => $value) { - $result[] = new Filter($filter, $type, $operator, $value); - } - } - - return $result; - } } diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index d2befb8..232ae08 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -4,10 +4,11 @@ use App\Enum\PropagatorAlgorithm; use App\Repository\TleRepository; +use App\Request\DateTimeDependantRequest; use App\Service\Traits\TleHttpTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; + use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -28,7 +29,7 @@ public function __construct(protected TleRepository $repository) #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] public function propagate( int $id, - Request $request, + DateTimeDependantRequest $request, NormalizerInterface $normalizer ): JsonResponse { $tle = $this->getTle($id); @@ -36,7 +37,7 @@ public function propagate( $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); - $datetime = $this->getDate($request, 'date'); + $datetime = $request->getDateTime(); $deltaT = ($datetime->getTimestamp() - $tleModel->epochDateTime()->getTimestamp()) / 60; // minutes $algorithm = ($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD ? PropagatorAlgorithm::SDP4 : PropagatorAlgorithm::SGP4; diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 2ef9616..5c8d090 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -18,13 +18,6 @@ final class TleController extends AbstractApiController { use TleHttpTrait; - protected const COLLECTION_FILTERS = [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, - TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, - TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, - TleCollectionSortableFieldsEnum::SATELLITE_ID => Filter::FILTER_TYPE_ARRAY, - ]; - public function __construct(protected TleRepository $repository) { } @@ -47,43 +40,18 @@ public function collection( TleCollectionRequest $request, NormalizerInterface $normalizer ): JsonResponse { - $satelliteIds = $request->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); - - /** @var Filter[] $filters */ - $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); - $builder = $this->repository->collection( $request->getSearch(), $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), $request->getSortDirection(), - $filters, + $request->getFilters(), ); $pagination = new QueryBuilderPaginator($builder); $pagination->setFromRequest($request); - $parameters = [ - TleCollectionRequest::$searchParam => $request->getSearch() ?? '*', - TleCollectionRequest::$sortParam => $request->getSort(TleCollectionSortableFieldsEnum::POPULARITY), - TleCollectionRequest::$sortDirParam => $request->getSortDirection(), - TleCollectionRequest::$pageParam => $request->getPage(), - TleCollectionRequest::$pageSizeParam => $request->getPageSize(), - ]; - - foreach ($filters as $filter) { - if ($filter->filter === TleCollectionSortableFieldsEnum::SATELLITE_ID) { - continue; - } - $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; - } - - foreach ($satelliteIds as $index => $satelliteId) { - $name = \sprintf('%s[%d]', TleCollectionSortableFieldsEnum::SATELLITE_ID, $index); - $parameters[$name] = $satelliteId; - } - $response = $normalizer->normalize($pagination, null, [TleRequest::EXTRA_PARAM => $request->getExtra()]); - $response['parameters'] = $parameters; + $response['parameters'] = $request->getParameters(); return $this->response($response); } diff --git a/src/Request/DateTimeDependantRequest.php b/src/Request/DateTimeDependantRequest.php new file mode 100644 index 0000000..c6c8665 --- /dev/null +++ b/src/Request/DateTimeDependantRequest.php @@ -0,0 +1,16 @@ +get($name, DateTimeService::getCurrentUTC()->format(\DateTimeInterface::ATOM)); + + return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + } +} diff --git a/src/Request/TleCollectionRequest.php b/src/Request/TleCollectionRequest.php index 3ed58ec..fe3cf0f 100644 --- a/src/Request/TleCollectionRequest.php +++ b/src/Request/TleCollectionRequest.php @@ -2,6 +2,8 @@ namespace App\Request; +use App\Enum\TleCollectionSortableFieldsEnum; +use App\ViewModel\Filter; use Ivanstan\SymfonySupport\Request\CollectionRequest; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; @@ -12,6 +14,13 @@ class TleCollectionRequest extends CollectionRequest validate as validateExtraParam; } + protected const COLLECTION_FILTERS = [ + TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::SATELLITE_ID => Filter::FILTER_TYPE_ARRAY, + ]; + public static array $sortFields = [ 'id', 'name', @@ -24,6 +33,8 @@ class TleCollectionRequest extends CollectionRequest 'semi_major_axis', ]; + protected ?array $filters = null; + public function validate(ValidatorInterface $validator): ConstraintViolationListInterface { $violations = $this->validateExtraParam($validator); @@ -31,4 +42,64 @@ public function validate(ValidatorInterface $validator): ConstraintViolationList return $violations; } + + public function getSatelliteIdsFilter(): array + { + return $this->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); + } + + /** + * @return Filter[] + */ + public function getFilters(array $filters = self::COLLECTION_FILTERS): array + { + if ($this->filters !== null) { + return $this->filters; + } + + $result = []; + + foreach ($filters as $filter => $type) { + $values = $this->get($filter, []); + + if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { + $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); + + continue; + } + + foreach ($values as $operator => $value) { + $result[] = new Filter($filter, $type, $operator, $value); + } + } + + $this->filters = $result; + + return $this->filters; + } + + public function getParameters(): array + { + $parameters = [ + self::$searchParam => $this->getSearch() ?? '*', + self::$sortParam => $this->getSort(TleCollectionSortableFieldsEnum::POPULARITY), + self::$sortDirParam => $this->getSortDirection(), + self::$pageParam => $this->getPage(), + self::$pageSizeParam => $this->getPageSize(), + ]; + + foreach ($this->getFilters() as $filter) { + if ($filter->filter === TleCollectionSortableFieldsEnum::SATELLITE_ID) { + continue; + } + $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; + } + + foreach ($this->getSatelliteIdsFilter() as $index => $satelliteId) { + $name = \sprintf('%s[%d]', TleCollectionSortableFieldsEnum::SATELLITE_ID, $index); + $parameters[$name] = $satelliteId; + } + + return $parameters; + } } From a8275102ff8bb9527f19c48c9ec7d98bf7fdd01a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 19:14:08 +0100 Subject: [PATCH 194/221] flyover with date --- src/Controller/FlyOverController.php | 7 +++++-- src/Service/FlyOverService.php | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 77b6037..87ba525 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -5,6 +5,7 @@ use App\Repository\TleRepository; use App\Service\FlyOverService; use App\Service\Traits\TleHttpTrait; +use DoctrineExtensions\Query\Mysql\Date; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -35,14 +36,16 @@ public function flyover( $onlyVisible = $request->get('only_visible', true); $tle = $this->getTle($id); + $date = new \DateTime(); + $this->service ->setObserver($observer) ->setTle($tle); if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + $results = $this->service->getVisiblePasses($date); } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + $results = $this->service->getPasses($date); } $parameters = [ diff --git a/src/Service/FlyOverService.php b/src/Service/FlyOverService.php index b5e4ef6..75ef131 100644 --- a/src/Service/FlyOverService.php +++ b/src/Service/FlyOverService.php @@ -35,12 +35,12 @@ public function setObserver(Observer $observer): self return $this; } - public function getVisiblePasses(float $time): array + public function getVisiblePasses(\DateTime $date): array { - return $this->predict->filterVisiblePasses($this->getPasses($time)); + return $this->predict->filterVisiblePasses($this->getPasses($date)); } - public function getPasses(float $time): array + public function getPasses(\DateTime $date): array { $this->predict->minEle = 10; // Minimum elevation for a pass $this->predict->timeRes = 10; // Pass details: time resolution in seconds @@ -48,6 +48,6 @@ public function getPasses(float $time): array $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) // Get the passes and filter visible only, takes about 4 seconds for 10 days - return $this->predict->get_passes($this->sat, $this->qth, $time, 10); + return $this->predict->get_passes($this->sat, $this->qth, \Predict_Time::unix2daynum($date->getTimestamp()), 10); } } From 02674bdf512beba0cec2ae5ba15ebf3f0e263dbe Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 20:04:21 +0100 Subject: [PATCH 195/221] flyover with date --- src/Controller/FlyOverController.php | 42 ++++++++++------------ src/Controller/PropagateController.php | 4 +-- src/Request/DateTimeDependantRequest.php | 3 +- src/Request/FlyOverRequest.php | 14 ++++++++ src/Request/PropagateRequest.php | 10 ++++++ src/Service/FlyOverService.php | 15 ++++---- src/Service/Traits/TleHttpTrait.php | 5 ++- tests/Controller/FlyOverControllerTest.php | 12 +++---- 8 files changed, 63 insertions(+), 42 deletions(-) create mode 100644 src/Request/FlyOverRequest.php create mode 100644 src/Request/PropagateRequest.php diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 87ba525..25f532e 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -3,19 +3,15 @@ namespace App\Controller; use App\Repository\TleRepository; +use App\Request\FlyOverRequest; use App\Service\FlyOverService; use App\Service\Traits\TleHttpTrait; -use DoctrineExtensions\Query\Mysql\Date; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -/** - * ToDo: currently available only for current time, accept date from request - */ final class FlyOverController extends AbstractApiController { use TleHttpTrait; @@ -30,33 +26,29 @@ public function __construct( #[Route("/api/tle/{id}/flyover", name: "tle_flyover", requirements: ["id" => "\d+"])] public function flyover( int $id, - Request $request + FlyOverRequest $request ): JsonResponse { $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); $tle = $this->getTle($id); - $date = new \DateTime(); + $date = $request->getDateTime(); $this->service ->setObserver($observer) ->setTle($tle); - if ($onlyVisible) { - $results = $this->service->getVisiblePasses($date); - } else { - $results = $this->service->getPasses($date); - } + $results = $this->service->getPasses($date, $request->filterVisible()); $parameters = [ 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, - 'only_visible' => $onlyVisible, + 'only_visible' => $request->filterVisible(), + 'date' => $date->format(\DateTime::ATOM), ]; $url = $this->router->generate( 'tle_flyover', - ['id' => $id, ...$parameters, ...$request->request->all()], + [...$request->request->all(), 'id' => $id, ...$parameters], UrlGeneratorInterface::ABSOLUTE_URL ); @@ -66,7 +58,14 @@ public function flyover( foreach ($members as $index => &$member) { $item = [ - '@id' => $this->generateUrl('tle_flyover_details', ['id' => $id, 'passId' => $index], UrlGeneratorInterface::ABSOLUTE_URL), + '@id' => $this->generateUrl('tle_flyover_details', [ + 'id' => $id, + 'passId' => $index, + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $request->filterVisible(), + 'date' => $date->format(\DateTime::ATOM), + ], UrlGeneratorInterface::ABSOLUTE_URL), ]; $member = $item + $member; @@ -89,21 +88,18 @@ public function flyover( public function flyoverDetails( int $id, int $passId, - Request $request, + FlyOverRequest $request, ): JsonResponse { $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); $tle = $this->getTle($id); $this->service ->setObserver($observer) ->setTle($tle); - if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); - } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); - } + $date = $request->getDateTime(); + + $results = $this->service->getPasses($date, $request->filterVisible()); $pass = $results[$passId] ?? null; diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 232ae08..6e49506 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -4,7 +4,7 @@ use App\Enum\PropagatorAlgorithm; use App\Repository\TleRepository; -use App\Request\DateTimeDependantRequest; +use App\Request\PropagateRequest; use App\Service\Traits\TleHttpTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; @@ -29,7 +29,7 @@ public function __construct(protected TleRepository $repository) #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] public function propagate( int $id, - DateTimeDependantRequest $request, + PropagateRequest $request, NormalizerInterface $normalizer ): JsonResponse { $tle = $this->getTle($id); diff --git a/src/Request/DateTimeDependantRequest.php b/src/Request/DateTimeDependantRequest.php index c6c8665..57a21df 100644 --- a/src/Request/DateTimeDependantRequest.php +++ b/src/Request/DateTimeDependantRequest.php @@ -2,10 +2,9 @@ namespace App\Request; -use Ivanstan\SymfonySupport\Request\AbstractRequest; use Ivanstan\SymfonySupport\Services\DateTimeService; -class DateTimeDependantRequest extends AbstractRequest +trait DateTimeDependantRequest { public function getDateTime(string $name = 'date'): \DateTime { diff --git a/src/Request/FlyOverRequest.php b/src/Request/FlyOverRequest.php new file mode 100644 index 0000000..b9bb387 --- /dev/null +++ b/src/Request/FlyOverRequest.php @@ -0,0 +1,14 @@ +get('only_visible', true); + } +} diff --git a/src/Request/PropagateRequest.php b/src/Request/PropagateRequest.php new file mode 100644 index 0000000..f446610 --- /dev/null +++ b/src/Request/PropagateRequest.php @@ -0,0 +1,10 @@ +predict->filterVisiblePasses($this->getPasses($date)); - } - - public function getPasses(\DateTime $date): array + public function getPasses(\DateTime $date, bool $filterVisible): array { $this->predict->minEle = 10; // Minimum elevation for a pass $this->predict->timeRes = 10; // Pass details: time resolution in seconds @@ -48,6 +43,12 @@ public function getPasses(\DateTime $date): array $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) // Get the passes and filter visible only, takes about 4 seconds for 10 days - return $this->predict->get_passes($this->sat, $this->qth, \Predict_Time::unix2daynum($date->getTimestamp()), 10); + $passes = $this->predict->get_passes($this->sat, $this->qth, \Predict_Time::unix2daynum($date->getTimestamp()), 10); + + if($filterVisible) { + return $this->predict->filterVisiblePasses($passes); + } + + return $passes; } } diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index ff48e48..f8a07c5 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -3,6 +3,7 @@ namespace App\Service\Traits; use App\Entity\Tle; +use App\Request\FlyOverRequest; use App\ViewModel\Observer; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -22,12 +23,14 @@ protected function getTle(int $id): Tle return $tle; } - protected function getObserver(Request $request): Observer + protected function getObserver(FlyOverRequest $request): Observer { try { return new Observer( (float)$request->get('latitude', 0), (float)$request->get('longitude', 0), + 0, + $request->getDateTime(), ); } catch (\InvalidArgumentException $exception) { throw new BadRequestHttpException($exception->getMessage()); diff --git a/tests/Controller/FlyOverControllerTest.php b/tests/Controller/FlyOverControllerTest.php index c9401c0..f2d0800 100644 --- a/tests/Controller/FlyOverControllerTest.php +++ b/tests/Controller/FlyOverControllerTest.php @@ -12,14 +12,12 @@ public function testFlyOverForSatellite(): array { $tle = TleFixtures::create(); - $date = (new \DateTime())->format(\DateTimeInterface::ATOM); - $response = $this->get( '/api/tle/'.$tle->getId().'/flyover', [ - 'latitude' => 0, + 'latitude' => 45, 'longitude' => 0, -// 'date' => '2022-01-09T18:16:04+00:00' + 'date' => '2022-01-11T00:00:00+00:00' ] ); @@ -30,10 +28,10 @@ public function testFlyOverForSatellite(): array self::assertEquals( [ '@type' => 'Observer', - 'timezone' => 'UTC', - 'date' => $date, + 'timezone' => 'Europe/Andorra', + 'date' => '2022-01-11T00:00:00+00:00', 'altitude' => 0, - 'latitude' => 0, + 'latitude' => 45, 'longitude' => 0, ], $response['observer'] From cdacf2ccd344c91fa6022a45c4e6d6980e43a845 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 20:05:18 +0100 Subject: [PATCH 196/221] flyover with date --- src/Controller/FlyOverController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 25f532e..f840378 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -60,7 +60,7 @@ public function flyover( $item = [ '@id' => $this->generateUrl('tle_flyover_details', [ 'id' => $id, - 'passId' => $index, + 'passId' => $index+1, 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, 'only_visible' => $request->filterVisible(), @@ -101,7 +101,7 @@ public function flyoverDetails( $results = $this->service->getPasses($date, $request->filterVisible()); - $pass = $results[$passId] ?? null; + $pass = $results[$passId-1] ?? null; if ($pass === null) { throw new NotFoundHttpException('Unable to find requested flyover details'); From b69bac098887cd141cb6050a9ce218eae27ed819 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 20:08:29 +0100 Subject: [PATCH 197/221] flyover with date --- src/Controller/FlyOverController.php | 8 ++++++-- src/Request/FlyOverRequest.php | 16 ++++++++++++++++ src/Service/Traits/TleHttpTrait.php | 18 ------------------ 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index f840378..bbb95e2 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -28,7 +28,7 @@ public function flyover( int $id, FlyOverRequest $request ): JsonResponse { - $observer = $this->getObserver($request); + $observer = $request->getObserver(); $tle = $this->getTle($id); $date = $request->getDateTime(); @@ -90,7 +90,7 @@ public function flyoverDetails( int $passId, FlyOverRequest $request, ): JsonResponse { - $observer = $this->getObserver($request); + $observer = $request->getObserver(); $tle = $this->getTle($id); $this->service @@ -113,6 +113,10 @@ public function flyoverDetails( ...$request->request->all(), 'id' => $id, 'passId' => $passId, + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $request->filterVisible(), + 'date' => $date->format(\DateTime::ATOM), ], UrlGeneratorInterface::ABSOLUTE_URL ); diff --git a/src/Request/FlyOverRequest.php b/src/Request/FlyOverRequest.php index b9bb387..f192185 100644 --- a/src/Request/FlyOverRequest.php +++ b/src/Request/FlyOverRequest.php @@ -2,7 +2,9 @@ namespace App\Request; +use App\ViewModel\Observer; use Ivanstan\SymfonySupport\Request\AbstractRequest; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class FlyOverRequest extends AbstractRequest { @@ -11,4 +13,18 @@ class FlyOverRequest extends AbstractRequest public function filterVisible(): bool { return (bool)$this->get('only_visible', true); } + + public function getObserver(): Observer + { + try { + return new Observer( + (float)$this->get('latitude', 0), + (float)$this->get('longitude', 0), + 0, + $this->getDateTime(), + ); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + } } diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index f8a07c5..fed5faa 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -3,10 +3,6 @@ namespace App\Service\Traits; use App\Entity\Tle; -use App\Request\FlyOverRequest; -use App\ViewModel\Observer; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; trait TleHttpTrait @@ -22,18 +18,4 @@ protected function getTle(int $id): Tle return $tle; } - - protected function getObserver(FlyOverRequest $request): Observer - { - try { - return new Observer( - (float)$request->get('latitude', 0), - (float)$request->get('longitude', 0), - 0, - $request->getDateTime(), - ); - } catch (\InvalidArgumentException $exception) { - throw new BadRequestHttpException($exception->getMessage()); - } - } } From 869557d4c8ceeb2a543a817efc19a8c9939ffd9b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 20:28:13 +0100 Subject: [PATCH 198/221] enum --- composer.json | 3 +-- composer.lock | 4 ++-- src/Enum/PropagatorAlgorithm.php | 4 +--- src/Enum/TleCollectionSortableFieldsEnum.php | 4 +--- src/Repository/TleRepository.php | 3 +-- 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index b58224a..975ce7f 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": "^8.0", + "php": "^8.1", "ext-ctype": "*", "ext-dom": "*", "ext-iconv": "*", @@ -20,7 +20,6 @@ "doctrine/orm": "^2", "ivanstan/symfony-support": "dev-master", "ivanstan/tle-php": "dev-master", - "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "6.0.*", diff --git a/composer.lock b/composer.lock index 6a26e59..eccb9ed 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5e8216c3b1a5db93b7403bcee703af43", + "content-hash": "8e62f925822722e34101deff69d82012", "packages": [ { "name": "beberlei/doctrineextensions", @@ -8743,7 +8743,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.0", + "php": "^8.1", "ext-ctype": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/src/Enum/PropagatorAlgorithm.php b/src/Enum/PropagatorAlgorithm.php index f3d2c50..8073d38 100644 --- a/src/Enum/PropagatorAlgorithm.php +++ b/src/Enum/PropagatorAlgorithm.php @@ -2,9 +2,7 @@ namespace App\Enum; -use MyCLabs\Enum\Enum; - -class PropagatorAlgorithm extends Enum +enum PropagatorAlgorithm { public const SGP4 = 'SGP4'; public const SDP4 = 'SDP4'; diff --git a/src/Enum/TleCollectionSortableFieldsEnum.php b/src/Enum/TleCollectionSortableFieldsEnum.php index 9356b00..0068b2b 100644 --- a/src/Enum/TleCollectionSortableFieldsEnum.php +++ b/src/Enum/TleCollectionSortableFieldsEnum.php @@ -2,9 +2,7 @@ namespace App\Enum; -use MyCLabs\Enum\Enum; - -class TleCollectionSortableFieldsEnum extends Enum +enum TleCollectionSortableFieldsEnum { public const ID = 'id'; public const NAME = 'name'; diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index b283c8d..a054be9 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -7,7 +7,6 @@ use App\Entity\TleInformation; use App\Enum\TleCollectionSortableFieldsEnum; use App\ViewModel\Filter; -use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; @@ -24,7 +23,7 @@ public function __construct(ManagerRegistry $registry) /** * @return Tle[]|Collection */ - public function fetchAllIndexed(): array|Collection + public function fetchAllIndexed(): array|Collection { return $this->createQueryBuilder('tle', 'tle.id') ->getQuery() From 0d33bd2fe42386de6eb6de43c31d82c697882b16 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 11 Jan 2022 20:46:31 +0100 Subject: [PATCH 199/221] enum --- src/Command/UpdateImportSources.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 2f2aaff..14f003e 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -98,6 +98,11 @@ protected function getSources(): array foreach ($crawler->filter('a') as $anchor) { $href = $anchor->getAttribute('href'); $path = parse_url($href, PHP_URL_PATH); + + if ($path === null) { + continue; + } + $extension = pathinfo($path, PATHINFO_EXTENSION); if ($extension === 'txt') { From a2e1809f6c6acc02687accad8d19cebc0575bd27 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 12 Jan 2022 20:39:33 +0100 Subject: [PATCH 200/221] add more tests --- tests/AssertionTrait.php | 15 +- tests/Controller/FlyOverControllerTest.php | 220 ++++++++++++++++++++- tests/Controller/TleControllerTest.php | 4 + tests/TleTest.php | 16 ++ 4 files changed, 248 insertions(+), 7 deletions(-) diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index 46fa0b1..d9c577a 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -10,8 +10,7 @@ public function assertTle(Tle $tle, array $response): void { $model = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); - self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); - self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); + self::assertEquals('http://localhost/api/tle/'.$tle->getId(), $response['@id']); self::assertEquals('Tle', $response['@type']); self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); @@ -19,4 +18,16 @@ public function assertTle(Tle $tle, array $response): void self::assertEquals($tle->getLine1(), $response['line1']); self::assertEquals($tle->getLine2(), $response['line2']); } + + public function assertObserverCorrect(array $expected, array $actual): void + { + self::assertEquals( + [ + '@type' => 'Observer', + 'altitude' => 0, + ...$expected, + ], + $actual + ); + } } diff --git a/tests/Controller/FlyOverControllerTest.php b/tests/Controller/FlyOverControllerTest.php index f2d0800..a902956 100644 --- a/tests/Controller/FlyOverControllerTest.php +++ b/tests/Controller/FlyOverControllerTest.php @@ -4,10 +4,13 @@ use App\DataFixtures\TleFixtures; use App\Tests\AbstractWebTestCase; +use App\Tests\AssertionTrait; use Symfony\Component\HttpFoundation\Response; class FlyOverControllerTest extends AbstractWebTestCase { + use AssertionTrait; + public function testFlyOverForSatellite(): array { $tle = TleFixtures::create(); @@ -17,7 +20,7 @@ public function testFlyOverForSatellite(): array [ 'latitude' => 45, 'longitude' => 0, - 'date' => '2022-01-11T00:00:00+00:00' + 'date' => '2022-01-11T00:00:00+00:00', ] ); @@ -25,19 +28,98 @@ public function testFlyOverForSatellite(): array $response = $this->toArray($response); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertEquals( + 'http://localhost/api/tle/43550/flyover?latitude=45&longitude=0&only_visible=1&date=2022-01-11T00:00:00%2B00:00', + $response['@id'] + ); + self::assertEquals('SatelliteFlyOverCollection', $response['@type']); + + $this->assertObserverCorrect( [ - '@type' => 'Observer', 'timezone' => 'Europe/Andorra', 'date' => '2022-01-11T00:00:00+00:00', - 'altitude' => 0, 'latitude' => 45, 'longitude' => 0, ], $response['observer'] ); - // ToDo: additional assertions + $this->assertTle($tle, $response['tle']); + + self::assertEquals( + [ + [ + '@id' => 'http://localhost/api/tle/43550/flyover/1?latitude=45&longitude=0&only_visible=1&date=2022-01-11T00:00:00%2B00:00', + '@type' => 'SatelliteFlyOver', + 'aos' => [ + 'date' => '2022-01-12T07:55:40+01:00', + 'azimuth' => 165.39, + 'elevation' => 11.43, + ], + 'max' => [ + 'date' => '2022-01-12T07:56:14+01:00', + 'azimuth' => 140.13, + 'elevation' => 13.02, + ], + 'los' => [ + 'date' => '2022-01-12T07:56:49+01:00', + 'azimuth' => 115.18, + 'elevation' => 11.3, + ], + ], + [ + '@id' => 'http://localhost/api/tle/43550/flyover/2?latitude=45&longitude=0&only_visible=1&date=2022-01-11T00:00:00%2B00:00', + '@type' => 'SatelliteFlyOver', + 'aos' => [ + 'date' => '2022-01-15T07:22:39+01:00', + 'azimuth' => 143.3, + 'elevation' => 58.7, + ], + 'max' => [ + 'date' => '2022-01-15T07:22:39+01:00', + 'azimuth' => 58.7, + 'elevation' => 58.7, + ], + 'los' => [ + 'date' => '2022-01-15T07:23:53+01:00', + 'azimuth' => 67.42, + 'elevation' => 12.3, + ], + ], + [ + '@id' => 'http://localhost/api/tle/43550/flyover/3?latitude=45&longitude=0&only_visible=1&date=2022-01-11T00:00:00%2B00:00', + '@type' => 'SatelliteFlyOver', + 'aos' => [ + 'date' => '2022-01-17T07:30:30+01:00', + 'azimuth' => 13.11, + 'elevation' => 15.04, + ], + 'max' => [ + 'date' => '2022-01-17T07:30:30+01:00', + 'azimuth' => 15.04, + 'elevation' => 15.04, + ], + 'los' => [ + 'date' => '2022-01-17T07:30:48+01:00', + 'azimuth' => 24.33, + 'elevation' => 12.23, + ], + ], + ], + $response['member'] + ); + + self::assertEquals( + [ + 'latitude' => 45, + 'longitude' => 0, + 'only_visible' => true, + 'date' => '2022-01-11T00:00:00+00:00', + 'satelliteId' => 43550, + ], + $response['parameters'] + ); return $response; } @@ -53,7 +135,135 @@ public function testFlyOverDetails(array $data): void $response = $this->toArray($response); - // ToDo: additional assertions + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals( + 'http://localhost/api/tle/43550/flyover/1?latitude=45&longitude=0&only_visible=1&date=2022-01-11T00:00:00%2B00:00', + $response['@id'] + ); + + $this->assertObserverCorrect( + [ + 'timezone' => 'Europe/Andorra', + 'date' => '2022-01-11T00:00:00+00:00', + 'latitude' => 45, + 'longitude' => 0, + ], + $response['observer'] + ); + + $this->assertTle(TleFixtures::create(), $response['tle']); + + self::assertEquals('SatelliteFlyOverDetails', $response['@type']); + self::assertEquals( + [ + 'date' => '2022-01-12T07:55:40+01:00', + 'azimuth' => 165.39, + 'elevation' => 11.43, + ], + $response['aos'] + ); + self::assertEquals( + [ + 'date' => '2022-01-12T07:56:14+01:00', + 'azimuth' => 140.13, + 'elevation' => 13.02, + ], + $response['max'] + ); + self::assertEquals( + [ + 'date' => '2022-01-12T07:56:49+01:00', + 'azimuth' => 115.18, + 'elevation' => 11.3, + ], + $response['los'] + ); + + self::assertEquals( + [ + [ + 'azimuth' => 207.65669959435, + 'elevation' => 0.0047869592920753, + ], + [ + 'azimuth' => 205.38477921994, + 'elevation' => 1.0912635294549, + ], + [ + 'azimuth' => 202.65595508189, + 'elevation' => 2.2651771539291, + ], + [ + 'azimuth' => 199.33469704804, + 'elevation' => 3.5438021529901, + ], + [ + 'azimuth' => 195.23705191884, + 'elevation' => 4.9443077838983, + ], + [ + 'azimuth' => 190.11679092622, + 'elevation' => 6.4773095713303, + ], + [ + 'azimuth' => 183.65932836183, + 'elevation' => 8.1311877732861, + ], + [ + 'azimuth' => 175.50942605954, + 'elevation' => 9.8398778133251, + ], + [ + 'azimuth' => 165.38832703269, + 'elevation' => 11.433463880821, + ], + [ + 'azimuth' => 153.35761135124, + 'elevation' => 12.609105694977, + ], + [ + 'azimuth' => 140.12610595023, + 'elevation' => 13.022338671373, + ], + [ + 'azimuth' => 126.98711086195, + 'elevation' => 12.525560688957, + ], + [ + 'azimuth' => 115.18410828561, + 'elevation' => 11.301953434457, + ], + [ + 'azimuth' => 105.33145147768, + 'elevation' => 9.7004916046037, + ], + [ + 'azimuth' => 97.426469426974, + 'elevation' => 8.0082733487551, + ], + [ + 'azimuth' => 91.16864583908, + 'elevation' => 6.3798579196494, + ], + [ + 'azimuth' => 86.20406033951, + 'elevation' => 4.8728059546152, + ], + [ + 'azimuth' => 82.226671257738, + 'elevation' => 3.4953715898431, + ], + [ + 'azimuth' => 78.999104073798, + 'elevation' => 2.2361396455495, + ], + [ + 'azimuth' => 76.344581280163, + 'elevation' => 1.0781611811795, + ], + ], + $response['details'] + ); } public function testLatitudeAbove90(): void { diff --git a/tests/Controller/TleControllerTest.php b/tests/Controller/TleControllerTest.php index bc3a783..220ce73 100644 --- a/tests/Controller/TleControllerTest.php +++ b/tests/Controller/TleControllerTest.php @@ -37,6 +37,8 @@ public function testTleExtraFieldsMissingData(): void $response = $this->toArray($response); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + $this->assertTle($tle, $response); } @@ -48,6 +50,8 @@ public function testTleExtraFields(): void $response = $this->toArray($response); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + $this->assertTle($tle, $response); } } diff --git a/tests/TleTest.php b/tests/TleTest.php index 0f39038..7dff385 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -145,4 +145,20 @@ public function testArrayFilter(): void self::assertEquals(22049, $response['member'][0]['satelliteId']); } + + public function testArrayInvalidFilter(): void + { + $response = $this->get( + '/api/tle/', + [ + 'satellite_id' => 22049, + ] + ); + + self::assertEquals(Response::HTTP_INTERNAL_SERVER_ERROR, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals('Filter satellite_id value should be array', $response['response']['message']); + } } From 089e07a58664962f4850d6b2441002ed57eb3d1b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 12 Jan 2022 20:41:48 +0100 Subject: [PATCH 201/221] add more tests --- src/Event/ApiLimiterSubscriber.php | 5 +++++ src/Event/StatisticSubscriber.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php index a4e15d2..27caf69 100644 --- a/src/Event/ApiLimiterSubscriber.php +++ b/src/Event/ApiLimiterSubscriber.php @@ -28,6 +28,11 @@ public function __construct(RateLimiterFactory $anonymousApiLimiter) $this->limiter = $anonymousApiLimiter; } + /** + * @codeCoverageIgnore + * + * @return string[] + */ public static function getSubscribedEvents(): array { return [ diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 3a04206..0ae4e15 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -24,6 +24,11 @@ public function __construct(private EntityManagerInterface $em, private TleRepos { } + /** + * @codeCoverageIgnore + * + * @return string[] + */ public static function getSubscribedEvents(): array { return [ From e4c9896c4082f0ae2513712af174a9c9bf149be4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 12 Jan 2022 20:50:15 +0100 Subject: [PATCH 202/221] add more tests --- src/Controller/AbstractApiController.php | 3 --- src/Controller/FlyOverController.php | 7 ++++--- src/Controller/TleController.php | 1 - src/Kernel.php | 1 + src/Repository/TleRepository.php | 3 +-- src/ViewModel/Filter.php | 2 +- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 22448c3..7e45e98 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -2,11 +2,8 @@ namespace App\Controller; -use App\ViewModel\Filter; -use Ivanstan\SymfonySupport\Services\DateTimeService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\RouterInterface; use Symfony\Contracts\Service\Attribute\Required; diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index bbb95e2..9ac5602 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -6,6 +6,7 @@ use App\Request\FlyOverRequest; use App\Service\FlyOverService; use App\Service\Traits\TleHttpTrait; +use DateTimeInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; @@ -43,7 +44,7 @@ public function flyover( 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, 'only_visible' => $request->filterVisible(), - 'date' => $date->format(\DateTime::ATOM), + 'date' => $date->format(DateTimeInterface::ATOM), ]; $url = $this->router->generate( @@ -64,7 +65,7 @@ public function flyover( 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, 'only_visible' => $request->filterVisible(), - 'date' => $date->format(\DateTime::ATOM), + 'date' => $date->format(DateTimeInterface::ATOM), ], UrlGeneratorInterface::ABSOLUTE_URL), ]; @@ -116,7 +117,7 @@ public function flyoverDetails( 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, 'only_visible' => $request->filterVisible(), - 'date' => $date->format(\DateTime::ATOM), + 'date' => $date->format(DateTimeInterface::ATOM), ], UrlGeneratorInterface::ABSOLUTE_URL ); diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 5c8d090..6048f3f 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -7,7 +7,6 @@ use App\Request\TleCollectionRequest; use App\Request\TleRequest; use App\Service\Traits\TleHttpTrait; -use App\ViewModel\Filter; use Ivanstan\SymfonySupport\Services\QueryBuilderPaginator; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; diff --git a/src/Kernel.php b/src/Kernel.php index e0b31e6..59817ca 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -9,6 +9,7 @@ class Kernel extends BaseKernel { use MicroKernelTrait; + /** @noinspection PhpUnusedPrivateMethodInspection */ private function getConfigDir(): string { return $this->getProjectDir().'/etc'; diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index a054be9..dab528a 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -77,8 +77,7 @@ public function collection( private function getSortTableColumnMapping(string $sort): ?string { return match ($sort) { - TleCollectionSortableFieldsEnum::ID => 'tle.id', - TleCollectionSortableFieldsEnum::SATELLITE_ID => 'tle.id', + TleCollectionSortableFieldsEnum::ID, TleCollectionSortableFieldsEnum::SATELLITE_ID => 'tle.id', TleCollectionSortableFieldsEnum::NAME => 'tle.name', TleCollectionSortableFieldsEnum::POPULARITY => null, TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index 808751c..1447977 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -67,7 +67,7 @@ protected function validateOperator(): string return ''; } - protected function validateValue(mixed $value): mixed + protected function validateValue(mixed $value): array|null|float { if ($this->type === self::FILTER_TYPE_FLOAT) { $value = (float)$value; From 260a98608d2b364ba804875c1b0dc9c72dd38aec Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 12 Jan 2022 20:56:19 +0100 Subject: [PATCH 203/221] sort test --- tests/TleTest.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/TleTest.php b/tests/TleTest.php index 7dff385..42b27e6 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -161,4 +161,20 @@ public function testArrayInvalidFilter(): void self::assertEquals('Filter satellite_id value should be array', $response['response']['message']); } + + public function testCollectionSort(): void + { + $response = $this->get( + '/api/tle/', + [ + 'sort' => 'eccentricity', + 'sort-dir' => 'desc', + ] + ); + + $response = $this->toArray($response); + + self::assertEquals('eccentricity', $response['parameters']['sort']); + self::assertEquals('desc', $response['parameters']['sort-dir']); + } } From 875c4296bc21ac281e59171f813d5ccdf3c1e23d Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 12 Jan 2022 21:02:44 +0100 Subject: [PATCH 204/221] sort test --- tests/TleTest.php | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/TleTest.php b/tests/TleTest.php index 42b27e6..715c090 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -162,7 +162,7 @@ public function testArrayInvalidFilter(): void self::assertEquals('Filter satellite_id value should be array', $response['response']['message']); } - public function testCollectionSort(): void + public function testCollectionSortEccentricity(): void { $response = $this->get( '/api/tle/', @@ -177,4 +177,36 @@ public function testCollectionSort(): void self::assertEquals('eccentricity', $response['parameters']['sort']); self::assertEquals('desc', $response['parameters']['sort-dir']); } + + public function testCollectionSortPeriod(): void + { + $response = $this->get( + '/api/tle/', + [ + 'sort' => 'period', + 'sort-dir' => 'desc', + ] + ); + + $response = $this->toArray($response); + + self::assertEquals('period', $response['parameters']['sort']); + self::assertEquals('desc', $response['parameters']['sort-dir']); + } + + public function testCollectionSortSemiMajorAxis(): void + { + $response = $this->get( + '/api/tle/', + [ + 'sort' => 'semi_major_axis', + 'sort-dir' => 'desc', + ] + ); + + $response = $this->toArray($response); + + self::assertEquals('semi_major_axis', $response['parameters']['sort']); + self::assertEquals('desc', $response['parameters']['sort-dir']); + } } From aa455ee39716634c084efc4aec6fbf1c0a09b090 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 14 Jan 2022 20:52:08 +0100 Subject: [PATCH 205/221] sort test --- etc/custom/tle.json | 74 ++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/etc/custom/tle.json b/etc/custom/tle.json index bf1ab25..bdaf5fc 100644 --- a/etc/custom/tle.json +++ b/etc/custom/tle.json @@ -10,43 +10,6 @@ } ], "paths": { - "/api/tle/{id}": { - "get": { - "summary": "Record", - "operationId": "record", - "description": "Return single TleModel for requested satellite id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Satellite id", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TleModel" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, "/api/tle": { "get": { "summary": "Collection", @@ -192,6 +155,43 @@ } } }, + "/api/tle/{id}": { + "get": { + "summary": "Record", + "operationId": "record", + "description": "Return single TleModel for requested satellite id", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Satellite id", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TleModel" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, "/api/tle/{id}/propagate": { "get": { "summary": "Propagate (experimental)", From 7db4281f2fd361ebc6802a8d323b464b4ac432b4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 14 Jan 2022 21:04:24 +0100 Subject: [PATCH 206/221] merge frontend and backend repositories --- .env | 3 + .gitignore | 26 + LICENSE.md | 674 + README.md | 2 +- bin/deploy | 6 + bin/deploy-frontend | 22 + bin/post-deploy | 7 + client/App.tsx | 70 + client/GoogleAnalytics.tsx | 29 + client/components/CopyButton.tsx | 37 + client/components/DonateButton.tsx | 28 + client/components/GeoMap.tsx | 87 + client/components/HideOnScroll.tsx | 22 + client/components/Navigation.tsx | 105 + client/components/SatellitePosition.tsx | 57 + client/components/TleBrowser.tsx | 238 + client/components/TleDisplay.tsx | 29 + client/components/TleElementDetails.tsx | 27 + client/components/TleMultiSelect.tsx | 149 + client/components/TleSelect.tsx | 106 + client/components/icons/ObserverIcon.ts | 7 + client/components/icons/SatelliteMarker.ts | 16 + client/index.css | 173 + client/index.tsx | 16 + client/model/LatLng.ts | 4 + client/pages/AbstractTlePage.tsx | 56 + client/pages/Browse.tsx | 344 + client/pages/Docs.tsx | 36 + client/pages/FlyOver.tsx | 132 + client/pages/Health.tsx | 84 + client/pages/Home.tsx | 199 + client/pages/Map.tsx | 226 + client/react-app-env.d.ts | 2 + client/reportWebVitals.ts | 15 + client/services/ColorPalette.ts | 16 + client/services/FlyOverStore.ts | 21 + client/services/Observer.ts | 78 + client/services/Satellite.ts | 36 + client/services/TleApi.ts | 70 + client/services/TleParser.ts | 119 + client/services/TlePopularProvider.ts | 17 + client/tests/date.test.ts | 4 + client/util/common.ts | 5 + client/util/date.ts | 32 + client/util/map.ts | 62 + client/util/responsive.ts | 20 + config-overrides.js | 13 + deploy.php | 2 +- package.json | 80 + static/favicon.ico | Bin 0 -> 15086 bytes static/images/logo.svg | 9 + static/images/observer.svg | 8 + static/images/satellite.svg | 4 + static/index.html | 57 + static/logo192.png | Bin 0 -> 6521 bytes static/logo512.png | Bin 0 -> 21181 bytes static/manifest.json | 25 + static/robots.txt | 3 + tsconfig.json | 27 + yarn.lock | 12739 +++++++++++++++++++ 60 files changed, 16479 insertions(+), 2 deletions(-) create mode 100644 LICENSE.md create mode 100644 bin/deploy create mode 100644 bin/deploy-frontend create mode 100644 bin/post-deploy create mode 100644 client/App.tsx create mode 100644 client/GoogleAnalytics.tsx create mode 100644 client/components/CopyButton.tsx create mode 100644 client/components/DonateButton.tsx create mode 100644 client/components/GeoMap.tsx create mode 100644 client/components/HideOnScroll.tsx create mode 100644 client/components/Navigation.tsx create mode 100644 client/components/SatellitePosition.tsx create mode 100644 client/components/TleBrowser.tsx create mode 100644 client/components/TleDisplay.tsx create mode 100644 client/components/TleElementDetails.tsx create mode 100644 client/components/TleMultiSelect.tsx create mode 100644 client/components/TleSelect.tsx create mode 100644 client/components/icons/ObserverIcon.ts create mode 100644 client/components/icons/SatelliteMarker.ts create mode 100644 client/index.css create mode 100644 client/index.tsx create mode 100644 client/model/LatLng.ts create mode 100644 client/pages/AbstractTlePage.tsx create mode 100644 client/pages/Browse.tsx create mode 100644 client/pages/Docs.tsx create mode 100644 client/pages/FlyOver.tsx create mode 100644 client/pages/Health.tsx create mode 100644 client/pages/Home.tsx create mode 100644 client/pages/Map.tsx create mode 100644 client/react-app-env.d.ts create mode 100644 client/reportWebVitals.ts create mode 100644 client/services/ColorPalette.ts create mode 100644 client/services/FlyOverStore.ts create mode 100644 client/services/Observer.ts create mode 100644 client/services/Satellite.ts create mode 100644 client/services/TleApi.ts create mode 100644 client/services/TleParser.ts create mode 100644 client/services/TlePopularProvider.ts create mode 100644 client/tests/date.test.ts create mode 100644 client/util/common.ts create mode 100644 client/util/date.ts create mode 100644 client/util/map.ts create mode 100644 client/util/responsive.ts create mode 100644 config-overrides.js create mode 100644 package.json create mode 100644 static/favicon.ico create mode 100644 static/images/logo.svg create mode 100644 static/images/observer.svg create mode 100644 static/images/satellite.svg create mode 100644 static/index.html create mode 100644 static/logo192.png create mode 100644 static/logo512.png create mode 100644 static/manifest.json create mode 100644 static/robots.txt create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.env b/.env index a4744f6..a8bdc6b 100644 --- a/.env +++ b/.env @@ -37,3 +37,6 @@ SENTRY_DSN= # postgresql+advisory://db_user:db_password@localhost/db_name LOCK_DSN=semaphore ###< symfony/lock ### + +CHOKIDAR_USEPOLLING=true +SKIP_PREFLIGHT_CHECK=true diff --git a/.gitignore b/.gitignore index b5db415..f448436 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + .idea ###> symfony/framework-bundle ### @@ -18,3 +20,27 @@ public/index.html coverage bin/.phpunit + +###> frontend ### +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +###< frontend ### diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6b111d1 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 76aa52e..83bf0d7 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The TLE API consists of two endpoints `GET http://tle.ivanstanojevic.me` Example query http://tle.ivanstanojevic.me/api/tle -# Client libraries +# Third party client libraries * JavaScript https://github.com/ivanstan/tle.js * PHP https://github.com/ivanstan/tle-php diff --git a/bin/deploy b/bin/deploy new file mode 100644 index 0000000..b54dc10 --- /dev/null +++ b/bin/deploy @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -e + +composer deploy + +sh ./deploy-frontend diff --git a/bin/deploy-frontend b/bin/deploy-frontend new file mode 100644 index 0000000..34b87ee --- /dev/null +++ b/bin/deploy-frontend @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -e + +# Setup exported env +export DEPLOY_PATH=/home/glutenfr/projects/tle.ivanstanojevic.me/shared/public + +# Setup local env +HOST=ivanstanojevic.me +USER=glutenfr +PORT=2233 + +# Setup +mkdir -p build + +# Custom commands +yarn build prod + +# Sync +rsync -arvz -e "ssh -p ${PORT}" --rsync-path=~/bin/rsync --progress --delete ./build ${USER}@${HOST}:${DEPLOY_PATH} + +# Run ./post-deploy on remote +ssh ${USER}@${HOST} -p${PORT} 'bash -s' < ./bin/post-deploy ${DEPLOY_PATH} diff --git a/bin/post-deploy b/bin/post-deploy new file mode 100644 index 0000000..ad9b778 --- /dev/null +++ b/bin/post-deploy @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# Executed on remote server + +DEPLOY_PATH=$1 + +cd ${DEPLOY_PATH} diff --git a/client/App.tsx b/client/App.tsx new file mode 100644 index 0000000..80379ff --- /dev/null +++ b/client/App.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import { HashRouter as Router, Route, Switch } from 'react-router-dom'; +import Home from "./pages/Home"; +import { Docs } from "./pages/Docs"; +import Navigation from "./components/Navigation"; +import { createMuiTheme, ThemeProvider } from "@material-ui/core"; +import { Health } from "./pages/Health"; +import { Browse } from "./pages/Browse"; +import { Map } from "./pages/Map"; +import * as Sentry from "@sentry/react"; +import { isProduction } from "./util/common"; +import { FlyOver } from "./pages/FlyOver"; +import { Provider } from 'mobx-react'; +import Observer from "./services/Observer"; +import FlyOverStore from "./services/FlyOverStore"; +import { GoogleAnalytics } from "./GoogleAnalytics"; +import { MuiPickersUtilsProvider } from '@material-ui/pickers'; +import DateFnsUtils from '@date-io/date-fns'; + +const theme = createMuiTheme({ + palette: { + primary: { + main: '#0b3d91', + }, + }, + overrides: { + MuiButton: { + label: { + color: "#0b3d91", + }, + }, + }, +}); + +if (isProduction()) { + Sentry.init({ dsn: "https://89c7162887474970b4d5e599245910b2@o509872.ingest.sentry.io/5604902" }); +} + +function App() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default App diff --git a/client/GoogleAnalytics.tsx b/client/GoogleAnalytics.tsx new file mode 100644 index 0000000..9b51f0c --- /dev/null +++ b/client/GoogleAnalytics.tsx @@ -0,0 +1,29 @@ +import React from "react"; + +export class GoogleAnalytics extends React.Component { + + componentDidUpdate(prevProps: any) { + if (this.props.location !== prevProps.location) { + this.onRouteChanged(); + } + } + + onRouteChanged() { + const { history } = this.props + + // @ts-ignore + const gtag = window.gtag; + + if (history.action === 'POP' && typeof (gtag) === 'function') { + gtag('config', 'G-M6WV4512EL', { + 'page_title': document.title, + 'page_location': history.location.pathname, + 'page_path': history.location.pathname + history.location.search + }); + } + } + + render() { + return null; + } +} diff --git a/client/components/CopyButton.tsx b/client/components/CopyButton.tsx new file mode 100644 index 0000000..4f9e626 --- /dev/null +++ b/client/components/CopyButton.tsx @@ -0,0 +1,37 @@ +import React from "react" +import { CopyToClipboard } from "react-copy-to-clipboard" +import { ClickAwayListener, IconButton, Tooltip } from "@material-ui/core" + +export class CopyButton extends React.Component { + + readonly state = { + open: false + } + + render() { + const { open } = this.state + const { value } = this.props + + return ( + this.setState({ open: false })}> + this.setState({ open: false })} + open={open} + disableFocusListener + disableHoverListener + disableTouchListener + title="Copied" + > + this.setState({ open: true })}> + + + + + + + ) + } +} diff --git a/client/components/DonateButton.tsx b/client/components/DonateButton.tsx new file mode 100644 index 0000000..bb6f322 --- /dev/null +++ b/client/components/DonateButton.tsx @@ -0,0 +1,28 @@ +import React from 'react' +import { Button, Typography } from "@material-ui/core" + +export const DonateButton = () => { + return ( +
+ + + {/**/} + + + +
+ ) +} diff --git a/client/components/GeoMap.tsx b/client/components/GeoMap.tsx new file mode 100644 index 0000000..1da4991 --- /dev/null +++ b/client/components/GeoMap.tsx @@ -0,0 +1,87 @@ +import React from "react" +import { styles } from "../util/map" +import { GoogleMap, withGoogleMap } from "react-google-maps" +import Marker from "react-google-maps/lib/components/Marker" +import { If } from "react-if" +import { Observer } from "../services/Observer" +import { inject } from "mobx-react" +import ObserverIcon from "./icons/ObserverIcon" + +interface GeoMapPropsInterface { + zoom?: number + renderObserver?: boolean + observer?: Observer +} + +interface GeoMapStateInterface { + +} + +@inject('observer') +class CustomGoogleMap extends React.Component { + + private _map: any + + onObserverDragEnd = (event: any): void => { + const { observer } = this.props + + if (observer) { + observer.setPosition({ + latitude: event.latLng.lat(), + longitude: event.latLng.lng(), + }) + } + } + + onClick = (event: any): void => { + let { renderObserver } = this.props + + if (renderObserver) { + this.onObserverDragEnd(event); + } + }; + + render() { + let { zoom, renderObserver, observer } = this.props + + if (!observer) { + return null + } + + // @ts-ignore + return ( + this._map = map} + defaultCenter={{ lat: -10, lng: 8 }} + defaultZoom={zoom || 1} + onClick={this.onClick} + defaultOptions={{ + styles: styles, + streetViewControl: false, + mapTypeControl: false, + scrollwheel: false, + restriction: { + latLngBounds: { + north: 85, + south: -85, + west: -180, + east: 180 + } + }, + }} + > + {this.props.children} + + + + + ) + } +} + +export const GeoMap = withGoogleMap(CustomGoogleMap) diff --git a/client/components/HideOnScroll.tsx b/client/components/HideOnScroll.tsx new file mode 100644 index 0000000..74c00d1 --- /dev/null +++ b/client/components/HideOnScroll.tsx @@ -0,0 +1,22 @@ +import React from 'react' +import { Slide, useScrollTrigger } from "@material-ui/core" +import { ReactElementLike } from "prop-types" + +interface HideOnScrollPropsInterface { + children: ReactElementLike, + window?: Function, +} + +export function HideOnScroll(props: HideOnScrollPropsInterface) { + const { children, window } = props + // Note that you normally won't need to set the window ref as useScrollTrigger + // will default to window. + // This is only being set here because the demo is in an iframe. + const trigger = useScrollTrigger({ target: window ? window() : undefined }) + + return ( + + {children} + + ) +} diff --git a/client/components/Navigation.tsx b/client/components/Navigation.tsx new file mode 100644 index 0000000..ded098b --- /dev/null +++ b/client/components/Navigation.tsx @@ -0,0 +1,105 @@ +import React from 'react' +import { HideOnScroll } from './HideOnScroll' +import { AppBar, Button, Drawer, IconButton, Toolbar, Typography, withStyles } from '@material-ui/core'; +import MenuIcon from '@material-ui/icons/Menu' +import styled from 'styled-components' +import { DonateButton } from "./DonateButton" + +const Menu = styled.div` + background: #0b3d91 + display: flex + flex-direction: column + align-items: baseline + padding: 15px +` + +const styles = (theme: any) => ({ + label: { + color: '#f1f1f1', + }, +}); + +class Navigation extends React.Component { + + public readonly state = { + open: false, + } + + toggleMenu = () => { + this.setState({ + open: !this.state.open + }) + } + + render() { + const { classes } = this.props + + const menu = ( + <> + + + + + + ) + + return ( + + + + + + + + + + + +
+ {menu} +
+ +
+ +
+ + + +
+ + + + {menu} + + + +
+ +
+ ) + } +} + +export default withStyles(styles)(Navigation) diff --git a/client/components/SatellitePosition.tsx b/client/components/SatellitePosition.tsx new file mode 100644 index 0000000..fd18d05 --- /dev/null +++ b/client/components/SatellitePosition.tsx @@ -0,0 +1,57 @@ +import React from "react" +import { GeoMap } from "./GeoMap" +import Marker from "react-google-maps/lib/components/Marker" +import { If } from "react-if" +import Polyline from "react-google-maps/lib/components/Polyline" +import SatelliteMarker from "./icons/SatelliteMarker"; + +export class SatellitePosition extends React.Component { + + readonly state: any = { + satelliteId: null, + propagation: null + } + + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean { + return this.state.satelliteId !== nextProps.satelliteId + } + + static getDerivedStateFromProps(props: any) { + return { + propagation: props.propagation, + satelliteId: props.satelliteId, + } + } + + render() { + const { propagation } = this.state + + return <> + } + mapElement={
} + > + + + + + + + + + + + {propagation.tle.name} position on {propagation.parameters.date} + + + + } +} diff --git a/client/components/TleBrowser.tsx b/client/components/TleBrowser.tsx new file mode 100644 index 0000000..e083140 --- /dev/null +++ b/client/components/TleBrowser.tsx @@ -0,0 +1,238 @@ +import React from "react" +import { LineNumber, TleParser } from "../services/TleParser" +import { If } from 'react-if' +import { CopyButton } from "./CopyButton" +import { TleElementDetails } from "./TleElementDetails" + +enum TleElements { + // Line1 elements + name = 'name', + lineNumber1 = 'line-number-1', + satelliteId1 = 'satellite-id', + classification = 'classification', + launchYear = 'launch-year', + launchOfYear = 'launch-of-year', + launchPiece = 'launch-piece', + epochYear = 'epoch-year', + epochDay = 'epoch-day', + firstDerivative = 'first-derivative', + secondDerivative = 'second-derivative', + dragTerm = 'drag-term', + ephemerisType = 'ephemeris-type', + elementNumber = 'element-number', + checkSum1 = 'checksum-1', + + // Line2 elements + lineNumber2 = 'line-number-2', + satelliteId2 = 'satellite-id-2', + inclination = 'inclination', + raan = 'raan', + eccentricity = 'eccentricity', + argumentOfPerigee = 'argument-of-perigee', + meanAnomaly = 'mean-anomaly', + meanMotion = 'mean-motion', + revolutionNumber = 'revolution-number', + checksum2 = 'checksum-2', +} + +export class TleBrowser extends React.Component { + + readonly state = { + active: null, + color: null, + } + + hover = (element: string, domElement: any): void => { + const styles: any = getComputedStyle(domElement.target) + this.setState({ active: element, color: styles['border-color'] }) + } + + render() { + const { active, color } = this.state + const data = new TleParser(this.props.data) + + let overflow:any = (window.innerWidth > 500) ? 'auto' : 'scroll' + + return <> +
+
+
+ this.hover(TleElements.name, element)}>{data.name} +
+ {/*
{data.line1}
*/} + +
+ this.hover(TleElements.lineNumber1, element)}>{data.getLineNumberRaw(LineNumber.LINE1)} +   + this.hover(TleElements.satelliteId1, element)}>{data.getSatelliteIdRaw(LineNumber.LINE1)} + this.hover(TleElements.classification, element)}>{data.getClassificationRaw()} +   + this.hover(TleElements.launchYear, element)}>{data.getLaunchYearRaw()} + this.hover(TleElements.launchOfYear, element)}>{data.getLaunchNumberOfTheYearRaw()} + this.hover(TleElements.launchPiece, element)}>{data.getLaunchPieceRaw()} +   + this.hover(TleElements.epochYear, element)}>{data.getEpochYearRaw()} + this.hover(TleElements.epochDay, element)}>{data.getEpochDayRaw()} +   + this.hover(TleElements.firstDerivative, element)}>{data.getFirstTimeDerivativeOfMeanMotionRaw()} +   + this.hover(TleElements.secondDerivative, element)}>{data.getSecondTimeDerivativeOfMeanMotionRaw()} +   + this.hover(TleElements.dragTerm, element)}>{data.getBstarDragTermRaw()} +   + this.hover(TleElements.ephemerisType, element)}>{data.getEphemerisTypeRaw()} +   + this.hover(TleElements.elementNumber, element)}>{data.getElementNumberRaw()} + this.hover(TleElements.checkSum1, element)}>{data.getLineChecksumRaw(LineNumber.LINE1)} +
+ + {/*
{data.line2}
*/} +
+ this.hover(TleElements.lineNumber2, element)}>{data.getLineNumberRaw(LineNumber.LINE2)} +   + this.hover(TleElements.satelliteId2, element)}>{data.getSatelliteIdRaw(LineNumber.LINE2)} +   + this.hover(TleElements.inclination, element)}>{data.getInclinationRaw()} +   + this.hover(TleElements.raan, element)}>{data.getRightAscensionOfAscendingNodeRaw()} +   + this.hover(TleElements.eccentricity, element)}>{data.getEccentricityRaw()} +   + this.hover(TleElements.argumentOfPerigee, element)}>{data.getArgumentOfPerigeeRaw()} +   + this.hover(TleElements.meanAnomaly, element)}>{data.getMeanAnomalyRaw()} +   + this.hover(TleElements.meanMotion, element)}>{data.getMeanMotionRaw()} +   + this.hover(TleElements.revolutionNumber, element)}>{data.getRevolutionNumberRaw()} + this.hover(TleElements.checksum2, element)}>{data.getLineChecksumRaw(LineNumber.LINE2)} +
+
+
+ +
+
+ +
+ Get daily updates for {data.name} using following API endpoint  + https://tle.ivanstanojevic.me/api/tle/{data.satelliteId} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + } + +} diff --git a/client/components/TleDisplay.tsx b/client/components/TleDisplay.tsx new file mode 100644 index 0000000..e94793f --- /dev/null +++ b/client/components/TleDisplay.tsx @@ -0,0 +1,29 @@ +import React from "react" +import { Tle } from "tle-client" +import { CopyButton } from "./CopyButton" + +interface TleDisplayPropsInterface { + data: Tle +} + +export class TleDisplay extends React.Component { + + render() { + const { data } = this.props + + return ( +
+
+
+ {data.name} +
+
{data.line1}
+
{data.line2}
+
+
+ +
+
+ ) + } +} diff --git a/client/components/TleElementDetails.tsx b/client/components/TleElementDetails.tsx new file mode 100644 index 0000000..d7b05c9 --- /dev/null +++ b/client/components/TleElementDetails.tsx @@ -0,0 +1,27 @@ +import React from "react" + +export class TleElementDetails extends React.Component { + + render() { + const { title, color } = this.props + + let squareStyle: any = { + width: 16, + height: 16, + backgroundColor: color, + marginRight: 10, + } + + return ( + <> +
+
+
+ {title} +
+
+ + ) + } + +} diff --git a/client/components/TleMultiSelect.tsx b/client/components/TleMultiSelect.tsx new file mode 100644 index 0000000..f5f8311 --- /dev/null +++ b/client/components/TleMultiSelect.tsx @@ -0,0 +1,149 @@ +import React, { ChangeEvent } from "react" +import TextField from "@material-ui/core/TextField" +import CircularProgress from "@material-ui/core/CircularProgress" +import Autocomplete from "@material-ui/lab/Autocomplete" +import { Checkbox, Chip } from "@material-ui/core"; +import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; +import CheckBoxIcon from '@material-ui/icons/CheckBox'; +import { If } from "react-if"; +import { Tle, TleProvider } from "tle-client/index"; + +const icon = ; +const checkedIcon = ; + +export interface TleSelectPropsInterface { + value: Tle[] | null + onChange: Function +} + +export class TleMultiSelect extends React.Component { + + private provider: TleProvider + + public readonly state = { + open: false, + loading: false, + options: [], + value: null, + inputValue: null, + } + + constructor(props: any) { + super(props) + + this.state.value = props.value + this.state.inputValue = props.value?.name + + this.provider = new TleProvider() + } + + static getDerivedStateFromProps(props: TleSelectPropsInterface, state: any) { + + if (props.value === null) { + return null + } + + return { + value: props.value, + } + } + + public async query(inputValue: string = '') { + this.provider.search(inputValue) + .then((data: Tle[]) => { + this.setState({ options: data, loading: false }) + }) + .catch(() => this.setState({ options: [], loading: false })) + } + + render() { + const { open, options, value, inputValue, loading } = this.state + const { onChange } = this.props + + let width = (window.innerWidth < 500) ? 'auto' : 400 + + // @ts-ignore + return ( + ( + + + {option.name} + + )} + onChange={(event, newValue: any) => { + this.setState({ value: newValue }) + + if (onChange !== null && typeof onChange === 'function') { + onChange(newValue) + } + }} + style={{ width: width, margin: 'auto' }} + open={open} + onOpen={() => { + if (options.length === 0) { + this.query() + } + this.setState({ open: true }) + }} + onClose={() => { + this.setState({ open: false }) + }} + getOptionSelected={(option: any, value) => option.name === value.name} + getOptionLabel={(option: any) => option.name || '-'} + options={options} + loading={loading} + noOptionsText={"No results found"} + renderTags={(value, getTagProps) => { + const newValue = [...value]; + + let render = newValue.slice(0, 2); + let left = newValue.splice(2, value.length) + + return <> + {render.map((option, index) => ( + + ))} + = 2 && left.length > 0}> + + + + }} + renderInput={(params) => ( + ) => { + this.setState({ inputValue: event.target.value, loading: true }, () => this.query(event.target.value)) + }} + label="Search satellites" + variant="standard" + InputProps={{ + ...params.InputProps, + endAdornment: ( + + {loading ? : null} + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + ); + } +} diff --git a/client/components/TleSelect.tsx b/client/components/TleSelect.tsx new file mode 100644 index 0000000..64bd773 --- /dev/null +++ b/client/components/TleSelect.tsx @@ -0,0 +1,106 @@ +import React, { ChangeEvent } from "react" +import TextField from "@material-ui/core/TextField" +import CircularProgress from "@material-ui/core/CircularProgress" +import Autocomplete from "@material-ui/lab/Autocomplete" +import { Tle, TleProvider } from "tle-client" + +export interface TleSelectPropsInterface { + value: Tle | null + onChange: Function +} + +export class TleSelect extends React.Component { + + private provider: TleProvider + + public readonly state = { + open: false, + loading: false, + options: [], + value: null, + inputValue: null, + } + + constructor(props: any) { + super(props) + + this.state.value = props.value + this.state.inputValue = props.value?.name + + this.provider = new TleProvider() + } + + static getDerivedStateFromProps(props: TleSelectPropsInterface, state: any) { + + if (props.value === null) { + return null + } + + return { + value: props.value, + inputValue: props.value.name, + } + } + + public async query(inputValue: string = '') { + this.provider.search(inputValue) + .then((data: Tle[]) => { + this.setState({ options: data, loading: false }) + }) + .catch(() => this.setState({ options: [], loading: false })) + } + + render() { + const { open, options, value, inputValue, loading } = this.state + const { onChange } = this.props + + let width = (window.innerWidth < 500) ? 'auto' : 400 + + return { + this.setState({ value: newValue }) + + if (onChange !== null && typeof onChange === 'function') { + onChange(newValue) + } + }} + style={{ width: width, margin: 'auto' }} + open={open} + onOpen={() => { + if (options.length === 0) { + this.query() + } + this.setState({ open: true }) + }} + onClose={() => { + this.setState({ open: false }) + }} + getOptionSelected={(option: any, value) => option.name === value.name} + getOptionLabel={(option: any) => option.name || '-'} + options={options} + loading={loading} + noOptionsText={"No results found"} + renderInput={(params) => ( + ) => { + this.setState({ inputValue: event.target.value, loading: true }, () => this.query(event.target.value)) + }} + label="Search satellites" + variant="standard" + InputProps={{ + ...params.InputProps, + endAdornment: ( + + {loading ? : null} + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + } +} diff --git a/client/components/icons/ObserverIcon.ts b/client/components/icons/ObserverIcon.ts new file mode 100644 index 0000000..4655478 --- /dev/null +++ b/client/components/icons/ObserverIcon.ts @@ -0,0 +1,7 @@ +export default new google.maps.MarkerImage( + '/images/observer.svg', + null, + null, + new google.maps.Point(20, 40), + new google.maps.Size(40, 40) +) diff --git a/client/components/icons/SatelliteMarker.ts b/client/components/icons/SatelliteMarker.ts new file mode 100644 index 0000000..c50768a --- /dev/null +++ b/client/components/icons/SatelliteMarker.ts @@ -0,0 +1,16 @@ +export interface SatelliteMarkerIconOptionsInterface { + color: string +} + +export default (options: SatelliteMarkerIconOptionsInterface) => { + const { color } = options + + return { + path: "M28.2 28.3L16.5 40l8.5 8.5 8.5 8.5 12.2-12.3L58 32.5l-8-8c-4.4-4.4-8.4-8-9-8-.6 0-6.3 5.3-12.8 11.8zM51.7 50.8L39.5 63l8.3 8.3 8.2 8.2 12.3-12.3L80.5 55l-8.3-8.3-8.2-8.2-12.3 12.3zM74 73.5l-12 12 8.5 8.5 8.5 8.5 11.7-11.7c6.5-6.5 11.8-12.2 11.8-12.8 0-1-15.1-16.5-16-16.5-.3 0-5.9 5.4-12.5 12zM118 76.4c-1.6 1-11.8 10.7-22.5 21.5L76 117.5v12l9.8 9.7 9.7 9.8h12l20.9-21c13.4-13.4 21.2-22 21.6-23.8 1.5-6-.3-9.7-8.8-18.5-10.9-11.3-16.5-13.5-23.2-9.3zM134.2 134.3L122.5 146l8.5 8.5 8.5 8.5 12.2-12.3 12.3-12.2-8-8c-4.4-4.4-8.4-8-9-8s-6.3 5.3-12.8 11.8zM55.7 136.3c-2.9 1.1-5.9 2.5-6.5 3.1-.9.9 3.3 5.6 17.1 19.4 17.5 17.4 18.4 18.1 19.8 16.2 4.4-5.9 5.3-17.8 1.8-24.8-6.2-12.3-20-18.2-32.2-13.9zM157.7 156.8L145.5 169l8.3 8.3 8.2 8.2 12.3-12.3 12.2-12.2-8.3-8.3-8.2-8.2-12.3 12.3zM180 179.5l-12 12 8.5 8.5 8.5 8.5 11.7-11.7c6.5-6.5 11.8-12.2 11.8-12.8 0-1-15.1-16.5-16-16.5-.3 0-5.9 5.4-12.5 12z", + strokeColor: color, + fillColor: color, + fillOpacity: 1.0, + scale: 0.2, + anchor: new google.maps.Point(100, 130) + } +} diff --git a/client/index.css b/client/index.css new file mode 100644 index 0000000..cb06a49 --- /dev/null +++ b/client/index.css @@ -0,0 +1,173 @@ +html { + height: 100%; + width: 100%; + overflow: -moz-scrollbars-vertical; + overflow-y: scroll; +} + +body { + height: 100%; + width: 100%; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', + 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.slide-container { + height: calc(100% * 2 - 64px); +} + +.slide-container a { + color: #dd361c; +} + +.slide-container a:visited { + color: #c62d1f; +} + +.slide { + padding: 40px 0; + min-height: 100vh; +} + +.first-slide { + padding: 40px 0; + min-height: calc(100vh - 64px); +} + +.code { + font-family: 'Anonymous Pro', monospace; + background: #f1f1f1; + padding: 20px 40px; +} + +#root { + height: 100%; +} + +.bg-darker { + +} + +.bg-dark { + background: #6e7a87; +} + +.bg-white { + background: #fff; +} + +#home-page { + min-height: calc(100% - 64px); +} + +.tle-display .element { + /*border: 2px solid transparent;*/ + border-radius: 8px; +} + +.tle-display .element:hover { + /*border: 2px solid red;*/ +} + +.element { + border: 2px solid transparent; +} + +.element-detail { + padding: 15px; +} + +.element.name { + border-color: #fc8080; +} + +.element.line_number { + border-color: #94dafb; +} + +.element.satellite_id { + border-color: #6d838e; +} + +.element.inclination { + border-color: #aed9c5; +} + +.element.raan { + border-color: #fdbc3a; +} + +.element.eccentricity { + border-color: #26a0fc; +} + +.element.argument-of-perigee { + border-color: #cff57b; +} + +.element.mean-anomaly { + border-color: #8b75d7; +} + +.element.mean-motion { + border-color: #26e7a6; +} + +.element.revolution-number { + border-color: #f2d3d9; +} + +.element.epoch-year { + border-color: #a8e5dd; +} + +.element.epoch-day { + border-color: #a8e5dd; +} + +.element.classification { + border-color: #c7cbe6; +} + +.element.launch-year { + border-color: #e1ebb9; +} + +.element.launch-number { + border-color: #e1ebb9; +} + +.element.launch-piece { + border-color: #e1ebb9; +} + +.element.checksum { + border-color: #c9e7f2; +} + +.element.first-derivative { + border-color: #c4a296; +} + +.element.second-derivative { + border-color: #a7babe; +} + +.element.drag-term { + border-color: #f9e0e3; +} + +.element.element-number { + border-color: #ddd5be; +} + +.element.ephemeris-type { + border-color: #b3b6c5; +} + +.MuiAppBar-root .MuiButton-label { + color: #f1f1f1; +} diff --git a/client/index.tsx b/client/index.tsx new file mode 100644 index 0000000..9b9d904 --- /dev/null +++ b/client/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; + +ReactDOM.render( + // + , + // , + document.getElementById('root') +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +// reportWebVitals(); diff --git a/client/model/LatLng.ts b/client/model/LatLng.ts new file mode 100644 index 0000000..4f4e52e --- /dev/null +++ b/client/model/LatLng.ts @@ -0,0 +1,4 @@ +export interface LatLng { + latitude: number + longitude: number +} diff --git a/client/pages/AbstractTlePage.tsx b/client/pages/AbstractTlePage.tsx new file mode 100644 index 0000000..63bd1d6 --- /dev/null +++ b/client/pages/AbstractTlePage.tsx @@ -0,0 +1,56 @@ +import React from "react" +import { Tle, TleProvider } from "tle-client" +import { RouteComponentProps } from "react-router" + +export interface AbstractTlePageStateInterface { + data: any | null +} + +type RouteParams = { + id: string +} + +abstract class AbstractTlePage

, S extends AbstractTlePageStateInterface> extends React.Component, S> { + + protected provider: TleProvider + + readonly state: any = { + data: null, + } + + protected constructor(props: RouteComponentProps) { + super(props) + + this.provider = new TleProvider() + } + + componentWillReceiveProps(nextProps: any) { + if (nextProps.match.params.id !== this.props.match.params.id) { + const { id } = nextProps.match.params + + if (id) { + this.provider.get(id).then(tle => this.updateTle(tle)) + } + } + } + + componentDidMount() { + const { id } = this.props.match.params + + if (id) { + this.provider.get(parseInt(id)).then(tle => this.updateTle(tle)) + } + } + + protected updateTle = (tle: Tle | null) => { + if (!tle) { + return + } + + this.setState({ + data: tle + }) + } +} + +export default AbstractTlePage diff --git a/client/pages/Browse.tsx b/client/pages/Browse.tsx new file mode 100644 index 0000000..734019c --- /dev/null +++ b/client/pages/Browse.tsx @@ -0,0 +1,344 @@ +import React from 'react'; +import { DataGrid, GridColDef } from '@material-ui/data-grid'; +import { Drawer, IconButton, InputAdornment, MenuItem, Select, TextField, Tooltip } from '@material-ui/core'; +import { TleProvider } from 'tle-client'; +import { If } from 'react-if'; +import { TleBrowser } from '../components/TleBrowser'; +import styled from 'styled-components'; +import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos'; +import SearchIcon from '@material-ui/icons/Search'; +import { SatellitePosition } from '../components/SatellitePosition'; +import TleApi from '../services/TleApi'; + +const Toolbar = styled.div` + padding: 10px 0 +`; + +const DrawerHeader = styled.div` + padding: 20px +`; + +export const RETROGRADE = 'retrograde'; +export const POSIGRADE = 'posigrade' + +const formatTime = (seconds: number) => { + const h = Math.floor(seconds / 3600) + const m = Math.floor((seconds % 3600) / 60) + const s = Math.round(seconds % 60) + return [ + h, + m > 9 ? m : (h ? '0' + m : m || '0'), + s > 9 ? s : '0' + s + ].filter(Boolean).join(':') +} + +const columns: GridColDef[] = [ + { + field: 'actions', + headerName: 'Actions', + type: 'string', + width: 100, + disableColumnMenu: true, + disableClickEventBubbling: true, + sortable: false, + renderCell: (params) => { + return ( + + + {'Flyover'} + + + ) + } + }, + { + field: 'name', + headerName: 'Name', + type: 'string', + width: 250, + disableColumnMenu: true, + }, + { + field: 'inclination', + headerName: 'Inclination', + type: 'float', + width: 250, + sortable: true, + disableColumnMenu: true, + filterable: true, + valueGetter: (params) => { + return params.row.extra.inclination.toFixed(2) + '°' + } + }, + { + field: 'eccentricity', + headerName: 'Eccentricity', + type: 'float', + width: 250, + valueGetter: (params) => { + return params.row.extra.eccentricity + }, + disableColumnMenu: true, + sortable: true + }, + { + field: 'semi_major_axis', + headerName: 'Semi Major Axis', + type: 'float', + width: 250, + valueGetter: (params) => { + return (parseFloat(params.row.extra.semi_major_axis) / 1000).toFixed(2) + }, + disableColumnMenu: true, + sortable: true + }, + { + field: 'period', + headerName: 'Period', + type: 'string', + width: 250, + valueGetter: (params) => { + return formatTime(params.row.extra.period) + }, + disableColumnMenu: true, + sortable: true + }, + { + field: 'raan', + headerName: 'RAAN', + type: 'string', + width: 250, + valueGetter: (params) => { + return params.row.extra.raan.toFixed(2) + '°' + }, + disableColumnMenu: true, + sortable: true + }, + +] + +const TleBrowserWrapper = styled.div` + padding: 20px +` + +export class Browse extends React.Component { + + private static URL: string = "https://tle.ivanstanojevic.me" + + private provider: TleProvider + + constructor(props: any) { + super(props) + + this.provider = new TleProvider() + } + + public readonly state: any = { + data: [], + total: 0, + loading: true, + parameters: { + extra: 1, + }, + orbitValue: '-', + open: false, + current: null, + propagation: null + } + + componentDidMount() { + this.collection() + } + + public async collection(): Promise { + + this.setState({ + loading: true, + }) + + let url: string = Browse.URL + '/api/tle' + + const response = await fetch(url + '?' + new URLSearchParams(this.state.parameters).toString()) + const data: any = await response.json() + + const result: any[] = [] + + if (result.hasOwnProperty('member')) { + return result + } + + this.setState({ + data: data.member, + total: data.totalItems, + loading: false, + }) + + return data.member + } + + handlePageChange = (event: any) => { + let parameters: any = this.state.parameters + + parameters['page-size'] = event.pageSize + + if (event.page > 0) { + parameters['page'] = event.page + } + + this.setState({ parameters: parameters }, this.collection) + } + + handleSortModelChange = (event: any) => { + let parameters: any = this.state.parameters + + if (!event.sortModel.hasOwnProperty(0)) { + return + } + + parameters['sort'] = event.sortModel[0].field + parameters['sort-dir'] = event.sortModel[0].sort + + this.setState({ parameters: parameters }, this.collection) + } + + handleModelSelectChange = (event: any) => { + this.provider.get(event.selectionModel[0]).then(async (current) => { + const date = new Date() + + let propagation = null + if (current) { + propagation = await TleApi.predict(current.satelliteId, date) + } + + this.setState({ + propagation: propagation, + current: current + }) + }) + + this.setState({ + open: true, + }) + } + + toggleDrawer = () => { + this.setState({ + open: !this.state.open + }) + } + + handleSearchChange = (event: any) => { + let value = event.target.value.trim() + + if (value !== '') { + let parameters: any = this.state.parameters + + parameters['search'] = value + + this.setState({ parameters: parameters }, this.collection) + } + } + + handleInclinationFilter = (event: any): void => { + let value = event.target.value.trim() + + let parameters: any = this.state.parameters + + if (value === RETROGRADE) { + parameters['inclination[gt]'] = 90 + delete parameters['inclination[lt]'] + } + + if (value === POSIGRADE) { + parameters['inclination[lt]'] = 90 + delete parameters['inclination[gt]'] + } + + if (value === '') { + delete parameters['inclination[lt]'] + delete parameters['inclination[gt]'] + } + + this.setState({ + orbitValue: value, + parameters: parameters + }, this.collection) + } + + render() { + const { orbitValue } = this.state + + return ( +

+ + + + + ), + }} + /> + + + + + row.satelliteId} + rowHeight={52} + rowCount={this.state.total} + columnBuffer={8} + density={"standard"} + onPageChange={this.handlePageChange} + onSortModelChange={this.handleSortModelChange} + paginationMode={'server'} + disableColumnMenu={false} + onSelectionModelChange={this.handleModelSelectChange} + sortingMode={'server'} + sortingOrder={['desc', 'asc']} + disableColumnSelector={true} + /> + + + + + + + + + + + + + + + +
+ ) + } +} diff --git a/client/pages/Docs.tsx b/client/pages/Docs.tsx new file mode 100644 index 0000000..8991462 --- /dev/null +++ b/client/pages/Docs.tsx @@ -0,0 +1,36 @@ +import React from "react" +import { RedocStandalone } from "redoc" +import { isProduction } from "../util/common" + +const PRODUCTION_DOCS = 'https://tle.ivanstanojevic.me/api/tle.json' +const DEVELOPMENT_DOCS = 'http://127.0.0.1:8000/api/tle.json' + +export class Docs extends React.Component { + + render() { + return <> + + + } +} diff --git a/client/pages/FlyOver.tsx b/client/pages/FlyOver.tsx new file mode 100644 index 0000000..05452ca --- /dev/null +++ b/client/pages/FlyOver.tsx @@ -0,0 +1,132 @@ +import React from "react" +import { inject, observer } from "mobx-react" +import { RouteComponentProps } from "react-router" +import { Observer } from "../services/Observer" +import { FlyOverStore } from "../services/FlyOverStore" +import { formatDiff, fromAtom } from "../util/date" +import { GeoMap } from "../components/GeoMap" +import { Link, List, ListItem, ListItemText } from "@material-ui/core" +import { If } from "react-if"; +import RoomIcon from '@material-ui/icons/Room'; +import Tooltip from '@material-ui/core/Tooltip'; + +type RouteParams = { + id: string +} + +interface FlyOverPropsInterface extends RouteComponentProps { + observer: Observer, + flyOverStore: FlyOverStore +} + +@inject('observer', 'flyOverStore') +@observer +export class FlyOver extends React.Component { + + public constructor(props: FlyOverPropsInterface) { + super(props) + + const { flyOverStore } = this.props + + const { id } = this.props.match.params + flyOverStore.tle = id + } + + async componentDidMount() { + // + // let flyOver = null + // if (tle) { + // flyOver = await TleApi.flyOver(tle, observer.position) + // } + // + // this.setState({ flyOver: flyOver, data: tle }) + } + + componentWillReceiveProps(nextProps: any) { + if (nextProps.match.params.id !== this.props.match.params.id) { + const { flyOverStore } = this.props + const { id } = nextProps.match.params + flyOverStore.tle = id + } + } + + render() { + // const { flyOver, data } = this.state + const { observer, flyOverStore } = this.props + + let flyovers = flyOverStore.flyovers.get() + + if (!flyovers.hasOwnProperty('member')) { + return null + } + + const timezone = flyovers.observer.timezone + + let observerTime = fromAtom(flyovers.observer.date) + + return ( +
+
+
+ } + mapElement={
} + /> + + * Click on map or drag marker to change your location + +
+
+ +
+ +
+

+ {flyovers.tle.name} visible flyovers for location +

+
[ latitude: {observer.position.latitude.toFixed(2)}°, + longitude: {observer.position.longitude.toFixed(2)}° ]
+
+ + + { + flyovers.member.map((element: any, index: number) => { + let aosTime = fromAtom(element.aos.date) + let losTime = fromAtom(element.los.date) + let maxTime = fromAtom(element.max.date) + + let diff = aosTime.diff(observerTime, ['days', 'hours', 'minutes', 'seconds']) + + let params = new URLSearchParams({ + 'id[]': flyOverStore.tle, + 'date': element.max.date, + }) + + let mapLink = '#/map?' + decodeURIComponent(params.toString()) + + return ( + + + + + + + ) + }) + } + + + + No flyovers found here. + + + +
+
+ ) + } +} diff --git a/client/pages/Health.tsx b/client/pages/Health.tsx new file mode 100644 index 0000000..701159b --- /dev/null +++ b/client/pages/Health.tsx @@ -0,0 +1,84 @@ +import React from "react" +import styled from "styled-components" +import { Line } from "react-chartjs-2" + +const Badge = styled.img` + margin-right: 5px +` + +const options = { + maintainAspectRatio: false, + title: { + display: true, + text: 'Number of requests in last three days' + }, + legend: { + display: false, + }, +} + +export class Health extends React.Component { + + public readonly state: any = { data: [], labels: [] } + + componentDidMount() { + this.getData().then(response => { + + const labels: any[] = [] + Object.keys(response).forEach(item => { + let dateObject: Date = new Date(Date.parse(item)) + + labels.push(dateObject.toLocaleString()) + }) + + this.setState({ + data: Object.values(response), + labels: labels + }) + }) + } + + getData = async () => { + const response = await fetch('https://tle.ivanstanojevic.me/api/tle/hits') + return await response.json() + } + + render() { + let data = { + labels: this.state.labels, + datasets: [{ + label: 'Requests', + data: this.state.data, + borderWidth: 1, + borderColor: 'rgba(53, 134, 77, 1)', + backgroundColor: 'rgba(53, 134, 77, 0.2)', + }] + } + + return ( +
+
+
+

API Health

+
+ + + +
+
+ +
+ +
+
+
+ ) + } +} diff --git a/client/pages/Home.tsx b/client/pages/Home.tsx new file mode 100644 index 0000000..b7d5106 --- /dev/null +++ b/client/pages/Home.tsx @@ -0,0 +1,199 @@ +import React from "react" +import { TleSelect } from "../components/TleSelect" +import { Tle } from "tle-client" +import { TleBrowser } from "../components/TleBrowser" +import { TlePopularProvider } from "../services/TlePopularProvider" +import { Button, Link, Typography, withStyles } from "@material-ui/core" +import styled from "styled-components" +import { device } from "../util/responsive" +import Satellite from "../services/Satellite" +import { If } from "react-if" +import { SatellitePosition } from "../components/SatellitePosition" +import AbstractTlePage, { AbstractTlePageStateInterface } from "./AbstractTlePage" +import RoomIcon from "@material-ui/icons/Room"; + +const styles: any = (theme: any) => ({ + button: { + height: 95, // setting height/width is optional + }, + label: { + // Aligns the content of the button vertically. + flexDirection: 'column' + }, + icon: { + color: '#5ba473', + fontSize: '62px !important', + padding: 2, + marginBottom: theme.spacing.unit + } +}) + +const CustomButton = (props: any) => { + const { classes, onClick } = props; + + return +} + +const WrappedCustomButton = withStyles(styles)(CustomButton) + +interface HomeStateInterface extends AbstractTlePageStateInterface { + popular: any[] + propagation: any, +} + +const PopularWrapper = styled.div` + margin-bottom: 20px; + + display: grid; + grid-template-columns: repeat(auto-fill,minmax(260px, 5fr)); + + @media ${device.tablet} { + margin-right: 100px; + margin-left: 100px; + } + + @media ${device.laptop} { + margin-right: 100px; + margin-left: 100px; + } +` + +const CenterTitle = styled.p` + font-weight: bold; + text-align: center; + margin-bottom: 40px; +` + +const PopularItemWrapper = styled.div`` + +class Home extends AbstractTlePage { + + private popular: TlePopularProvider + + constructor(props: any) { + super(props) + + this.popular = new TlePopularProvider() + } + + readonly state: HomeStateInterface = { + propagation: null, + data: null, + popular: [], + } + + componentDidMount() { + super.componentDidMount() + this.provider.search().then((data: any) => { + if (data) { + this.setState({ popular: data }) + } + }) + } + + onChange = (tle: any | null) => { + if (tle === null) { + this.props.history.push('/') + } else { + this.props.history.push('/tle/' + tle.satelliteId) + } + + this.updateTle(tle) + } + + protected updateTle = (tle: Tle|null) => { + if (!tle) { + return + } + + this.setState({ + propagation: Satellite.sgp4(tle, new Date()), + data: tle + }) + window.scroll({ + top: window.innerHeight + 64, + behavior: 'smooth' + }) + } + + public render() { + const { data, popular, propagation } = this.state + const { history } = this.props + + const classes: any = this.props; + + console.log(classes) + + return ( +
+
+
+ +
+ {"TLE +

TLE API

+

+ API provides up to date NORAD two line element sets for number of Earth orbiting satellites. Data is + provided + by CelesTrak and served in web application friendly JSON format. + A two-line element set (TLE) is a data format encoding of orbital elements of an Earth-orbiting + object for a given point in time. +

+ + Recently popular satellites + + {popular.map(item => { + return ( + + {item.name} + + ) + })} + + + Search for satellite of your interest + +
+ + {data?.name &&
+

{data.name}

+ +
+ {/* {history.push(`/map?id[]=${data.satelliteId}`)}}>*/} + {/* */} + {/* Map*/} + {/**/} + + {history.push(`/tle/${data.satelliteId}/flyover`)}}> + {''}/ + Flyover + +
+ +

Latest two line element data for selected satellite

+ + + + + + + +
} +
+
+
+ ) + } +} + +export default withStyles(styles)(Home) diff --git a/client/pages/Map.tsx b/client/pages/Map.tsx new file mode 100644 index 0000000..e3d8845 --- /dev/null +++ b/client/pages/Map.tsx @@ -0,0 +1,226 @@ +import React from 'react'; +import * as satellite from 'satellite.js'; +import { twoline2satrec } from 'satellite.js'; +import { fromAtom, toAtom } from '../util/date'; +import { GeoMap } from '../components/GeoMap'; +import Marker from 'react-google-maps/lib/components/Marker'; +import { RouteComponentProps } from 'react-router'; +import SatelliteMarker from '../components/icons/SatelliteMarker'; +import { TleApi } from '../services/TleApi'; +import { If } from 'react-if'; +import Polyline from 'react-google-maps/lib/components/Polyline'; +import { IconButton, InputAdornment, Toolbar } from '@material-ui/core'; +import { DateTimePicker } from '@material-ui/pickers'; +import { DateTime } from 'luxon'; +import { MaterialUiPickersDate } from '@material-ui/pickers/typings/date'; +import AccessTimeIcon from '@material-ui/icons/AccessTime'; +import { getColor } from "../services/ColorPalette"; + +interface MapPropsInterface extends RouteComponentProps { + +} + +interface MapStateInterface { + satellites: any[] + data: any[] + date: Date + params: any +} + +export class Map extends React.Component { + + state = { + date: DateTime.now().toJSDate(), + params: new URLSearchParams(), + satellites: [], + data: [], + } + + public static getDerivedStateFromProps(props: Readonly, state: Readonly) { + const params = new URLSearchParams(props.location.search); + + let date: any = toAtom(new Date()); + let dateFromParam = params.get('date'); + + if (dateFromParam) { + date = dateFromParam.replace(' ', '+'); + } + + return { + date: fromAtom(date).toJSDate(), + params: params, + }; + } + + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean { + if (nextProps.location.search !== this.props.location.search) { + return true; + } + + if (this.state.satellites.length === 0) { + return true; + } + + return false; + } + + componentDidMount() { + this.componentDidUpdate(this.props, this.state); + } + + async componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any) { + const { params } = this.state + + // let result1 = await fetch('https://tle.ivanstanojevic.me/api/tle/25544/propagate?date=' + dateParam) + // let response1 = await result1.json() + // + // { + // marker: { + // lat: response1.geodetic.latitude, + // lng: response1.geodetic.longitude, + // } + // } + + const date = this.state.date; + + const requestParams = new URLSearchParams(); + + if (params.getAll('id[]').length > 0) { + params.getAll('id[]').forEach(item => requestParams.append('satellite_id[]', item)); + + let result2 = await fetch('https://tle.ivanstanojevic.me/api/tle?' + requestParams.toString()); + let response2 = await result2.json(); + + const satellites: any = []; + response2.member.forEach((member: any, index: number) => { + const satrec = twoline2satrec(member.line1, member.line2); + const positionAndVelocity = satellite.propagate(satrec, date); + const positionEci: any = positionAndVelocity.position; + const gmst = satellite.gstime(date); + + const positionGd = satellite.eciToGeodetic(positionEci, gmst); + + satellites.push({ + color: getColor(index), + tle: member, + groundTracks: TleApi.groundTracks(member, date), + marker: { + lat: positionGd.latitude * 180 / Math.PI, + lng: positionGd.longitude * 180 / Math.PI, + }, + }); + }); + + this.setState({ satellites: satellites }); + } + } + + handleDateChange = (event: MaterialUiPickersDate) => { + if (event === null) { + return; + } + + const { params } = this.state; + + params.set('date', toAtom(event)); + + this.updateUrl(params); + }; + + updateUrl = (params: URLSearchParams) => { + const { history } = this.props; + + history.push({ + pathname: history.location.pathname, + search: decodeURIComponent(params.toString()), + }); + }; + + onChange = (satellites: any | null) => { + const { params } = this.state; + + const objectParams: any = {}; + params.forEach((item, index) => objectParams[index] = item) + console.log(objectParams) + + params.delete('id[]'); + + satellites.forEach((satellite: any) => params.append('id[]', satellite.satelliteId)) + + this.updateUrl(params); + } + + render() { + const { satellites, params, data } = this.state; + + const labelSize = { width: 220}; + const labelPadding = 8; + + return ( + <> + +
+ + {/* satellite.tle)}*/} + {/*/>*/} + +
+ + + + + + + ), + }} + /> + +
+ + } + mapElement={
} + > + {satellites.map((satellite: any, index: number) => ( + + + + + + + + + ) + )} + + + ) + } +} + diff --git a/client/react-app-env.d.ts b/client/react-app-env.d.ts new file mode 100644 index 0000000..88e9c03 --- /dev/null +++ b/client/react-app-env.d.ts @@ -0,0 +1,2 @@ +/// +declare var google: any; diff --git a/client/reportWebVitals.ts b/client/reportWebVitals.ts new file mode 100644 index 0000000..49a2a16 --- /dev/null +++ b/client/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/client/services/ColorPalette.ts b/client/services/ColorPalette.ts new file mode 100644 index 0000000..7a55cee --- /dev/null +++ b/client/services/ColorPalette.ts @@ -0,0 +1,16 @@ +const palette = [ + '#74BD8C', + '#fc8080', + '#fdbc3a', + '#f2d3d9', + '#b3b6c5' +] + +export const getColor = (index: number): string => { + + if (palette[index] !== undefined) { + return palette[index] + } + + return '#74BD8C'; +} diff --git a/client/services/FlyOverStore.ts b/client/services/FlyOverStore.ts new file mode 100644 index 0000000..7652976 --- /dev/null +++ b/client/services/FlyOverStore.ts @@ -0,0 +1,21 @@ +import { makeObservable, observable } from "mobx" +import { promisedComputed } from "computed-async-mobx" +import TleApi from "../services/TleApi" +import Observer from "./Observer" + +export class FlyOverStore { + + constructor() { + makeObservable(this) + } + + @observable + public tle: any + + public flyovers = promisedComputed({}, async () => { + return await TleApi.flyOver(this.tle, Observer.position) + }) + +} + +export default new FlyOverStore() diff --git a/client/services/Observer.ts b/client/services/Observer.ts new file mode 100644 index 0000000..daa60eb --- /dev/null +++ b/client/services/Observer.ts @@ -0,0 +1,78 @@ +import { LatLng } from "../model/LatLng" +import { action, makeObservable, observable } from "mobx" + +export class Observer { + + @observable + public position: LatLng + + @action + setPosition = (position: LatLng) => { + this.position = position + + this.persist() + } + + constructor() { + this.position = { + latitude: 0, + longitude: 0 + } + + this.restore().then(data => { + this.position = data.position + }) + + makeObservable(this) + } + + protected getHtml5Geolocation = (defaultValue: LatLng): Promise => { + if (!navigator.geolocation) { + return new Promise(resolve => resolve(defaultValue)) + } + + return new Promise(resolve => { + navigator.geolocation.getCurrentPosition((position => { + resolve({ + latitude: position.coords.latitude, + longitude: position.coords.longitude + }) + }), () => { + resolve(defaultValue) + }) + }) + } + + protected restore = async (): Promise => { + let json = localStorage.getItem('observer') || '{}' + + let data + try { + data = JSON.parse(json) + } catch (e) { + data = {} + } + + let result = { + position: this.position + } + + if (data.hasOwnProperty('position')) { + result.position = data.position + } else { + result.position = await this.getHtml5Geolocation(this.position) + } + + return result + } + + protected persist = (): void => { + const data = { + position: this.position, + } + + localStorage.setItem('observer', JSON.stringify(data)) + } +} + +export default new Observer() diff --git a/client/services/Satellite.ts b/client/services/Satellite.ts new file mode 100644 index 0000000..3fa7191 --- /dev/null +++ b/client/services/Satellite.ts @@ -0,0 +1,36 @@ +import * as satellite from 'satellite.js' +import { Tle } from "tle-client" +import { toAtom } from "../util/date" +import { TleApi } from "./TleApi" + +export class Satellite { + + public sgp4 = (tle: Tle, date: Date) => { + const satrec = satellite.twoline2satrec(tle.line1, tle.line2) + + const positionAndVelocity = satellite.propagate(satrec, date) + + const positionEci: any = positionAndVelocity.position + const gmst = satellite.gstime(date) + + const positionGd = satellite.eciToGeodetic(positionEci, gmst) + + return { + tle: tle, + parameters: { + satelliteId: tle.satelliteId, + date: toAtom(date) + }, + groundTracks: TleApi.groundTracks(tle, date), + geodetic: { + latitude: positionGd.latitude * 180 / Math.PI, + longitude: positionGd.longitude * 180 / Math.PI, + } + } + } + + + +} + +export default new Satellite() diff --git a/client/services/TleApi.ts b/client/services/TleApi.ts new file mode 100644 index 0000000..131c0af --- /dev/null +++ b/client/services/TleApi.ts @@ -0,0 +1,70 @@ +import { toAtom } from "../util/date" +import { Tle } from "tle-client" +import * as satellite from "satellite.js" +import { TleParser } from "./TleParser" +import { LatLng } from "../model/LatLng" + +export class TleApi { + + static GROUND_TRACK_ORBITS = 1 + + predict = async (satelliteId: number, date: Date) => { + let atom = toAtom(date) + + let result: any = await fetch(`https://tle.ivanstanojevic.me/api/tle/${satelliteId}/propagate?date=${atom}`) + result = await result.json() + + result['groundTracks'] = TleApi.groundTracks(result.tle, date) + + return result + } + + static groundTracks(tle: Tle, date: Date) { + const satrec = satellite.twoline2satrec(tle.line1, tle.line2) + + const period = (new TleParser(tle)).getPeriod() + + let dt = 30, // time increase [seconds] + TO = Math.floor(period), + timestamp = Math.floor(date.getTime() / 1000), + half = Math.floor(TO / 2 * TleApi.GROUND_TRACK_ORBITS), + T1 = timestamp - half, // start time + T2 = timestamp + half, // end time + result: any[] = [] + + while (T1 < T2) { + let time: Date = new Date(T1 * 1000) + + const positionAndVelocity: any = satellite.propagate(satrec, time) + + const geodetic = satellite.eciToGeodetic(positionAndVelocity.position, satellite.gstime(date)) + + result.push({ + lat: geodetic.latitude * 180 / Math.PI, + lng: geodetic.longitude * 180 / Math.PI, + }) + + T1 += dt + } + + return result + } + + flyOver = async (tle: Tle | number, position: LatLng) => { + let id = tle + if (typeof tle === "object") { + id = tle.satelliteId + } + + const params = new URLSearchParams() + params.append('latitude', position.latitude.toString()) + params.append('longitude', position.longitude.toString()) + + let result: any = await fetch(`https://tle.ivanstanojevic.me/api/tle/${id}/flyover?${params.toString()}`) + + return await result.json() + } + +} + +export default new TleApi() diff --git a/client/services/TleParser.ts b/client/services/TleParser.ts new file mode 100644 index 0000000..29b89bb --- /dev/null +++ b/client/services/TleParser.ts @@ -0,0 +1,119 @@ +import { Tle } from "tle-client" + +export enum LineNumber { + LINE1 = 1, + LINE2 = 2, +} + +export class TleParser extends Tle { + + getLine(lineNumber: LineNumber): string { + if (lineNumber === LineNumber.LINE1) { + return this.line1 + } else if (lineNumber === LineNumber.LINE2) { + return this.line2 + } + + return '' + } + + getLineNumberRaw(lineNumber: LineNumber): string { + const line = this.getLine(lineNumber) + + return line.substring(0, 1).trim() + } + + getLineChecksumRaw(lineNumber: LineNumber): string { + const line = this.getLine(lineNumber) + + return line.substring(68, 69).trim() + } + + getSatelliteIdRaw(lineNumber: LineNumber): string { + const line = this.getLine(lineNumber) + + return line.substring(2, 7).trim() + } + + /** + * Line 1 Data + */ + getClassificationRaw(): string { + return this.line1.substring(7, 8).trim() + } + + getLaunchYearRaw(fourDigits: boolean = false): string { + return this.line1.substring(9, 11).trim() + } + + getLaunchNumberOfTheYearRaw(): string { + return this.line1.substring(11, 14).trim() + } + + getLaunchPieceRaw(): string { + return this.line1.substring(14, 17).trim() + } + + getEpochYearRaw(): string { + return this.line1.substring(18, 20).trim() + } + + getEpochDayRaw(): string { + return this.line1.substring(20, 32).trim() + } + + getFirstTimeDerivativeOfMeanMotionRaw(): string { + return this.line1.substring(33, 43).trim() + } + + getSecondTimeDerivativeOfMeanMotionRaw(): string { + return this.line1.substring(44, 52).trim() + } + + getBstarDragTermRaw(): string { + return this.line1.substring(53, 61).trim() + } + + getEphemerisTypeRaw(): string { + return this.line1.substring(62, 63).trim() + } + + getElementNumberRaw(): string { + return this.line1.substring(64, 68).trim() + } + + /** + * Line 2 Data + */ + getInclinationRaw(): string { + return this.line2.substring(8, 16).trim() + } + + getRightAscensionOfAscendingNodeRaw(): string { + return this.line2.substring(17, 25).trim() + } + + getEccentricityRaw(): string { + return this.line2.substring(26, 33).trim() + } + + getArgumentOfPerigeeRaw(): string { + return this.line2.substring(34, 42).trim() + } + + getMeanAnomalyRaw(): string { + return this.line2.substring(43, 51).trim() + } + + getMeanMotionRaw(): string { + return this.line2.substring(52, 63).trim() + } + + getPeriod(): number { + return 86400 / parseFloat(this.getMeanMotionRaw()) + } + + getRevolutionNumberRaw(): string { + return this.line2.substring(63, 68).trim() + } +} diff --git a/client/services/TlePopularProvider.ts b/client/services/TlePopularProvider.ts new file mode 100644 index 0000000..a23222e --- /dev/null +++ b/client/services/TlePopularProvider.ts @@ -0,0 +1,17 @@ +export class TlePopularProvider { + + private static URL: string = "https://tle.ivanstanojevic.me" + + public async get(): Promise { + let url: string = TlePopularProvider.URL + '/api/tle/popular' + + const response = await fetch(url) + const data = await response.json() + + if (!data) { + return null + } + + return data.member + } +} diff --git a/client/tests/date.test.ts b/client/tests/date.test.ts new file mode 100644 index 0000000..2c55574 --- /dev/null +++ b/client/tests/date.test.ts @@ -0,0 +1,4 @@ + +test('Link changes the class when hovered', () => { + +}); diff --git a/client/util/common.ts b/client/util/common.ts new file mode 100644 index 0000000..94b02e9 --- /dev/null +++ b/client/util/common.ts @@ -0,0 +1,5 @@ +export const PRODUCTION_HOST = 'tle.ivanstanojevic.me'; + +export const isProduction = (): boolean => { + return window.location.host === PRODUCTION_HOST; +} diff --git a/client/util/date.ts b/client/util/date.ts new file mode 100644 index 0000000..eb80186 --- /dev/null +++ b/client/util/date.ts @@ -0,0 +1,32 @@ +import { DateTime } from "luxon"; +import { Duration } from "luxon/src/duration"; + +export const toAtom = (date: Date): string => { + // @ts-ignore + const luxon: any = new DateTime.fromJSDate(date); + let format = luxon.toFormat('yyyy-MM-dd'); + format += 'T' + luxon.toFormat('TTZZ'); + + return format; +} + +export const fromAtom = (date: string|null): DateTime => { + + if (!date) { + return new DateTime(); + } + + return DateTime.fromFormat(date, "yyyy-MM-dd'T'HH:mm:ssZZ") +} + +export const formatDiff = (difference: Duration): string => { + const diff = difference.toObject(); + + let result = ''; + + if (diff.days) { + result += diff.days + (diff.days > 1 ? ' days,' : ' day,'); + } + + return `${result} ${diff.hours} hours, ${diff.minutes} minutes, ${diff.seconds?.toFixed()} seconds`; +} diff --git a/client/util/map.ts b/client/util/map.ts new file mode 100644 index 0000000..bf5a506 --- /dev/null +++ b/client/util/map.ts @@ -0,0 +1,62 @@ +export const styles = [ + { + "featureType": "all", + "stylers": [ + { + "saturation": 0 + }, + { + "hue": "#e7ecf0" + } + ] + }, + { + "featureType": "road", + "stylers": [ + { + "saturation": -70 + } + ] + }, + { + featureType: "administrative.country", + elementType: "labels", + stylers: [ + { visibility: "off" } + ] + }, + { + featureType: "administrative.province", + elementType: "labels", + stylers: [ + { visibility: "off" } + ] + }, + { + "featureType": "transit", + "stylers": [ + { + "visibility": "off" + } + ] + }, + { + "featureType": "poi", + "stylers": [ + { + "visibility": "off" + } + ] + }, + { + "featureType": "water", + "stylers": [ + { + "visibility": "simplified" + }, + { + "saturation": -60 + } + ] + } +] diff --git a/client/util/responsive.ts b/client/util/responsive.ts new file mode 100644 index 0000000..f5dad2f --- /dev/null +++ b/client/util/responsive.ts @@ -0,0 +1,20 @@ +export const size = { + mobileS: '320px', + mobileM: '375px', + mobileL: '425px', + tablet: '768px', + laptop: '1024px', + laptopL: '1440px', + desktop: '2560px' +} + +export const device = { + mobileS: `(min-width: ${size.mobileS})`, + mobileM: `(min-width: ${size.mobileM})`, + mobileL: `(min-width: ${size.mobileL})`, + tablet: `(min-width: ${size.tablet})`, + laptop: `(min-width: ${size.laptop})`, + laptopL: `(min-width: ${size.laptopL})`, + desktop: `(min-width: ${size.desktop})`, + desktopL: `(min-width: ${size.desktop})` +}; diff --git a/config-overrides.js b/config-overrides.js new file mode 100644 index 0000000..605df2a --- /dev/null +++ b/config-overrides.js @@ -0,0 +1,13 @@ +const path = require('path'); + +module.exports = { + paths: function (paths, env) { + paths.appIndexJs = path.resolve(__dirname, 'client/index.tsx'); + paths.appSrc = path.resolve(__dirname, 'client'); + paths.appTypeDeclarations = path.resolve(__dirname, 'client/react-app-env.d.ts'); + paths.appHtml = path.resolve(__dirname, 'static/index.html'); + paths.appPublic = path.resolve(__dirname, 'static'); + + return paths; + }, +} diff --git a/deploy.php b/deploy.php index 422976c..c39f237 100644 --- a/deploy.php +++ b/deploy.php @@ -36,7 +36,7 @@ ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); task('test', function () { - set('symfony_env', 'dev'); + set('symfony_env', 'test'); runLocally('bin/phpunit'); }); diff --git a/package.json b/package.json new file mode 100644 index 0000000..fa6ecd7 --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "name": "tle-frontend", + "author": "Ivan Stanojevic", + "email": "ivanstan@gmail.com", + "version": "0.1.0", + "private": true, + "license": "GNU GPLv3", + "dependencies": { + "@babel/polyfill": "^7.12.1", + "@date-io/date-fns": "1.x", + "@material-ui/core": "^4.11.3", + "@material-ui/data-grid": "^4.0.0-alpha.23", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/pickers": "^3.3.10", + "@sentry/react": "^6.2.5", + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "@types/jest": "^26.0.15", + "@types/node": "^12.0.0", + "@types/react": "^17.0.0", + "@types/react-dom": "^17.0.0", + "@types/react-router-dom": "^5.1.7", + "chart.js": "^2.9.4", + "computed-async-mobx": "^7.0.1-beta.1", + "core-js": "^3.8.3", + "date-fns": "^2.23.0", + "luxon": "^1.26.0", + "mobx": "^6.1.5", + "mobx-utils": "^6.0.4", + "react": "^17.0.1", + "react-chartjs-2": "^2.11.1", + "react-copy-to-clipboard": "^5.0.3", + "react-dom": "^17.0.1", + "react-full-page": "^0.1.11", + "react-google-maps": "^9.4.5", + "react-if": "^4.0.1", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-scripts": "4.0.3", + "redoc": "^2.0.0-rc.48", + "satellite.js": "^4.1.3", + "styled-components": "^5.3.0", + "tle-client": "ivanstan/tle.js", + "typescript": "^4.1.2", + "web-vitals": "^1.0.1" + }, + "scripts": { + "start": "react-app-rewired start", + "build": "react-app-rewired build", + "test": "react-app-rewired test", + "eject": "react-scripts eject", + "deploy": "sh bin/deploy-frontend" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@types/luxon": "^1.26.4", + "@types/react-copy-to-clipboard": "^5.0.0", + "@types/styled-components": "^5.1.9", + "react-app-rewired": "^2.1.8" + } +} diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c50dde6b20aef21e35ecf162239dfdbd52da9a82 GIT binary patch literal 15086 zcmdU$ZEzLU8ON6bb+pAQV|AwEOWJA2jtWwzLUAOhB$O+f7s3!sYy^Rj!~nt2k!h6# zBnbr23Z(=KN{T=z5#>cGDm6Ny{i+U@Po1FB55CmY@okhn+uyVIp4-i`ckkZ4yP;*~ z$JyPp=RE&&?s<04p6A3ch8e?+apMfq0;A_AhB4kSjDmvH`9+5D53XHAD*1II45OVJ ze#$)*G3J0=xBvY(nZ*77{9U(?fGO}Yybjah+i}~?w|+DZgKJ)~7Z z+KHn)x-N$Yp&ztvclthgtDztc4Poj;%f(O&Z-NPK&F*u>J@3F`xFn3tD9T{_d?`wr*84hYhg2d1le@u zn*RxPZik;iq&`l4S3nD#f?RdwdjDx`w8M{rj0eAasADwL!CN4Hm#dbr_lvEQ&;;N2 z)995)nG0YByaHi-GpufRxii>*1F9gak8{sRD1@gW3g2|=341O+ei(|u)5quRn0hsN zTR`5GVeQ0SZeZT7#FOluzR|-q<5CN^7%To?pU+6;n=Tx z*1gm`=ozc^OB+f$#;cjXyVr+Ym~>ZU@gQb$0|l zF1p1xo5VMd)Z4!4)8|^dqSd` zRS4g7YxO#hO@F!_>nEz3ZN+9&Z>6~^H{bNq>%JD7{yW-!Zom7gH%?Ix?7PSP-gN5- zdmfwq%10-wrMvGkJB}_<8~&Pp--p$isa&M`rO#)szggYaU16?%zA;YSx;>HT7v1G+ zC#u?QC1&fPI{TU8m}6;Main?a7u}_6CaAev66S-?%va21tr*9OSNlWh*S>l8rlO>8 zzQ~+5zA^5lTVD&MUwrfa-Boe>rq<|}2G*~Av$1=o*>+^nx$19sTe9l6eX}#^n=231 z52bIqwR)Xr)Svdvu7vr}vkT6JZ+hus;gQVPZ0aU=N@C}5q8AX{h*!~+-!6>K3Ajgy$4fXIg zI%)RFHob&r5a&mfGZjH)ltC_XO!D83#M7h>A-o(v~PGa zl{`3O7?UL(FpTd>+HV-cC2eJY5vh{Kw;0A(l3ryP{gR$%7=4ls|Nl+(p^&a^TLxEFwKF8E0dnFcv?3FOVCnjp=$vXQ9 zXoS%Fm?*3FI`nZIX0L>WAbvTYIINocr)l}t?OQ$->#>N# zT5U%g7i;^(CK@C@A#qgpN~oCPsItdFIpV0x-1c>hq=GmodmR*e9emr9?YH`G9JEq- z#6dIK7ag)@!(Ii&*zk;-WwR~$$v9@MVvm9BjnH!zo%-6>eUaL0pmN!3(6F~$;*cs! z95Rr7ts}KpKxNu1kd7lBs8Jm+1d1c(WMAt@#Q_G_AehdGyT z>@lzf;#f!fgnGBZI2bhl(({0n4q59igr^~@b+CifH3b5HBXO^+RnLG|Aj~?JtZyHO zN(emvcJ@W8KSoo&4&H(w?>D*U9asdHxa$jhPF+{P3OEIs#+s}nJq!h5?f8|WUKyj; z!tdcj&^lziZiTUsacue3ol71zWQ-Prj1BpXZ->BR%W2DArjexsSw=`LDacZTEIahE z!V(2iS9MJ0i@R{_*=6e|Cr;-I>c0X6<&jBkntN&*U3Hdt*8Iy z<3o=1JYW9)L%#pUfamYX^&o$9A?pCEfEBCczv`{GjhgqA{r5<3b3MqMo_i7}7VMf{ z-@N~>3(Gnu6jg329AF-KxuS*JO9zMt+wJoB9@Fi0 zr=QaQiRL}kqu39$kXUlin4dg{Pe21)sK+74S3(Q;JxAXoe-)(1uP!es*X21VF|WXGNzRFHV=YcLHw{a3ZHR*ISdS^H((x0NWnA99b}D`lkYe*n3B BoM`|6 literal 0 HcmV?d00001 diff --git a/static/images/logo.svg b/static/images/logo.svg new file mode 100644 index 0000000..a8d9550 --- /dev/null +++ b/static/images/logo.svg @@ -0,0 +1,9 @@ + + + + + logo + + + + diff --git a/static/images/observer.svg b/static/images/observer.svg new file mode 100644 index 0000000..253ec81 --- /dev/null +++ b/static/images/observer.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/static/images/satellite.svg b/static/images/satellite.svg new file mode 100644 index 0000000..c61c644 --- /dev/null +++ b/static/images/satellite.svg @@ -0,0 +1,4 @@ + + + diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..0ea2118 --- /dev/null +++ b/static/index.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + TLE API + + + + + + +
+ + + diff --git a/static/logo192.png b/static/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..bc75d815184f41d5a89ce5b79abc58fced82473b GIT binary patch literal 6521 zcmZ`;XIN89v^^n(5=!V&LRW%PrAd)yKzazEGyx-mq6moeW39|tJz+q;JwFO(s z(T4>Ae%sQ0n85~i&Ctpa0IJfF`vf@nTf)QC)(QZ^PXGWh4ghw+N5nY*2vP=s`O5&H zodp1b{yFt{U9baj#o{~`I6QjiH@$uWK4A_tvodC$W)fymlFV~&iUELQ!e&@Q`_SRV z7fvKmho}cFE*D&zwk*G053YjWp$RG3=0&(Cg*Yc6i=)BgM5Ecp~7uhJ1g&2cI@(%)M0(V-Av$d3qi$#<%qB%M+XE{%4chLRgr4lwp@x8=;|`UfXvh)%@9Oq1%pKHDXCSG3?31aj<-j{`MVKhA~AargQ%8 zIH%rrC?@7vU!y{j zR4AKQ%3Tg+{?&9j0(M8hMjztp@{?z&cAp>b9*vWR48oabISDRe(F{w1SI{ODSJ1Q- z#J$bF5^bZ;tUzu=$^bfyw!2|m!?u_2YdR3_>wKG;h!r`}PD}?voDCOSDFGlasrd2d zx#yTFtw2bpQy9$&i%4Hb*fD%FdRuqSvl1N9KyJ1=dk>ax%-KB(V-TY`XLt|IX?)i- zZQuv|($sN8HN+WP2bTc^e=_KjHW;AK(=Y1zXDjpXh5p5P zXBlAjXItGlAJoH7&s$lRTw*NdQX^_$kpl0@kuWE`o>J3F=K^L!MbAJi6z)~K=0ZdV zjRaF}GYTm$oJ%InJ1gfNnF7y?Lk?v8wM_gEfrRs;6|Ov&bD2Iu^X$x(;4xpU?#hta zc>qQZKYbih!R&^ZBKtagwT}_^!0x!@n@drlV#M%v2Z~+HO_f+3?x2QY8e&C(AwZ+y z|Aibx8{AWV2sr~LkxosDyT~ZA5h7jNqH%f4Lugy~)!>pM!k)zZOYp$7^{-tD;{eel zS4;RK;V-+w&C$+x@4|IW6y*B+wjARNg@c0p71hd-3~Xz84X>+ag%`%K7>zUMkL`G5 zovr-=bpVEnNB%A9C+1zo?kL;zVSMK&`;wYD44NigDBqQ1_na^5&IfO>c+$r1Z9(*z zN+By_dXZA=t^j8@`jeCdC0umHgoap`-I%NnCi2sKKa40FheWqnY#;MK?@9`4ffdX`SC;Bp3QgF-ki(>Fl>mD2$iOuiMTy7-gr5dx9?Hq{eFMf2jfi8(^{!A8 zp>0kR(p?sxjVmnSCjl@!3)C@RCSx?AevsT_K@EtU3ykDr_yhNFOHzasV1;xlq?E<{ zCc3v<-eDVUWo1lK(3muG#5q!fHgNZBNCIVFC6${V!u0Jt?4wI>mNZ%)h-7;cHn(KA zSg!$C#qLGYXx$bnhNyaRu5DZj<}L@uC?qN12b>ZZ=@}D!!mD`g#${apB2Vx?CzKz^ zm2X3Ae$}7?tpMLQN>||~H^$?*>9W{SMM=H^q7otP?xA?SDM^}((ptB5`O?MZR?BN{ z%(_r+dh`_GvcNWKZqLA2k@^Up@9iafPiWjdU1+&os!7_Yp_g)&!W@GuA=(Wmb#qCv z8Z@mnP?ia>t>Xy{PGPYX_bfuMLyQq$(GN6-fnDP2d*yR490)U;@vTKnk%HhBD*Q~Q zKLSK^8d#CW1}ict^k&x3$o2}`IXD|7GscB~-#)~YG$KsAH?C#B<2J%aYC~@}{pN-{Z*p@Smm0haVs6ngi z8NcTeL6F?I2!OfRgo!lpRC(~#EuEWg-7Ic_Qu7yIAuxDVf_8sC&mG?UUEs_K5+7pw z)+!m=0uB=NNaGcZD_&872Y7HW1}mpiK>ve zY7F)N{IkWgtX^G}gsyih7%T2o#k-eCTp~)%d`P-i@Fv$-c0<>%c(LO`s#Si{qMiP>IG_mBrNbl#wb& z+EWP@S4)d!-{v_|ku6&h&9vkLK4~;$UvKtn)A{``(_e0&V1|?9umZuMfqrmAd3E*0 zOLu-~4%~b6liP23$}OXFO0@GGNtZj$&Ex!?Epxe8iAsS?!O`l8=lXi5-CpEo)%2Bo zI49`yo-gj=(7zKIwrtY%73FVtJfuCUpCt;NdSR}^R;0!QlMEkr zYaK#OKUtG4V8{qR!TT8=RcGAqH(9=f-Yu;|2m2Dh$+q3sS9O-E~QdA=nwkpi{ z7D@BU`E>DAblp}$OQj519(!IU+mU2@{lf)}0KLyd?km@HQ`3_OV^Vw??=QuQ`xvEi z`MUTkt>Pj=WmY(AmuL1SSf@D_*Q!*!T>NarW=H&!0dvBayg^m`3*kH-yuh%v11#V0 z97$YvC%@@K{ghQY&Y^uP0fSsDbiw)Ch)kyrMsd++#p-5Fm0Q%5$nqcJE5e!7?3Ncw zE8P;*v0+{T_kYqW6W*bOT}6lpb2%ooqeYp8FQJLCEHpIPWl1ZxbjCUjo^=%`A~^7R z)&5jBCzn4b+PafYzhgEWlswCOWK~*Sy4KV2pqu1|OR+vvaf&SOljobkxM(xo6|gV| zJwGbFCB`}k!JY zx(3pM>=T4s&nJD_irQPB@Q$dioPXhjw+8)7w{nN)w+i9)Hf*Ad!%DTAuYF2vxXtbP zQ#9Nu*2OU6)bwC4^KwW!{f^9;rqKHNy`z=Y<~n5!RH-SE_Eq*N8B0oVWF6ekE1*qW zOgPx5QvfgKzpDpu2xo6({&+fSRH8`bRXv&Ap=~aw^{=miP!^yT`Vy1AEcDho9hZ#Z z!axQ85Vu0@ghS^(z|HO`9{Lm@U7(Px-NMg>U`D1;Jp-huQAsd{%JqcR{l3N~=Sv$WOk_*#c!%ndvOGO>b}M8OqeE_sX7-jq^e~8pTW3B+4A!!R!-LV z)8xpBtca;x>D{S)Gwx|I116NzHEfv2+0C-amVl+^E#JG|o@Q>Cu`gdy#T;tbFffu8 znFD_x?I&oesz@vGEgQ)Iw?KqQ3*@FVp-WsG{ni?nfC=H{A#(bgkY;f?VFlY$gD+qB z^QPrEaw|*#XmE5pPBdh>epWFm;Lp`BT#@b_pCwLDvGx#zUo_c{Oa$J}RVbTDeYF;S zBKNj@k$jj~pa84EwcZ+!y+q4C+||c5o-T<2<(5S@tf&8c(0oiSdzl@`ciOXGP6j}K zdZ(bDYaQBQ*;nI{X7L2ZtX;{LL2ke+?A2i_v>yxCOjy$mv2}~4z;KE!HN@_={xho* zN8MoScKz8yf>+AL&a#W%Wm8CfcNA}UDGQVo4d5%ml|CENXh%eTvC_S^94?RgZWih0)uXm$!B zE+>ctguC}Fbhs+xI9XJRhq$5~n{Bn57}!_kbMrO&knYDeU{bx{JD_pTQg<>n3G*Nc zCIOQlS)KS5mq&Z)qvMqqlG9?xmtS3zltFf>c>4E}luOs^)r&^hupg#CaLhZBI8L}V zNKvA;;BO;%G+q>(CU8%?N@@DaV)$zlvodMEF8=3k8g^}UCj{uJH>#7qYNbsN+B#RA z1@q}Mi?3qQWXHBIOjCZItSioU%GggvU5eajB?FY>1?i+bQ&}TkI;u*eG<(Tw@#@3d z-^WbD<4D||B^&iDJjCS7FwI}G@6ASnKMB$+&qz~Uj(@x~vVJGg#|pbMVG4AA7HaJ( zB2Ct~gBUb(q^ajR3U26W`Lr)&Ef|Kf%K+&Ha{T}BRAka#`SYqg=tlZp&$L}Td#&Vy z&s&FqrpS}->SXy-)Glx)@{3TKg{R%HRU6uK!>9eO%#F^nHfzDzAi{gcn_x1Iz>W7czw|B@Ctx&HdLWfPofa>jM3Xz=nwB6D)eF~nhlWj0`W?TL z7{fmu!%jTn@%a8#jUl^Ok>L$!Gv`8eSFG#s@XGxs=l=cKU%AMckKwWhx09GEKj`J5r#}WG z^)R3>&Npv1DN^h71gD#k6sJ}zx%Qx!lglVLES+asa-@2+nP9MB$;gPCsN*aE1;Y!BDuU)Ud zAhhqUJCK1}N6^5-fh<}3r&vU0A?H20@z*t8AuxISg2;6B|3H2RL2|b)%JP*eQjH@# z%IHC4(Jlv>CrO+QUSeEk1C#%gD>{~?-^@JZ`LQVt20Y3WA%)ov9sYX<1 zpaaQY&zo9f?jo|}74-dEo9dXU_S?r*SKG05(vZse*zB*b9%kq<+h-0L^{G zFKpcGB46q{@vi1O0?(-f4BtkBfr0LW@I*~rJ8GJ|P^VWEF zvQ?nOgl}b(g5Yj_|JHA;#s3(ytPPm>^SYhR{@}xXslZANTjwY^T>xU@`WZi=!%1YR zK=DVrl74(Nk8VE5Rcjx6hVeU0<^w4UFY!sr0=v{vb@S$&qz-*Vf=fy?rO=hp;suc?r zllb?Ak!&xe>8Pr5c6`kg`&1|T9{Ss8OJK0R09&dU)D7Cm5sG+MXmMR%HUQ@#?}CVy=0)z;gpbHjTR1N< zH?j@#c17{*rdV~eEp2(@{aqy2SL09MqxDv-Q!uY}?&QVkeTE(&YvJ1`i>2mnrLQSr zUFJhJqxPLE!HR~c-3sI4Yj|V6XW#8qiC+0=E<{H%##EvC7*#KT9c7 zIahd1iY%X#_dq3fPcmMw6t5#dzc^Gv%VJcJw{d8{5AP69@u5zJObjlOr#J znQNOXg%OR$82vs~OW+w2yE_ z6A@Nq-Pobj&EOPFXWRbLPeag2*clT+7T;6rSU`9odo=wWpLS0=bc|&mZbFKf*WOLx zXRIA-{VRl8H){9md4hiJZM@@6sixfI#xJRPGDg5YZkxrTwDEjd@X9R)V-8g`A-N;2 z7Wz8m*+HXIxapq_SnKWlT?&q_-Q}HI!B}UwtOW^)5sr@bz=ai z*q(xX-~=+55BQ|1Er|&M$8-TYYot8^{at4;a;$va>OYV;x%bwuNT8}D7J6!BD!Ori zvywfMvlhMXnjdZsuH>f^FC^d%pD#Ivk47tl;#7DX2g3zKs+m7OqBkDBcpen9=GJck z!fJ`Deqe<@ZJ;m@y+Pbwcnx3n67)kO0Ul*EgCdD26bqE3ls zJccxgTV(yBji`Ljj*_h{S2k@~IbY=$tbe`8X4e)}O4XHxKpoAJRkgVVE?ui$>c6dU z@5c^-0_~yXIL8$J)B-h-42n(vBHOc*D{nz}G%5>-e(a3b(W*Se6Z2^g0maV=tKtKP zW1X-psp^rKZ#Nxl9;S^OFs-nNNm3mMxh&sK>}Mv0#Cl|{PU%1`^smEjC|A%R0(xE_ygU3idciy@<>y^6@Z$i{tU4sJ+=Im zxHHYqw0#`HLv*bKd5h_DbhaW0^lm~k`^NU_fk@#ytDlrmt)u)rM3k~$H#Vj@4h#@_ zHQlLQR4M{FLqp@V50)MQai*hOK9(_~I?C{n&kg%EU}{8(&m8;n?&5PlH-%Uc1P@We zhRaCQE+7i}3Z_%nU ziT*u6Fm7+$RRr9jzVHKHZhD#|WKP+Nynl(|M-*a+D?>26l%JZWv&(#kTx9yt_s$lo zI{3%I@jzq8z^jBnPi>C?Pp|<_E1y=zks8plUtAHTVdk+CrI*O>ER6#_gND=7}REi?f zq?ZH%=@6ua{wCc2dmrBKe(-80=gjPxz4qFBuSwhu!>gxgIcXsXI(7Y;)=dZ^1OH0~ zQB#6HHiLfefj=mmH4HQ$sQfYA!5ujGJHNxVn+6aRA`C&82M|OWf|-XPe`yF>w1Xh! zbO>Ve%B(}Ff)6O|^{#3`$E5#q8w*pxzfk#IH_)bfs9*0$)cO-Rr%QAb)}ev`RL2i>V$zguqpNpGTRF5uVqpBte^ipCQX zXW!U-IA7f@7Ddf{r#_oe`KazWiZ@~D!m)6dAl%j2r`ASkynZAs#jqTu_f3p$|jeyC~77SHPTaOdf1MfV@G?|9q60k z4Q#`Vs?UA*gV!K+ic7Gtr{f3IB5QqH=6j9DA8^eE%p)+;ckGt}BA^DShAc>hAdYRs z99Pp29wQDh-4G+BHo?rqfd->AS9`4W>`I~?vdIr%t*ysH$S+vK_vE(l0|MvfG51wkk7TZbgdd2#jJLfvqr7KLKzUuw1= zH)DOv-1Iqu)U;dH{IS1zdCnFFAqYzN*oU5x{qmW13xAH^<04cAd|n_Rtw-N-aEEIP zGdxz)ZLIsW@s@{au>JY&ZXZS>j3A1iPWEnM+`JUlo3p+DSXb*;6d9%i6WYBlluff4 z@4VNn>pd00#b!eo6Ln^VtEX}KK6Z6Sm+;cX(q9Bdh6Qw4>p`V*s#HN@g(Ae@!%Jh+ z_sDDu=c&dQ0u)nJhFx**`1xgH!8|B?X)rsJPT*Anpk%%Gv3l{lzp=e zOq4W=DQ4A%40$J5s8!)e0fjhtWX?!5#k1m_=y6oadTgQ;v6~rWm}@!K;Rnj}@?`|q zw?S>{*Wk@rPswmF56TVEvK?6MDrM~EW6~(MiPas<+zqSEk5D!v5v)h@J}g3Wy$#D2 z83QZg=daiSYuO%_3$&&hOdl`br{DI8r#tS9tid^tX^LUJ@sxD7SxAK;u9DMwY}Wm2 zzHy1CfT7fU=866X1k#kipiK&65{S#1%bpaz^ zinZT7@$}oEx5omOR>TOtAbI@ez8g8RARQUR^2mt8b*+m13|u=P4(zbx@Ofe_)>o7k zy+&z+y~lPCpi53viO<9HU+&*ffJS~6@ED` zGe$Ge`s%7#qTK72CW;_N0xO;)agd@}BNcW`F-{*gYB49mo?%;PN~QhlC0Ln~vfqIq z#5>dd7P-@y+M5F=!iiOgd`y-@wZ`1B($^X>3igDav?rB*U0HmT(zVm7U$NU1&1qzJ zn!DxO1|y|zZIU-3guYv}@9YM8-d4Xn^L^ghF-63CYkdhHM8_TYL;05q{lOac7;2!k zKG-jzJb)3J$&MxC@`nDFvK^YQbH0sLg-yVicHu_}&3m@Qfm9Kqx%+*xAfeXz$%IJw zX61$0U*fcrj#D{@s@?KmpBzui9p|8P3>@+En))-|+;y%rWoO$Cgj;=&s&60;HZNQt zDr0vr8RcQL4iRLV7r~r*H}42n%=VbRkdAAuYilJ~#rxpuF}51;<~zSBj(8OlWvVUH zt|nFmEcl1`-=F{+3K9EDdK(#3lk9DdVfdk5ie^+9Lm0e;Ji8ph#H3&~cL?)IHdj#;?- z6Xuy)LpWxT?p>?=ez^imgJ-}~6HfhWh+L|8Bh4>(4R%@QSBvG5pj7yRI^pB--Z<^> z(2e5xM)vfzoe@W*n-QYnl%kvW@d%^x$iFz3qv@(e#>Z$M8{yt*caV8p@El_;D_&4Chkf?Ce5*vA5}o>o>-aAAR&TSzLJk8#5buO% zVK^ARGG{Tt{N!vdqajDo(6~R3QriXLh_eKS_$ZuIepC*9G6hlCOK@;}&^L4cZ1u5? zwg!hC*o86%9@{VM+^)ftz4Q4)r*r?B3Po&|cQTvT`YMWGJt?#IW+q4epA zlVk+p__0GNsvn1!GCIu5fE86lb?71v*Mhw^0)v!~r&}ZX)+*yN^B{im=~wk1^ZOU@ z!8T`tB)l+rQ|c3>kErxeqz${DxXbY5J{m($3x^i!HQUoVV1+>s*A$Si4)=R0)HzP^ z;B7G(7$c9vol;)9Yt5q2HCt=nohm4@>hD7Y%fX}$iqQYiR>y!gEXE#;;$CbLQ_U#*vhr0)2If}ZefhyZIQ$u-H*A*y#7 zZ;Wr7wiwMEWJ0TN(~-o1x&mGfqOIT6%K;cNj8&Otpe>!$E^pYJc0YCrsk76>@NNrO zK@dyEcmo0VY#VMC2^`f+yO)=1#SVv*JY$ljQsyMvX3Aw6xR;F)AGhD*MJhJx5JfTS zG=HZD|7l8FJ8UlIX7Yt!>kJ+V$x+V@`h4sWf9F#316s5|y#)M-xrUi|vDNi~+Cxam zlos+CJnEc2R$xAbt$A^f7O8NnVQ}XPc5P=@t4*JUc)s-jBSn0>cddQUysu3|Ne_I% z6k0Hr~UDox;uaXE+Ud3Cm?_QqJ>#@CK*QceNl78g9Yj6DS>#W<0Z^} z5_KtbV}n12#gvD!+*_#92o|7){?#09{#x>y;C3~j34#Nfq9?iv&Et|f>=se_%nfkj zgQ~xwZDw2KGu{i)R_I@YD@RZMj2u13T4J1EpJ^2MDgZxudeeOR&$w-@$Jvsgeypo=?Vrjl~Xtt@@snu#YI) zSF$FEkxXA9_#$!|i%Qt7NEkUFw2sOvt|Fke;T+(pu>OZDH0TJ52F^1FS~@60Zz_Bx z_6|ADO{0iD%q)g#6*3{=S?1b)4!=t2$gD$pETdxkq~e$q#7p=BO@xdp&yTb_X-tnJnG&9k??FC zf8vu1CYwzU?46F+ZWYfDP^dF2@re@D@Y7fknepg>#VOQlNSf@kOyrn%FngIE@H%!UT1azwvHs&%PKQj@2+r2(!y*jsGHEE!5;hGPg-!c% z(ONGrc1g0X4mbC7BNvi>@VRN7%Z~FW7nU~{_!*cGGe@vxQA`&bW~l{T$os5w@5V}eq#&gf|HiG*cc=DgF<2m<+d2O7a zK|W1~t%3JcGkf~d&WM)Qul{YV7R$)|L1mopxa#2)V|Kgy@!u{$-G{-PAyd9)Rw|K- zVH|!lezNd&Gaoa@DeGV9$a~W2u#h2};ygR`1+spT<89(;cdP_0x|@6wKA`}z)=Fgr$W<)b@3 z5vN2l-rENW5zye+(C?`*rK}H0&)$R7j6qsXTys z0`+(5kwkC&i<0BX0f)$qe8`KJVWP1rZ|EOceBdsQR+SC-v)1;NE9D_XYJxfUYP-Gv zRs1*-%8b^u9X(H+JvdFELa;>`5LlQO9-qQ{VjjcV*Ueh&(`*X)z2p(luPfhQYe}cCtbU+5;*Bxo0ghL4s7G|-RHl2adJL<5_q+l1| zb#!Jv%q-y%I$6@m89Y|c4@MP6*W9*1gYM2V8xs={_<9!BWFUhgTwoYaXhEBK(gUhf zc6X`j5?c@@K_0JmFDfUtqil?#iPDO3{BB2@1f@IAZ3y4I_vJKZU3D9_FFH9F!Ev4# z7n}Gr6+3~@z`JG`g^#vvK0bbayijrc88^3>QGN;<;% z)PM1*Lk8tXdXgJ#5& z%jDh=H)K1oi6xym(u)PXuEtvbk~w%Rh*q$BLymnd6;6@pJ-@{osV7Rgd%${QmE=Z_ zxn_1}6dA(kzYe8mkJ-6DEEszHmp(Fu9^%_uY)^N=8U1~5>n(Dd2eM)OO@c{gj(e;% zd^J3ZZc~<&W0UlA#01mkW{|d{1kXSW;Vv|?beHZH2XlA{wHAeg=tFV^|j3&-Xpt;*l*v$?997IYSwd!3^bQ2JemHnI$Rc-MziFKb` z+B#+`9jS<5`{lY?_hQ`pio;4mWZ*6OjbO^w?MuweDQMluh&*34 zMl;Z}WWGw3El8}DqM0q1G*9|$R)RlXngCbj&7;y|JLSa0-T{HSz-h$CH3`V`ZBU63 z083^LzcChgGsU)p-4SOer4wNfMt%k=ZCX+`Nh5#jTxssGtc~d2wWZTP2?YXkcJ;_0 z`k!}PcSCdiCxoIesN39lIJa#&$rRqVZAHHxpTpc%Q6nyGGZeVMjgA zM-h*^hDdrquxI%oxa!d7>wc_>4(a?*d6K`J^buv9m`NSedj`F%Y@1V zo7&sS-0j{aRfk8u%;3DZgwsIIUQaK^@dXhh!4u`o)2-iicmIq*u|I5MPaxE^S{%gY5Xl$;NR6jQ4Pac*uQB>|O{6-`ei zf30=C{ctN~ZLg{IJT+M5@{>qf=*A{_NHA}4@yET4q!49eiTJ40=ihraRBaC-;0$yM zUNF0{02EM-2EE&BUq!^v*c>Mq`$VlnR<@){L zXIS{1fU}ADiWk}2^Hj(L0Jhv`C&O+_pRIoWNq6T`kf-NTQe>MO3PBGw%J2gmWOyV1 zxm{p)DA|(F$e1n3v#U_7PB%0ybijd9FnEdEDPw5Z2^k+%#8qU|Xx{x+xbSJ~ZtEwD z_d3~2!L+1T7`Y+IvGUR0brX5W8WirDbD@(ZoiE+0Rk`vpuTpAGtD7qa_);Oofk zsu!yn5xVk9GUf<)NqiLWvL+oR2r3k&eI#OxO<2JA0eGcFu(AC`|^oju4!w4 z1H?7W4oPRC5c=p>CB-Fg5_}Uz{M?oQso}1keC+MO0e$9h=-5y-!&&Wcb%mG|8H()x zW$hnzl=I;+Kp>b?dgTUTc>1?vOAkAXM8FI~WKdq8(~VoyBkOdjS)uXv6U9wJUF|>(*ZH*Sjvce*ZFl#lhpgB>h)u)|W25<_CvI^BN3a%+bFR@HO>hx;iHM2rEC4^DHS#ptuX30j9#u z;gD%q&7v0eZ^|y*LE>dbmZ#)T@t}el1c$?I(wblALS9Fi0WY4dM$8|rF7Dm0kgo4Z z&w0uCm7ktov5pVCCt4qdC(C?=9KQc-Y^SPT%vJ3Bm*p$qXt3;|b4gA|FAiv>owRUu zZL^K-4rhtZXW(_K8Mw3o;rl6b!A*NGu>1EAP{5OxbeoTCrNt%0jHE8NI^~H`h34)I zq|t-Y{DH4vj3O8l)4$-Ccl8AyjlBF&>d4F5wm~foP|wzKf7 zC%8fZ0qwOf_<@i@a`*8~E8jaFEmG~XJu=ClX8;)0by)6k=0!cd9rdsXPj_JNoGj0u z-9L*++flCzv-7G+GRgm4*F0ctZaH$E*6`|UK1$Xik`0%Ua16{oQD)F0qOyEJ&a%tU zzv7jf0fJtwd!v_&9K2i;0a2zd%>EB;mlpi|>ly)An23BRpH{R`6BiI*(}&rWy#%X2 z+WQ-#tbPHPne%d|Q;1}}nJ-9)o=TysuP>Z&V#w0m^7`L7)>j+-zBb&g%p?Hl2)+Ta zOL|mJh~q+!)v^Xi$m&sk>4F>!{N&kl*I;%X|2vQh4LU`=O0^-fBMQw@86ONEW}hq} zlLwADdpA)gIGYNX$5OlHr6caZUfKL*Vin1IvlGd%gbNcM3d-gGVw+L6-A;wh8UHsB zI9Rm;*bP>th4Q}|R9-~mr>LR^wgw#U0CZPZWBcZPorScDIV6g#`E8U27XZyp?>o+XwF5VNO}khoo&X z&l&uo;tQ5G8#B}U>-?7s96>a9>;HVeA`p~T5@jf{?jkGy8W|_+tr2d&47%VNBq!;p z0rqtmD~hpPF>$`@USOuCs&r;Ido9|SiHVux4lU&Hi`_S5%PT+I(714P|L@M-RF>4& zb3skQVD^c^a0nL9-?QSM4_rOEtIbJSMXui_-SX%80$s;M(#jpbA)yWjrRy)gF{=Kv zE2}Gi^|M=C9?UUHF`m3#u@v-6V-qRi(5}*>l{~wfO*<{2bz(~ZM3?P-1487fqi+C| zOkoCPB%=Q^pvaW>t?pG{o z$!%H<4QaxdQ>OAEerFK$LmF*r8tRrk2Nn89-j59a8PBtnG`4R?0he@42h-j4sxV|# z5Bk$$=k6f(ix5L#J#6LS>2kqbl4aTZSNy-u4&05%Z%X-P*!7v!iEaG*565DSD*ysDVV46E z05biFF;qnqdzP|kx75Pb8K!UKKh)ORGXkGxjOkhw?DIBM*Vi@mW#?GC{WR#N1l)xL z#eE92P{k5GC7n(FK=G&5V;ASDbmZ{MQp1?0HL7<2V^8YGQZH4zqpOnSnkS2$Zw z@G%T7EiD{uhWVlcCdIDKvge~Qu^k?ugP?)`oEosu6tlWiTKw@G@Vu>&g%N4me5@UJ zqcT#UVguNTpPhct;$yGdZS?4oi*vBMl6j`(Pp7v|S5EkdV<9NuUzTZmGB%ET=NXh_ zB1l3K);YHRQ7wr8Yf=y$5e1!qcc4QvYJ&2*e=<>nXChaI{MFpK5zMvH;L~|hL{bM4 z$t&Df?PW%`yW~%az1bS>*Cb2NfyUvZhy8}51^aw;&GmKVFC>3T{+@d~_XYWT5xC*T zYlvSn-%KrW=$>4|V0g)|e~Uh$xPvAV51~La<&hR^PU@;uZna^WQ8GPyjG`Muwr6aNw;9Q3NpmiER$}+w-^%e^N{&)pBJw6J-pm$C7x>(dPhP z@a*meSe)3IV#1gZt9l9a#DolA70mAQHGwHMz53NHd6Cs=E?SzJgmg19z>qU$u8lhN zQ=eBo{Y?kcQd>t_-JI?V(;i$V;TS-vj%%{)pyTBxpE2@dRQI!DbNYa=>+7}MNDwS# zL5Cm;eX?WVb&roPNK0`vW2Mqv(NCDD3 z-TdCqu3vC(c2bNK1a3CN=9^LCwBY=`yRLJobD^m=+#dum$J^jrsxSu-dbe~YT&pay z01)<u0hVs@_SJpMX5dS6l+xe~YS1jX|-;7KtFi@`dX#rCtv5emPeukwIfMIUm zy=6>VffumLG80Ic00SK}+u-WbQI=DBF8)jE?Lgf98O3DW+D2S#=5^R*$GMllL9)!$ znB6W8_P+$k30C0&(j}hh8dg%;a0uGB6``4aMaZE0dHA21fPR9lyM`mZ;L?B5k&ylC z$DZyMThB~jZF=E_mW2q}d**fFC z)K5t#Fsu36?2o{qmd}7T`jPa64G7&nvSzq(kYhMoTC%`3+r2@HL@OW*NGc+fTtw82 z5t$h;T>--+pORLSC%{+fd}TPGK20(tQ8W>yCv`gvgX7`e<`rW4}5(+tyntA&U6AK zvJ@bRzW(ajYAB)U|8d`pY&yVwdjRM1Nd`OqD6wj=NMUK#q<+90fZa})#M}O=m%}^Z zI13W%$t2n4tYeTq%FCygl>J&{r6*bqkxWj)m<}ctV}zCEwgOki!q4COp@4J(zN{Qh4|0fctr!bZ}=k>F-Tnx;b{IC1}c!TWU*#z_$`)o2T-F_L8 z0?T_~;m4pgDho)X8R6B+-)}~1Ah6sG7c$SZ{`t1>tsIzwA?Y1=g0uHsGh9#7$HBLw z2_TDb&tnZPoiitiYZPyRA>Kgsqrmz9hZYWg*|(ctrDQK<8Wx@awjJ=Ateh;|FyMW$ zQSTA~RylykkxnLgX2jT)ukx zkB(@WxeWaIz_st~nAkh_po6-P@pA`K)=v%Rd6lL7R6f6#s=~~2Q-lSFAqB%2N;IM|L4NYj6jy%c)=c5>YvCED>nUm`BGUQ$@{*A?p;@DOwtt_rG< z;V__V0=q>5FUN~B$#cSYxC8QZmxG&3Tb4T%0;E>nK4;mQHB8ghQq;54=$!WBf}l6eL#nkQUBT@<<&T?9*72Z~R>aA;Q~4|PiM z2G}VZR4ns$`l`lhWBbahK)Ge_lM$2jX{uUf1&p(-s`=Z7=2imfu`Hx)L)tbd=0T*^0 zeG4q*B6B5V zOzCv8rRfz%(*@1zj&o)X`XaH>0k`9L)VVvOaE3CqUC}zDn`2q$iYR8cZ@+&5Hcd=F zZkhg&KW-Uv(EkfZvl{2AA|IwqCx!#DABjmQJT+*3Ue%|2`@~;^Q-GP-uBl%ZVEfXu z6(&WaS13$;kFQqAG@MKtvRKl%;3{OPt)cE0O??=gkjV!82qdzq3JE_@oGWWT0E_5JpoDwJVj_U+ zr)a(dSmW}=J|~ML5w6r;ExZz-ggziYOzHnDLKN~A+8)Oi&9nX^oCocJ#y1&$@?c5U zAMO_9a)%@rT~!nSCmn0jA{G1PVzHJm=xyFleN5?4a>~NI)2QCXf9LWNHz%}MK zjM`qIAx9A5ntP1$blsvAspVQc9bei^CV+?b{1{!(y6rOf=T%`|ZsG+%iA}Ag2>tK4 zx4!tWE0z|`eVuMu@GwH?XDm40cE3GMqfYqJ^KR~}1CUa+8LWnQsEA*kC_}()@Y?gy z5!|)rCwSw>X)aiD#*_X5sics|2%gFYIuAF~wP%Mn$c)57;0ar)hJUi=-)4o3UUT)9 zD|+y}#~5{^4RZ;)``dgv{bFpC_=j(8kE5Q-=-m1}Z&LJI z2SS93wMwV&n?0kK0|sycSo2%mn6P0?NVQJ2T&k{kk>>Zb`1Hl67VlrZh`Kq?E<$QJ z|B3+_ji77d0#Un#(U#@FaSh<%CnT+*)^mU|PAP1l4)UX{SKW+5m{oIVx=Lx91<6*}s2fIH==#)i&&$S3TdTykf%2&(FCtM^k)Ee}C-vRwxjUk_TZ|rME&QDb zYCMT_${Ysr!qeB)#f51>5j!0CW_0e-o(<<2v5@egz|MDl_zEHSU?)o= zmh$CA%=KNRh5C$YrqKN`8iUr)%I-L$!AzRW&c3f4w=w-VVwP+fT?a%LO2WKhb#}%TMbt z&0dv%mpkh`?Pui`KY`*;uHFN22Z}zo5zo}}BJNcvBrb$R4kiCUHOaLYMc>rIZvM0R zG&xDIG#AV2(b5>v1Qms`kkU2xkMpOjx{cSb&&-{;kbCJir^|)+ZK+8l7B+raU8=$r z>`ygNx&1(ioWEMiMm%#FcTX!D16NpiJDZv`YbfY)uIgsVEt<{~V)7#yWY1YIxBxHd zhd2K-skG&@0a6W%rD|n&sS$mZg4}1|h!%6d&}>)aj29v)BLm{)el477w1lgNo5f|S zr;e%KdvmI}(HK$OHXy#8zoI~?B^i6f{2hK_4Bkw_5qfay9j}75%U7C!O(M~eel3mK z8>D&K8O!M306dMA`AD@El!tw>!c4!_f!DkWy&4iuMEYW4H*s%CyGTkHt7tICVYY(^ye4xmlUig)f$pWNiY=huPU4H|*+2MCfw#LlI^i*65 zQ{?+BP>4hT3%_2FVKS4z<^Xl;pWIJXgSYu)1rE2~#YKVBR@^FQq^+UEwMQjj)WP1r zP9~Lf-n%p^rvobsn4|kAg=mvOLt(%iP(Ur zWzH=G+_WC>-oZQ&kg}=4Yk7edUDX6&;prE7hGrysOfn2H$XsE=Q2vF=)(J-j?TcW* zbw`|%rr+EVy_Wy)Jq>zq=dA2E@j=hPQJYbN>gdZRG@U8Jw6sX*8j8?)Abo8*j$M7z zVS4_nhT{XEY26&n3IIb^EUfgZH=WSc)*n{B^V2x5JZli* z=VM+W72kql=B@6H#&f^pZBo2v{6Z%B?z@%@{j~V*sM`BZXMo=;Je(ns0~Ah4(03}K zx3Ot1_)H?`?mPT2sCRLx&E8tPo^PGt3TQaPp#b%~A)XzSKp6*X3{SV+VSO$LlogH{ zLKDe&N!t z&1sWAs^SluzzltOGd(7gOf6l}7hK<__BvK_8tg@~Y0YmqI)XZJavt6^Uipp?XdNX0 z^(ZJ>*^G8I%(m$Ux<0w#Ap441wY~oy0hCIm4}9AFE2J4J%TBA<;DL5gKm~9+Gc>5& z;cr{5Jd5^umxuT2e`p^BB9nM*)VUAeewnm@D5mXL&F<>nqo0B9yI$dQL-(z2)y3`U zVVUHFOQDaFL7BX~Ej^iUZ()!^J!$n!N~2>)u++HzBD$#GP~?klC9CN~M}ojaIJe|p zC#UdRBvE@-kr44!y{gZex^Jk0?a{`G2XJS+bQnL0H;i^sGR1`w2VxcMWj%>uLbY0T0v44Hs9ETIF)(AZ1tatjNSgvBH8+tV7BL{0wp^F9PU3ys(e5 zofq*I`gN!n%R}0HA~1TCh`Em7GRn65dro zIOga(&(QVgo41SSPc_7&NczR}*1hWr>xRE8SDkJez5R3FghA|eVV<2WXfHJa1V{%V zY&}2Mk#v$}<@G&$0W)p*l_Gjt_{aT-)ZLHo1h5O z>7p>fE0JmZ#b;hAJ3dN9pRFLv7{Hhp*pQE;J*m9_vM#U)Q2z!gW#^Ccw5y=mlyxUb z##((dwd^#@Hw_Xn3b6g0`7d=QIhu*Zt%471yQq6T)&q0}>R7tF`h`ehYcPu73nX*Q zBj$z*YdT9STe;?&gdNF;Hccp{YCwU;q=3L))1;}N) z>1(lQ;3?13UV21^&39)zsJI5shSsB(8Gijfqh^z@kY-D_KZOuce%@kc?cRO-43+Or zb9_V+Yv=iZtVntcP}S|HhOeGS0X@QpyF%*8R_$Bt8{I^2Mo7CwiuUO{?w9-wg466I zr5lF?U_`^$xHS4)3ZIwtm9`ld&a^vNBe=(KH6Z<`YdSit*4Lw z)ev+iuH+$yKeQSvY)|)a^p>v)azLbfA8E1)IH6Lh&JH+M<}&}q-;>Hsew>L!Y4QvZ z<Vv4sRxx?V0E8nlKz1Mx=1Iz#rnH!X@-LvgZj)VJ4I)KekK4&sB;Rw4 zA*K8|ZsLK9*8yoA_@#B5My;J|Po?uKFXYqiUBS=L_wIDP&3qck15&b_0FlW0oEFe; zs8&Lvdd6P>7Z1D_(|&5HwU4viQG@+WuT~--rO@}SG8F&Vuuy05dR(n94 z;ZKjuubwmT7zqeu(Sb#HXF!brpfRVYf%^G4y@k0-7PW{))y)CAm|~ScD9iF;XeZM#RRw1YmB8zRp01+$-vs0;D26j6YCKfky9+hX5D(-$DZR9T)v2~~>G{=7xY{Xr>cX zB#s<*PM1YFf=D8+I5&fb6)Bfv_SQ=enq?CGOqrD&{mc`lc~nF}S)YRksAo zm6fCMD&nd!cKE4+ab9Wt2y~&cj>^{+_6-NEE^(e~Q8y1zfR?{2tao}4nFgzbio=x% zym%iwoXz1LFadcn)d5rk|0&|rzYpsg$M?M6J8gujlJBZOHyiS zoWg&M6l4z-dH$W{jcEJiZp8Ag#@-P<`Zy&T+`7zRw1PF936gw84TKT-`KQ9zYG6e1 z){^6c;mG6RYVs{L2wGM@(BKwnw_vdh67_;==!0lSX@JJ!YZ3VY6OqCzLG%Z@acn8gO%47VHGfd@Pp-2Z%vMo&i+1J&0UdaZ*G#?BVV zP=f%h5~&C-ih<2kh0%d4Eo7IRrnnvx`uDiI@pM#2ICRbmic%JGtKaOPDl;2u2^KC) zh?0Uu{r7a4MXV|2E0En9L{KhR9>1hi1|yd{G(zwygd(g;_0fjgf8vvmr@}J+m>jzU zc7bD~-2Bq)jwHi=KD>H~nki~Rl6I9UTgI)K5y*mQc<}pJ5$V6vZKHga^QRUSj@miv z=;ks!4wx>8i4_|d3;-cm1ho}~KIw|3fGn#I9*ytE8nAD;r_Q-_`|lo{i2&=#ssh^4 zv2DIxCM8~mtl%`Ni$~CNUiS0g66MybZMpM@%mwW8EVEJy0GZX#! z7fE{JH*14RaxLBCThn64U-x{E{_(dnB>#OFF=htjZpSH)LZs*eoCOCADftvXfLsrge}DG z#=Rb^dcdthhyb<>bpp!j&w7k}-~7*Zzof9yUN^%hA;L*QFf}Ct3rG_cEIZXXH03{Z z6LWqJgB>xd^qL)O`nEIa?U*e9aYHsqCn^wHJ(-p@I&lB58U82$lv+9Vp)&X5UUf<@ zY%uLMO1lNzP6oka<1^*K83KylHgb>inNq;)F}R+*l|_c-u!&eY^NjPZPvIQL(j~qi zl~%2mxz{A&)z>$t4tTr-hr92hmNW|I#-y5-_Ru-5c1WOcx4b|h5MK|O-fXx;QdoA_ zb%ITq)RJjkbG{rn?zyAR3&)6*9d|?+zTXTUUD5k7_)i7lNpD3ao~y3HoTAY;?bouV z<3Mzt_b)!B6o5Yl+d%nL(%yNhLXgTkQt~G`8;T+lr%jTdpew;4x*Mo`*$g&L7h(pzbi`;l7MDUH>-C_+6iQP!pA(b)9x{$|oKXf|cW05el~ zB~8^Lgj%Y}o8v(xSs?Va_WF4oGu|wFqfBO4rL?d5$oDnml`X0C@2VEjZ$X>kuMi@T zeDY*){oPRQwIo)Lm6YS*)`f}JV~2A<7)E6ku*pAolM+o;LrYYP2X=_Hs^KL#fLk`P zRbhPd^IXRdQPA*N=VIP$%E`+z*XHH!fd*v9ZUy!$xH(h3f6RN2Ot3yLPzrGVvJ!qg zWCWMY4|2dO^pHdizU2&IG&Q_GO@lTf%%(px%1UPJZAXz|B}Zt_f<8&XpmYmdXjGvMdu0F4$cXJ| zA|EQF+U8R-y9kqi4@r?vUM&y4L2BlY`-@6$S3?Tq$29ZvUz+#*)<-nccy}S2_WZf6 zw=z~&P>3*z8!IHg*-nS^LaPvi?Co4xPza;HYjCSeU+K`QwJun&eQJqZ?a$9N*CBbl+>@avxKjb zC3F5XHN3d7HP_AQ5tJc$5Um5V!vb2T7C)u2_6A9NbpB-Md-8~@z01dBWr@PXQx}0O z4wz}@4h=@NES=3KWQ$OVY&(?@yQxPTmIi(z!JT1OjWrcly0c3KuAndl_a{Z@r$2Jk zFp(K-Nc>Zdy^H1Et4E|XR#_AFDG1&P5+<9AU(_#xdtFy7AH$*hSZ#3i!~efq9fDF+ zs~}OEfWp##e}2!N+^AQ*9|IP}RKGb-g*DS$RV6iaK7y&fIJs1Io%CY{$YH5^HTgQ; zaqohrEk=+vGkYzhMAzW|65Q|-2#w3Y;YLLL!S4gaL`wBcoudq04&Q52|A~NfI_|de zpT*fnJQtv7fCn*<7QcHPFhvCm;-~0Zz7EeJ{+tw0DY2Jqp2GF4bJaAKksZiutK)A1 znZ({cYf5D=Q1(yIkK0e}mlmYfdCi^K8&p50 zNJHvf^#N<3&3Z37M-Tik0ybT-Dx`*;che-EpKt{@3`Zd8+R##DJ)wbRGh}=CIheyD zsDE`F2~w3~V0=L^ZR#KuZ6sk2s0BxExdTfmkX7Ft-|LpE3k(A#qxXN3F>%!iJ;-Uw4b9vlr($hJI}*uaGQHLVusu-L@|ht70n2^812a&td3+wSXc_Ujbc3AQ*)?m zz1a@57nwdTz06*j{VZ@Cc|&^M1%83Ag|M*a;ND`Ewc-MlGvtfbfL-QoALJsxL9V#+d(9T02l+7%f)hMX5H{{yVNjneU&Zpc+nk(rcPSMW?G^>L9(Mlp|JiGjq z(=#*OWN1Fc%P0h?_1tJo)uaz@%al4~WQa&*WNKCK&$@wLL9kLjl1PTnvOErE0KMUg zu~BSwq@bNA`366@-7^Ok{%h<=&=a-|%VHuL#G`>XUFd0+NXdEuenjLF!*;42n%+!^YU^#cFVAW*evXpUGvc=s_fB&qm76T+veTBfI5;o zK+82HXbkz^1v?yN1Kt0q$)j(|pwIboy2l)5)P){FfdaqSHV(~XA|5o@uH1YDbvleu z8%4rxUR$y-mKxZy%uvU|4$v)8V_aK#vk*{Aq+Z94LO#rx7sj6GC7uY zN{1m8`$McT9mRx@G-lY9jN`VIEv-`2yCs8!STn-pZG^3~QOXQJ9ELC1>`C%=V>5@1|LAqJ#*EFrT>_IFp4NTV71!b<1??{;G9thYzh z^QVxtBK{0TvwCTEQf|-S1Nz{sxEp$_C8X}<*|ZLEPCWW^?pf@YkLQ8qI_o5P(;RfhMOQBFJ z)n=S_&9Qsp5Dils#Y(-`XG2}? z2t?$KFbT~oD|d*i0EoQA0}w%05(b`B!6AR1?+}#0Af2tVR4={=;q@bu)P&&SS~rPu zOnjDCjbnZXg_C##=(WDaXAbGQ5EBbUu2imp4s7htfJo9CFK-?^0D?+(H~}<`l7BK$ zl!;4$t1s1~#YVa)u3#!T*}!JZtAaq!N4yS;gIu9wvJ2~lyU70q)kCXM&&GLU*{ana z&CP-1=5eSzqE%nWL@kRGPW#+DKd^gD{0`ce{qL8L#RvU6N^SiXoF-!2Tle4*07BXB)r8q|R0QZ1@ydNmh%Yk+p&|bP#)}MmpSF^!jh3NjYKe zlShn{g#o*n9kc9$VU#I(aV=X-w`nVvcoPz~!J#q3BTU86pJ9H5i+m(o2&Wl4^7<;%V%vX=qyJTiTLg<$+e=|N#%%r^-+|ZkS|%bbXJvtZKZ4@F%u?$E!ql+5Rbvi! zt)`BB6mfNlBDT5-ziNgyX!qcgR@YF6M+`-+w}5V>#?4JMWct6K ziCtdiNBnG^F{=R`eP1eV62R|xOvJQW!tIq_Z;z*%^u4$1d5wuk7@bSM;CMlrZ4{2? z|F}_p8VviFue#$!GQ^nff`R1#{O4$s{YJXAesT(H9OJUlAh>5qHeH1#hOQAF0 zA)-%uLP*zvoK*nh1mo9DLuPR!;Q%loxtx!4pO;!l~C4=Hkt0_ zEHy$eBdlbd1Un2g^13HKX9+1P-Imh%?t-4$r>n2^axX#JumBWo^0cQ)nnKZ-?3hY3aXq;F26qgp(r2zPmQbs75JNIbK6+Z|Z zB(M}4wVz_zQ5aB9P!3s#OA*T>me_`zs^;RFa=cILRQn+XAa8BNnqvObkD~9@v z0|caSDkUCoL{%Q~i!gKqd9js*4hbj|jq$Bg;+NmYj5Pr_V2=zimgU>zDHLgFQC}^G zjERAYy`Pfgs0o;L{Rvg(#h5bNkB_^oDjZ-#U0cO(J7<+1;5Q|y`X7fs2T^apy=1Pbe?UJb|dVLghw zN73FQ=yNsTm>^0PX}+j;Xt_Zkkaf@x6=C^45ul7ENSj8PkQ=b{p{ka_k;2qht?2|+ zhP-)_p#zi1+j zw8+=BLBg^gl0X3?GjH0Tn8V#u7Y(^};J9+MEP9;KI|@elNXDixzQ=Q3UwoSLn`Zr` z4_W-h_TFj6sJIuC4!TE@632(WWQBx-yiGcpU&{UtP?p?D+-*=$6l$p23Q8c|7SqnD zZ_@QRrL) z^|R+wLJJm0NX<(?)0AIW{Ir9sRmaC5>QDx~}i!C%*bTAm6A zqEb;)LDeJEiN~h}+pw%->5=!jX$N%R3$xH4HRn?kQQQLZjzt~sazB7P}s7^o? zAPtJ)t?9Dl{_{wZQtb~pCkMK(a1R7LqP&vPp1Peot_39sgE-h4^KeM$$v%iYh@Y>8 z>iOI^;o8d!nilSnRnCf2wCVt5GU27o(MVD2U2H8oFkm+p;lr*V)?W?F?KDhK7Tq9B zXhaest@9@XB7PS%v<@#)R_9z2m$I_T`H&wwL{RIxgis!Wc_#4AX|~B@>d05EqE~~m zxznGh2AEJ&bNj9V^iqF;4@J`U+Z~B+@<$JR0B5l?1!0b z^)eHaZM9J}E1WY@57HkT8>flJ(40T~VM`^A3#P|Y(pSxy+bThPab2u?Ky3IAv21%* zG#fq;YnnCPf@W=Dy>&m0VZX)B-p1xz8r_~o8{#;g{GS0Qqr#6JKJ)(vT(= 1.12.0": + version "1.13.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" + integrity sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" + integrity sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg== + dependencies: + "@babel/core" "7.12.3" + "@babel/plugin-proposal-class-properties" "7.12.1" + "@babel/plugin-proposal-decorators" "7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" + "@babel/plugin-proposal-numeric-separator" "7.12.1" + "@babel/plugin-proposal-optional-chaining" "7.12.1" + "@babel/plugin-transform-flow-strip-types" "7.12.1" + "@babel/plugin-transform-react-display-name" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.1" + "@babel/preset-env" "7.12.1" + "@babel/preset-react" "7.12.1" + "@babel/preset-typescript" "7.12.1" + "@babel/runtime" "7.12.1" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.11.6, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +better-ajv-errors@^0.6.1, better-ajv-errors@^0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz#b5344af1ce10f434fe02fc4390a5a9c811e470d1" + integrity sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/runtime" "^7.0.0" + chalk "^2.4.1" + core-js "^3.2.1" + json-to-ast "^2.0.3" + jsonpointer "^4.0.1" + leven "^3.1.0" + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== + dependencies: + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +can-use-dom@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" + integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001219: + version "1.0.30001230" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" + integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chart.js@^2.9.4: + version "2.9.4" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684" + integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A== + dependencies: + chartjs-color "^2.1.0" + moment "^2.10.2" + +chartjs-color-string@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" + integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== + dependencies: + color-name "^1.0.0" + +chartjs-color@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" + integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== + dependencies: + chartjs-color-string "^0.6.0" + color-convert "^1.9.3" + +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clipboard@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-error-fragment@0.0.230: + version "0.0.230" + resolved "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz#d736d75c832445342eca1d1fedbf17d9618b14d7" + integrity sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" + integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +computed-async-mobx@^7.0.1-beta.1: + version "7.0.1-beta.1" + resolved "https://registry.yarnpkg.com/computed-async-mobx/-/computed-async-mobx-7.0.1-beta.1.tgz#8e1c7157f2ae9d8561d18341d46c0be3eedb4cf2" + integrity sha512-mj0XkU88wi1aaJ0BNJz0JWtpe9uNxzLZHUUPV+MtoQeCTeyElrPxuDCFGyB3UnYr32UmstlTnwttWfznacQX1A== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.6.2, core-js-compat@^3.9.0, core-js-compat@^3.9.1: + version "3.13.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.13.0.tgz#a88f5fa81d8e9b15d7f98abc4447a4dfca2a358f" + integrity sha512-jhbI2zpVskgfDC9mGRaDo1gagd0E0i/kYW0+WvibL/rafEHKAHO653hEXIxJHqRlRLITluXtRH3AGTL5qJmifQ== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.0.tgz#9d267fb47d1d7046cfbc05e7b67bb235b6735355" + integrity sha512-7VTvXbsMxROvzPAVczLgfizR8CyYnvWPrb1eGrtlZAJfjQWEHLofVfCKljLHdpazTfpaziRORwUH/kfGDKvpdA== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0, core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.2.1, core-js@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" + integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== + +core-js@^3.6.5: + version "3.13.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.13.0.tgz#58ca436bf01d6903aee3d364089868d0d89fe58d" + integrity sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.1" + semver "^7.3.2" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0, css-select@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.5.2: + version "2.6.14" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.14.tgz#004822a4050345b55ad4dcc00be1d9cf2f4296de" + integrity sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A== + +csstype@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.6.tgz#865d0b5833d7d8d40f4e5b8a6d76aea3de4725ef" + integrity sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.23.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" + integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + +decko@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" + integrity sha1-/UPHNelnuAEzBohKVvvmZZlraBc= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" + integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +dompurify@^2.0.12: + version "2.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.6.tgz#54945dc5c0b45ce5ae228705777e8e59d7b2edc4" + integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ== + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723: + version "1.3.742" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.742.tgz#7223215acbbd3a5284962ebcb6df85d88b95f200" + integrity sha512-ihL14knI9FikJmH2XUIDdZFWJxvr14rPSdOhJ7PpS27xbz8qmaRwCwyg/bmFwjWKmWK9QyamiCZVCvXm5CH//Q== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.0.2, escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" + integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== + dependencies: + confusing-browser-globals "^1.0.10" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@^5.2.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz#482a42fe5d15ee614652ed256d37543d584d7bc0" + integrity sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg== + dependencies: + lodash "^4.17.15" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.22.1: + version "2.23.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz#8a1b073289fff03c4af0f04b6df956b7d463e191" + integrity sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.4.0" + minimatch "^3.0.4" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.1.0: + version "24.3.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz#5f0ca019183c3188c5ad3af8e80b41de6c8e9173" + integrity sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jsx-a11y@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.21.5: + version "7.23.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz#2d2291b0f95c03728b55869f01102290e792d494" + integrity sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw== + dependencies: + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.3" + object.fromentries "^2.0.4" + object.values "^1.1.3" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + string.prototype.matchall "^4.0.4" + +eslint-plugin-testing-library@^3.9.2: + version "3.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" + integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== + dependencies: + "@typescript-eslint/experimental-utils" "^3.10.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-webpack-plugin@^2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz#473b84932f1a8e2c2b8e66a402d0497bf440b986" + integrity sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw== + dependencies: + "@types/eslint" "^7.2.6" + arrify "^2.0.1" + jest-worker "^26.6.2" + micromatch "^4.0.2" + normalize-path "^3.0.0" + schema-utils "^3.0.0" + +eslint@^7.11.0: + version "7.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" + integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.0, expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fork-ts-checker-webpack-plugin@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +format-util@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^13.6.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + dependencies: + type-fest "^0.20.2" + +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.1: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +google-maps-infobox@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/google-maps-infobox/-/google-maps-infobox-2.0.0.tgz#1ea6de93c0cdf4138c2d586331835c83dcc59dc2" + integrity sha512-hTuWmWZZSOxf5D/z7l3/hTF1grgRvLG53BEKMdjiKOG+FcK/kH7vqseUeyIU9Zj2ZIqKTOaro0nknxpAuRq4Vw== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^1.2.1, html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-client@^1.2.5: + version "1.3.3" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz#90fc15d646cca86956b156d07c83947d57d659a9" + integrity sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA== + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indefinite-observable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400" + integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== + dependencies: + symbol-observable "1.2.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.0.4, is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5, is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-circus@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" + integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.0" + "@jest/test-result" "^26.6.0" + "@jest/types" "^26.6.0" + "@types/babel__traverse" "^7.0.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^26.6.0" + is-generator-fn "^2.0.0" + jest-each "^26.6.0" + jest-matcher-utils "^26.6.0" + jest-message-util "^26.6.0" + jest-runner "^26.6.0" + jest-runtime "^26.6.0" + jest-snapshot "^26.6.0" + jest-util "^26.6.0" + pretty-format "^26.6.0" + stack-utils "^2.0.2" + throat "^5.0.0" + +jest-cli@^26.6.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.0.0, jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.0, jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.0, jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" + integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== + dependencies: + "@jest/types" "^26.6.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.0, jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.0, jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.6.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-watch-typeahead@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" + integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^26.0.0" + jest-watcher "^26.3.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + +jest-watcher@^26.3.0, jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^26.5.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" + integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== + dependencies: + "@jest/core" "^26.6.0" + import-local "^3.0.2" + jest-cli "^26.6.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.12.1, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsdom@^16.4.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.5" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-pointer@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.1.tgz#3c6caa6ac139e2599f5a1659d39852154015054d" + integrity sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q== + dependencies: + foreach "^2.0.4" + +json-schema-ref-parser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz#30af34aeab5bee0431da805dac0eb21b574bf63d" + integrity sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw== + dependencies: + call-me-maybe "^1.0.1" + js-yaml "^3.12.1" + ono "^4.0.11" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-to-ast@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz#041a9fcd03c0845036acb670d29f425cea4faaf9" + integrity sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ== + dependencies: + code-error-fragment "0.0.230" + grapheme-splitter "^1.0.4" + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" + integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg== + +jss-plugin-camel-case@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.1.tgz#427b24a9951b4c2eaa7e3d5267acd2e00b0934f9" + integrity sha512-9+oymA7wPtswm+zxVti1qiowC5q7bRdCJNORtns2JUj/QHp2QPXYwSNRD8+D2Cy3/CEMtdJzlNnt5aXmpS6NAg== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.5.1" + +jss-plugin-default-unit@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.1.tgz#2be385d71d50aee2ee81c2a9ac70e00592ed861b" + integrity sha512-D48hJBc9Tj3PusvlillHW8Fz0y/QqA7MNmTYDQaSB/7mTrCZjt7AVRROExoOHEtd2qIYKOYJW3Jc2agnvsXRlQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-global@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.5.1.tgz#0e1793dea86c298360a7e2004721351653c7e764" + integrity sha512-jX4XpNgoaB8yPWw/gA1aPXJEoX0LNpvsROPvxlnYe+SE0JOhuvF7mA6dCkgpXBxfTWKJsno7cDSCgzHTocRjCQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-nested@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.5.1.tgz#8753a80ad31190fb6ac6fdd39f57352dcf1295bb" + integrity sha512-xXkWKOCljuwHNjSYcXrCxBnjd8eJp90KVFW1rlhvKKRXnEKVD6vdKXYezk2a89uKAHckSvBvBoDGsfZrldWqqQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.1.tgz#ab1c167fd2d4506fb6a1c1d66c5f3ef545ff1cd8" + integrity sha512-t+2vcevNmMg4U/jAuxlfjKt46D/jHzCPEjsjLRj/J56CvP7Iy03scsUP58Iw8mVnaV36xAUZH2CmAmAdo8994g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + +jss-plugin-rule-value-function@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.1.tgz#37f4030523fb3032c8801fab48c36c373004de7e" + integrity sha512-3gjrSxsy4ka/lGQsTDY8oYYtkt2esBvQiceGBB4PykXxHoGRz14tbCK31Zc6DHEnIeqsjMUGbq+wEly5UViStQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.5.1" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.1.tgz#45a183a3a0eb097bdfab0986b858d99920c0bbd8" + integrity sha512-cLkH6RaPZWHa1TqSfd2vszNNgxT1W0omlSjAd6hCFHp3KIocSrW21gaHjlMU26JpTHwkc+tJTCQOmE/O1A4FKQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.5.1" + +jss@10.5.1, jss@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.5.1.tgz#93e6b2428c840408372d8b548c3f3c60fa601c40" + integrity sha512-hbbO3+FOTqVdd7ZUoTiwpHzKXIo5vGpMNbuXH1a0wubRSWLWSBvwvaq4CiHH/U42CmjOnp6lVNNs/l+Z7ZdDmg== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + indefinite-observable "^2.0.1" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.16.2, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr@2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" + integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + +luxon@^1.26.0: + version "1.26.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.26.0.tgz#d3692361fda51473948252061d0f8561df02b578" + integrity sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A== + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha1-GA8fnr74sOY45BZq1S24eb6y/8U= + +marked@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + +marker-clusterer-plus@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/marker-clusterer-plus/-/marker-clusterer-plus-2.1.4.tgz#f8eff74d599dab3b7d0e3fed5264ea0e704f5d67" + integrity sha1-+O/3TVmdqzt9Dj/tUmTqDnBPXWc= + +markerwithlabel@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/markerwithlabel/-/markerwithlabel-2.0.2.tgz#fa6aee4abb0ee553e24e2b708226858f58b8729e" + integrity sha512-C/cbm1A0h/u54gwHk5ZJNdUU3V3+1BbCpRPMsMyFA7vF4yL+aB4rWpxACz29TpQ+cTg6/iQroExh0PMSRGtQFg== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memoize-one@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" + integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + dependencies: + mime-db "1.47.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" + integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mobx-react-lite@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.2.0.tgz#331d7365a6b053378dfe9c087315b4e41c5df69f" + integrity sha512-q5+UHIqYCOpBoFm/PElDuOhbcatvTllgRp3M1s+Hp5j0Z6XNgDbgqxawJ0ZAUEyKM8X1zs70PCuhAIzX1f4Q/g== + +mobx-react@^7.0.5: + version "7.1.0" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-7.1.0.tgz#d947cada3cfad294b4b6f692e969c242b9c16eaf" + integrity sha512-DxvA6VXmnZ+N9f/UTtolWtdRnAAQY2iHWTSPLktfpj8NKlXUe4dabBAjuXrBcZUM8GjLWnxD1ZEjssXq1M0RAw== + dependencies: + mobx-react-lite "^3.2.0" + +mobx-utils@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/mobx-utils/-/mobx-utils-6.0.4.tgz#5283a466ece8de0ac36ae3cfa1b1c032ec302b37" + integrity sha512-CcTgFcCWN78eyRXU7OiKfhIVDEWFFoKdpfj49GIVcWykIQ4deXnaRnnKHElbVYFFgz1TOs8a3bDAq7qsSe864A== + +mobx@^6.1.5: + version "6.3.2" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.3.2.tgz#125590961f702a572c139ab69392bea416d2e51b" + integrity sha512-xGPM9dIE1qkK9Nrhevp0gzpsmELKU4MFUJRORW/jqxVFIHHWIoQrjDjL8vkwoJYY3C2CeVJqgvl38hgKTalTWg== + +moment@^2.10.2: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-url@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" + integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha1-271K8SE04uY1wkXvk//Pb2BnOl0= + dependencies: + es6-promise "^3.2.1" + +node-releases@^1.1.61, node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.1.tgz#1a6d9117d146805b58e56df479861de0293b6e5b" + integrity sha512-e5G6bbq3Nrfxm+SDPR5AiZ6n2smVUmhLA1OgI2/Bl8e2ywfWsKw/yuqrwiXXiNHb1wdM/GyPMX6QjCGJODlaaA== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.4.3: + version "2.5.4" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.4.tgz#81fa1aaa7e2387ab2dba1045827e9d7b79822326" + integrity sha512-1vIj5Wkjmi+kZj5sFamt95LkuXoalmoKUohtaUQoCQZjLfPFaY8uZ7nw6IZaWuE6eLON2b6xrXhxD4hiTdYl0g== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.8" + yaml "^1.10.0" + yargs "^16.1.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-4.0.8.tgz#4f1a4d6bd9e030ad07db03fd7a7bc3a91aabcc7d" + integrity sha512-bIt8erTyclF7bkaySTtQ9sppqyVc+mAlPi7vPzCLVHJsL9nrivQjc/jHLX/o+eGbxHd6a6YBwuY/Vxa6wGsiuw== + dependencies: + ajv "^5.5.2" + better-ajv-errors "^0.6.7" + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.1.3" + oas-resolver "^2.4.3" + oas-schema-walker "^1.1.5" + reftools "^1.1.5" + should "^13.2.1" + yaml "^1.8.3" + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.10.3, object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.0, object.entries@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ono@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" + integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== + dependencies: + format-util "^1.0.3" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +openapi-sampler@^1.0.0-beta.18: + version "1.0.0-beta.18" + resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.18.tgz#9e0845616a669e048860625ea5c10d0f554f1b53" + integrity sha512-nG/0kvvSY5FbrU5A+Dbp1xTQN++7pKIh87/atryZlxrzDuok5Y6TCbpxO1jYqpUKLycE4ReKGHCywezngG6xtQ== + dependencies: + json-pointer "^0.6.0" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +perfect-scrollbar@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83" + integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +polished@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.7.0.tgz#ece3368df30d33082bc8a957aa212d3f98119278" + integrity sha512-1tnvQ2wsxfR/DyPE2Xu9sRbnLAwXAarCWiZJ8Hfirw59bTigqjbzEWSAmzYizT6ocQW995V8n7RP48jq50DjJA== + dependencies: + "@babel/runtime" "^7.12.5" + "@scarf/scarf" "^1.1.0" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" + integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== + dependencies: + postcss "^8.1.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" + integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +prismjs@^1.22.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" + integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== + optionalDependencies: + clipboard "^2.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prompts@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.0, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-app-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" + integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== + dependencies: + core-js "^3.6.5" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + whatwg-fetch "^3.4.1" + +react-app-rewired@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-2.1.8.tgz#e192f93b98daf96889418d33d3e86cf863812b56" + integrity sha512-wjXPdKPLscA7mn0I1de1NHrbfWdXz4S1ladaGgHVKdn1hTgKK5N6EdGIJM0KrS6bKnJBj7WuqJroDTsPKKr66Q== + dependencies: + semver "^5.6.0" + +react-chartjs-2@^2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-2.11.1.tgz#a78d0df05fc8bc8ffcd4c4ab5b89a25dd2ca3278" + integrity sha512-G7cNq/n2Bkh/v4vcI+GKx7Q1xwZexKYhOSj2HmrFXlvNeaURWXun6KlOUpEQwi1cv9Tgs4H3kGywDWMrX2kxfA== + dependencies: + lodash "^4.17.19" + prop-types "^15.7.2" + +react-copy-to-clipboard@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz#2a0623b1115a1d8c84144e9434d3342b5af41ab4" + integrity sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw== + dependencies: + copy-to-clipboard "^3" + prop-types "^15.5.8" + +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== + dependencies: + "@babel/code-frame" "7.10.4" + address "1.1.2" + browserslist "4.14.2" + chalk "2.4.2" + cross-spawn "7.0.3" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.1.0" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "4.1.6" + global-modules "2.0.0" + globby "11.0.1" + gzip-size "5.1.1" + immer "8.0.1" + is-root "2.1.0" + loader-utils "2.0.0" + open "^7.0.2" + pkg-up "3.1.0" + prompts "2.4.0" + react-error-overlay "^6.0.9" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" + integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.1" + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-full-page@^0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/react-full-page/-/react-full-page-0.1.11.tgz#1b74fc4d746fb9de4b1a2b026084a82a1858dbd2" + integrity sha512-8pSXt2Ik799DWtXqS4746T+OnHEFadOF5gNQ10as6CIwgpGwaMAV0NJ7ItXUfEYAX1E/ky0A/mjeWfvjjldfHQ== + dependencies: + core-js "^3.6.5" + +react-google-maps@^9.4.5: + version "9.4.5" + resolved "https://registry.yarnpkg.com/react-google-maps/-/react-google-maps-9.4.5.tgz#920c199bdc925e0ce93880edffb09428d263aafa" + integrity sha512-8z5nX9DxIcBCXuEiurmRT1VXVwnzx0C6+3Es6lxB2/OyY2SLax2/LcDu6Aldxnl3HegefTL7NJzGeaKAJ61pOA== + dependencies: + babel-runtime "^6.11.6" + can-use-dom "^0.1.0" + google-maps-infobox "^2.0.0" + invariant "^2.2.1" + lodash "^4.16.2" + marker-clusterer-plus "^2.1.4" + markerwithlabel "^2.0.1" + prop-types "^15.5.8" + recompose "^0.26.0" + scriptjs "^2.5.8" + warning "^3.0.0" + +react-if@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/react-if/-/react-if-4.0.1.tgz#fd60599f585a55d417d94f9a576047869994fcae" + integrity sha512-TyfDGdBrIAHntLM5YkRbszeqcyzucB3m2ddF46XH10wTZ8SE2ZjNPD8qNphTJ+7j36SZ4qMvqmlMntcsczLAXQ== + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react-is@^16.8.0 || ^17.0.0": + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + +react-is@^17.0.0, react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-refresh@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" + integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== + dependencies: + "@babel/core" "7.12.3" + "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" + "@svgr/webpack" "5.5.0" + "@typescript-eslint/eslint-plugin" "^4.5.0" + "@typescript-eslint/parser" "^4.5.0" + babel-eslint "^10.1.0" + babel-jest "^26.6.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.7" + babel-preset-react-app "^10.0.0" + bfj "^7.0.2" + camelcase "^6.1.0" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "4.3.0" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^7.11.0" + eslint-config-react-app "^6.0.0" + eslint-plugin-flowtype "^5.2.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-jest "^24.1.0" + eslint-plugin-jsx-a11y "^6.3.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.2.0" + eslint-plugin-testing-library "^3.9.2" + eslint-webpack-plugin "^2.5.2" + file-loader "6.1.1" + fs-extra "^9.0.1" + html-webpack-plugin "4.5.0" + identity-obj-proxy "3.0.0" + jest "26.6.0" + jest-circus "26.6.0" + jest-resolve "26.6.0" + jest-watch-typeahead "0.6.1" + mini-css-extract-plugin "0.11.3" + optimize-css-assets-webpack-plugin "5.0.4" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.2.1" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "5.0.2" + prompts "2.4.0" + react-app-polyfill "^2.0.0" + react-dev-utils "^11.0.3" + react-refresh "^0.8.3" + resolve "1.18.1" + resolve-url-loader "^3.1.2" + sass-loader "^10.0.5" + semver "7.3.2" + style-loader "1.3.0" + terser-webpack-plugin "4.2.3" + ts-pnp "1.2.0" + url-loader "4.1.1" + webpack "4.44.2" + webpack-dev-server "3.11.1" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "5.1.4" + optionalDependencies: + fsevents "^2.1.3" + +react-tabs@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.2.0.tgz#0fd8d595ef26d3684da876c27a3cc90392dffb40" + integrity sha512-q7oNapNRoYTQq8gDhApXwdBheuuN5qQ4YvUaQUAkb6OSSttJulBAvxJ0FS6W5uojvMxbbIZKu1f2I+GXISoLjw== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + +react-transition-group@^4.0.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" + integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +recompose@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" + integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== + dependencies: + change-emitter "^0.1.2" + fbjs "^0.8.1" + hoist-non-react-statics "^2.3.1" + symbol-observable "^1.0.4" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redoc@^2.0.0-rc.48: + version "2.0.0-rc.48" + resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.48.tgz#5303cff67af5cba8a2b48dc1347a9854d45be835" + integrity sha512-shArJWhNG2gQ0XKxW8WcfG8peNOtxbZ86CqxgrR9P7MnE5ESAo559CH/PSlezePeVLpcC0C9tcimOfSN5MaAvA== + dependencies: + "@redocly/react-dropdown-aria" "^2.0.11" + "@types/node" "^13.11.1" + classnames "^2.2.6" + decko "^1.2.0" + dompurify "^2.0.12" + eventemitter3 "^4.0.4" + json-pointer "^0.6.0" + json-schema-ref-parser "^6.1.0" + lunr "2.3.8" + mark.js "^8.11.1" + marked "^0.7.0" + memoize-one "~5.1.1" + mobx-react "^7.0.5" + openapi-sampler "^1.0.0-beta.18" + perfect-scrollbar "^1.4.0" + polished "^3.6.5" + prismjs "^1.22.0" + prop-types "^15.7.2" + react-tabs "^3.1.1" + slugify "^1.4.4" + stickyfill "^1.1.1" + swagger2openapi "^6.2.1" + tslib "^2.0.0" + url-template "^2.0.8" + +reftools@^1.1.5, reftools@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.8.tgz#cc08fd67eb913d779fd330657d010cc080c7d643" + integrity sha512-Yvz9NH8uFHzD/AXX82Li1GdAP6FzDBxEZw+njerNBBQv/XHihqsWAjNfXtaq4QD2l4TEZVnp4UbktdYSegAM3g== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" + integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + dependencies: + css-select "^2.0.2" + dom-converter "^0.2" + htmlparser2 "^3.10.1" + lodash "^4.17.20" + strip-ansi "^3.0.0" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.3.tgz#49ec68340f67d8d2ab6b401948d5def3ab2d0367" + integrity sha512-WbDSNFiKPPLem1ln+EVTE+bFUBdTTytfQZWbmghroaFNFaAVmGq0Saqw6F/306CwgPXsGwXVxbODE+3xAo/YbA== + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rifm@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.7.0.tgz#debe951a9c83549ca6b33e5919f716044c2230be" + integrity sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ== + dependencies: + "@babel/runtime" "^7.3.1" + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-babel@^4.3.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-terser@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== + dependencies: + "@babel/code-frame" "^7.5.5" + jest-worker "^24.9.0" + rollup-pluginutils "^2.8.2" + serialize-javascript "^4.0.0" + terser "^4.6.2" + +rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.31.1: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@^10.0.5: + version "10.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +satellite.js@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/satellite.js/-/satellite.js-4.1.3.tgz#a47382d5319efe672bf379d716a67110ca2990c4" + integrity sha512-l65XHxmT4n31DSGQy/jnu/sLfKn42g862h1p9NyalOEYCpEsplFAqUIT4+euK0AByizZML2Zkjbl0HWI79KC0A== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c" + integrity sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scriptjs@^2.5.8: + version "2.5.9" + resolved "https://registry.yarnpkg.com/scriptjs/-/scriptjs-2.5.9.tgz#343915cd2ec2ed9bfdde2b9875cd28f59394b35f" + integrity sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg== + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slugify@^1.4.4: + version "1.4.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.6.tgz#ef288d920a47fb01c2be56b3487b6722f5e34ace" + integrity sha512-ZdJIgv9gdrYwhXqxsH9pv7nXxjUEyQ6nqhngRxoAAOlmMGA28FDq5O4/5US4G2/Nod7d1ovNcgURQJ7kHq50KQ== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" + integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.1" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stickyfill@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" + integrity sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +styled-components@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.0.tgz#e47c3d3e9ddfff539f118a3dd0fd4f8f4fb25727" + integrity sha512-bPJKwZCHjJPf/hwTJl6TbkSZg/3evha+XPEizrZUGb535jLImwDUdjTNxXqjjaASt2M4qO4AVfoHJNe3XB/tpQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swagger2openapi@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-6.2.3.tgz#4a8059f89d851aee4c9ab178f9b7190debd904e2" + integrity sha512-cUUktzLpK69UwpMbcTzjMw2ns9RZChfxh56AHv6+hTx3StPOX2foZjPgds3HlJcINbxosYYBn/D3cG8nwcCWwQ== + dependencies: + better-ajv-errors "^0.6.1" + call-me-maybe "^1.0.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.4.3" + oas-schema-walker "^1.1.5" + oas-validator "^4.0.8" + reftools "^1.1.5" + yaml "^1.8.3" + yargs "^15.3.1" + +symbol-observable@1.2.0, symbol-observable@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempy@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tle-client@ivanstan/tle.js: + version "1.0.2" + resolved "https://codeload.github.com/ivanstan/tle.js/tar.gz/1057655740b8b98900b5a0edfc15fd22f0f020e3" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-pnp@1.2.0, ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tslib@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== + +ua-parser-js@^0.7.18: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse@^1.4.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url-parse@^1.5.1: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.0.tgz#7f410d9a1f7a1cd5d952806b45776204b47dc274" + integrity sha512-1cx54eRxY/+M0KNKdNpNnuXAXG+vJEvwScV4DiV9rOYDguHoeDIzm09ghBohOPtkqPO5OtPC14FWkNva3SDisg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" + integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + dependencies: + lodash "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== + dependencies: + workbox-core "^5.1.4" + +workbox-broadcast-update@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== + dependencies: + workbox-core "^5.1.4" + +workbox-build@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== + dependencies: + "@babel/core" "^7.8.4" + "@babel/preset-env" "^7.8.4" + "@babel/runtime" "^7.8.4" + "@hapi/joi" "^15.1.0" + "@rollup/plugin-node-resolve" "^7.1.1" + "@rollup/plugin-replace" "^2.3.1" + "@surma/rollup-plugin-off-main-thread" "^1.1.1" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^8.1.0" + glob "^7.1.6" + lodash.template "^4.5.0" + pretty-bytes "^5.3.0" + rollup "^1.31.1" + rollup-plugin-babel "^4.3.3" + rollup-plugin-terser "^5.3.1" + source-map "^0.7.3" + source-map-url "^0.4.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + tempy "^0.3.0" + upath "^1.2.0" + workbox-background-sync "^5.1.4" + workbox-broadcast-update "^5.1.4" + workbox-cacheable-response "^5.1.4" + workbox-core "^5.1.4" + workbox-expiration "^5.1.4" + workbox-google-analytics "^5.1.4" + workbox-navigation-preload "^5.1.4" + workbox-precaching "^5.1.4" + workbox-range-requests "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + workbox-streams "^5.1.4" + workbox-sw "^5.1.4" + workbox-window "^5.1.4" + +workbox-cacheable-response@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== + dependencies: + workbox-core "^5.1.4" + +workbox-core@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== + +workbox-expiration@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== + dependencies: + workbox-core "^5.1.4" + +workbox-google-analytics@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== + dependencies: + workbox-background-sync "^5.1.4" + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + +workbox-navigation-preload@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== + dependencies: + workbox-core "^5.1.4" + +workbox-precaching@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== + dependencies: + workbox-core "^5.1.4" + +workbox-range-requests@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== + dependencies: + workbox-core "^5.1.4" + +workbox-routing@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== + dependencies: + workbox-core "^5.1.4" + +workbox-strategies@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-streams@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-sw@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== + +workbox-webpack-plugin@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== + dependencies: + "@babel/runtime" "^7.5.5" + fast-json-stable-stringify "^2.0.0" + source-map-url "^0.4.0" + upath "^1.1.2" + webpack-sources "^1.3.0" + workbox-build "^5.1.4" + +workbox-window@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" + integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== + dependencies: + workbox-core "^5.1.4" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.4.5: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^1.8.3: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1, yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 9885c6bf16d3a7dbc42528f396ba02883e67706c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 14 Jan 2022 21:05:47 +0100 Subject: [PATCH 207/221] merge frontend and backend repositories --- tests/Controller/CollectionTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Controller/CollectionTest.php b/tests/Controller/CollectionTest.php index fece02d..1bf16c8 100644 --- a/tests/Controller/CollectionTest.php +++ b/tests/Controller/CollectionTest.php @@ -1,7 +1,8 @@ Date: Fri, 14 Jan 2022 21:07:17 +0100 Subject: [PATCH 208/221] merge frontend and backend repositories --- deploy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.php b/deploy.php index c39f237..8b22d5a 100644 --- a/deploy.php +++ b/deploy.php @@ -29,7 +29,7 @@ ]); add('writable_dirs', ['var']); -host('ivanstanojevic.me') +host('tle.ivanstanojevic.me') ->user('glutenfr') ->port(2233) ->stage('production') From b9f22ce762d194313eb8ff62e4a1bea452cdcabc Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 30 Jan 2022 11:51:33 +0100 Subject: [PATCH 209/221] merge frontend and backend repositories --- deploy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy.php b/deploy.php index 8b22d5a..3db09d9 100644 --- a/deploy.php +++ b/deploy.php @@ -36,7 +36,7 @@ ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); task('test', function () { - set('symfony_env', 'test'); + set('symfony_env', 'dev'); runLocally('bin/phpunit'); }); From 15bbc7a2018c356c72dd514463cb77f16d14f322 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 30 Jan 2022 11:51:57 +0100 Subject: [PATCH 210/221] merge frontend and backend repositories --- deploy.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy.php b/deploy.php index 3db09d9..49ebb48 100644 --- a/deploy.php +++ b/deploy.php @@ -36,8 +36,9 @@ ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); task('test', function () { - set('symfony_env', 'dev'); + set('symfony_env', 'test'); runLocally('bin/phpunit'); + set('symfony_env', 'dev'); }); task('deploy:dump-env', function () { From efb14869b95efaf64ab739c9c8e021ee81e47fd3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 4 Feb 2022 20:28:45 +0100 Subject: [PATCH 211/221] merge frontend and backend repositories --- src/Command/ImportTleCommand.php | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 35ca506..741fba3 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -9,6 +9,7 @@ use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Ivanstan\Tle\Model\TleFile; +use Psr\Log\LoggerInterface; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; @@ -19,7 +20,7 @@ use Symfony\Component\Yaml\Yaml; #[AsCommand( - name: 'import:tle', description: 'Update TLE database' + name: 'tle:import', description: 'Update TLE database', aliases: ['import:tle'] )] final class ImportTleCommand extends Command { @@ -32,7 +33,7 @@ final class ImportTleCommand extends Command private array $satellites = []; - public function __construct(private EntityManagerInterface $em, private TleRepository $repository) + public function __construct(private EntityManagerInterface $em, private TleRepository $repository, private LoggerInterface $logger) { parent::__construct(); } @@ -69,17 +70,18 @@ protected function execute(InputInterface $input, OutputInterface $output): int try { $response = (new Client())->request('GET', $uri); } catch (\Exception $exception) { - $output->writeln( - \sprintf( - 'Unable to fetch resource "%s" with exception message "%s"', - $uri, - $exception->getMessage() - ) - ); + $message = \sprintf('Unable to fetch resource "%s" with exception message "%s"', $uri, $exception->getMessage()); + + $this->logger->error($message); + $output->writeln($message); continue; } if (!$response->getBody()) { + $message = \sprintf('URI "%s" returned empty body, skipping', $uri); + + $this->logger->error($message); + $output->writeln($message); continue; } @@ -111,9 +113,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int $table = new Table($output); $table - ->setHeaders([ - 'Output' - ]) + ->setHeaders( + [ + 'Output', + ] + ) ->setStyle('box') ->setRows( [ From 50d50ea6c62d1f20aa8d3141e572d10c0eec3cae Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Feb 2022 20:00:07 +0100 Subject: [PATCH 212/221] merge frontend and backend repositories --- src/Controller/DocsController.php | 16 ++++++---------- src/Service/ApiDocService.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 src/Service/ApiDocService.php diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index f3c2a23..1228f81 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Service\ApiDocService; use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; @@ -12,6 +13,10 @@ final class DocsController extends AbstractController { use FileSystemAwareTrait; + public function __construct(private ApiDocService $service) + { + } + #[Route("/", name: "tle_home")] #[Route('/api/tle/docs', name: "app_api_docs")] public function docs(): Response @@ -25,15 +30,6 @@ public function docs(): Response #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - $docs = json_decode( - file_get_contents($this->getProjectDir().'/etc/custom/tle.json'), - true, - JSON_THROW_ON_ERROR, - JSON_THROW_ON_ERROR - ); - - $docs['info']['version'] = $this->getParameter('version'); - - return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*']); + return new JsonResponse($this->service->getDocs('/etc/custom/tle.json'), Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*']); } } diff --git a/src/Service/ApiDocService.php b/src/Service/ApiDocService.php new file mode 100644 index 0000000..83d3911 --- /dev/null +++ b/src/Service/ApiDocService.php @@ -0,0 +1,29 @@ +getProjectDir(). $file), + true, + JSON_THROW_ON_ERROR, + JSON_THROW_ON_ERROR + ); + + $docs['info']['version'] = $this->bag->get('version'); + + return $docs; + } +} From 1f793bcea0db6fe69bb34fc43abe563a5c164863 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Feb 2022 20:03:30 +0100 Subject: [PATCH 213/221] merge frontend and backend repositories --- src/Service/ApiDocService.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Service/ApiDocService.php b/src/Service/ApiDocService.php index 83d3911..fc1ff0b 100644 --- a/src/Service/ApiDocService.php +++ b/src/Service/ApiDocService.php @@ -4,13 +4,12 @@ use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; -use Symfony\Contracts\Cache\CacheInterface; class ApiDocService { use FileSystemAwareTrait; - public function __construct(protected ParameterBagInterface $bag, private CacheInterface $cache) + public function __construct(protected ParameterBagInterface $bag) { } From 36c5ce529ae392a4dc4b6ba31230befd3914b6d2 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 15 Feb 2022 16:19:24 +0100 Subject: [PATCH 214/221] add cache to docs --- phpunit.xml.dist | 1 - src/Controller/DocsController.php | 5 +---- src/Service/ApiDocService.php | 25 +++++++++++++++++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c439d12..3ec5168 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -30,7 +30,6 @@ src/Migrations - src/Command src/DataFixtures src/Kernel.php diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 1228f81..9e16b53 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -24,12 +24,9 @@ public function docs(): Response return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } - /** - * @throws \JsonException - */ #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - return new JsonResponse($this->service->getDocs('/etc/custom/tle.json'), Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*']); + return new JsonResponse($this->service->get('/etc/custom/tle.json'), Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*']); } } diff --git a/src/Service/ApiDocService.php b/src/Service/ApiDocService.php index fc1ff0b..c2a6193 100644 --- a/src/Service/ApiDocService.php +++ b/src/Service/ApiDocService.php @@ -3,19 +3,40 @@ namespace App\Service; use Ivanstan\SymfonySupport\Traits\FileSystemAwareTrait; +use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class ApiDocService { use FileSystemAwareTrait; + protected FilesystemAdapter $cache; + public function __construct(protected ParameterBagInterface $bag) { + $this->cache = new FilesystemAdapter(); } - public function getDocs(string $file): array { + public function get(string $file): array + { + $result = $this->cache->getItem('tle_api_doc'); + $result->expiresAfter(new \DateInterval('PT30M')); + + if ($result->isHit()) { + return $result->get(); + } + + $data = $this->build($file); + + $result->set($data); + + return $data; + } + + protected function build(string $file): array + { $docs = json_decode( - file_get_contents($this->getProjectDir(). $file), + file_get_contents($this->getProjectDir().$file), true, JSON_THROW_ON_ERROR, JSON_THROW_ON_ERROR From 90f64a2ba47240eb2b608976cd2e9e4e7e0fb335 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 15 Feb 2022 17:11:34 +0100 Subject: [PATCH 215/221] add cache to docs --- etc/services.yaml | 3 +++ src/Request/TleRequest.php | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/etc/services.yaml b/etc/services.yaml index 38aa0fc..799c354 100644 --- a/etc/services.yaml +++ b/etc/services.yaml @@ -26,5 +26,8 @@ services: resource: '../src/Controller' tags: [ 'controller.service_arguments' ] + App\Repository\TleRepository: + public: true + # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index 9a0aa54..ed3dab0 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -2,18 +2,28 @@ namespace App\Request; +use App\Repository\TleRepository; use Ivanstan\SymfonySupport\Request\AbstractRequest; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\Service\Attribute\Required; class TleRequest extends AbstractRequest { public const EXTRA_PARAM = 'extra'; + protected TleRepository $repository; + use TleRequestTrait { validate as validateExtraParam; } + #[Required] + public function setRepository(TleRepository $repository): void + { + $this->repository = $repository; + } + public function getId(): int { return $this->attributes->get('id'); From 2fa2e94c5dc4fe3e35111abeddb02def58aa64e8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 15 Feb 2022 17:24:24 +0100 Subject: [PATCH 216/221] add cache to docs --- composer.lock | 872 +++++++++++++------------ src/Controller/FlyOverController.php | 19 +- src/Controller/PropagateController.php | 11 +- src/Controller/TleController.php | 5 +- src/Request/FlyOverRequest.php | 2 +- src/Request/PropagateRequest.php | 4 +- src/Request/TleRequest.php | 14 + src/Service/Traits/TleHttpTrait.php | 21 - 8 files changed, 469 insertions(+), 479 deletions(-) delete mode 100644 src/Service/Traits/TleHttpTrait.php diff --git a/composer.lock b/composer.lock index eccb9ed..48b4ad4 100644 --- a/composer.lock +++ b/composer.lock @@ -85,12 +85,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -444,16 +444,16 @@ }, { "name": "doctrine/common", - "version": "3.2.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "e927fc2410c8723d053b8032e591cdff76587cdb" + "reference": "295082d3750987065912816a9d536c2df735f637" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/e927fc2410c8723d053b8032e591cdff76587cdb", - "reference": "e927fc2410c8723d053b8032e591cdff76587cdb", + "url": "https://api.github.com/repos/doctrine/common/zipball/295082d3750987065912816a9d536c2df735f637", + "reference": "295082d3750987065912816a9d536c2df735f637", "shasum": "" }, "require": { @@ -462,7 +462,7 @@ }, "require-dev": { "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan": "^1.4.1", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", @@ -514,7 +514,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.2.1" + "source": "https://github.com/doctrine/common/tree/3.2.2" }, "funding": [ { @@ -530,24 +530,24 @@ "type": "tidelift" } ], - "time": "2021-12-26T22:39:45+00:00" + "time": "2022-02-02T09:15:57+00:00" }, { "name": "doctrine/dbal", - "version": "3.2.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542" + "reference": "35eae239ef515d55ebb24e9d4715cad09a4f58ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/4caf37acf14b513a91dd4f087f7eda424fa25542", - "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/35eae239ef515d55ebb24e9d4715cad09a4f58ed", + "reference": "35eae239ef515d55ebb24e9d4715cad09a4f58ed", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.11.99", + "composer-runtime-api": "^2", "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", @@ -558,13 +558,13 @@ "require-dev": { "doctrine/coding-standard": "9.0.0", "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.3.0", + "phpstan/phpstan": "1.4.0", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "9.5.11", "psalm/plugin-phpunit": "0.16.1", "squizlabs/php_codesniffer": "3.6.2", "symfony/cache": "^5.2|^6.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", + "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0", "vimeo/psalm": "4.16.1" }, "suggest": { @@ -625,7 +625,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.2.1" + "source": "https://github.com/doctrine/dbal/tree/3.3.2" }, "funding": [ { @@ -641,7 +641,7 @@ "type": "tidelift" } ], - "time": "2022-01-05T08:52:06+00:00" + "time": "2022-02-05T16:33:45+00:00" }, { "name": "doctrine/deprecations", @@ -688,22 +688,22 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.5.5", + "version": "2.5.6", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc" + "reference": "f1423b2a640b6ac545b6e0c02575427a4dc1e9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5c086cbbe5327937dd6f90da075f7d421b0f28bc", - "reference": "5c086cbbe5327937dd6f90da075f7d421b0f28bc", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f1423b2a640b6ac545b6e0c02575427a4dc1e9dc", + "reference": "f1423b2a640b6ac545b6e0c02575427a4dc1e9dc", "shasum": "" }, "require": { "doctrine/annotations": "^1", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^2.13.1|^3.1", + "doctrine/dbal": "^2.13.1|^3.3.2", "doctrine/persistence": "^2.2", "doctrine/sql-formatter": "^1.0.1", "php": "^7.1 || ^8.0", @@ -717,7 +717,7 @@ "symfony/service-contracts": "^1.1.1|^2.0|^3" }, "conflict": { - "doctrine/orm": "<2.9", + "doctrine/orm": "<2.9|>=3.0", "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { @@ -781,7 +781,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.5.5" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.5.6" }, "funding": [ { @@ -797,20 +797,20 @@ "type": "tidelift" } ], - "time": "2022-01-06T08:56:31+00:00" + "time": "2022-02-13T20:17:53+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.2.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "c1b10bc1466e08bba82640e49c7bbcce0c9853c2" + "reference": "3393f411ba25ade21969c33f2053220044854d01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/c1b10bc1466e08bba82640e49c7bbcce0c9853c2", - "reference": "c1b10bc1466e08bba82640e49c7bbcce0c9853c2", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/3393f411ba25ade21969c33f2053220044854d01", + "reference": "3393f411ba25ade21969c33f2053220044854d01", "shasum": "" }, "require": { @@ -850,11 +850,11 @@ }, { "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org" + "homepage": "https://www.doctrine-project.org" }, { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony DoctrineMigrationsBundle", @@ -866,7 +866,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.2.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.2.2" }, "funding": [ { @@ -882,7 +882,7 @@ "type": "tidelift" } ], - "time": "2021-11-11T11:08:52+00:00" + "time": "2022-02-01T18:08:07+00:00" }, { "name": "doctrine/event-manager", @@ -1140,32 +1140,28 @@ }, { "name": "doctrine/lexer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", + "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" @@ -1200,7 +1196,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/doctrine/lexer/tree/1.2.2" }, "funding": [ { @@ -1216,24 +1212,24 @@ "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2022-01-12T08:27:12+00:00" }, { "name": "doctrine/migrations", - "version": "3.3.2", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "b6e43bb5815f4dbb88c79a0fef1c669dfba52d58" + "reference": "e7df670aa9565b435ffec636cebdb4d0a1987f10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/b6e43bb5815f4dbb88c79a0fef1c669dfba52d58", - "reference": "b6e43bb5815f4dbb88c79a0fef1c669dfba52d58", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/e7df670aa9565b435ffec636cebdb4d0a1987f10", + "reference": "e7df670aa9565b435ffec636cebdb4d0a1987f10", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8", + "composer-runtime-api": "^2", "doctrine/dbal": "^2.11 || ^3.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", @@ -1256,7 +1252,7 @@ "phpstan/phpstan-strict-rules": "^0.12", "phpstan/phpstan-symfony": "^0.12", "phpunit/phpunit": "^8.5 || ^9.4", - "symfony/cache": "^3.4.26 || ~4.1.12 || ^4.2.7 || ^5.0 || ^6.0", + "symfony/cache": "^3.4.26 || ^4.2.12 || ^5.0 || ^6.0", "symfony/process": "^3.4 || ^4.0 || ^5.0 || ^6.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, @@ -1306,7 +1302,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.3.2" + "source": "https://github.com/doctrine/migrations/tree/3.4.1" }, "funding": [ { @@ -1322,28 +1318,28 @@ "type": "tidelift" } ], - "time": "2021-11-12T09:03:27+00:00" + "time": "2022-01-28T21:58:35+00:00" }, { "name": "doctrine/orm", - "version": "2.10.4", + "version": "2.11.1", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "cccb2e2fdfed2969afb3d65c5ea82bafdefbe1a7" + "reference": "4b88ce787d3916c8366abf52f6c658a7a27ed3a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/cccb2e2fdfed2969afb3d65c5ea82bafdefbe1a7", - "reference": "cccb2e2fdfed2969afb3d65c5ea82bafdefbe1a7", + "url": "https://api.github.com/repos/doctrine/orm/zipball/4b88ce787d3916c8366abf52f6c658a7a27ed3a6", + "reference": "4b88ce787d3916c8366abf52f6c658a7a27ed3a6", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8", + "composer-runtime-api": "^2", "doctrine/cache": "^1.12.1 || ^2.1.1", "doctrine/collections": "^1.5", "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.1 || ^3.1.1", + "doctrine/dbal": "^2.13.1 || ^3.2", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.1", "doctrine/inflector": "^1.4 || ^2.0", @@ -1352,7 +1348,7 @@ "doctrine/persistence": "^2.2", "ext-ctype": "*", "ext-pdo": "*", - "php": "^7.1 ||^8.0", + "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3", "symfony/console": "^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/polyfill-php72": "^1.23", @@ -1365,12 +1361,12 @@ "doctrine/annotations": "^1.13", "doctrine/coding-standard": "^9.0", "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "1.2.0", + "phpstan/phpstan": "1.4.3", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4 || ^5.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", - "vimeo/psalm": "4.15.0" + "vimeo/psalm": "4.19.0" }, "suggest": { "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", @@ -1419,44 +1415,45 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.10.4" + "source": "https://github.com/doctrine/orm/tree/2.11.1" }, - "time": "2021-12-20T21:23:47+00:00" + "time": "2022-01-30T21:47:06+00:00" }, { "name": "doctrine/persistence", - "version": "2.2.3", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee" + "reference": "f8af155c1e7963f3d2b4415097d55757bbaa53d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee", - "reference": "5e7bdbbfe9811c06e1f745d1c166647d5c47d6ee", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/f8af155c1e7963f3d2b4415097d55757bbaa53d8", + "reference": "f8af155c1e7963f3d2b4415097d55757bbaa53d8", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", "doctrine/cache": "^1.11 || ^2.0", "doctrine/collections": "^1.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "php": "^7.1 || ^8.0", - "psr/cache": "^1.0|^2.0|^3.0" + "psr/cache": "^1.0 || ^2.0 || ^3.0" }, "conflict": { + "doctrine/annotations": "<1.0 || >=2.0", "doctrine/common": "<2.10@dev" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.0", "doctrine/coding-standard": "^6.0 || ^9.0", "doctrine/common": "^3.0", - "phpstan/phpstan": "0.12.84", + "phpstan/phpstan": "1.2.0", "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", - "symfony/cache": "^4.4|^5.0", - "vimeo/psalm": "4.7.0" + "symfony/cache": "^4.4 || ^5.0 || ^6.0", + "vimeo/psalm": "4.13.1" }, "type": "library", "autoload": { @@ -1506,9 +1503,9 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.2.3" + "source": "https://github.com/doctrine/persistence/tree/2.3.0" }, - "time": "2021-10-25T19:59:10+00:00" + "time": "2022-01-09T19:58:46+00:00" }, { "name": "doctrine/sql-formatter", @@ -1680,12 +1677,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1835,12 +1832,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1973,12 +1970,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/symfony-support.git", - "reference": "5b31f82016b4f082c70cf2c97afd37c359f27e32" + "reference": "6a2abcd75f3aed5ad44bfda11e1533d0e342aac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/5b31f82016b4f082c70cf2c97afd37c359f27e32", - "reference": "5b31f82016b4f082c70cf2c97afd37c359f27e32", + "url": "https://api.github.com/repos/ivanstan/symfony-support/zipball/6a2abcd75f3aed5ad44bfda11e1533d0e342aac1", + "reference": "6a2abcd75f3aed5ad44bfda11e1533d0e342aac1", "shasum": "" }, "require": { @@ -2015,7 +2012,7 @@ "issues": "https://github.com/ivanstan/symfony-support/issues", "source": "https://github.com/ivanstan/symfony-support/tree/master" }, - "time": "2022-01-09T17:59:36+00:00" + "time": "2022-02-15T16:11:33+00:00" }, { "name": "ivanstan/tle-php", @@ -2555,16 +2552,16 @@ }, { "name": "php-http/message", - "version": "1.12.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "39eb7548be982a81085fe5a6e2a44268cd586291" + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/39eb7548be982a81085fe5a6e2a44268cd586291", - "reference": "39eb7548be982a81085fe5a6e2a44268cd586291", + "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", "shasum": "" }, "require": { @@ -2581,7 +2578,7 @@ "ext-zlib": "*", "guzzlehttp/psr7": "^1.0", "laminas/laminas-diactoros": "^2.0", - "phpspec/phpspec": "^5.1 || ^6.3", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "slim/slim": "^3.0" }, "suggest": { @@ -2597,12 +2594,12 @@ } }, "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - }, "files": [ "src/filters.php" - ] + ], + "psr-4": { + "Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2623,9 +2620,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.12.0" + "source": "https://github.com/php-http/message/tree/1.13.0" }, - "time": "2021-08-29T09:13:12+00:00" + "time": "2022-02-11T13:41:14+00:00" }, { "name": "php-http/message-factory", @@ -3411,16 +3408,16 @@ }, { "name": "sentry/sentry", - "version": "3.3.5", + "version": "3.3.7", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "c186c44c32899ad0cf5b4e942d71035f01b87b64" + "reference": "32e5415803ff0349ccb5e5b5e77b016320762786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c186c44c32899ad0cf5b4e942d71035f01b87b64", - "reference": "c186c44c32899ad0cf5b4e942d71035f01b87b64", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/32e5415803ff0349ccb5e5b5e77b016320762786", + "reference": "32e5415803ff0349ccb5e5b5e77b016320762786", "shasum": "" }, "require": { @@ -3447,17 +3444,18 @@ "raven/raven": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^2.19|3.4.*", "http-interop/http-factory-guzzle": "^1.0", "monolog/monolog": "^1.3|^2.0", "nikic/php-parser": "^4.10.3", "php-http/mock-client": "^1.3", + "phpbench/phpbench": "^1.0", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^8.5.14|^9.4", "symfony/phpunit-bridge": "^5.2|^6.0", - "vimeo/psalm": "^4.2" + "vimeo/psalm": "^4.17" }, "suggest": { "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." @@ -3499,7 +3497,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.3.5" + "source": "https://github.com/getsentry/sentry-php/tree/3.3.7" }, "funding": [ { @@ -3511,20 +3509,20 @@ "type": "custom" } ], - "time": "2021-12-27T12:31:24+00:00" + "time": "2022-01-19T08:46:27+00:00" }, { "name": "sentry/sentry-symfony", - "version": "4.2.5", + "version": "4.2.6", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "2d3016484d83291a5da137d1a9347e70f0fe526a" + "reference": "c3f2c687b45e3e42573372ac75e643c9e4f3f896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/2d3016484d83291a5da137d1a9347e70f0fe526a", - "reference": "2d3016484d83291a5da137d1a9347e70f0fe526a", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/c3f2c687b45e3e42573372ac75e643c9e4f3f896", + "reference": "c3f2c687b45e3e42573372ac75e643c9e4f3f896", "shasum": "" }, "require": { @@ -3532,7 +3530,7 @@ "php": "^7.2||^8.0", "php-http/discovery": "^1.11", "sentry/sdk": "^3.1", - "symfony/cache-contracts": "^1.1||^2.4", + "symfony/cache-contracts": "^1.1||^2.4||^3.0", "symfony/config": "^3.4.44||^4.4.20||^5.0.11||^6.0", "symfony/console": "^3.4.44||^4.4.20||^5.0.11||^6.0", "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11||^6.0", @@ -3613,7 +3611,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.2.5" + "source": "https://github.com/getsentry/sentry-symfony/tree/4.2.6" }, "funding": [ { @@ -3625,7 +3623,7 @@ "type": "custom" } ], - "time": "2021-12-13T08:52:25+00:00" + "time": "2022-01-10T08:56:54+00:00" }, { "name": "symfony/apache-pack", @@ -3655,16 +3653,16 @@ }, { "name": "symfony/asset", - "version": "v6.0.1", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "98cc78b2fd6f00191596bc91f72d7301e8ac88dd" + "reference": "a926033206f3644b1289f4eb09dc0989c7080c21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/98cc78b2fd6f00191596bc91f72d7301e8ac88dd", - "reference": "98cc78b2fd6f00191596bc91f72d7301e8ac88dd", + "url": "https://api.github.com/repos/symfony/asset/zipball/a926033206f3644b1289f4eb09dc0989c7080c21", + "reference": "a926033206f3644b1289f4eb09dc0989c7080c21", "shasum": "" }, "require": { @@ -3707,7 +3705,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.0.1" + "source": "https://github.com/symfony/asset/tree/v6.0.3" }, "funding": [ { @@ -3723,20 +3721,20 @@ "type": "tidelift" } ], - "time": "2021-12-08T15:13:44+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/browser-kit", - "version": "v6.0.1", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "3e2f1610a25edc2afc2f5f37cc421049d6bef208" + "reference": "0ec66df981406fd2c9e41acbb526249bd18a0123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3e2f1610a25edc2afc2f5f37cc421049d6bef208", - "reference": "3e2f1610a25edc2afc2f5f37cc421049d6bef208", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/0ec66df981406fd2c9e41acbb526249bd18a0123", + "reference": "0ec66df981406fd2c9e41acbb526249bd18a0123", "shasum": "" }, "require": { @@ -3778,7 +3776,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.0.1" + "source": "https://github.com/symfony/browser-kit/tree/v6.0.3" }, "funding": [ { @@ -3794,20 +3792,20 @@ "type": "tidelift" } ], - "time": "2021-12-08T15:13:44+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/cache", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "41bdcb2d067c68f338b0cfd46a86abd8309b4153" + "reference": "4d2edb87334c1fb2fade9382c70e2284204f0b8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/41bdcb2d067c68f338b0cfd46a86abd8309b4153", - "reference": "41bdcb2d067c68f338b0cfd46a86abd8309b4153", + "url": "https://api.github.com/repos/symfony/cache/zipball/4d2edb87334c1fb2fade9382c70e2284204f0b8b", + "reference": "4d2edb87334c1fb2fade9382c70e2284204f0b8b", "shasum": "" }, "require": { @@ -3871,7 +3869,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.0.2" + "source": "https://github.com/symfony/cache/tree/v6.0.3" }, "funding": [ { @@ -3887,25 +3885,25 @@ "type": "tidelift" } ], - "time": "2021-12-29T13:00:11+00:00" + "time": "2022-01-26T17:32:35+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" + "reference": "2f7463f156cf9c665d9317e21a809c3bbff5754e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/2f7463f156cf9c665d9317e21a809c3bbff5754e", + "reference": "2f7463f156cf9c665d9317e21a809c3bbff5754e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" + "php": ">=8.0.2", + "psr/cache": "^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -3913,7 +3911,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -3950,7 +3948,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.0.0" }, "funding": [ { @@ -3966,20 +3964,20 @@ "type": "tidelift" } ], - "time": "2021-08-17T14:20:01+00:00" + "time": "2021-08-17T15:35:52+00:00" }, { "name": "symfony/config", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "990e6d603da7b9556645e5689c7b082f564790e7" + "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/990e6d603da7b9556645e5689c7b082f564790e7", - "reference": "990e6d603da7b9556645e5689c7b082f564790e7", + "url": "https://api.github.com/repos/symfony/config/zipball/c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", + "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", "shasum": "" }, "require": { @@ -4028,7 +4026,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.0.2" + "source": "https://github.com/symfony/config/tree/v6.0.3" }, "funding": [ { @@ -4044,20 +4042,20 @@ "type": "tidelift" } ], - "time": "2021-12-28T14:01:53+00:00" + "time": "2022-01-03T09:53:43+00:00" }, { "name": "symfony/console", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dd434fa8d69325e5d210f63070014d889511fcb3" + "reference": "22e8efd019c3270c4f79376234a3f8752cd25490" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dd434fa8d69325e5d210f63070014d889511fcb3", - "reference": "dd434fa8d69325e5d210f63070014d889511fcb3", + "url": "https://api.github.com/repos/symfony/console/zipball/22e8efd019c3270c4f79376234a3f8752cd25490", + "reference": "22e8efd019c3270c4f79376234a3f8752cd25490", "shasum": "" }, "require": { @@ -4123,7 +4121,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.0.2" + "source": "https://github.com/symfony/console/tree/v6.0.3" }, "funding": [ { @@ -4139,20 +4137,20 @@ "type": "tidelift" } ], - "time": "2021-12-27T21:05:08+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "symfony/css-selector", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "380f86c1a9830226f42a08b5926f18aed4195f25" + "reference": "1955d595c12c111629cc814d3f2a2ff13580508a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/380f86c1a9830226f42a08b5926f18aed4195f25", - "reference": "380f86c1a9830226f42a08b5926f18aed4195f25", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1955d595c12c111629cc814d3f2a2ff13580508a", + "reference": "1955d595c12c111629cc814d3f2a2ff13580508a", "shasum": "" }, "require": { @@ -4188,7 +4186,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.0.2" + "source": "https://github.com/symfony/css-selector/tree/v6.0.3" }, "funding": [ { @@ -4204,20 +4202,20 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:13:01+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8" + "reference": "bf53dbf6e8f3eec14f44c53fa4c3b4905ab19ee4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8", - "reference": "a9346ef44ea8a7b60f1f1edc8d802ffb91baa6a8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/bf53dbf6e8f3eec14f44c53fa4c3b4905ab19ee4", + "reference": "bf53dbf6e8f3eec14f44c53fa4c3b4905ab19ee4", "shasum": "" }, "require": { @@ -4276,7 +4274,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.0.2" + "source": "https://github.com/symfony/dependency-injection/tree/v6.0.3" }, "funding": [ { @@ -4292,7 +4290,7 @@ "type": "tidelift" } ], - "time": "2021-12-29T10:14:09+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4363,16 +4361,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "edc5491594d2f69d5704118d255c6f597167813d" + "reference": "d1d9d54717d3125119e09c9c34b337364e47960e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/edc5491594d2f69d5704118d255c6f597167813d", - "reference": "edc5491594d2f69d5704118d255c6f597167813d", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d1d9d54717d3125119e09c9c34b337364e47960e", + "reference": "d1d9d54717d3125119e09c9c34b337364e47960e", "shasum": "" }, "require": { @@ -4458,7 +4456,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.0.2" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.0.3" }, "funding": [ { @@ -4474,20 +4472,20 @@ "type": "tidelift" } ], - "time": "2021-12-25T20:10:03+00:00" + "time": "2022-01-27T10:11:24+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "bf704b7d995c4908d9906d687b9d4cbfecf01b2c" + "reference": "24d9de5965b8b043ea13ef234087543c9740641c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bf704b7d995c4908d9906d687b9d4cbfecf01b2c", - "reference": "bf704b7d995c4908d9906d687b9d4cbfecf01b2c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/24d9de5965b8b043ea13ef234087543c9740641c", + "reference": "24d9de5965b8b043ea13ef234087543c9740641c", "shasum": "" }, "require": { @@ -4531,7 +4529,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.0.2" + "source": "https://github.com/symfony/dom-crawler/tree/v6.0.3" }, "funding": [ { @@ -4547,20 +4545,20 @@ "type": "tidelift" } ], - "time": "2021-12-28T17:22:37+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/dotenv", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "5c43c5515e549a8c2c426be36d40f47daf196968" + "reference": "45c47b67cc92fbcf9b1d40f08e970a136f75559f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/5c43c5515e549a8c2c426be36d40f47daf196968", - "reference": "5c43c5515e549a8c2c426be36d40f47daf196968", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/45c47b67cc92fbcf9b1d40f08e970a136f75559f", + "reference": "45c47b67cc92fbcf9b1d40f08e970a136f75559f", "shasum": "" }, "require": { @@ -4601,7 +4599,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.0.2" + "source": "https://github.com/symfony/dotenv/tree/v6.0.3" }, "funding": [ { @@ -4617,20 +4615,20 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:05:41+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "symfony/error-handler", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "3e677f0c14a529bc542025c96cfa9638227b4cc6" + "reference": "20343b3bad7ebafa38138ddcb97290a24722b57b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/3e677f0c14a529bc542025c96cfa9638227b4cc6", - "reference": "3e677f0c14a529bc542025c96cfa9638227b4cc6", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/20343b3bad7ebafa38138ddcb97290a24722b57b", + "reference": "20343b3bad7ebafa38138ddcb97290a24722b57b", "shasum": "" }, "require": { @@ -4672,7 +4670,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.0.2" + "source": "https://github.com/symfony/error-handler/tree/v6.0.3" }, "funding": [ { @@ -4688,20 +4686,20 @@ "type": "tidelift" } ], - "time": "2021-12-21T13:16:58+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c" + "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7093f25359e2750bfe86842c80c4e4a6a852d05c", - "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6472ea2dd415e925b90ca82be64b8bc6157f3934", + "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934", "shasum": "" }, "require": { @@ -4755,7 +4753,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.3" }, "funding": [ { @@ -4771,7 +4769,7 @@ "type": "tidelift" } ], - "time": "2021-12-21T10:43:13+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4854,16 +4852,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.0.0", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "52b3c9cce673b014915445a432339f282e002ce6" + "reference": "6ae49c4fda17322171a2b8dc5f70bc6edbc498e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", - "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6ae49c4fda17322171a2b8dc5f70bc6edbc498e1", + "reference": "6ae49c4fda17322171a2b8dc5f70bc6edbc498e1", "shasum": "" }, "require": { @@ -4897,7 +4895,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + "source": "https://github.com/symfony/filesystem/tree/v6.0.3" }, "funding": [ { @@ -4913,20 +4911,20 @@ "type": "tidelift" } ], - "time": "2021-10-29T07:35:21+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/finder", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "03d2833e677d48317cac852f9c0287fb048c3c5c" + "reference": "8661b74dbabc23223f38c9b99d3f8ade71170430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/03d2833e677d48317cac852f9c0287fb048c3c5c", - "reference": "03d2833e677d48317cac852f9c0287fb048c3c5c", + "url": "https://api.github.com/repos/symfony/finder/zipball/8661b74dbabc23223f38c9b99d3f8ade71170430", + "reference": "8661b74dbabc23223f38c9b99d3f8ade71170430", "shasum": "" }, "require": { @@ -4958,7 +4956,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.0.2" + "source": "https://github.com/symfony/finder/tree/v6.0.3" }, "funding": [ { @@ -4974,20 +4972,20 @@ "type": "tidelift" } ], - "time": "2021-12-20T16:21:45+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "symfony/flex", - "version": "v1.17.6", + "version": "v1.18.4", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "7a79135e1dc66b30042b4d968ecba0908f9374bc" + "reference": "910a5c5ac35b58c9faddc992f56ad7a931d1e064" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/7a79135e1dc66b30042b4d968ecba0908f9374bc", - "reference": "7a79135e1dc66b30042b4d968ecba0908f9374bc", + "url": "https://api.github.com/repos/symfony/flex/zipball/910a5c5ac35b58c9faddc992f56ad7a931d1e064", + "reference": "910a5c5ac35b58c9faddc992f56ad7a931d1e064", "shasum": "" }, "require": { @@ -5023,7 +5021,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.17.6" + "source": "https://github.com/symfony/flex/tree/v1.18.4" }, "funding": [ { @@ -5039,20 +5037,20 @@ "type": "tidelift" } ], - "time": "2021-11-29T15:39:37+00:00" + "time": "2022-02-15T08:56:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.0.2", + "version": "v6.0.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "d0598be96b193c4c2e5abab56af512a8e10b3540" + "reference": "12d8bfaa3dec658da80125d37633221ce1e40f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/d0598be96b193c4c2e5abab56af512a8e10b3540", - "reference": "d0598be96b193c4c2e5abab56af512a8e10b3540", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/12d8bfaa3dec658da80125d37633221ce1e40f8f", + "reference": "12d8bfaa3dec658da80125d37633221ce1e40f8f", "shasum": "" }, "require": { @@ -5173,7 +5171,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.0.2" + "source": "https://github.com/symfony/framework-bundle/tree/v6.0.4" }, "funding": [ { @@ -5189,20 +5187,20 @@ "type": "tidelift" } ], - "time": "2021-12-22T00:01:56+00:00" + "time": "2022-01-29T17:50:53+00:00" }, { "name": "symfony/http-client", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "7f1cbd44590cb0acc6208c1711a52733e9a91663" + "reference": "45b95017f6a20d564584bdee6a376c9a79caa316" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/7f1cbd44590cb0acc6208c1711a52733e9a91663", - "reference": "7f1cbd44590cb0acc6208c1711a52733e9a91663", + "url": "https://api.github.com/repos/symfony/http-client/zipball/45b95017f6a20d564584bdee6a376c9a79caa316", + "reference": "45b95017f6a20d564584bdee6a376c9a79caa316", "shasum": "" }, "require": { @@ -5257,7 +5255,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v6.0.2" + "source": "https://github.com/symfony/http-client/tree/v6.0.3" }, "funding": [ { @@ -5273,7 +5271,7 @@ "type": "tidelift" } ], - "time": "2021-12-29T10:14:09+00:00" + "time": "2022-01-22T06:58:00+00:00" }, { "name": "symfony/http-client-contracts", @@ -5355,16 +5353,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ac1cd9b84bdea9a3a06cd2127e910afc8b276798" + "reference": "ad157299ced81a637fade1efcadd688d6deba5c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ac1cd9b84bdea9a3a06cd2127e910afc8b276798", - "reference": "ac1cd9b84bdea9a3a06cd2127e910afc8b276798", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ad157299ced81a637fade1efcadd688d6deba5c1", + "reference": "ad157299ced81a637fade1efcadd688d6deba5c1", "shasum": "" }, "require": { @@ -5407,7 +5405,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.0.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.0.3" }, "funding": [ { @@ -5423,20 +5421,20 @@ "type": "tidelift" } ], - "time": "2021-12-28T17:22:37+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.0.2", + "version": "v6.0.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "00743bc336421a9be4f3e04464969ba8ef3517ad" + "reference": "9dce179ce52b0f4f669c07fd5e465e5d809a5d3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/00743bc336421a9be4f3e04464969ba8ef3517ad", - "reference": "00743bc336421a9be4f3e04464969ba8ef3517ad", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9dce179ce52b0f4f669c07fd5e465e5d809a5d3b", + "reference": "9dce179ce52b0f4f669c07fd5e465e5d809a5d3b", "shasum": "" }, "require": { @@ -5516,7 +5514,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.0.2" + "source": "https://github.com/symfony/http-kernel/tree/v6.0.4" }, "funding": [ { @@ -5532,20 +5530,20 @@ "type": "tidelift" } ], - "time": "2021-12-29T14:07:16+00:00" + "time": "2022-01-29T18:12:46+00:00" }, { "name": "symfony/lock", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "7d1425626631ddabc18eaa303af60273806df8d2" + "reference": "07aae10b83209a0c85bd19824d42c25efccde3fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/7d1425626631ddabc18eaa303af60273806df8d2", - "reference": "7d1425626631ddabc18eaa303af60273806df8d2", + "url": "https://api.github.com/repos/symfony/lock/zipball/07aae10b83209a0c85bd19824d42c25efccde3fe", + "reference": "07aae10b83209a0c85bd19824d42c25efccde3fe", "shasum": "" }, "require": { @@ -5593,7 +5591,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v6.0.2" + "source": "https://github.com/symfony/lock/tree/v6.0.3" }, "funding": [ { @@ -5609,20 +5607,20 @@ "type": "tidelift" } ], - "time": "2021-12-29T10:14:09+00:00" + "time": "2022-01-27T13:13:08+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.0.1", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "fcdd5ddb18114457ad53be75540a45d96450a9e6" + "reference": "10d90ee25c6a76c12d4bbe8721e354c287e177da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/fcdd5ddb18114457ad53be75540a45d96450a9e6", - "reference": "fcdd5ddb18114457ad53be75540a45d96450a9e6", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/10d90ee25c6a76c12d4bbe8721e354c287e177da", + "reference": "10d90ee25c6a76c12d4bbe8721e354c287e177da", "shasum": "" }, "require": { @@ -5676,7 +5674,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.0.1" + "source": "https://github.com/symfony/monolog-bridge/tree/v6.0.3" }, "funding": [ { @@ -5692,7 +5690,7 @@ "type": "tidelift" } ], - "time": "2021-12-09T12:41:48+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/monolog-bundle", @@ -5777,16 +5775,16 @@ }, { "name": "symfony/options-resolver", - "version": "v6.0.0", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798" + "reference": "51f7006670febe4cbcbae177cbffe93ff833250d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/be0facf48a42a232d6c0daadd76e4eb5657a4798", - "reference": "be0facf48a42a232d6c0daadd76e4eb5657a4798", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/51f7006670febe4cbcbae177cbffe93ff833250d", + "reference": "51f7006670febe4cbcbae177cbffe93ff833250d", "shasum": "" }, "require": { @@ -5824,7 +5822,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.0.3" }, "funding": [ { @@ -5840,24 +5838,23 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/orm-pack", - "version": "v2.1.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/orm-pack.git", - "reference": "357f6362067b1ebb94af321b79f8939fc9118751" + "reference": "c4728ba9ed071876f71df637c7dff0490c9252b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/357f6362067b1ebb94af321b79f8939fc9118751", - "reference": "357f6362067b1ebb94af321b79f8939fc9118751", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c4728ba9ed071876f71df637c7dff0490c9252b2", + "reference": "c4728ba9ed071876f71df637c7dff0490c9252b2", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "*", "doctrine/doctrine-bundle": "*", "doctrine/doctrine-migrations-bundle": "*", "doctrine/orm": "*", @@ -5871,7 +5868,7 @@ "description": "A pack for the Doctrine ORM", "support": { "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/v2.1.0" + "source": "https://github.com/symfony/orm-pack/tree/v2.2.0" }, "funding": [ { @@ -5887,20 +5884,20 @@ "type": "tidelift" } ], - "time": "2020-12-22T16:33:52+00:00" + "time": "2022-01-12T09:53:02+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "84a702edf57cdccd25c43b0c80c130a8b3d6c82d" + "reference": "4d04edcbcee4a97f39c72d1cf6149681d634e63f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/84a702edf57cdccd25c43b0c80c130a8b3d6c82d", - "reference": "84a702edf57cdccd25c43b0c80c130a8b3d6c82d", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/4d04edcbcee4a97f39c72d1cf6149681d634e63f", + "reference": "4d04edcbcee4a97f39c72d1cf6149681d634e63f", "shasum": "" }, "require": { @@ -5943,7 +5940,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.0.2" + "source": "https://github.com/symfony/password-hasher/tree/v6.0.3" }, "funding": [ { @@ -5959,7 +5956,7 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:13:01+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -5992,12 +5989,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6075,12 +6072,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6160,12 +6157,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6247,12 +6244,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6324,12 +6321,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6407,12 +6404,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6492,12 +6489,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6542,16 +6539,16 @@ }, { "name": "symfony/property-access", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "3f237ffd38a54592181ac62f63c6cabbca00051f" + "reference": "428ffd96c60bf2c13b35182f704b24db6712c897" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/3f237ffd38a54592181ac62f63c6cabbca00051f", - "reference": "3f237ffd38a54592181ac62f63c6cabbca00051f", + "url": "https://api.github.com/repos/symfony/property-access/zipball/428ffd96c60bf2c13b35182f704b24db6712c897", + "reference": "428ffd96c60bf2c13b35182f704b24db6712c897", "shasum": "" }, "require": { @@ -6601,7 +6598,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.0.2" + "source": "https://github.com/symfony/property-access/tree/v6.0.3" }, "funding": [ { @@ -6617,20 +6614,20 @@ "type": "tidelift" } ], - "time": "2021-12-11T16:36:28+00:00" + "time": "2022-01-12T18:59:56+00:00" }, { "name": "symfony/property-info", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf" + "reference": "46e4e6d254f80d103689f2bb103b52a6f5ac2fe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf", - "reference": "fc23cfd8fe8faa0712a8909f956cf2e46c72f6cf", + "url": "https://api.github.com/repos/symfony/property-info/zipball/46e4e6d254f80d103689f2bb103b52a6f5ac2fe2", + "reference": "46e4e6d254f80d103689f2bb103b52a6f5ac2fe2", "shasum": "" }, "require": { @@ -6690,7 +6687,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.0.2" + "source": "https://github.com/symfony/property-info/tree/v6.0.3" }, "funding": [ { @@ -6706,20 +6703,20 @@ "type": "tidelift" } ], - "time": "2021-12-27T21:05:08+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb" + "reference": "51ba60d4340fd91dd42c9caad76a414a521fbee4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb", - "reference": "9a310804dbf73d5a115412f0f0f8eb14ff3d8cfb", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/51ba60d4340fd91dd42c9caad76a414a521fbee4", + "reference": "51ba60d4340fd91dd42c9caad76a414a521fbee4", "shasum": "" }, "require": { @@ -6756,7 +6753,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.0.2" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.0.3" }, "funding": [ { @@ -6772,7 +6769,7 @@ "type": "tidelift" } ], - "time": "2021-12-25T20:10:03+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6864,16 +6861,16 @@ }, { "name": "symfony/rate-limiter", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "a721a4ce81aaeb76d629112c62c38a0c7770b3fb" + "reference": "795406813d478966ac2a8d5e8771177a69b64cbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/a721a4ce81aaeb76d629112c62c38a0c7770b3fb", - "reference": "a721a4ce81aaeb76d629112c62c38a0c7770b3fb", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/795406813d478966ac2a8d5e8771177a69b64cbf", + "reference": "795406813d478966ac2a8d5e8771177a69b64cbf", "shasum": "" }, "require": { @@ -6914,7 +6911,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.0.2" + "source": "https://github.com/symfony/rate-limiter/tree/v6.0.3" }, "funding": [ { @@ -6930,20 +6927,20 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:13:01+00:00" + "time": "2022-01-24T15:11:35+00:00" }, { "name": "symfony/routing", - "version": "v6.0.1", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "362bc14e1187deaef12d1ca0e04bd919580e8e49" + "reference": "b1debdf7a40e6bc7eee0f363ab9dd667fe04f099" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/362bc14e1187deaef12d1ca0e04bd919580e8e49", - "reference": "362bc14e1187deaef12d1ca0e04bd919580e8e49", + "url": "https://api.github.com/repos/symfony/routing/zipball/b1debdf7a40e6bc7eee0f363ab9dd667fe04f099", + "reference": "b1debdf7a40e6bc7eee0f363ab9dd667fe04f099", "shasum": "" }, "require": { @@ -7002,7 +6999,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.0.1" + "source": "https://github.com/symfony/routing/tree/v6.0.3" }, "funding": [ { @@ -7018,20 +7015,20 @@ "type": "tidelift" } ], - "time": "2021-12-08T15:13:44+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/runtime", - "version": "v6.0.0", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "7ae279ba1eae28ac3f5d7098bd94f2ead498e458" + "reference": "3b1ee78e883101439eb6c033feb43a5eea7fe190" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/7ae279ba1eae28ac3f5d7098bd94f2ead498e458", - "reference": "7ae279ba1eae28ac3f5d7098bd94f2ead498e458", + "url": "https://api.github.com/repos/symfony/runtime/zipball/3b1ee78e883101439eb6c033feb43a5eea7fe190", + "reference": "3b1ee78e883101439eb6c033feb43a5eea7fe190", "shasum": "" }, "require": { @@ -7078,7 +7075,7 @@ "description": "Enables decoupling PHP applications from global state", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/runtime/tree/v6.0.0" + "source": "https://github.com/symfony/runtime/tree/v6.0.3" }, "funding": [ { @@ -7094,20 +7091,20 @@ "type": "tidelift" } ], - "time": "2021-11-07T13:29:17+00:00" + "time": "2022-01-26T17:34:56+00:00" }, { "name": "symfony/security-core", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "5580d791d999ae500367780612c6210f03716b6c" + "reference": "eccb5675df44b2d7f3ad3a936c09ee8cb8340de5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/5580d791d999ae500367780612c6210f03716b6c", - "reference": "5580d791d999ae500367780612c6210f03716b6c", + "url": "https://api.github.com/repos/symfony/security-core/zipball/eccb5675df44b2d7f3ad3a936c09ee8cb8340de5", + "reference": "eccb5675df44b2d7f3ad3a936c09ee8cb8340de5", "shasum": "" }, "require": { @@ -7169,7 +7166,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.0.2" + "source": "https://github.com/symfony/security-core/tree/v6.0.3" }, "funding": [ { @@ -7185,20 +7182,20 @@ "type": "tidelift" } ], - "time": "2021-12-29T10:31:56+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/serializer", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "2282e7512a3264ef964cefce0a4a8037cd1044e5" + "reference": "8a81ecc4f0ca229961c6c2d699e634bf6f80c4fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/2282e7512a3264ef964cefce0a4a8037cd1044e5", - "reference": "2282e7512a3264ef964cefce0a4a8037cd1044e5", + "url": "https://api.github.com/repos/symfony/serializer/zipball/8a81ecc4f0ca229961c6c2d699e634bf6f80c4fc", + "reference": "8a81ecc4f0ca229961c6c2d699e634bf6f80c4fc", "shasum": "" }, "require": { @@ -7270,7 +7267,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.0.2" + "source": "https://github.com/symfony/serializer/tree/v6.0.3" }, "funding": [ { @@ -7286,7 +7283,7 @@ "type": "tidelift" } ], - "time": "2021-12-25T20:10:03+00:00" + "time": "2022-01-26T17:34:56+00:00" }, { "name": "symfony/serializer-pack", @@ -7423,16 +7420,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.0.0", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e0ed55d1ffdfadd03af180443fbdca9876483b3" + "reference": "6835045bb9f00fa4486ea4f1bcaf623be761556f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e0ed55d1ffdfadd03af180443fbdca9876483b3", - "reference": "0e0ed55d1ffdfadd03af180443fbdca9876483b3", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/6835045bb9f00fa4486ea4f1bcaf623be761556f", + "reference": "6835045bb9f00fa4486ea4f1bcaf623be761556f", "shasum": "" }, "require": { @@ -7465,7 +7462,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.0.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.0.3" }, "funding": [ { @@ -7481,20 +7478,20 @@ "type": "tidelift" } ], - "time": "2021-11-23T19:05:29+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/string", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "bae261d0c3ac38a1f802b4dfed42094296100631" + "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/bae261d0c3ac38a1f802b4dfed42094296100631", - "reference": "bae261d0c3ac38a1f802b4dfed42094296100631", + "url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2", + "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2", "shasum": "" }, "require": { @@ -7550,7 +7547,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.0.2" + "source": "https://github.com/symfony/string/tree/v6.0.3" }, "funding": [ { @@ -7566,7 +7563,7 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:13:01+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/translation-contracts", @@ -7648,22 +7645,23 @@ }, { "name": "symfony/validator", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "550557c0074d9abf70133c9df20f479e55961553" + "reference": "35f3614f605227ad16e03cab9fb9815ba05f5878" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/550557c0074d9abf70133c9df20f479e55961553", - "reference": "550557c0074d9abf70133c9df20f479e55961553", + "url": "https://api.github.com/repos/symfony/validator/zipball/35f3614f605227ad16e03cab9fb9815ba05f5878", + "reference": "35f3614f605227ad16e03cab9fb9815ba05f5878", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php81": "^1.22", "symfony/translation-contracts": "^1.1|^2|^3" }, "conflict": { @@ -7735,7 +7733,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.0.2" + "source": "https://github.com/symfony/validator/tree/v6.0.3" }, "funding": [ { @@ -7751,20 +7749,20 @@ "type": "tidelift" } ], - "time": "2021-12-21T13:16:58+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41e46f64084a205459a862751158ce2190bd5cb5" + "reference": "7b701676fc64f9ef11f9b4870f16b48f66be4834" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41e46f64084a205459a862751158ce2190bd5cb5", - "reference": "41e46f64084a205459a862751158ce2190bd5cb5", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7b701676fc64f9ef11f9b4870f16b48f66be4834", + "reference": "7b701676fc64f9ef11f9b4870f16b48f66be4834", "shasum": "" }, "require": { @@ -7823,7 +7821,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.0.2" + "source": "https://github.com/symfony/var-dumper/tree/v6.0.3" }, "funding": [ { @@ -7839,20 +7837,20 @@ "type": "tidelift" } ], - "time": "2021-12-29T10:14:09+00:00" + "time": "2022-01-17T16:30:44+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.0.0", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af" + "reference": "1261b2d4a23081cb2b59a4caa311a5ac43b845b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af", - "reference": "32cf62f12d35d441da1ca4a4c0fc1cd5f2a207af", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1261b2d4a23081cb2b59a4caa311a5ac43b845b6", + "reference": "1261b2d4a23081cb2b59a4caa311a5ac43b845b6", "shasum": "" }, "require": { @@ -7895,7 +7893,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.0.0" + "source": "https://github.com/symfony/var-exporter/tree/v6.0.3" }, "funding": [ { @@ -7911,20 +7909,20 @@ "type": "tidelift" } ], - "time": "2021-11-22T10:44:58+00:00" + "time": "2022-01-02T09:55:41+00:00" }, { "name": "symfony/yaml", - "version": "v6.0.2", + "version": "v6.0.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ed602f38b8636a2ea21af760d2578f3d2f92fc60" + "reference": "e77f3ea0b21141d771d4a5655faa54f692b34af5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ed602f38b8636a2ea21af760d2578f3d2f92fc60", - "reference": "ed602f38b8636a2ea21af760d2578f3d2f92fc60", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e77f3ea0b21141d771d4a5655faa54f692b34af5", + "reference": "e77f3ea0b21141d771d4a5655faa54f692b34af5", "shasum": "" }, "require": { @@ -7969,7 +7967,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.0.2" + "source": "https://github.com/symfony/yaml/tree/v6.0.3" }, "funding": [ { @@ -7985,7 +7983,7 @@ "type": "tidelift" } ], - "time": "2021-12-16T22:13:01+00:00" + "time": "2022-01-26T17:23:29+00:00" }, { "name": "webmozart/assert", @@ -8049,16 +8047,16 @@ "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f18adf13f6c81c67a88360dca359ad474523f8e3" + "reference": "51c1890e8c5467c421c7cab4579f059ebf720278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f18adf13f6c81c67a88360dca359ad474523f8e3", - "reference": "f18adf13f6c81c67a88360dca359ad474523f8e3", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51c1890e8c5467c421c7cab4579f059ebf720278", + "reference": "51c1890e8c5467c421c7cab4579f059ebf720278", "shasum": "" }, "require": { @@ -8067,15 +8065,20 @@ "php": "^7.2 || ^8.0" }, "conflict": { + "doctrine/dbal": "<2.13", "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { "doctrine/coding-standard": "^9.0", - "doctrine/dbal": "^2.5.4 || ^3.0", + "doctrine/dbal": "^2.13 || ^3.0", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", "ext-sqlite3": "*", - "phpunit/phpunit": "^8.0" + "jangregor/phpstan-prophecy": "^0.8.1", + "phpstan/phpstan": "^0.12.99", + "phpunit/phpunit": "^8.0", + "symfony/cache": "^5.0 || ^6.0", + "vimeo/psalm": "^4.10" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -8100,13 +8103,13 @@ } ], "description": "Data Fixtures for all Doctrine Object Managers", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org", "keywords": [ "database" ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.5.1" + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.2" }, "funding": [ { @@ -8122,7 +8125,7 @@ "type": "tidelift" } ], - "time": "2021-09-20T21:51:43+00:00" + "time": "2022-01-20T17:10:56+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -8213,17 +8216,17 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "11696ae4d8970456cbd1919c17e6bb2ddb63553a" + "reference": "1032f0ce78ed92e983c17697eafd202ac5cbbca4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11696ae4d8970456cbd1919c17e6bb2ddb63553a", - "reference": "11696ae4d8970456cbd1919c17e6bb2ddb63553a", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/1032f0ce78ed92e983c17697eafd202ac5cbbca4", + "reference": "1032f0ce78ed92e983c17697eafd202ac5cbbca4", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "akaunting/akaunting": "<2.1.13", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", @@ -8247,8 +8250,9 @@ "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<7.2.1", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cakephp/cakephp": "<4.0.6", "cardgate/magento2": "<2.0.33", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", @@ -8257,14 +8261,14 @@ "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "codeigniter4/framework": "<4.1.6", + "codeigniter4/framework": "<4.1.8", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.23|>=2-alpha.1,<2.1.9", "concrete5/concrete5": "<8.5.5", "concrete5/core": "<8.5.7", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", + "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "craftcms/cms": "<3.7.14", "croogo/croogo": "<3.0.7", @@ -8281,7 +8285,7 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", + "dolibarr/dolibarr": "<=14.0.5|>= 3.3.beta1, < 13.0.2", "dompdf/dompdf": ">=0.6,<0.6.2", "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", @@ -8289,7 +8293,7 @@ "ecodev/newsletter": "<=4", "elgg/elgg": "<3.3.24|>=4,<4.0.5", "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", + "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", "ether/logs": "<3.0.4", "ezsystems/demobundle": ">=5.4,<5.4.6.1", @@ -8303,7 +8307,7 @@ "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.26", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", @@ -8327,11 +8331,12 @@ "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", "gaoming13/wechat-php-sdk": "<=1.10.2", - "getgrav/grav": "<=1.7.24", + "getgrav/grav": "<1.7.28", "getkirby/cms": "<3.5.8", "getkirby/panel": "<2.5.14", "gilacms/gila": "<=1.11.4", "globalpayments/php-sdk": "<2", + "google/protobuf": "<3.15", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", @@ -8342,7 +8347,7 @@ "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", "ibexa/post-install": "<=1.0.4", - "icecoder/icecoder": "<=8", + "icecoder/icecoder": "<=8.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", @@ -8356,6 +8361,7 @@ "james-heinrich/getid3": "<1.9.21", "joomla/archive": "<1.1.10", "joomla/session": "<1.3.1", + "jsdecena/laracom": "<2.0.9", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", "kevinpapst/kimai2": "<1.16.7", @@ -8363,6 +8369,7 @@ "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", "laminas/laminas-http": "<2.14.2", "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", @@ -8374,6 +8381,7 @@ "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "librenms/librenms": "<=21.11", "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": ">2.2.4,<2.2.6", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", @@ -8384,12 +8392,13 @@ "marcwillmann/turn": "<0.3.3", "mautic/core": "<4|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", - "microweber/microweber": "<1.2.8", + "microweber/microweber": "<1.2.11", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "modx/revolution": "<2.8", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2", + "moodle/moodle": "<3.9.11|>=3.10-beta,<3.10.8|>=3.11,<3.11.5", + "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", "neoan3-apps/template": "<1.1.1", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", @@ -8407,7 +8416,7 @@ "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.472|>=1.1.1,<1.1.5|>=2.1,<2.1.12", + "october/system": "<1.0.473|>=1.1,<1.1.6|>=2.1,<2.1.12", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "opencart/opencart": "<=3.0.3.2", @@ -8415,7 +8424,7 @@ "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", - "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.21|>=4.1,<4.1.14|>=4.2,<4.2.8", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", "pagekit/pagekit": "<=1.0.18", @@ -8429,7 +8438,7 @@ "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpmyadmin/phpmyadmin": "<4.9.8|>=5,<5.0.3|>=5.1,<5.1.2", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", @@ -8437,13 +8446,13 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.2.7", - "pocketmine/pocketmine-mp": "<4.0.5", + "pimcore/pimcore": "<=10.3", + "pocketmine/pocketmine-mp": "<4.0.7", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": ">=1.7.5,<=1.7.8.1", + "prestashop/prestashop": ">=1.7,<=1.7.8.2", "prestashop/productcomments": ">=4,<4.2.1", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", @@ -8451,11 +8460,12 @@ "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<1.6.6", + "pterodactyl/panel": "<1.7", + "ptrofimov/beanstalk_console": "<1.7.14", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", - "remdex/livehelperchat": "<3.91", + "remdex/livehelperchat": "<3.93", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -8467,13 +8477,13 @@ "shopware/platform": "<=6.4.6", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<5.7.7", - "showdoc/showdoc": "<2.10", + "showdoc/showdoc": "<=2.10.2", "silverstripe/admin": ">=1,<1.8.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.7.4", + "silverstripe/framework": "<4.10.1", "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", @@ -8486,10 +8496,11 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.39", - "snipe/snipe-it": "<5.3.5", + "smarty/smarty": "<3.1.43|>=4,<4.0.3", + "snipe/snipe-it": "<=5.3.7", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", + "spipu/html2pdf": "<5.2.4", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<21.12.1", @@ -8512,7 +8523,7 @@ "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", @@ -8530,7 +8541,7 @@ "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -8539,6 +8550,7 @@ "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", @@ -8549,7 +8561,7 @@ "topthink/thinkphp": "<=3.2.3", "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", + "twig/twig": "<1.38|>=2,<2.14.11|>3,<3.3.8", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5", @@ -8647,20 +8659,20 @@ "type": "tidelift" } ], - "time": "2022-01-08T00:53:14+00:00" + "time": "2022-02-15T01:00:26+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.4.0", + "version": "v5.4.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c" + "reference": "216b07b05644607c81afd89a208e52641c1ce6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c", - "reference": "59bbd98ee7aa15b9f75c0fc088c7a5cbf7aa9b5c", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/216b07b05644607c81afd89a208e52641c1ce6b8", + "reference": "216b07b05644607c81afd89a208e52641c1ce6b8", "shasum": "" }, "require": { @@ -8714,7 +8726,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.3" }, "funding": [ { @@ -8730,7 +8742,7 @@ "type": "tidelift" } ], - "time": "2021-11-29T15:30:56+00:00" + "time": "2022-01-26T16:28:35+00:00" } ], "aliases": [], diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 9ac5602..a4cc5ea 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -5,7 +5,6 @@ use App\Repository\TleRepository; use App\Request\FlyOverRequest; use App\Service\FlyOverService; -use App\Service\Traits\TleHttpTrait; use DateTimeInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -15,8 +14,6 @@ final class FlyOverController extends AbstractApiController { - use TleHttpTrait; - public function __construct( protected TleRepository $repository, protected NormalizerInterface $normalizer, @@ -26,11 +23,10 @@ public function __construct( #[Route("/api/tle/{id}/flyover", name: "tle_flyover", requirements: ["id" => "\d+"])] public function flyover( - int $id, FlyOverRequest $request ): JsonResponse { $observer = $request->getObserver(); - $tle = $this->getTle($id); + $tle = $request->getTle(); $date = $request->getDateTime(); @@ -49,19 +45,19 @@ public function flyover( $url = $this->router->generate( 'tle_flyover', - [...$request->request->all(), 'id' => $id, ...$parameters], + [...$request->request->all(), 'id' => $request->getId(), ...$parameters], UrlGeneratorInterface::ABSOLUTE_URL ); - $parameters['satelliteId'] = $id; + $parameters['satelliteId'] = $request->getId(); $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); foreach ($members as $index => &$member) { $item = [ '@id' => $this->generateUrl('tle_flyover_details', [ - 'id' => $id, - 'passId' => $index+1, + 'id' => $request->getId(), + 'passId' => $index + 1, 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, 'only_visible' => $request->filterVisible(), @@ -87,12 +83,11 @@ public function flyover( #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] public function flyoverDetails( - int $id, int $passId, FlyOverRequest $request, ): JsonResponse { $observer = $request->getObserver(); - $tle = $this->getTle($id); + $tle = $request->getTle(); $this->service ->setObserver($observer) @@ -112,7 +107,7 @@ public function flyoverDetails( 'tle_flyover_details', [ ...$request->request->all(), - 'id' => $id, + 'id' => $request->getId(), 'passId' => $passId, 'latitude' => $observer->latitude, 'longitude' => $observer->longitude, diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 6e49506..5c97399 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -5,18 +5,14 @@ use App\Enum\PropagatorAlgorithm; use App\Repository\TleRepository; use App\Request\PropagateRequest; -use App\Service\Traits\TleHttpTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; - use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; final class PropagateController extends AbstractApiController { - use TleHttpTrait; - protected const DEEP_SATELLITE_PERIOD = 225; // minutes protected \Predict_SGPSDP $propagator; @@ -28,11 +24,10 @@ public function __construct(protected TleRepository $repository) #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] public function propagate( - int $id, PropagateRequest $request, NormalizerInterface $normalizer ): JsonResponse { - $tle = $this->getTle($id); + $tle = $request->getTle(); $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); @@ -58,11 +53,11 @@ public function propagate( $url = $this->router->generate( 'tle_propagate', - array_merge($request->request->all(), $parameters, ['id' => $id]), + array_merge($request->request->all(), $parameters, ['id' => $request->getId()]), UrlGeneratorInterface::ABSOLUTE_URL ); - $parameters['satelliteId'] = $id; + $parameters['satelliteId'] = $request->getId(); $data = [ '@context' => self::HYDRA_CONTEXT, diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 6048f3f..9e92912 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -6,7 +6,6 @@ use App\Repository\TleRepository; use App\Request\TleCollectionRequest; use App\Request\TleRequest; -use App\Service\Traits\TleHttpTrait; use Ivanstan\SymfonySupport\Services\QueryBuilderPaginator; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; @@ -15,8 +14,6 @@ #[Route("/api/tle")] final class TleController extends AbstractApiController { - use TleHttpTrait; - public function __construct(protected TleRepository $repository) { } @@ -29,7 +26,7 @@ public function record( return $this->response( [ '@context' => self::HYDRA_CONTEXT, - ...$normalizer->normalize($this->getTle($request->getId()), null, [TleRequest::EXTRA_PARAM => $request->getExtra()]), + ...$normalizer->normalize($request->getTle(), null, [TleRequest::EXTRA_PARAM => $request->getExtra()]), ] ); } diff --git a/src/Request/FlyOverRequest.php b/src/Request/FlyOverRequest.php index f192185..3541ce1 100644 --- a/src/Request/FlyOverRequest.php +++ b/src/Request/FlyOverRequest.php @@ -6,7 +6,7 @@ use Ivanstan\SymfonySupport\Request\AbstractRequest; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -class FlyOverRequest extends AbstractRequest +class FlyOverRequest extends TleRequest { use DateTimeDependantRequest; diff --git a/src/Request/PropagateRequest.php b/src/Request/PropagateRequest.php index f446610..a64d960 100644 --- a/src/Request/PropagateRequest.php +++ b/src/Request/PropagateRequest.php @@ -2,9 +2,7 @@ namespace App\Request; -use Ivanstan\SymfonySupport\Request\AbstractRequest; - -class PropagateRequest extends AbstractRequest +class PropagateRequest extends TleRequest { use DateTimeDependantRequest; } diff --git a/src/Request/TleRequest.php b/src/Request/TleRequest.php index ed3dab0..953037c 100644 --- a/src/Request/TleRequest.php +++ b/src/Request/TleRequest.php @@ -2,8 +2,10 @@ namespace App\Request; +use App\Entity\Tle; use App\Repository\TleRepository; use Ivanstan\SymfonySupport\Request\AbstractRequest; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Contracts\Service\Attribute\Required; @@ -36,4 +38,16 @@ public function validate(ValidatorInterface $validator): ConstraintViolationList return $violations; } + + public function getTle(): Tle + { + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $this->getId()]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $this->getId())); + } + + return $tle; + } } diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php deleted file mode 100644 index fed5faa..0000000 --- a/src/Service/Traits/TleHttpTrait.php +++ /dev/null @@ -1,21 +0,0 @@ -repository->findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $tle; - } -} From 255d86965fa5131ea6b1b57fb28c19033219ef52 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 15 Feb 2022 17:25:04 +0100 Subject: [PATCH 217/221] add cache to docs --- src/Request/FlyOverRequest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Request/FlyOverRequest.php b/src/Request/FlyOverRequest.php index 3541ce1..f500a24 100644 --- a/src/Request/FlyOverRequest.php +++ b/src/Request/FlyOverRequest.php @@ -3,7 +3,6 @@ namespace App\Request; use App\ViewModel\Observer; -use Ivanstan\SymfonySupport\Request\AbstractRequest; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class FlyOverRequest extends TleRequest From d123b65aecd441dfdc43c216eeb8191f14bf2544 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 18 Feb 2022 19:59:41 +0100 Subject: [PATCH 218/221] add cache to docs --- client/pages/AbstractPage.tsx | 39 ++++++ client/pages/Map.tsx | 220 ++++++++++++++-------------------- package.json | 1 + yarn.lock | 5 + 4 files changed, 133 insertions(+), 132 deletions(-) create mode 100644 client/pages/AbstractPage.tsx diff --git a/client/pages/AbstractPage.tsx b/client/pages/AbstractPage.tsx new file mode 100644 index 0000000..59247d3 --- /dev/null +++ b/client/pages/AbstractPage.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import {RouteComponentProps} from "react-router"; + +export interface AbstractPagePropsInterface extends RouteComponentProps { + +} + +export interface AbstractPageStateInterface { + routeParams: any + queryParams: URLSearchParams +} + +export abstract class AbstractPage extends React.Component { + + readonly state = { + routeParams: [], + queryParams: new URLSearchParams(), + } + + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean { + return (nextProps.match.params !== this.props.match.params) || (nextProps.location.search !== this.props.location.search); + } + + public static getDerivedStateFromProps(props: Readonly, state: Readonly): AbstractPageStateInterface { + return { + routeParams: props.match.params, + queryParams: new URLSearchParams(props.location.search) + } + } + + updateUrl(path: null, query: URLSearchParams) { + const { history } = this.props; + + history.push({ + pathname: history.location.pathname, + search: decodeURIComponent(query.toString()), + }); + } +} diff --git a/client/pages/Map.tsx b/client/pages/Map.tsx index e3d8845..c120cd4 100644 --- a/client/pages/Map.tsx +++ b/client/pages/Map.tsx @@ -1,75 +1,68 @@ -import React from 'react'; -import * as satellite from 'satellite.js'; -import { twoline2satrec } from 'satellite.js'; -import { fromAtom, toAtom } from '../util/date'; -import { GeoMap } from '../components/GeoMap'; -import Marker from 'react-google-maps/lib/components/Marker'; -import { RouteComponentProps } from 'react-router'; -import SatelliteMarker from '../components/icons/SatelliteMarker'; -import { TleApi } from '../services/TleApi'; -import { If } from 'react-if'; -import Polyline from 'react-google-maps/lib/components/Polyline'; -import { IconButton, InputAdornment, Toolbar } from '@material-ui/core'; -import { DateTimePicker } from '@material-ui/pickers'; -import { DateTime } from 'luxon'; -import { MaterialUiPickersDate } from '@material-ui/pickers/typings/date'; -import AccessTimeIcon from '@material-ui/icons/AccessTime'; -import { getColor } from "../services/ColorPalette"; - -interface MapPropsInterface extends RouteComponentProps { - -} - -interface MapStateInterface { +import React from 'react' +import * as satellite from 'satellite.js' +import {twoline2satrec} from 'satellite.js' +import {fromAtom, toAtom} from '../util/date' +import {GeoMap} from '../components/GeoMap' +import Marker from 'react-google-maps/lib/components/Marker' +import SatelliteMarker from '../components/icons/SatelliteMarker' +import {TleApi} from '../services/TleApi' +import {If} from 'react-if' +import Polyline from 'react-google-maps/lib/components/Polyline' +import {IconButton, InputAdornment, Toolbar} from '@material-ui/core' +import {DateTimePicker} from '@material-ui/pickers' +import {MaterialUiPickersDate} from '@material-ui/pickers/typings/date' +import AccessTimeIcon from '@material-ui/icons/AccessTime' +import {getColor} from "../services/ColorPalette" +import {AbstractPage, AbstractPagePropsInterface, AbstractPageStateInterface} from "./AbstractPage" + +interface MapStateInterface extends AbstractPageStateInterface { satellites: any[] - data: any[] - date: Date - params: any } -export class Map extends React.Component { +export class Map extends AbstractPage> { - state = { - date: DateTime.now().toJSDate(), - params: new URLSearchParams(), + readonly state: MapStateInterface = { + queryParams: new URLSearchParams(), + routeParams: [], satellites: [], - data: [], } - public static getDerivedStateFromProps(props: Readonly, state: Readonly) { - const params = new URLSearchParams(props.location.search); + public static getDerivedStateFromProps(props: Readonly, state: Readonly): MapStateInterface { + let newState: any = super.getDerivedStateFromProps(props, state) - let date: any = toAtom(new Date()); - let dateFromParam = params.get('date'); + return newState + } + + getDate = () => { + let date: any = toAtom(new Date()) - if (dateFromParam) { - date = dateFromParam.replace(' ', '+'); + if (this.state.queryParams.has('date') && this.state.queryParams.get('date')) { + date = this.state.queryParams.get('date')?.replace(' ', '+') } - return { - date: fromAtom(date).toJSDate(), - params: params, - }; + return fromAtom(date).toJSDate() } - shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean { - if (nextProps.location.search !== this.props.location.search) { - return true; - } + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean { + let result = super.shouldComponentUpdate(nextProps, nextState, nextContext) if (this.state.satellites.length === 0) { - return true; + result = true } - return false; + return result } componentDidMount() { - this.componentDidUpdate(this.props, this.state); + this.onChange() } - async componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any) { - const { params } = this.state + async componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any) { + await this.onChange() + } + + onChange = async () => { + const {queryParams} = this.state // let result1 = await fetch('https://tle.ivanstanojevic.me/api/tle/25544/propagate?date=' + dateParam) // let response1 = await result1.json() @@ -81,24 +74,24 @@ export class Map extends React.Component { // } // } - const date = this.state.date; + const date = this.getDate() - const requestParams = new URLSearchParams(); + const requestParams = new URLSearchParams() - if (params.getAll('id[]').length > 0) { - params.getAll('id[]').forEach(item => requestParams.append('satellite_id[]', item)); + if (queryParams.getAll('id[]').length > 0) { + queryParams.getAll('id[]').forEach((item: any) => requestParams.append('satellite_id[]', item)) - let result2 = await fetch('https://tle.ivanstanojevic.me/api/tle?' + requestParams.toString()); - let response2 = await result2.json(); + let result2 = await fetch('https://tle.ivanstanojevic.me/api/tle?' + requestParams.toString()) + let response2 = await result2.json() - const satellites: any = []; - response2.member.forEach((member: any, index: number) => { - const satrec = twoline2satrec(member.line1, member.line2); - const positionAndVelocity = satellite.propagate(satrec, date); - const positionEci: any = positionAndVelocity.position; - const gmst = satellite.gstime(date); + const satellites: any = [] + response2.member?.forEach((member: any, index: number) => { + const satrec = twoline2satrec(member.line1, member.line2) + const positionAndVelocity = satellite.propagate(satrec, date) + const positionEci: any = positionAndVelocity.position + const gmst = satellite.gstime(date) - const positionGd = satellite.eciToGeodetic(positionEci, gmst); + const positionGd = satellite.eciToGeodetic(positionEci, gmst) satellites.push({ color: getColor(index), @@ -108,72 +101,36 @@ export class Map extends React.Component { lat: positionGd.latitude * 180 / Math.PI, lng: positionGd.longitude * 180 / Math.PI, }, - }); - }); + }) + }) - this.setState({ satellites: satellites }); + this.setState({satellites: satellites}) } } handleDateChange = (event: MaterialUiPickersDate) => { if (event === null) { - return; + return } - const { params } = this.state; - - params.set('date', toAtom(event)); - - this.updateUrl(params); - }; - - updateUrl = (params: URLSearchParams) => { - const { history } = this.props; + const {queryParams} = this.state - history.push({ - pathname: history.location.pathname, - search: decodeURIComponent(params.toString()), - }); - }; + queryParams.set('date', toAtom(event)) - onChange = (satellites: any | null) => { - const { params } = this.state; - - const objectParams: any = {}; - params.forEach((item, index) => objectParams[index] = item) - console.log(objectParams) - - params.delete('id[]'); - - satellites.forEach((satellite: any) => params.append('id[]', satellite.satelliteId)) - - this.updateUrl(params); + super.updateUrl(null, queryParams) } render() { - const { satellites, params, data } = this.state; - - const labelSize = { width: 220}; - const labelPadding = 8; - return ( <> -
- - {/* satellite.tle)}*/} - {/*/>*/} - -
- +
{ } - mapElement={
} + containerElement={
} + mapElement={
} > - {satellites.map((satellite: any, index: number) => ( - - - - - - - - + {this.state.satellites.map((satellite: any, index: number) => ( + + + + + + + + ) )} @@ -223,4 +180,3 @@ export class Map extends React.Component { ) } } - diff --git a/package.json b/package.json index fa6ecd7..c19d3cb 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "computed-async-mobx": "^7.0.1-beta.1", "core-js": "^3.8.3", "date-fns": "^2.23.0", + "json-loader": "^0.5.7", "luxon": "^1.26.0", "mobx": "^6.1.5", "mobx-utils": "^6.0.4", diff --git a/yarn.lock b/yarn.lock index bafa4ef..fbe3446 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7339,6 +7339,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-loader@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== + json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" From 736e26cc57c096715bad6418a018b36841471f6f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 18 Feb 2022 20:04:02 +0100 Subject: [PATCH 219/221] add cache to docs --- client/pages/Home.tsx | 2 -- client/pages/Map.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/client/pages/Home.tsx b/client/pages/Home.tsx index b7d5106..666ec2d 100644 --- a/client/pages/Home.tsx +++ b/client/pages/Home.tsx @@ -130,8 +130,6 @@ class Home extends AbstractTlePage { const classes: any = this.props; - console.log(classes) - return (
diff --git a/client/pages/Map.tsx b/client/pages/Map.tsx index c120cd4..5fcecd1 100644 --- a/client/pages/Map.tsx +++ b/client/pages/Map.tsx @@ -69,7 +69,7 @@ export class Map extends AbstractPage Date: Fri, 10 Jun 2022 14:58:06 +0200 Subject: [PATCH 220/221] fix import command --- src/Command/ImportTleCommand.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 741fba3..35b56a8 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -91,6 +91,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $update = []; foreach ($file->parse() as $tle) { + if ($tle === null) { + continue; + } + if (\array_key_exists($tle->getId(), $this->satellites)) { $update[$tle->getId()] = $tle; } else { From 285dcf0870e6a626264800255c2ae2f30ac9391a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:17:44 +0000 Subject: [PATCH 221/221] Bump terser from 4.8.0 to 4.8.1 Bumps [terser](https://github.com/terser/terser) from 4.8.0 to 4.8.1. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index fbe3446..b1f5ac1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3381,9 +3381,9 @@ bser@2.1.1: node-int64 "^0.4.0" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" @@ -11093,9 +11093,9 @@ source-map-resolve@^0.6.0: decode-uri-component "^0.2.0" source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -11612,9 +11612,9 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" source-map "~0.6.1"