├── .editorconfig ├── .gitattributes ├── .gitignore ├── LICENSE.md ├── README.md ├── composer.json ├── composer.lock ├── index.php ├── src ├── Attributes │ ├── Connect.php │ ├── Delete.php │ ├── Get.php │ ├── Head.php │ ├── Options.php │ ├── Patch.php │ ├── Post.php │ ├── Route.php │ ├── RouteAttribute.php │ └── Trace.php └── RouteAttributes.php └── vendor ├── autoload.php ├── composer ├── ClassLoader.php ├── InstalledVersions.php ├── LICENSE ├── autoload_classmap.php ├── autoload_namespaces.php ├── autoload_psr4.php ├── autoload_real.php ├── autoload_static.php ├── installed.json ├── installed.php └── platform_check.php └── getkirby └── composer-installer ├── composer.json ├── composer.lock ├── readme.md └── src └── ComposerInstaller ├── CmsInstaller.php ├── Installer.php ├── Plugin.php └── PluginInstaller.php /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.php] 13 | indent_size = 4 14 | 15 | [*.md,*.txt] 16 | trim_trailing_whitespace = false 17 | insert_final_newline = false 18 | 19 | [composer.json] 20 | indent_size = 4 -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Note: You need to uncomment the lines you want to use; the other lines can be deleted 2 | 3 | # Git 4 | # .gitattributes export-ignore 5 | # .gitignore export-ignore 6 | 7 | # Tests 8 | # /.coveralls.yml export-ignore 9 | # /.travis.yml export-ignore 10 | # /phpunit.xml.dist export-ignore 11 | # /tests/ export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS files 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Present Progressive 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kirby routing with attributes 2 | 3 | Load routes from `site/routes` and annotate metadata with PHP 8 attributes. 4 | No more business logic in your config files 🎉 5 | 6 | **** 7 | 8 | ## Usage 9 | 10 | After [installing](#Installation), create a new folder `site/routes`. Then 11 | create a new file for each route you want to add. The filename does not matter, 12 | but every file must return a function, that is annotated with the provided 13 | PHP 8 attributes: 14 | 15 | ```php 16 | // site/routes/my-awesome-route.php 17 | $all", null, 200); 24 | }; 25 | ``` 26 | 27 | The following attributes are included: 28 | 29 | * [Get](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Get.php) 30 | * [Head](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Head.php) 31 | * [Options](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Options.php) 32 | * [Post](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Post.php) 33 | * [Patch](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Patch.php) 34 | * [Delete](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Delete.php) 35 | * [Connect](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Connect.php) 36 | * [Trace](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Trace.php) 37 | 38 | All these attributes share the same base `Route` attribute, which you also may use directly too: 39 | * [Route](https://github.com/presprog/kirby-route-attributes/blob/master/src/Attributes/Route.php) 40 | 41 | ```php 42 | // site/routes/my-awesome-route.php 43 | $all", null, 200); 50 | }; 51 | ``` 52 | 53 | When developing in `debug` mode, the files will always be read from disk. 54 | When`debug` is `false`, the loaded routes will be read once and then cached. 55 | Make sure to clear the plugin cache after deployment, when you have made 56 | changes to the routes. 57 | 58 | **** 59 | 60 | ## Installation 61 | 62 | ### Composer 63 | 64 | ``` 65 | composer require presprog/kirby-route-attributes 66 | ``` 67 | 68 | ### Download 69 | 70 | Download and copy this repository to `/site/plugins/route-attributes`. 71 | 72 | ### Git submodule 73 | 74 | ``` 75 | git submodule add https://github.com/presprog/kirby-route-attributes.git site/plugins/route-attributes 76 | ``` 77 | 78 | ## License 79 | 80 | MIT 81 | 82 | ## Credits 83 | 84 | **Designed and built with ☕ and ❤ by [Present Progressive](https://www.presentprogressive.de)** 85 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "presprog/kirby-route-attributes", 3 | "type": "kirby-plugin", 4 | "license": "MIT", 5 | "kewyords": [ 6 | "kirby", 7 | "routing", 8 | "attributes", 9 | "annotations" 10 | ], 11 | "authors": [ 12 | { 13 | "name": "Benedict Massolle", 14 | "email": "bm@presentprogressive.de", 15 | "role": "Developer", 16 | "homepage": "https://www.presentprogressive.de" 17 | } 18 | ], 19 | "require": { 20 | "php": "^8.0", 21 | "getkirby/composer-installer": "^1.2" 22 | }, 23 | "autoload": { 24 | "psr-4": { 25 | "PresProg\\RouteAttributes\\": "src/" 26 | } 27 | }, 28 | "extra": { 29 | "installer-name": "route-attributes" 30 | }, 31 | "support": { 32 | "email": "support@presentprogressive.de", 33 | "issues": "https://github.com/presprog/kirby-route-attributes/issues", 34 | "source": "https://github.com/presprog/kirby-route-attributes" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "9098bd588785414bde07e11fb75307b6", 8 | "packages": [ 9 | { 10 | "name": "getkirby/composer-installer", 11 | "version": "1.2.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/getkirby/composer-installer.git", 15 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", 20 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "composer-plugin-api": "^1.0 || ^2.0" 25 | }, 26 | "require-dev": { 27 | "composer/composer": "^1.8 || ^2.0" 28 | }, 29 | "type": "composer-plugin", 30 | "extra": { 31 | "class": "Kirby\\ComposerInstaller\\Plugin" 32 | }, 33 | "autoload": { 34 | "psr-4": { 35 | "Kirby\\": "src/" 36 | } 37 | }, 38 | "notification-url": "https://packagist.org/downloads/", 39 | "license": [ 40 | "MIT" 41 | ], 42 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", 43 | "homepage": "https://getkirby.com", 44 | "support": { 45 | "issues": "https://github.com/getkirby/composer-installer/issues", 46 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" 47 | }, 48 | "funding": [ 49 | { 50 | "url": "https://getkirby.com/buy", 51 | "type": "custom" 52 | } 53 | ], 54 | "time": "2020-12-28T12:54:39+00:00" 55 | } 56 | ], 57 | "packages-dev": [], 58 | "aliases": [], 59 | "minimum-stability": "stable", 60 | "stability-flags": [], 61 | "prefer-stable": false, 62 | "prefer-lowest": false, 63 | "platform": { 64 | "php": "^8.0" 65 | }, 66 | "platform-dev": [], 67 | "plugin-api-version": "2.0.0" 68 | } 69 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'cache' => true, 12 | ], 13 | 'hooks' => [ 14 | 'system.loadPlugins:after' => function () { 15 | RouteAttributes::registerRoutes(); 16 | } 17 | ] 18 | ]); 19 | -------------------------------------------------------------------------------- /src/Attributes/Connect.php: -------------------------------------------------------------------------------- 1 | cache = $cache; 22 | $this->debug = $debug; 23 | } 24 | 25 | /** 26 | * @throws ReflectionException 27 | * @throws InvalidArgumentException 28 | */ 29 | public static function registerRoutes(): void 30 | { 31 | $self = new self( 32 | kirby()->cache('presprog.route-attributes'), 33 | kirby()->option('debug', false) 34 | ); 35 | 36 | kirby()->extend([ 37 | 'routes' => $self->loadRoutes() 38 | ]); 39 | } 40 | 41 | /** 42 | * @throws ReflectionException 43 | */ 44 | private function loadRoutes(): array 45 | { 46 | if (!$this->debug && $this->cache->exists('routes')) { 47 | $routes = $this->cache->get('routes'); 48 | } else { 49 | $routes = $this->loadRoutesFromFiles(); 50 | if (!$this->debug) { 51 | $this->cache->set('routes', $routes); 52 | } 53 | } 54 | 55 | foreach ($routes as &$route) { 56 | $action = require $route['file']; 57 | $route['action'] = function () use ($action) { 58 | return $action(...func_get_args()); 59 | }; 60 | unset($route['file']); 61 | } 62 | 63 | return $routes; 64 | } 65 | 66 | /** 67 | * @return array 68 | * @throws ReflectionException 69 | */ 70 | private function loadRoutesFromFiles(): array 71 | { 72 | $routes = []; 73 | $files = Dir::files(kirby()->root('site') . '/routes', null, true); 74 | 75 | foreach ($files as $file) { 76 | $route = require $file; 77 | 78 | if (!is_callable(($route))) { 79 | throw new RuntimeException(sprintf('%s must return a callable.', $file)); 80 | } 81 | 82 | $routes[] = $this->getRouteMetaData($route, $file); 83 | } 84 | 85 | return $routes; 86 | } 87 | 88 | /** 89 | * @throws ReflectionException 90 | * @throws RuntimeException 91 | */ 92 | private function getRouteMetaData(callable $route, string $file): array 93 | { 94 | $function = new ReflectionFunction($route); 95 | $attributes = $function->getAttributes( 96 | RouteAttribute::class, 97 | ReflectionAttribute::IS_INSTANCEOF 98 | ); 99 | 100 | if (empty($attributes)) { 101 | throw new RuntimeException('Routes defined in /site/routes/*.php must be annotated with attributes. See PresProg\RouteAttributes\Attributes for available attributes.'); 102 | } 103 | 104 | $attribute = $attributes[0]; 105 | $instance = $attribute->newInstance(); 106 | 107 | return [ 108 | 'pattern' => $instance->pattern, 109 | 'method' => $instance->method, 110 | 'file' => $file, 111 | ]; 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer\Autoload; 14 | 15 | /** 16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. 17 | * 18 | * $loader = new \Composer\Autoload\ClassLoader(); 19 | * 20 | * // register classes with namespaces 21 | * $loader->add('Symfony\Component', __DIR__.'/component'); 22 | * $loader->add('Symfony', __DIR__.'/framework'); 23 | * 24 | * // activate the autoloader 25 | * $loader->register(); 26 | * 27 | * // to enable searching the include path (eg. for PEAR packages) 28 | * $loader->setUseIncludePath(true); 29 | * 30 | * In this example, if you try to use a class in the Symfony\Component 31 | * namespace or one of its children (Symfony\Component\Console for instance), 32 | * the autoloader will first look for the class under the component/ 33 | * directory, and it will then fallback to the framework/ directory if not 34 | * found before giving up. 35 | * 36 | * This class is loosely based on the Symfony UniversalClassLoader. 37 | * 38 | * @author Fabien Potencier 39 | * @author Jordi Boggiano 40 | * @see https://www.php-fig.org/psr/psr-0/ 41 | * @see https://www.php-fig.org/psr/psr-4/ 42 | */ 43 | class ClassLoader 44 | { 45 | private $vendorDir; 46 | 47 | // PSR-4 48 | private $prefixLengthsPsr4 = array(); 49 | private $prefixDirsPsr4 = array(); 50 | private $fallbackDirsPsr4 = array(); 51 | 52 | // PSR-0 53 | private $prefixesPsr0 = array(); 54 | private $fallbackDirsPsr0 = array(); 55 | 56 | private $useIncludePath = false; 57 | private $classMap = array(); 58 | private $classMapAuthoritative = false; 59 | private $missingClasses = array(); 60 | private $apcuPrefix; 61 | 62 | private static $registeredLoaders = array(); 63 | 64 | public function __construct($vendorDir = null) 65 | { 66 | $this->vendorDir = $vendorDir; 67 | } 68 | 69 | public function getPrefixes() 70 | { 71 | if (!empty($this->prefixesPsr0)) { 72 | return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); 73 | } 74 | 75 | return array(); 76 | } 77 | 78 | public function getPrefixesPsr4() 79 | { 80 | return $this->prefixDirsPsr4; 81 | } 82 | 83 | public function getFallbackDirs() 84 | { 85 | return $this->fallbackDirsPsr0; 86 | } 87 | 88 | public function getFallbackDirsPsr4() 89 | { 90 | return $this->fallbackDirsPsr4; 91 | } 92 | 93 | public function getClassMap() 94 | { 95 | return $this->classMap; 96 | } 97 | 98 | /** 99 | * @param array $classMap Class to filename map 100 | */ 101 | public function addClassMap(array $classMap) 102 | { 103 | if ($this->classMap) { 104 | $this->classMap = array_merge($this->classMap, $classMap); 105 | } else { 106 | $this->classMap = $classMap; 107 | } 108 | } 109 | 110 | /** 111 | * Registers a set of PSR-0 directories for a given prefix, either 112 | * appending or prepending to the ones previously set for this prefix. 113 | * 114 | * @param string $prefix The prefix 115 | * @param array|string $paths The PSR-0 root directories 116 | * @param bool $prepend Whether to prepend the directories 117 | */ 118 | public function add($prefix, $paths, $prepend = false) 119 | { 120 | if (!$prefix) { 121 | if ($prepend) { 122 | $this->fallbackDirsPsr0 = array_merge( 123 | (array) $paths, 124 | $this->fallbackDirsPsr0 125 | ); 126 | } else { 127 | $this->fallbackDirsPsr0 = array_merge( 128 | $this->fallbackDirsPsr0, 129 | (array) $paths 130 | ); 131 | } 132 | 133 | return; 134 | } 135 | 136 | $first = $prefix[0]; 137 | if (!isset($this->prefixesPsr0[$first][$prefix])) { 138 | $this->prefixesPsr0[$first][$prefix] = (array) $paths; 139 | 140 | return; 141 | } 142 | if ($prepend) { 143 | $this->prefixesPsr0[$first][$prefix] = array_merge( 144 | (array) $paths, 145 | $this->prefixesPsr0[$first][$prefix] 146 | ); 147 | } else { 148 | $this->prefixesPsr0[$first][$prefix] = array_merge( 149 | $this->prefixesPsr0[$first][$prefix], 150 | (array) $paths 151 | ); 152 | } 153 | } 154 | 155 | /** 156 | * Registers a set of PSR-4 directories for a given namespace, either 157 | * appending or prepending to the ones previously set for this namespace. 158 | * 159 | * @param string $prefix The prefix/namespace, with trailing '\\' 160 | * @param array|string $paths The PSR-4 base directories 161 | * @param bool $prepend Whether to prepend the directories 162 | * 163 | * @throws \InvalidArgumentException 164 | */ 165 | public function addPsr4($prefix, $paths, $prepend = false) 166 | { 167 | if (!$prefix) { 168 | // Register directories for the root namespace. 169 | if ($prepend) { 170 | $this->fallbackDirsPsr4 = array_merge( 171 | (array) $paths, 172 | $this->fallbackDirsPsr4 173 | ); 174 | } else { 175 | $this->fallbackDirsPsr4 = array_merge( 176 | $this->fallbackDirsPsr4, 177 | (array) $paths 178 | ); 179 | } 180 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) { 181 | // Register directories for a new namespace. 182 | $length = strlen($prefix); 183 | if ('\\' !== $prefix[$length - 1]) { 184 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 185 | } 186 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 187 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 188 | } elseif ($prepend) { 189 | // Prepend directories for an already registered namespace. 190 | $this->prefixDirsPsr4[$prefix] = array_merge( 191 | (array) $paths, 192 | $this->prefixDirsPsr4[$prefix] 193 | ); 194 | } else { 195 | // Append directories for an already registered namespace. 196 | $this->prefixDirsPsr4[$prefix] = array_merge( 197 | $this->prefixDirsPsr4[$prefix], 198 | (array) $paths 199 | ); 200 | } 201 | } 202 | 203 | /** 204 | * Registers a set of PSR-0 directories for a given prefix, 205 | * replacing any others previously set for this prefix. 206 | * 207 | * @param string $prefix The prefix 208 | * @param array|string $paths The PSR-0 base directories 209 | */ 210 | public function set($prefix, $paths) 211 | { 212 | if (!$prefix) { 213 | $this->fallbackDirsPsr0 = (array) $paths; 214 | } else { 215 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; 216 | } 217 | } 218 | 219 | /** 220 | * Registers a set of PSR-4 directories for a given namespace, 221 | * replacing any others previously set for this namespace. 222 | * 223 | * @param string $prefix The prefix/namespace, with trailing '\\' 224 | * @param array|string $paths The PSR-4 base directories 225 | * 226 | * @throws \InvalidArgumentException 227 | */ 228 | public function setPsr4($prefix, $paths) 229 | { 230 | if (!$prefix) { 231 | $this->fallbackDirsPsr4 = (array) $paths; 232 | } else { 233 | $length = strlen($prefix); 234 | if ('\\' !== $prefix[$length - 1]) { 235 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 236 | } 237 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 238 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 239 | } 240 | } 241 | 242 | /** 243 | * Turns on searching the include path for class files. 244 | * 245 | * @param bool $useIncludePath 246 | */ 247 | public function setUseIncludePath($useIncludePath) 248 | { 249 | $this->useIncludePath = $useIncludePath; 250 | } 251 | 252 | /** 253 | * Can be used to check if the autoloader uses the include path to check 254 | * for classes. 255 | * 256 | * @return bool 257 | */ 258 | public function getUseIncludePath() 259 | { 260 | return $this->useIncludePath; 261 | } 262 | 263 | /** 264 | * Turns off searching the prefix and fallback directories for classes 265 | * that have not been registered with the class map. 266 | * 267 | * @param bool $classMapAuthoritative 268 | */ 269 | public function setClassMapAuthoritative($classMapAuthoritative) 270 | { 271 | $this->classMapAuthoritative = $classMapAuthoritative; 272 | } 273 | 274 | /** 275 | * Should class lookup fail if not found in the current class map? 276 | * 277 | * @return bool 278 | */ 279 | public function isClassMapAuthoritative() 280 | { 281 | return $this->classMapAuthoritative; 282 | } 283 | 284 | /** 285 | * APCu prefix to use to cache found/not-found classes, if the extension is enabled. 286 | * 287 | * @param string|null $apcuPrefix 288 | */ 289 | public function setApcuPrefix($apcuPrefix) 290 | { 291 | $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; 292 | } 293 | 294 | /** 295 | * The APCu prefix in use, or null if APCu caching is not enabled. 296 | * 297 | * @return string|null 298 | */ 299 | public function getApcuPrefix() 300 | { 301 | return $this->apcuPrefix; 302 | } 303 | 304 | /** 305 | * Registers this instance as an autoloader. 306 | * 307 | * @param bool $prepend Whether to prepend the autoloader or not 308 | */ 309 | public function register($prepend = false) 310 | { 311 | spl_autoload_register(array($this, 'loadClass'), true, $prepend); 312 | 313 | if (null === $this->vendorDir) { 314 | return; 315 | } 316 | 317 | if ($prepend) { 318 | self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; 319 | } else { 320 | unset(self::$registeredLoaders[$this->vendorDir]); 321 | self::$registeredLoaders[$this->vendorDir] = $this; 322 | } 323 | } 324 | 325 | /** 326 | * Unregisters this instance as an autoloader. 327 | */ 328 | public function unregister() 329 | { 330 | spl_autoload_unregister(array($this, 'loadClass')); 331 | 332 | if (null !== $this->vendorDir) { 333 | unset(self::$registeredLoaders[$this->vendorDir]); 334 | } 335 | } 336 | 337 | /** 338 | * Loads the given class or interface. 339 | * 340 | * @param string $class The name of the class 341 | * @return bool|null True if loaded, null otherwise 342 | */ 343 | public function loadClass($class) 344 | { 345 | if ($file = $this->findFile($class)) { 346 | includeFile($file); 347 | 348 | return true; 349 | } 350 | } 351 | 352 | /** 353 | * Finds the path to the file where the class is defined. 354 | * 355 | * @param string $class The name of the class 356 | * 357 | * @return string|false The path if found, false otherwise 358 | */ 359 | public function findFile($class) 360 | { 361 | // class map lookup 362 | if (isset($this->classMap[$class])) { 363 | return $this->classMap[$class]; 364 | } 365 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { 366 | return false; 367 | } 368 | if (null !== $this->apcuPrefix) { 369 | $file = apcu_fetch($this->apcuPrefix.$class, $hit); 370 | if ($hit) { 371 | return $file; 372 | } 373 | } 374 | 375 | $file = $this->findFileWithExtension($class, '.php'); 376 | 377 | // Search for Hack files if we are running on HHVM 378 | if (false === $file && defined('HHVM_VERSION')) { 379 | $file = $this->findFileWithExtension($class, '.hh'); 380 | } 381 | 382 | if (null !== $this->apcuPrefix) { 383 | apcu_add($this->apcuPrefix.$class, $file); 384 | } 385 | 386 | if (false === $file) { 387 | // Remember that this class does not exist. 388 | $this->missingClasses[$class] = true; 389 | } 390 | 391 | return $file; 392 | } 393 | 394 | /** 395 | * Returns the currently registered loaders indexed by their corresponding vendor directories. 396 | * 397 | * @return self[] 398 | */ 399 | public static function getRegisteredLoaders() 400 | { 401 | return self::$registeredLoaders; 402 | } 403 | 404 | private function findFileWithExtension($class, $ext) 405 | { 406 | // PSR-4 lookup 407 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; 408 | 409 | $first = $class[0]; 410 | if (isset($this->prefixLengthsPsr4[$first])) { 411 | $subPath = $class; 412 | while (false !== $lastPos = strrpos($subPath, '\\')) { 413 | $subPath = substr($subPath, 0, $lastPos); 414 | $search = $subPath . '\\'; 415 | if (isset($this->prefixDirsPsr4[$search])) { 416 | $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); 417 | foreach ($this->prefixDirsPsr4[$search] as $dir) { 418 | if (file_exists($file = $dir . $pathEnd)) { 419 | return $file; 420 | } 421 | } 422 | } 423 | } 424 | } 425 | 426 | // PSR-4 fallback dirs 427 | foreach ($this->fallbackDirsPsr4 as $dir) { 428 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { 429 | return $file; 430 | } 431 | } 432 | 433 | // PSR-0 lookup 434 | if (false !== $pos = strrpos($class, '\\')) { 435 | // namespaced class name 436 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) 437 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); 438 | } else { 439 | // PEAR-like class name 440 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; 441 | } 442 | 443 | if (isset($this->prefixesPsr0[$first])) { 444 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { 445 | if (0 === strpos($class, $prefix)) { 446 | foreach ($dirs as $dir) { 447 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 448 | return $file; 449 | } 450 | } 451 | } 452 | } 453 | } 454 | 455 | // PSR-0 fallback dirs 456 | foreach ($this->fallbackDirsPsr0 as $dir) { 457 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 458 | return $file; 459 | } 460 | } 461 | 462 | // PSR-0 include paths. 463 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { 464 | return $file; 465 | } 466 | 467 | return false; 468 | } 469 | } 470 | 471 | /** 472 | * Scope isolated include. 473 | * 474 | * Prevents access to $this/self from included files. 475 | */ 476 | function includeFile($file) 477 | { 478 | include $file; 479 | } 480 | -------------------------------------------------------------------------------- /vendor/composer/InstalledVersions.php: -------------------------------------------------------------------------------- 1 | 27 | array ( 28 | 'pretty_version' => 'dev-main', 29 | 'version' => 'dev-main', 30 | 'aliases' => 31 | array ( 32 | ), 33 | 'reference' => '92738d7209ce8b0b6597ef23aa16ae7a6c687dec', 34 | 'name' => 'presprog/kirby-route-attributes', 35 | ), 36 | 'versions' => 37 | array ( 38 | 'getkirby/composer-installer' => 39 | array ( 40 | 'pretty_version' => '1.2.1', 41 | 'version' => '1.2.1.0', 42 | 'aliases' => 43 | array ( 44 | ), 45 | 'reference' => 'c98ece30bfba45be7ce457e1102d1b169d922f3d', 46 | ), 47 | 'presprog/kirby-route-attributes' => 48 | array ( 49 | 'pretty_version' => 'dev-main', 50 | 'version' => 'dev-main', 51 | 'aliases' => 52 | array ( 53 | ), 54 | 'reference' => '92738d7209ce8b0b6597ef23aa16ae7a6c687dec', 55 | ), 56 | ), 57 | ); 58 | private static $canGetVendors; 59 | private static $installedByVendor = array(); 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | public static function getInstalledPackages() 68 | { 69 | $packages = array(); 70 | foreach (self::getInstalled() as $installed) { 71 | $packages[] = array_keys($installed['versions']); 72 | } 73 | 74 | 75 | if (1 === \count($packages)) { 76 | return $packages[0]; 77 | } 78 | 79 | return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); 80 | } 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | public static function isInstalled($packageName) 91 | { 92 | foreach (self::getInstalled() as $installed) { 93 | if (isset($installed['versions'][$packageName])) { 94 | return true; 95 | } 96 | } 97 | 98 | return false; 99 | } 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | public static function satisfies(VersionParser $parser, $packageName, $constraint) 115 | { 116 | $constraint = $parser->parseConstraints($constraint); 117 | $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); 118 | 119 | return $provided->matches($constraint); 120 | } 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | public static function getVersionRanges($packageName) 132 | { 133 | foreach (self::getInstalled() as $installed) { 134 | if (!isset($installed['versions'][$packageName])) { 135 | continue; 136 | } 137 | 138 | $ranges = array(); 139 | if (isset($installed['versions'][$packageName]['pretty_version'])) { 140 | $ranges[] = $installed['versions'][$packageName]['pretty_version']; 141 | } 142 | if (array_key_exists('aliases', $installed['versions'][$packageName])) { 143 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); 144 | } 145 | if (array_key_exists('replaced', $installed['versions'][$packageName])) { 146 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); 147 | } 148 | if (array_key_exists('provided', $installed['versions'][$packageName])) { 149 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); 150 | } 151 | 152 | return implode(' || ', $ranges); 153 | } 154 | 155 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 156 | } 157 | 158 | 159 | 160 | 161 | 162 | public static function getVersion($packageName) 163 | { 164 | foreach (self::getInstalled() as $installed) { 165 | if (!isset($installed['versions'][$packageName])) { 166 | continue; 167 | } 168 | 169 | if (!isset($installed['versions'][$packageName]['version'])) { 170 | return null; 171 | } 172 | 173 | return $installed['versions'][$packageName]['version']; 174 | } 175 | 176 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 177 | } 178 | 179 | 180 | 181 | 182 | 183 | public static function getPrettyVersion($packageName) 184 | { 185 | foreach (self::getInstalled() as $installed) { 186 | if (!isset($installed['versions'][$packageName])) { 187 | continue; 188 | } 189 | 190 | if (!isset($installed['versions'][$packageName]['pretty_version'])) { 191 | return null; 192 | } 193 | 194 | return $installed['versions'][$packageName]['pretty_version']; 195 | } 196 | 197 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 198 | } 199 | 200 | 201 | 202 | 203 | 204 | public static function getReference($packageName) 205 | { 206 | foreach (self::getInstalled() as $installed) { 207 | if (!isset($installed['versions'][$packageName])) { 208 | continue; 209 | } 210 | 211 | if (!isset($installed['versions'][$packageName]['reference'])) { 212 | return null; 213 | } 214 | 215 | return $installed['versions'][$packageName]['reference']; 216 | } 217 | 218 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 219 | } 220 | 221 | 222 | 223 | 224 | 225 | public static function getRootPackage() 226 | { 227 | $installed = self::getInstalled(); 228 | 229 | return $installed[0]['root']; 230 | } 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | public static function getRawData() 239 | { 240 | return self::$installed; 241 | } 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | public static function reload($data) 262 | { 263 | self::$installed = $data; 264 | self::$installedByVendor = array(); 265 | } 266 | 267 | 268 | 269 | 270 | private static function getInstalled() 271 | { 272 | if (null === self::$canGetVendors) { 273 | self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); 274 | } 275 | 276 | $installed = array(); 277 | 278 | if (self::$canGetVendors) { 279 | foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { 280 | if (isset(self::$installedByVendor[$vendorDir])) { 281 | $installed[] = self::$installedByVendor[$vendorDir]; 282 | } elseif (is_file($vendorDir.'/composer/installed.php')) { 283 | $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; 284 | } 285 | } 286 | } 287 | 288 | $installed[] = self::$installed; 289 | 290 | return $installed; 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /vendor/composer/autoload_classmap.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/composer/InstalledVersions.php', 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | array($baseDir . '/src'), 10 | 'Kirby\\' => array($vendorDir . '/getkirby/composer-installer/src'), 11 | ); 12 | -------------------------------------------------------------------------------- /vendor/composer/autoload_real.php: -------------------------------------------------------------------------------- 1 | = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); 32 | if ($useStaticLoader) { 33 | require __DIR__ . '/autoload_static.php'; 34 | 35 | call_user_func(\Composer\Autoload\ComposerStaticInit7a0c86118e4968aa121645d16f763860::getInitializer($loader)); 36 | } else { 37 | $map = require __DIR__ . '/autoload_namespaces.php'; 38 | foreach ($map as $namespace => $path) { 39 | $loader->set($namespace, $path); 40 | } 41 | 42 | $map = require __DIR__ . '/autoload_psr4.php'; 43 | foreach ($map as $namespace => $path) { 44 | $loader->setPsr4($namespace, $path); 45 | } 46 | 47 | $classMap = require __DIR__ . '/autoload_classmap.php'; 48 | if ($classMap) { 49 | $loader->addClassMap($classMap); 50 | } 51 | } 52 | 53 | $loader->register(true); 54 | 55 | return $loader; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | 11 | array ( 12 | 'PresProg\\RouteAttributes\\' => 25, 13 | ), 14 | 'K' => 15 | array ( 16 | 'Kirby\\' => 6, 17 | ), 18 | ); 19 | 20 | public static $prefixDirsPsr4 = array ( 21 | 'PresProg\\RouteAttributes\\' => 22 | array ( 23 | 0 => __DIR__ . '/../..' . '/src', 24 | ), 25 | 'Kirby\\' => 26 | array ( 27 | 0 => __DIR__ . '/..' . '/getkirby/composer-installer/src', 28 | ), 29 | ); 30 | 31 | public static $classMap = array ( 32 | 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 33 | ); 34 | 35 | public static function getInitializer(ClassLoader $loader) 36 | { 37 | return \Closure::bind(function () use ($loader) { 38 | $loader->prefixLengthsPsr4 = ComposerStaticInit7a0c86118e4968aa121645d16f763860::$prefixLengthsPsr4; 39 | $loader->prefixDirsPsr4 = ComposerStaticInit7a0c86118e4968aa121645d16f763860::$prefixDirsPsr4; 40 | $loader->classMap = ComposerStaticInit7a0c86118e4968aa121645d16f763860::$classMap; 41 | 42 | }, null, ClassLoader::class); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | { 4 | "name": "getkirby/composer-installer", 5 | "version": "1.2.1", 6 | "version_normalized": "1.2.1.0", 7 | "source": { 8 | "type": "git", 9 | "url": "https://github.com/getkirby/composer-installer.git", 10 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" 11 | }, 12 | "dist": { 13 | "type": "zip", 14 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", 15 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", 16 | "shasum": "" 17 | }, 18 | "require": { 19 | "composer-plugin-api": "^1.0 || ^2.0" 20 | }, 21 | "require-dev": { 22 | "composer/composer": "^1.8 || ^2.0" 23 | }, 24 | "time": "2020-12-28T12:54:39+00:00", 25 | "type": "composer-plugin", 26 | "extra": { 27 | "class": "Kirby\\ComposerInstaller\\Plugin" 28 | }, 29 | "installation-source": "dist", 30 | "autoload": { 31 | "psr-4": { 32 | "Kirby\\": "src/" 33 | } 34 | }, 35 | "notification-url": "https://packagist.org/downloads/", 36 | "license": [ 37 | "MIT" 38 | ], 39 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", 40 | "homepage": "https://getkirby.com", 41 | "support": { 42 | "issues": "https://github.com/getkirby/composer-installer/issues", 43 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" 44 | }, 45 | "funding": [ 46 | { 47 | "url": "https://getkirby.com/buy", 48 | "type": "custom" 49 | } 50 | ], 51 | "install-path": "../getkirby/composer-installer" 52 | } 53 | ], 54 | "dev": true, 55 | "dev-package-names": [] 56 | } 57 | -------------------------------------------------------------------------------- /vendor/composer/installed.php: -------------------------------------------------------------------------------- 1 | 3 | array ( 4 | 'pretty_version' => 'dev-main', 5 | 'version' => 'dev-main', 6 | 'aliases' => 7 | array ( 8 | ), 9 | 'reference' => '92738d7209ce8b0b6597ef23aa16ae7a6c687dec', 10 | 'name' => 'presprog/kirby-route-attributes', 11 | ), 12 | 'versions' => 13 | array ( 14 | 'getkirby/composer-installer' => 15 | array ( 16 | 'pretty_version' => '1.2.1', 17 | 'version' => '1.2.1.0', 18 | 'aliases' => 19 | array ( 20 | ), 21 | 'reference' => 'c98ece30bfba45be7ce457e1102d1b169d922f3d', 22 | ), 23 | 'presprog/kirby-route-attributes' => 24 | array ( 25 | 'pretty_version' => 'dev-main', 26 | 'version' => 'dev-main', 27 | 'aliases' => 28 | array ( 29 | ), 30 | 'reference' => '92738d7209ce8b0b6597ef23aa16ae7a6c687dec', 31 | ), 32 | ), 33 | ); 34 | -------------------------------------------------------------------------------- /vendor/composer/platform_check.php: -------------------------------------------------------------------------------- 1 | = 80000)) { 8 | $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.'; 9 | } 10 | 11 | if ($issues) { 12 | if (!headers_sent()) { 13 | header('HTTP/1.1 500 Internal Server Error'); 14 | } 15 | if (!ini_get('display_errors')) { 16 | if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { 17 | fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); 18 | } elseif (!headers_sent()) { 19 | echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; 20 | } 21 | } 22 | trigger_error( 23 | 'Composer detected issues in your platform: ' . implode(' ', $issues), 24 | E_USER_ERROR 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "getkirby/composer-installer", 3 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", 4 | "type": "composer-plugin", 5 | "license": "MIT", 6 | "homepage": "https://getkirby.com", 7 | "require": { 8 | "composer-plugin-api": "^1.0 || ^2.0" 9 | }, 10 | "require-dev": { 11 | "composer/composer": "^1.8 || ^2.0" 12 | }, 13 | "autoload": { 14 | "psr-4": { 15 | "Kirby\\": "src/" 16 | } 17 | }, 18 | "autoload-dev": { 19 | "psr-4": { 20 | "Kirby\\": "tests/" 21 | } 22 | }, 23 | "scripts": { 24 | "fix": "php-cs-fixer fix --config .php_cs", 25 | "test": "--stderr --coverage-html=tests/coverage" 26 | }, 27 | "extra": { 28 | "class": "Kirby\\ComposerInstaller\\Plugin" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "981db668fb0d4f37f7b64daf03b5f131", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "composer/ca-bundle", 12 | "version": "1.2.8", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/composer/ca-bundle.git", 16 | "reference": "8a7ecad675253e4654ea05505233285377405215" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215", 21 | "reference": "8a7ecad675253e4654ea05505233285377405215", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "ext-openssl": "*", 26 | "ext-pcre": "*", 27 | "php": "^5.3.2 || ^7.0 || ^8.0" 28 | }, 29 | "require-dev": { 30 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", 31 | "psr/log": "^1.0", 32 | "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" 33 | }, 34 | "type": "library", 35 | "extra": { 36 | "branch-alias": { 37 | "dev-master": "1.x-dev" 38 | } 39 | }, 40 | "autoload": { 41 | "psr-4": { 42 | "Composer\\CaBundle\\": "src" 43 | } 44 | }, 45 | "notification-url": "https://packagist.org/downloads/", 46 | "license": [ 47 | "MIT" 48 | ], 49 | "authors": [ 50 | { 51 | "name": "Jordi Boggiano", 52 | "email": "j.boggiano@seld.be", 53 | "homepage": "http://seld.be" 54 | } 55 | ], 56 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 57 | "keywords": [ 58 | "cabundle", 59 | "cacert", 60 | "certificate", 61 | "ssl", 62 | "tls" 63 | ], 64 | "support": { 65 | "irc": "irc://irc.freenode.org/composer", 66 | "issues": "https://github.com/composer/ca-bundle/issues", 67 | "source": "https://github.com/composer/ca-bundle/tree/1.2.8" 68 | }, 69 | "funding": [ 70 | { 71 | "url": "https://packagist.com", 72 | "type": "custom" 73 | }, 74 | { 75 | "url": "https://github.com/composer", 76 | "type": "github" 77 | }, 78 | { 79 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 80 | "type": "tidelift" 81 | } 82 | ], 83 | "time": "2020-08-23T12:54:47+00:00" 84 | }, 85 | { 86 | "name": "composer/composer", 87 | "version": "2.0.8", 88 | "source": { 89 | "type": "git", 90 | "url": "https://github.com/composer/composer.git", 91 | "reference": "62139b2806178adb979d76bd3437534a1a9fd490" 92 | }, 93 | "dist": { 94 | "type": "zip", 95 | "url": "https://api.github.com/repos/composer/composer/zipball/62139b2806178adb979d76bd3437534a1a9fd490", 96 | "reference": "62139b2806178adb979d76bd3437534a1a9fd490", 97 | "shasum": "" 98 | }, 99 | "require": { 100 | "composer/ca-bundle": "^1.0", 101 | "composer/semver": "^3.0", 102 | "composer/spdx-licenses": "^1.2", 103 | "composer/xdebug-handler": "^1.1", 104 | "justinrainbow/json-schema": "^5.2.10", 105 | "php": "^5.3.2 || ^7.0 || ^8.0", 106 | "psr/log": "^1.0", 107 | "react/promise": "^1.2 || ^2.7", 108 | "seld/jsonlint": "^1.4", 109 | "seld/phar-utils": "^1.0", 110 | "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", 111 | "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", 112 | "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", 113 | "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0" 114 | }, 115 | "require-dev": { 116 | "phpspec/prophecy": "^1.10", 117 | "symfony/phpunit-bridge": "^4.2 || ^5.0" 118 | }, 119 | "suggest": { 120 | "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", 121 | "ext-zip": "Enabling the zip extension allows you to unzip archives", 122 | "ext-zlib": "Allow gzip compression of HTTP requests" 123 | }, 124 | "bin": [ 125 | "bin/composer" 126 | ], 127 | "type": "library", 128 | "extra": { 129 | "branch-alias": { 130 | "dev-master": "2.0-dev" 131 | } 132 | }, 133 | "autoload": { 134 | "psr-4": { 135 | "Composer\\": "src/Composer" 136 | } 137 | }, 138 | "notification-url": "https://packagist.org/downloads/", 139 | "license": [ 140 | "MIT" 141 | ], 142 | "authors": [ 143 | { 144 | "name": "Nils Adermann", 145 | "email": "naderman@naderman.de", 146 | "homepage": "https://www.naderman.de" 147 | }, 148 | { 149 | "name": "Jordi Boggiano", 150 | "email": "j.boggiano@seld.be", 151 | "homepage": "https://seld.be" 152 | } 153 | ], 154 | "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", 155 | "homepage": "https://getcomposer.org/", 156 | "keywords": [ 157 | "autoload", 158 | "dependency", 159 | "package" 160 | ], 161 | "support": { 162 | "irc": "irc://irc.freenode.org/composer", 163 | "issues": "https://github.com/composer/composer/issues", 164 | "source": "https://github.com/composer/composer/tree/2.0.8" 165 | }, 166 | "funding": [ 167 | { 168 | "url": "https://packagist.com", 169 | "type": "custom" 170 | }, 171 | { 172 | "url": "https://github.com/composer", 173 | "type": "github" 174 | }, 175 | { 176 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 177 | "type": "tidelift" 178 | } 179 | ], 180 | "time": "2020-12-03T16:20:39+00:00" 181 | }, 182 | { 183 | "name": "composer/semver", 184 | "version": "3.2.4", 185 | "source": { 186 | "type": "git", 187 | "url": "https://github.com/composer/semver.git", 188 | "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" 189 | }, 190 | "dist": { 191 | "type": "zip", 192 | "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", 193 | "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", 194 | "shasum": "" 195 | }, 196 | "require": { 197 | "php": "^5.3.2 || ^7.0 || ^8.0" 198 | }, 199 | "require-dev": { 200 | "phpstan/phpstan": "^0.12.54", 201 | "symfony/phpunit-bridge": "^4.2 || ^5" 202 | }, 203 | "type": "library", 204 | "extra": { 205 | "branch-alias": { 206 | "dev-main": "3.x-dev" 207 | } 208 | }, 209 | "autoload": { 210 | "psr-4": { 211 | "Composer\\Semver\\": "src" 212 | } 213 | }, 214 | "notification-url": "https://packagist.org/downloads/", 215 | "license": [ 216 | "MIT" 217 | ], 218 | "authors": [ 219 | { 220 | "name": "Nils Adermann", 221 | "email": "naderman@naderman.de", 222 | "homepage": "http://www.naderman.de" 223 | }, 224 | { 225 | "name": "Jordi Boggiano", 226 | "email": "j.boggiano@seld.be", 227 | "homepage": "http://seld.be" 228 | }, 229 | { 230 | "name": "Rob Bast", 231 | "email": "rob.bast@gmail.com", 232 | "homepage": "http://robbast.nl" 233 | } 234 | ], 235 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 236 | "keywords": [ 237 | "semantic", 238 | "semver", 239 | "validation", 240 | "versioning" 241 | ], 242 | "support": { 243 | "irc": "irc://irc.freenode.org/composer", 244 | "issues": "https://github.com/composer/semver/issues", 245 | "source": "https://github.com/composer/semver/tree/3.2.4" 246 | }, 247 | "funding": [ 248 | { 249 | "url": "https://packagist.com", 250 | "type": "custom" 251 | }, 252 | { 253 | "url": "https://github.com/composer", 254 | "type": "github" 255 | }, 256 | { 257 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 258 | "type": "tidelift" 259 | } 260 | ], 261 | "time": "2020-11-13T08:59:24+00:00" 262 | }, 263 | { 264 | "name": "composer/spdx-licenses", 265 | "version": "1.5.5", 266 | "source": { 267 | "type": "git", 268 | "url": "https://github.com/composer/spdx-licenses.git", 269 | "reference": "de30328a7af8680efdc03e396aad24befd513200" 270 | }, 271 | "dist": { 272 | "type": "zip", 273 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", 274 | "reference": "de30328a7af8680efdc03e396aad24befd513200", 275 | "shasum": "" 276 | }, 277 | "require": { 278 | "php": "^5.3.2 || ^7.0 || ^8.0" 279 | }, 280 | "require-dev": { 281 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" 282 | }, 283 | "type": "library", 284 | "extra": { 285 | "branch-alias": { 286 | "dev-main": "1.x-dev" 287 | } 288 | }, 289 | "autoload": { 290 | "psr-4": { 291 | "Composer\\Spdx\\": "src" 292 | } 293 | }, 294 | "notification-url": "https://packagist.org/downloads/", 295 | "license": [ 296 | "MIT" 297 | ], 298 | "authors": [ 299 | { 300 | "name": "Nils Adermann", 301 | "email": "naderman@naderman.de", 302 | "homepage": "http://www.naderman.de" 303 | }, 304 | { 305 | "name": "Jordi Boggiano", 306 | "email": "j.boggiano@seld.be", 307 | "homepage": "http://seld.be" 308 | }, 309 | { 310 | "name": "Rob Bast", 311 | "email": "rob.bast@gmail.com", 312 | "homepage": "http://robbast.nl" 313 | } 314 | ], 315 | "description": "SPDX licenses list and validation library.", 316 | "keywords": [ 317 | "license", 318 | "spdx", 319 | "validator" 320 | ], 321 | "support": { 322 | "irc": "irc://irc.freenode.org/composer", 323 | "issues": "https://github.com/composer/spdx-licenses/issues", 324 | "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" 325 | }, 326 | "funding": [ 327 | { 328 | "url": "https://packagist.com", 329 | "type": "custom" 330 | }, 331 | { 332 | "url": "https://github.com/composer", 333 | "type": "github" 334 | }, 335 | { 336 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 337 | "type": "tidelift" 338 | } 339 | ], 340 | "time": "2020-12-03T16:04:16+00:00" 341 | }, 342 | { 343 | "name": "composer/xdebug-handler", 344 | "version": "1.4.5", 345 | "source": { 346 | "type": "git", 347 | "url": "https://github.com/composer/xdebug-handler.git", 348 | "reference": "f28d44c286812c714741478d968104c5e604a1d4" 349 | }, 350 | "dist": { 351 | "type": "zip", 352 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", 353 | "reference": "f28d44c286812c714741478d968104c5e604a1d4", 354 | "shasum": "" 355 | }, 356 | "require": { 357 | "php": "^5.3.2 || ^7.0 || ^8.0", 358 | "psr/log": "^1.0" 359 | }, 360 | "require-dev": { 361 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" 362 | }, 363 | "type": "library", 364 | "autoload": { 365 | "psr-4": { 366 | "Composer\\XdebugHandler\\": "src" 367 | } 368 | }, 369 | "notification-url": "https://packagist.org/downloads/", 370 | "license": [ 371 | "MIT" 372 | ], 373 | "authors": [ 374 | { 375 | "name": "John Stevenson", 376 | "email": "john-stevenson@blueyonder.co.uk" 377 | } 378 | ], 379 | "description": "Restarts a process without Xdebug.", 380 | "keywords": [ 381 | "Xdebug", 382 | "performance" 383 | ], 384 | "support": { 385 | "irc": "irc://irc.freenode.org/composer", 386 | "issues": "https://github.com/composer/xdebug-handler/issues", 387 | "source": "https://github.com/composer/xdebug-handler/tree/1.4.5" 388 | }, 389 | "funding": [ 390 | { 391 | "url": "https://packagist.com", 392 | "type": "custom" 393 | }, 394 | { 395 | "url": "https://github.com/composer", 396 | "type": "github" 397 | }, 398 | { 399 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 400 | "type": "tidelift" 401 | } 402 | ], 403 | "time": "2020-11-13T08:04:11+00:00" 404 | }, 405 | { 406 | "name": "justinrainbow/json-schema", 407 | "version": "5.2.10", 408 | "source": { 409 | "type": "git", 410 | "url": "https://github.com/justinrainbow/json-schema.git", 411 | "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" 412 | }, 413 | "dist": { 414 | "type": "zip", 415 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", 416 | "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", 417 | "shasum": "" 418 | }, 419 | "require": { 420 | "php": ">=5.3.3" 421 | }, 422 | "require-dev": { 423 | "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", 424 | "json-schema/json-schema-test-suite": "1.2.0", 425 | "phpunit/phpunit": "^4.8.35" 426 | }, 427 | "bin": [ 428 | "bin/validate-json" 429 | ], 430 | "type": "library", 431 | "extra": { 432 | "branch-alias": { 433 | "dev-master": "5.0.x-dev" 434 | } 435 | }, 436 | "autoload": { 437 | "psr-4": { 438 | "JsonSchema\\": "src/JsonSchema/" 439 | } 440 | }, 441 | "notification-url": "https://packagist.org/downloads/", 442 | "license": [ 443 | "MIT" 444 | ], 445 | "authors": [ 446 | { 447 | "name": "Bruno Prieto Reis", 448 | "email": "bruno.p.reis@gmail.com" 449 | }, 450 | { 451 | "name": "Justin Rainbow", 452 | "email": "justin.rainbow@gmail.com" 453 | }, 454 | { 455 | "name": "Igor Wiedler", 456 | "email": "igor@wiedler.ch" 457 | }, 458 | { 459 | "name": "Robert Schönthal", 460 | "email": "seroscho@googlemail.com" 461 | } 462 | ], 463 | "description": "A library to validate a json schema.", 464 | "homepage": "https://github.com/justinrainbow/json-schema", 465 | "keywords": [ 466 | "json", 467 | "schema" 468 | ], 469 | "support": { 470 | "issues": "https://github.com/justinrainbow/json-schema/issues", 471 | "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" 472 | }, 473 | "time": "2020-05-27T16:41:55+00:00" 474 | }, 475 | { 476 | "name": "psr/container", 477 | "version": "1.0.0", 478 | "source": { 479 | "type": "git", 480 | "url": "https://github.com/php-fig/container.git", 481 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 482 | }, 483 | "dist": { 484 | "type": "zip", 485 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 486 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 487 | "shasum": "" 488 | }, 489 | "require": { 490 | "php": ">=5.3.0" 491 | }, 492 | "type": "library", 493 | "extra": { 494 | "branch-alias": { 495 | "dev-master": "1.0.x-dev" 496 | } 497 | }, 498 | "autoload": { 499 | "psr-4": { 500 | "Psr\\Container\\": "src/" 501 | } 502 | }, 503 | "notification-url": "https://packagist.org/downloads/", 504 | "license": [ 505 | "MIT" 506 | ], 507 | "authors": [ 508 | { 509 | "name": "PHP-FIG", 510 | "homepage": "http://www.php-fig.org/" 511 | } 512 | ], 513 | "description": "Common Container Interface (PHP FIG PSR-11)", 514 | "homepage": "https://github.com/php-fig/container", 515 | "keywords": [ 516 | "PSR-11", 517 | "container", 518 | "container-interface", 519 | "container-interop", 520 | "psr" 521 | ], 522 | "support": { 523 | "issues": "https://github.com/php-fig/container/issues", 524 | "source": "https://github.com/php-fig/container/tree/master" 525 | }, 526 | "time": "2017-02-14T16:28:37+00:00" 527 | }, 528 | { 529 | "name": "psr/log", 530 | "version": "1.1.3", 531 | "source": { 532 | "type": "git", 533 | "url": "https://github.com/php-fig/log.git", 534 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" 535 | }, 536 | "dist": { 537 | "type": "zip", 538 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", 539 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", 540 | "shasum": "" 541 | }, 542 | "require": { 543 | "php": ">=5.3.0" 544 | }, 545 | "type": "library", 546 | "extra": { 547 | "branch-alias": { 548 | "dev-master": "1.1.x-dev" 549 | } 550 | }, 551 | "autoload": { 552 | "psr-4": { 553 | "Psr\\Log\\": "Psr/Log/" 554 | } 555 | }, 556 | "notification-url": "https://packagist.org/downloads/", 557 | "license": [ 558 | "MIT" 559 | ], 560 | "authors": [ 561 | { 562 | "name": "PHP-FIG", 563 | "homepage": "http://www.php-fig.org/" 564 | } 565 | ], 566 | "description": "Common interface for logging libraries", 567 | "homepage": "https://github.com/php-fig/log", 568 | "keywords": [ 569 | "log", 570 | "psr", 571 | "psr-3" 572 | ], 573 | "support": { 574 | "source": "https://github.com/php-fig/log/tree/1.1.3" 575 | }, 576 | "time": "2020-03-23T09:12:05+00:00" 577 | }, 578 | { 579 | "name": "react/promise", 580 | "version": "v2.8.0", 581 | "source": { 582 | "type": "git", 583 | "url": "https://github.com/reactphp/promise.git", 584 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" 585 | }, 586 | "dist": { 587 | "type": "zip", 588 | "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", 589 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", 590 | "shasum": "" 591 | }, 592 | "require": { 593 | "php": ">=5.4.0" 594 | }, 595 | "require-dev": { 596 | "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" 597 | }, 598 | "type": "library", 599 | "autoload": { 600 | "psr-4": { 601 | "React\\Promise\\": "src/" 602 | }, 603 | "files": [ 604 | "src/functions_include.php" 605 | ] 606 | }, 607 | "notification-url": "https://packagist.org/downloads/", 608 | "license": [ 609 | "MIT" 610 | ], 611 | "authors": [ 612 | { 613 | "name": "Jan Sorgalla", 614 | "email": "jsorgalla@gmail.com" 615 | } 616 | ], 617 | "description": "A lightweight implementation of CommonJS Promises/A for PHP", 618 | "keywords": [ 619 | "promise", 620 | "promises" 621 | ], 622 | "support": { 623 | "issues": "https://github.com/reactphp/promise/issues", 624 | "source": "https://github.com/reactphp/promise/tree/v2.8.0" 625 | }, 626 | "time": "2020-05-12T15:16:56+00:00" 627 | }, 628 | { 629 | "name": "seld/jsonlint", 630 | "version": "1.8.3", 631 | "source": { 632 | "type": "git", 633 | "url": "https://github.com/Seldaek/jsonlint.git", 634 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" 635 | }, 636 | "dist": { 637 | "type": "zip", 638 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", 639 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", 640 | "shasum": "" 641 | }, 642 | "require": { 643 | "php": "^5.3 || ^7.0 || ^8.0" 644 | }, 645 | "require-dev": { 646 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 647 | }, 648 | "bin": [ 649 | "bin/jsonlint" 650 | ], 651 | "type": "library", 652 | "autoload": { 653 | "psr-4": { 654 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 655 | } 656 | }, 657 | "notification-url": "https://packagist.org/downloads/", 658 | "license": [ 659 | "MIT" 660 | ], 661 | "authors": [ 662 | { 663 | "name": "Jordi Boggiano", 664 | "email": "j.boggiano@seld.be", 665 | "homepage": "http://seld.be" 666 | } 667 | ], 668 | "description": "JSON Linter", 669 | "keywords": [ 670 | "json", 671 | "linter", 672 | "parser", 673 | "validator" 674 | ], 675 | "support": { 676 | "issues": "https://github.com/Seldaek/jsonlint/issues", 677 | "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" 678 | }, 679 | "funding": [ 680 | { 681 | "url": "https://github.com/Seldaek", 682 | "type": "github" 683 | }, 684 | { 685 | "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", 686 | "type": "tidelift" 687 | } 688 | ], 689 | "time": "2020-11-11T09:19:24+00:00" 690 | }, 691 | { 692 | "name": "seld/phar-utils", 693 | "version": "1.1.1", 694 | "source": { 695 | "type": "git", 696 | "url": "https://github.com/Seldaek/phar-utils.git", 697 | "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" 698 | }, 699 | "dist": { 700 | "type": "zip", 701 | "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", 702 | "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", 703 | "shasum": "" 704 | }, 705 | "require": { 706 | "php": ">=5.3" 707 | }, 708 | "type": "library", 709 | "extra": { 710 | "branch-alias": { 711 | "dev-master": "1.x-dev" 712 | } 713 | }, 714 | "autoload": { 715 | "psr-4": { 716 | "Seld\\PharUtils\\": "src/" 717 | } 718 | }, 719 | "notification-url": "https://packagist.org/downloads/", 720 | "license": [ 721 | "MIT" 722 | ], 723 | "authors": [ 724 | { 725 | "name": "Jordi Boggiano", 726 | "email": "j.boggiano@seld.be" 727 | } 728 | ], 729 | "description": "PHAR file format utilities, for when PHP phars you up", 730 | "keywords": [ 731 | "phar" 732 | ], 733 | "support": { 734 | "issues": "https://github.com/Seldaek/phar-utils/issues", 735 | "source": "https://github.com/Seldaek/phar-utils/tree/master" 736 | }, 737 | "time": "2020-07-07T18:42:57+00:00" 738 | }, 739 | { 740 | "name": "symfony/console", 741 | "version": "v5.2.1", 742 | "source": { 743 | "type": "git", 744 | "url": "https://github.com/symfony/console.git", 745 | "reference": "47c02526c532fb381374dab26df05e7313978976" 746 | }, 747 | "dist": { 748 | "type": "zip", 749 | "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976", 750 | "reference": "47c02526c532fb381374dab26df05e7313978976", 751 | "shasum": "" 752 | }, 753 | "require": { 754 | "php": ">=7.2.5", 755 | "symfony/polyfill-mbstring": "~1.0", 756 | "symfony/polyfill-php73": "^1.8", 757 | "symfony/polyfill-php80": "^1.15", 758 | "symfony/service-contracts": "^1.1|^2", 759 | "symfony/string": "^5.1" 760 | }, 761 | "conflict": { 762 | "symfony/dependency-injection": "<4.4", 763 | "symfony/dotenv": "<5.1", 764 | "symfony/event-dispatcher": "<4.4", 765 | "symfony/lock": "<4.4", 766 | "symfony/process": "<4.4" 767 | }, 768 | "provide": { 769 | "psr/log-implementation": "1.0" 770 | }, 771 | "require-dev": { 772 | "psr/log": "~1.0", 773 | "symfony/config": "^4.4|^5.0", 774 | "symfony/dependency-injection": "^4.4|^5.0", 775 | "symfony/event-dispatcher": "^4.4|^5.0", 776 | "symfony/lock": "^4.4|^5.0", 777 | "symfony/process": "^4.4|^5.0", 778 | "symfony/var-dumper": "^4.4|^5.0" 779 | }, 780 | "suggest": { 781 | "psr/log": "For using the console logger", 782 | "symfony/event-dispatcher": "", 783 | "symfony/lock": "", 784 | "symfony/process": "" 785 | }, 786 | "type": "library", 787 | "autoload": { 788 | "psr-4": { 789 | "Symfony\\Component\\Console\\": "" 790 | }, 791 | "exclude-from-classmap": [ 792 | "/Tests/" 793 | ] 794 | }, 795 | "notification-url": "https://packagist.org/downloads/", 796 | "license": [ 797 | "MIT" 798 | ], 799 | "authors": [ 800 | { 801 | "name": "Fabien Potencier", 802 | "email": "fabien@symfony.com" 803 | }, 804 | { 805 | "name": "Symfony Community", 806 | "homepage": "https://symfony.com/contributors" 807 | } 808 | ], 809 | "description": "Symfony Console Component", 810 | "homepage": "https://symfony.com", 811 | "keywords": [ 812 | "cli", 813 | "command line", 814 | "console", 815 | "terminal" 816 | ], 817 | "support": { 818 | "source": "https://github.com/symfony/console/tree/v5.2.1" 819 | }, 820 | "funding": [ 821 | { 822 | "url": "https://symfony.com/sponsor", 823 | "type": "custom" 824 | }, 825 | { 826 | "url": "https://github.com/fabpot", 827 | "type": "github" 828 | }, 829 | { 830 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 831 | "type": "tidelift" 832 | } 833 | ], 834 | "time": "2020-12-18T08:03:05+00:00" 835 | }, 836 | { 837 | "name": "symfony/filesystem", 838 | "version": "v5.2.1", 839 | "source": { 840 | "type": "git", 841 | "url": "https://github.com/symfony/filesystem.git", 842 | "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d" 843 | }, 844 | "dist": { 845 | "type": "zip", 846 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/fa8f8cab6b65e2d99a118e082935344c5ba8c60d", 847 | "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d", 848 | "shasum": "" 849 | }, 850 | "require": { 851 | "php": ">=7.2.5", 852 | "symfony/polyfill-ctype": "~1.8" 853 | }, 854 | "type": "library", 855 | "autoload": { 856 | "psr-4": { 857 | "Symfony\\Component\\Filesystem\\": "" 858 | }, 859 | "exclude-from-classmap": [ 860 | "/Tests/" 861 | ] 862 | }, 863 | "notification-url": "https://packagist.org/downloads/", 864 | "license": [ 865 | "MIT" 866 | ], 867 | "authors": [ 868 | { 869 | "name": "Fabien Potencier", 870 | "email": "fabien@symfony.com" 871 | }, 872 | { 873 | "name": "Symfony Community", 874 | "homepage": "https://symfony.com/contributors" 875 | } 876 | ], 877 | "description": "Symfony Filesystem Component", 878 | "homepage": "https://symfony.com", 879 | "support": { 880 | "source": "https://github.com/symfony/filesystem/tree/v5.2.1" 881 | }, 882 | "funding": [ 883 | { 884 | "url": "https://symfony.com/sponsor", 885 | "type": "custom" 886 | }, 887 | { 888 | "url": "https://github.com/fabpot", 889 | "type": "github" 890 | }, 891 | { 892 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 893 | "type": "tidelift" 894 | } 895 | ], 896 | "time": "2020-11-30T17:05:38+00:00" 897 | }, 898 | { 899 | "name": "symfony/finder", 900 | "version": "v5.2.1", 901 | "source": { 902 | "type": "git", 903 | "url": "https://github.com/symfony/finder.git", 904 | "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba" 905 | }, 906 | "dist": { 907 | "type": "zip", 908 | "url": "https://api.github.com/repos/symfony/finder/zipball/0b9231a5922fd7287ba5b411893c0ecd2733e5ba", 909 | "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba", 910 | "shasum": "" 911 | }, 912 | "require": { 913 | "php": ">=7.2.5" 914 | }, 915 | "type": "library", 916 | "autoload": { 917 | "psr-4": { 918 | "Symfony\\Component\\Finder\\": "" 919 | }, 920 | "exclude-from-classmap": [ 921 | "/Tests/" 922 | ] 923 | }, 924 | "notification-url": "https://packagist.org/downloads/", 925 | "license": [ 926 | "MIT" 927 | ], 928 | "authors": [ 929 | { 930 | "name": "Fabien Potencier", 931 | "email": "fabien@symfony.com" 932 | }, 933 | { 934 | "name": "Symfony Community", 935 | "homepage": "https://symfony.com/contributors" 936 | } 937 | ], 938 | "description": "Symfony Finder Component", 939 | "homepage": "https://symfony.com", 940 | "support": { 941 | "source": "https://github.com/symfony/finder/tree/v5.2.1" 942 | }, 943 | "funding": [ 944 | { 945 | "url": "https://symfony.com/sponsor", 946 | "type": "custom" 947 | }, 948 | { 949 | "url": "https://github.com/fabpot", 950 | "type": "github" 951 | }, 952 | { 953 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 954 | "type": "tidelift" 955 | } 956 | ], 957 | "time": "2020-12-08T17:02:38+00:00" 958 | }, 959 | { 960 | "name": "symfony/polyfill-ctype", 961 | "version": "v1.20.0", 962 | "source": { 963 | "type": "git", 964 | "url": "https://github.com/symfony/polyfill-ctype.git", 965 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" 966 | }, 967 | "dist": { 968 | "type": "zip", 969 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", 970 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", 971 | "shasum": "" 972 | }, 973 | "require": { 974 | "php": ">=7.1" 975 | }, 976 | "suggest": { 977 | "ext-ctype": "For best performance" 978 | }, 979 | "type": "library", 980 | "extra": { 981 | "branch-alias": { 982 | "dev-main": "1.20-dev" 983 | }, 984 | "thanks": { 985 | "name": "symfony/polyfill", 986 | "url": "https://github.com/symfony/polyfill" 987 | } 988 | }, 989 | "autoload": { 990 | "psr-4": { 991 | "Symfony\\Polyfill\\Ctype\\": "" 992 | }, 993 | "files": [ 994 | "bootstrap.php" 995 | ] 996 | }, 997 | "notification-url": "https://packagist.org/downloads/", 998 | "license": [ 999 | "MIT" 1000 | ], 1001 | "authors": [ 1002 | { 1003 | "name": "Gert de Pagter", 1004 | "email": "BackEndTea@gmail.com" 1005 | }, 1006 | { 1007 | "name": "Symfony Community", 1008 | "homepage": "https://symfony.com/contributors" 1009 | } 1010 | ], 1011 | "description": "Symfony polyfill for ctype functions", 1012 | "homepage": "https://symfony.com", 1013 | "keywords": [ 1014 | "compatibility", 1015 | "ctype", 1016 | "polyfill", 1017 | "portable" 1018 | ], 1019 | "support": { 1020 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" 1021 | }, 1022 | "funding": [ 1023 | { 1024 | "url": "https://symfony.com/sponsor", 1025 | "type": "custom" 1026 | }, 1027 | { 1028 | "url": "https://github.com/fabpot", 1029 | "type": "github" 1030 | }, 1031 | { 1032 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1033 | "type": "tidelift" 1034 | } 1035 | ], 1036 | "time": "2020-10-23T14:02:19+00:00" 1037 | }, 1038 | { 1039 | "name": "symfony/polyfill-intl-grapheme", 1040 | "version": "v1.20.0", 1041 | "source": { 1042 | "type": "git", 1043 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 1044 | "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" 1045 | }, 1046 | "dist": { 1047 | "type": "zip", 1048 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", 1049 | "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", 1050 | "shasum": "" 1051 | }, 1052 | "require": { 1053 | "php": ">=7.1" 1054 | }, 1055 | "suggest": { 1056 | "ext-intl": "For best performance" 1057 | }, 1058 | "type": "library", 1059 | "extra": { 1060 | "branch-alias": { 1061 | "dev-main": "1.20-dev" 1062 | }, 1063 | "thanks": { 1064 | "name": "symfony/polyfill", 1065 | "url": "https://github.com/symfony/polyfill" 1066 | } 1067 | }, 1068 | "autoload": { 1069 | "psr-4": { 1070 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 1071 | }, 1072 | "files": [ 1073 | "bootstrap.php" 1074 | ] 1075 | }, 1076 | "notification-url": "https://packagist.org/downloads/", 1077 | "license": [ 1078 | "MIT" 1079 | ], 1080 | "authors": [ 1081 | { 1082 | "name": "Nicolas Grekas", 1083 | "email": "p@tchwork.com" 1084 | }, 1085 | { 1086 | "name": "Symfony Community", 1087 | "homepage": "https://symfony.com/contributors" 1088 | } 1089 | ], 1090 | "description": "Symfony polyfill for intl's grapheme_* functions", 1091 | "homepage": "https://symfony.com", 1092 | "keywords": [ 1093 | "compatibility", 1094 | "grapheme", 1095 | "intl", 1096 | "polyfill", 1097 | "portable", 1098 | "shim" 1099 | ], 1100 | "support": { 1101 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" 1102 | }, 1103 | "funding": [ 1104 | { 1105 | "url": "https://symfony.com/sponsor", 1106 | "type": "custom" 1107 | }, 1108 | { 1109 | "url": "https://github.com/fabpot", 1110 | "type": "github" 1111 | }, 1112 | { 1113 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1114 | "type": "tidelift" 1115 | } 1116 | ], 1117 | "time": "2020-10-23T14:02:19+00:00" 1118 | }, 1119 | { 1120 | "name": "symfony/polyfill-intl-normalizer", 1121 | "version": "v1.20.0", 1122 | "source": { 1123 | "type": "git", 1124 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 1125 | "reference": "727d1096295d807c309fb01a851577302394c897" 1126 | }, 1127 | "dist": { 1128 | "type": "zip", 1129 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", 1130 | "reference": "727d1096295d807c309fb01a851577302394c897", 1131 | "shasum": "" 1132 | }, 1133 | "require": { 1134 | "php": ">=7.1" 1135 | }, 1136 | "suggest": { 1137 | "ext-intl": "For best performance" 1138 | }, 1139 | "type": "library", 1140 | "extra": { 1141 | "branch-alias": { 1142 | "dev-main": "1.20-dev" 1143 | }, 1144 | "thanks": { 1145 | "name": "symfony/polyfill", 1146 | "url": "https://github.com/symfony/polyfill" 1147 | } 1148 | }, 1149 | "autoload": { 1150 | "psr-4": { 1151 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 1152 | }, 1153 | "files": [ 1154 | "bootstrap.php" 1155 | ], 1156 | "classmap": [ 1157 | "Resources/stubs" 1158 | ] 1159 | }, 1160 | "notification-url": "https://packagist.org/downloads/", 1161 | "license": [ 1162 | "MIT" 1163 | ], 1164 | "authors": [ 1165 | { 1166 | "name": "Nicolas Grekas", 1167 | "email": "p@tchwork.com" 1168 | }, 1169 | { 1170 | "name": "Symfony Community", 1171 | "homepage": "https://symfony.com/contributors" 1172 | } 1173 | ], 1174 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 1175 | "homepage": "https://symfony.com", 1176 | "keywords": [ 1177 | "compatibility", 1178 | "intl", 1179 | "normalizer", 1180 | "polyfill", 1181 | "portable", 1182 | "shim" 1183 | ], 1184 | "support": { 1185 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" 1186 | }, 1187 | "funding": [ 1188 | { 1189 | "url": "https://symfony.com/sponsor", 1190 | "type": "custom" 1191 | }, 1192 | { 1193 | "url": "https://github.com/fabpot", 1194 | "type": "github" 1195 | }, 1196 | { 1197 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1198 | "type": "tidelift" 1199 | } 1200 | ], 1201 | "time": "2020-10-23T14:02:19+00:00" 1202 | }, 1203 | { 1204 | "name": "symfony/polyfill-mbstring", 1205 | "version": "v1.20.0", 1206 | "source": { 1207 | "type": "git", 1208 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1209 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" 1210 | }, 1211 | "dist": { 1212 | "type": "zip", 1213 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", 1214 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", 1215 | "shasum": "" 1216 | }, 1217 | "require": { 1218 | "php": ">=7.1" 1219 | }, 1220 | "suggest": { 1221 | "ext-mbstring": "For best performance" 1222 | }, 1223 | "type": "library", 1224 | "extra": { 1225 | "branch-alias": { 1226 | "dev-main": "1.20-dev" 1227 | }, 1228 | "thanks": { 1229 | "name": "symfony/polyfill", 1230 | "url": "https://github.com/symfony/polyfill" 1231 | } 1232 | }, 1233 | "autoload": { 1234 | "psr-4": { 1235 | "Symfony\\Polyfill\\Mbstring\\": "" 1236 | }, 1237 | "files": [ 1238 | "bootstrap.php" 1239 | ] 1240 | }, 1241 | "notification-url": "https://packagist.org/downloads/", 1242 | "license": [ 1243 | "MIT" 1244 | ], 1245 | "authors": [ 1246 | { 1247 | "name": "Nicolas Grekas", 1248 | "email": "p@tchwork.com" 1249 | }, 1250 | { 1251 | "name": "Symfony Community", 1252 | "homepage": "https://symfony.com/contributors" 1253 | } 1254 | ], 1255 | "description": "Symfony polyfill for the Mbstring extension", 1256 | "homepage": "https://symfony.com", 1257 | "keywords": [ 1258 | "compatibility", 1259 | "mbstring", 1260 | "polyfill", 1261 | "portable", 1262 | "shim" 1263 | ], 1264 | "support": { 1265 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" 1266 | }, 1267 | "funding": [ 1268 | { 1269 | "url": "https://symfony.com/sponsor", 1270 | "type": "custom" 1271 | }, 1272 | { 1273 | "url": "https://github.com/fabpot", 1274 | "type": "github" 1275 | }, 1276 | { 1277 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1278 | "type": "tidelift" 1279 | } 1280 | ], 1281 | "time": "2020-10-23T14:02:19+00:00" 1282 | }, 1283 | { 1284 | "name": "symfony/polyfill-php73", 1285 | "version": "v1.20.0", 1286 | "source": { 1287 | "type": "git", 1288 | "url": "https://github.com/symfony/polyfill-php73.git", 1289 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" 1290 | }, 1291 | "dist": { 1292 | "type": "zip", 1293 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", 1294 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", 1295 | "shasum": "" 1296 | }, 1297 | "require": { 1298 | "php": ">=7.1" 1299 | }, 1300 | "type": "library", 1301 | "extra": { 1302 | "branch-alias": { 1303 | "dev-main": "1.20-dev" 1304 | }, 1305 | "thanks": { 1306 | "name": "symfony/polyfill", 1307 | "url": "https://github.com/symfony/polyfill" 1308 | } 1309 | }, 1310 | "autoload": { 1311 | "psr-4": { 1312 | "Symfony\\Polyfill\\Php73\\": "" 1313 | }, 1314 | "files": [ 1315 | "bootstrap.php" 1316 | ], 1317 | "classmap": [ 1318 | "Resources/stubs" 1319 | ] 1320 | }, 1321 | "notification-url": "https://packagist.org/downloads/", 1322 | "license": [ 1323 | "MIT" 1324 | ], 1325 | "authors": [ 1326 | { 1327 | "name": "Nicolas Grekas", 1328 | "email": "p@tchwork.com" 1329 | }, 1330 | { 1331 | "name": "Symfony Community", 1332 | "homepage": "https://symfony.com/contributors" 1333 | } 1334 | ], 1335 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 1336 | "homepage": "https://symfony.com", 1337 | "keywords": [ 1338 | "compatibility", 1339 | "polyfill", 1340 | "portable", 1341 | "shim" 1342 | ], 1343 | "support": { 1344 | "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" 1345 | }, 1346 | "funding": [ 1347 | { 1348 | "url": "https://symfony.com/sponsor", 1349 | "type": "custom" 1350 | }, 1351 | { 1352 | "url": "https://github.com/fabpot", 1353 | "type": "github" 1354 | }, 1355 | { 1356 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1357 | "type": "tidelift" 1358 | } 1359 | ], 1360 | "time": "2020-10-23T14:02:19+00:00" 1361 | }, 1362 | { 1363 | "name": "symfony/polyfill-php80", 1364 | "version": "v1.20.0", 1365 | "source": { 1366 | "type": "git", 1367 | "url": "https://github.com/symfony/polyfill-php80.git", 1368 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" 1369 | }, 1370 | "dist": { 1371 | "type": "zip", 1372 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 1373 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 1374 | "shasum": "" 1375 | }, 1376 | "require": { 1377 | "php": ">=7.1" 1378 | }, 1379 | "type": "library", 1380 | "extra": { 1381 | "branch-alias": { 1382 | "dev-main": "1.20-dev" 1383 | }, 1384 | "thanks": { 1385 | "name": "symfony/polyfill", 1386 | "url": "https://github.com/symfony/polyfill" 1387 | } 1388 | }, 1389 | "autoload": { 1390 | "psr-4": { 1391 | "Symfony\\Polyfill\\Php80\\": "" 1392 | }, 1393 | "files": [ 1394 | "bootstrap.php" 1395 | ], 1396 | "classmap": [ 1397 | "Resources/stubs" 1398 | ] 1399 | }, 1400 | "notification-url": "https://packagist.org/downloads/", 1401 | "license": [ 1402 | "MIT" 1403 | ], 1404 | "authors": [ 1405 | { 1406 | "name": "Ion Bazan", 1407 | "email": "ion.bazan@gmail.com" 1408 | }, 1409 | { 1410 | "name": "Nicolas Grekas", 1411 | "email": "p@tchwork.com" 1412 | }, 1413 | { 1414 | "name": "Symfony Community", 1415 | "homepage": "https://symfony.com/contributors" 1416 | } 1417 | ], 1418 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 1419 | "homepage": "https://symfony.com", 1420 | "keywords": [ 1421 | "compatibility", 1422 | "polyfill", 1423 | "portable", 1424 | "shim" 1425 | ], 1426 | "support": { 1427 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" 1428 | }, 1429 | "funding": [ 1430 | { 1431 | "url": "https://symfony.com/sponsor", 1432 | "type": "custom" 1433 | }, 1434 | { 1435 | "url": "https://github.com/fabpot", 1436 | "type": "github" 1437 | }, 1438 | { 1439 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1440 | "type": "tidelift" 1441 | } 1442 | ], 1443 | "time": "2020-10-23T14:02:19+00:00" 1444 | }, 1445 | { 1446 | "name": "symfony/process", 1447 | "version": "v5.2.1", 1448 | "source": { 1449 | "type": "git", 1450 | "url": "https://github.com/symfony/process.git", 1451 | "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd" 1452 | }, 1453 | "dist": { 1454 | "type": "zip", 1455 | "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd", 1456 | "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd", 1457 | "shasum": "" 1458 | }, 1459 | "require": { 1460 | "php": ">=7.2.5", 1461 | "symfony/polyfill-php80": "^1.15" 1462 | }, 1463 | "type": "library", 1464 | "autoload": { 1465 | "psr-4": { 1466 | "Symfony\\Component\\Process\\": "" 1467 | }, 1468 | "exclude-from-classmap": [ 1469 | "/Tests/" 1470 | ] 1471 | }, 1472 | "notification-url": "https://packagist.org/downloads/", 1473 | "license": [ 1474 | "MIT" 1475 | ], 1476 | "authors": [ 1477 | { 1478 | "name": "Fabien Potencier", 1479 | "email": "fabien@symfony.com" 1480 | }, 1481 | { 1482 | "name": "Symfony Community", 1483 | "homepage": "https://symfony.com/contributors" 1484 | } 1485 | ], 1486 | "description": "Symfony Process Component", 1487 | "homepage": "https://symfony.com", 1488 | "support": { 1489 | "source": "https://github.com/symfony/process/tree/v5.2.1" 1490 | }, 1491 | "funding": [ 1492 | { 1493 | "url": "https://symfony.com/sponsor", 1494 | "type": "custom" 1495 | }, 1496 | { 1497 | "url": "https://github.com/fabpot", 1498 | "type": "github" 1499 | }, 1500 | { 1501 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1502 | "type": "tidelift" 1503 | } 1504 | ], 1505 | "time": "2020-12-08T17:03:37+00:00" 1506 | }, 1507 | { 1508 | "name": "symfony/service-contracts", 1509 | "version": "v2.2.0", 1510 | "source": { 1511 | "type": "git", 1512 | "url": "https://github.com/symfony/service-contracts.git", 1513 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" 1514 | }, 1515 | "dist": { 1516 | "type": "zip", 1517 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", 1518 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", 1519 | "shasum": "" 1520 | }, 1521 | "require": { 1522 | "php": ">=7.2.5", 1523 | "psr/container": "^1.0" 1524 | }, 1525 | "suggest": { 1526 | "symfony/service-implementation": "" 1527 | }, 1528 | "type": "library", 1529 | "extra": { 1530 | "branch-alias": { 1531 | "dev-master": "2.2-dev" 1532 | }, 1533 | "thanks": { 1534 | "name": "symfony/contracts", 1535 | "url": "https://github.com/symfony/contracts" 1536 | } 1537 | }, 1538 | "autoload": { 1539 | "psr-4": { 1540 | "Symfony\\Contracts\\Service\\": "" 1541 | } 1542 | }, 1543 | "notification-url": "https://packagist.org/downloads/", 1544 | "license": [ 1545 | "MIT" 1546 | ], 1547 | "authors": [ 1548 | { 1549 | "name": "Nicolas Grekas", 1550 | "email": "p@tchwork.com" 1551 | }, 1552 | { 1553 | "name": "Symfony Community", 1554 | "homepage": "https://symfony.com/contributors" 1555 | } 1556 | ], 1557 | "description": "Generic abstractions related to writing services", 1558 | "homepage": "https://symfony.com", 1559 | "keywords": [ 1560 | "abstractions", 1561 | "contracts", 1562 | "decoupling", 1563 | "interfaces", 1564 | "interoperability", 1565 | "standards" 1566 | ], 1567 | "support": { 1568 | "source": "https://github.com/symfony/service-contracts/tree/master" 1569 | }, 1570 | "funding": [ 1571 | { 1572 | "url": "https://symfony.com/sponsor", 1573 | "type": "custom" 1574 | }, 1575 | { 1576 | "url": "https://github.com/fabpot", 1577 | "type": "github" 1578 | }, 1579 | { 1580 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1581 | "type": "tidelift" 1582 | } 1583 | ], 1584 | "time": "2020-09-07T11:33:47+00:00" 1585 | }, 1586 | { 1587 | "name": "symfony/string", 1588 | "version": "v5.2.1", 1589 | "source": { 1590 | "type": "git", 1591 | "url": "https://github.com/symfony/string.git", 1592 | "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed" 1593 | }, 1594 | "dist": { 1595 | "type": "zip", 1596 | "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", 1597 | "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", 1598 | "shasum": "" 1599 | }, 1600 | "require": { 1601 | "php": ">=7.2.5", 1602 | "symfony/polyfill-ctype": "~1.8", 1603 | "symfony/polyfill-intl-grapheme": "~1.0", 1604 | "symfony/polyfill-intl-normalizer": "~1.0", 1605 | "symfony/polyfill-mbstring": "~1.0", 1606 | "symfony/polyfill-php80": "~1.15" 1607 | }, 1608 | "require-dev": { 1609 | "symfony/error-handler": "^4.4|^5.0", 1610 | "symfony/http-client": "^4.4|^5.0", 1611 | "symfony/translation-contracts": "^1.1|^2", 1612 | "symfony/var-exporter": "^4.4|^5.0" 1613 | }, 1614 | "type": "library", 1615 | "autoload": { 1616 | "psr-4": { 1617 | "Symfony\\Component\\String\\": "" 1618 | }, 1619 | "files": [ 1620 | "Resources/functions.php" 1621 | ], 1622 | "exclude-from-classmap": [ 1623 | "/Tests/" 1624 | ] 1625 | }, 1626 | "notification-url": "https://packagist.org/downloads/", 1627 | "license": [ 1628 | "MIT" 1629 | ], 1630 | "authors": [ 1631 | { 1632 | "name": "Nicolas Grekas", 1633 | "email": "p@tchwork.com" 1634 | }, 1635 | { 1636 | "name": "Symfony Community", 1637 | "homepage": "https://symfony.com/contributors" 1638 | } 1639 | ], 1640 | "description": "Symfony String component", 1641 | "homepage": "https://symfony.com", 1642 | "keywords": [ 1643 | "grapheme", 1644 | "i18n", 1645 | "string", 1646 | "unicode", 1647 | "utf-8", 1648 | "utf8" 1649 | ], 1650 | "support": { 1651 | "source": "https://github.com/symfony/string/tree/v5.2.1" 1652 | }, 1653 | "funding": [ 1654 | { 1655 | "url": "https://symfony.com/sponsor", 1656 | "type": "custom" 1657 | }, 1658 | { 1659 | "url": "https://github.com/fabpot", 1660 | "type": "github" 1661 | }, 1662 | { 1663 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1664 | "type": "tidelift" 1665 | } 1666 | ], 1667 | "time": "2020-12-05T07:33:16+00:00" 1668 | } 1669 | ], 1670 | "aliases": [], 1671 | "minimum-stability": "stable", 1672 | "stability-flags": [], 1673 | "prefer-stable": false, 1674 | "prefer-lowest": false, 1675 | "platform": { 1676 | "composer-plugin-api": "^1.0 || ^2.0" 1677 | }, 1678 | "platform-dev": [], 1679 | "plugin-api-version": "2.0.0" 1680 | } 1681 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/readme.md: -------------------------------------------------------------------------------- 1 | # Kirby Composer Installer 2 | 3 | [![CI Status](https://flat.badgen.net/github/checks/getkirby/composer-installer/master)](https://github.com/getkirby/composer-installer/actions?query=workflow%3ACI) 4 | [![Coverage Status](https://flat.badgen.net/coveralls/c/github/getkirby/composer-installer)](https://coveralls.io/github/getkirby/composer-installer) 5 | 6 | This is Kirby's custom [Composer installer](https://getcomposer.org/doc/articles/custom-installers.md) for the Kirby CMS. 7 | It is responsible for automatically choosing the correct installation paths if you install the CMS via Composer. 8 | 9 | It can also be used to automatically install Kirby plugins to the `site/plugins` directory. 10 | 11 | ## Installing the CMS 12 | 13 | ### Default configuration 14 | 15 | If you `require` the `getkirby/cms` package in your own `composer.json`, there is nothing else you need to do: 16 | 17 | ```js 18 | { 19 | "require": { 20 | "getkirby/cms": "^3.0" 21 | } 22 | } 23 | ``` 24 | 25 | Kirby's Composer installer (this repo) will run automatically and will install the CMS to the `kirby` directory. 26 | 27 | ### Custom installation path 28 | 29 | You might want to use a different installation path. The path can be configured like this in your `composer.json`: 30 | 31 | ```js 32 | { 33 | "require": { 34 | "getkirby/cms": "^3.0" 35 | }, 36 | "extra": { 37 | "kirby-cms-path": "kirby" // change this to your custom path 38 | } 39 | } 40 | ``` 41 | 42 | ### Disable the installer for the CMS 43 | 44 | If you prefer to have the CMS installed to the `vendor` directory, you can disable the custom path entirely: 45 | 46 | ```js 47 | { 48 | "require": { 49 | "getkirby/cms": "^3.0" 50 | }, 51 | "extra": { 52 | "kirby-cms-path": false 53 | } 54 | } 55 | ``` 56 | 57 | Please note that you will need to modify your site's `index.php` to load the `vendor/autoload.php` file instead of Kirby's `bootstrap.php`. 58 | 59 | ## Installing plugins 60 | 61 | ### Support in published plugins 62 | 63 | Plugins need to require this installer as a Composer dependency to make use of the automatic installation to the `site/plugins` directory. 64 | 65 | You can find out more about this in our [plugin documentation](https://getkirby.com/docs/guide/plugins/plugin-setup-basic). 66 | 67 | ### Usage for plugin users 68 | 69 | As a user of Kirby plugins that support this installer, you only need to `require` the plugins in your site's `composer.json`: 70 | 71 | ```js 72 | { 73 | "require": { 74 | "getkirby/cms": "^3.0", 75 | "superwoman/superplugin": "^1.0" 76 | } 77 | } 78 | ``` 79 | 80 | The installer (this repo) will run automatically, as the plugin dev added it to the plugin's `composer.json`. 81 | 82 | ### Custom installation path 83 | 84 | If your `site/plugins` directory is at a custom path, you can configure the installation path like this in your `composer.json`: 85 | 86 | ```js 87 | { 88 | "require": { 89 | "getkirby/cms": "^3.0", 90 | "superwoman/superplugin": "^1.0" 91 | }, 92 | "extra": { 93 | "kirby-plugin-path": "site/plugins" // change this to your custom path 94 | } 95 | } 96 | ``` 97 | 98 | ## License 99 | 100 | 101 | 102 | ## Author 103 | 104 | Lukas Bestle 105 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/src/ComposerInstaller/CmsInstaller.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class CmsInstaller extends Installer 17 | { 18 | /** 19 | * Decides if the installer supports the given type 20 | * 21 | * @param string $packageType 22 | * @return bool 23 | */ 24 | public function supports($packageType): bool 25 | { 26 | return $packageType === 'kirby-cms'; 27 | } 28 | 29 | /** 30 | * Returns the installation path of a package 31 | * 32 | * @param \Composer\Package\PackageInterface $package 33 | * @return string 34 | */ 35 | public function getInstallPath(PackageInterface $package): string 36 | { 37 | // get the extra configuration of the top-level package 38 | if ($rootPackage = $this->composer->getPackage()) { 39 | $extra = $rootPackage->getExtra(); 40 | } else { 41 | $extra = []; 42 | } 43 | 44 | // use path from configuration, otherwise fall back to default 45 | if (isset($extra['kirby-cms-path']) === true) { 46 | $path = $extra['kirby-cms-path']; 47 | } else { 48 | $path = 'kirby'; 49 | } 50 | 51 | // if explicitly set to something invalid (e.g. `false`), install to vendor dir 52 | if (is_string($path) !== true) { 53 | return parent::getInstallPath($package); 54 | } 55 | 56 | // don't allow unsafe directories 57 | $vendorDir = $this->composer->getConfig()->get('vendor-dir', Config::RELATIVE_PATHS) ?? 'vendor'; 58 | if ($path === $vendorDir || $path === '.') { 59 | throw new InvalidArgumentException('The path ' . $path . ' is an unsafe installation directory for ' . $package->getPrettyName() . '.'); 60 | } 61 | 62 | return $path; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/src/ComposerInstaller/Installer.php: -------------------------------------------------------------------------------- 1 | 14 | * @link https://getkirby.com 15 | * @copyright Bastian Allgeier GmbH 16 | * @license https://opensource.org/licenses/MIT 17 | */ 18 | class Installer extends LibraryInstaller 19 | { 20 | /** 21 | * Decides if the installer supports the given type 22 | * 23 | * @param string $packageType 24 | * @return bool 25 | */ 26 | public function supports($packageType): bool 27 | { 28 | throw new RuntimeException('This method needs to be overridden.'); // @codeCoverageIgnore 29 | } 30 | 31 | /** 32 | * Installs a specific package 33 | * 34 | * @param \Composer\Repository\InstalledRepositoryInterface $repo Repository in which to check 35 | * @param \Composer\Package\PackageInterface $package Package instance to install 36 | * @return \React\Promise\PromiseInterface|null 37 | */ 38 | public function install(InstalledRepositoryInterface $repo, PackageInterface $package) 39 | { 40 | // first install the package normally... 41 | $promise = parent::install($repo, $package); 42 | 43 | // ...then run custom code 44 | $postInstall = function () use ($package): void { 45 | $this->postInstall($package); 46 | }; 47 | 48 | // Composer 2 in async mode 49 | if ($promise instanceof PromiseInterface) { 50 | return $promise->then($postInstall); 51 | } 52 | 53 | // Composer 1 or Composer 2 without async 54 | $postInstall(); 55 | } 56 | 57 | /** 58 | * Updates a specific package 59 | * 60 | * @param \Composer\Repository\InstalledRepositoryInterface $repo Repository in which to check 61 | * @param \Composer\Package\PackageInterface $initial Already installed package version 62 | * @param \Composer\Package\PackageInterface $target Updated version 63 | * @return \React\Promise\PromiseInterface|null 64 | * 65 | * @throws \InvalidArgumentException if $initial package is not installed 66 | */ 67 | public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) 68 | { 69 | // first update the package normally... 70 | $promise = parent::update($repo, $initial, $target); 71 | 72 | // ...then run custom code 73 | $postInstall = function () use ($target): void { 74 | $this->postInstall($target); 75 | }; 76 | 77 | // Composer 2 in async mode 78 | if ($promise instanceof PromiseInterface) { 79 | return $promise->then($postInstall); 80 | } 81 | 82 | // Composer 1 or Composer 2 without async 83 | $postInstall(); 84 | } 85 | 86 | /** 87 | * Custom handler that will be called after each package 88 | * installation or update 89 | * 90 | * @param \Composer\Package\PackageInterface $package 91 | * @return void 92 | */ 93 | protected function postInstall(PackageInterface $package) 94 | { 95 | // remove the package's `vendor` directory to avoid duplicated autoloader and vendor code 96 | $packageVendorDir = $this->getInstallPath($package) . '/vendor'; 97 | if (is_dir($packageVendorDir) === true) { 98 | $success = $this->filesystem->removeDirectory($packageVendorDir); 99 | 100 | if ($success !== true) { 101 | throw new RuntimeException('Could not completely delete ' . $packageVendorDir . ', aborting.'); // @codeCoverageIgnore 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/src/ComposerInstaller/Plugin.php: -------------------------------------------------------------------------------- 1 | 12 | * @link https://getkirby.com 13 | * @copyright Bastian Allgeier GmbH 14 | * @license https://opensource.org/licenses/MIT 15 | */ 16 | class Plugin implements PluginInterface 17 | { 18 | /** 19 | * Apply plugin modifications to Composer 20 | * 21 | * @param \Composer\Composer $composer 22 | * @param \Composer\IO\IOInterface $io 23 | * @return void 24 | */ 25 | public function activate(Composer $composer, IOInterface $io): void 26 | { 27 | $installationManager = $composer->getInstallationManager(); 28 | $installationManager->addInstaller(new CmsInstaller($io, $composer)); 29 | $installationManager->addInstaller(new PluginInstaller($io, $composer)); 30 | } 31 | 32 | /** 33 | * Remove any hooks from Composer 34 | * 35 | * @codeCoverageIgnore 36 | * 37 | * @param \Composer\Composer $composer 38 | * @param \Composer\IO\IOInterface $io 39 | * @return void 40 | */ 41 | public function deactivate(Composer $composer, IOInterface $io): void 42 | { 43 | // nothing to do 44 | } 45 | 46 | /** 47 | * Prepare the plugin to be uninstalled 48 | * 49 | * @codeCoverageIgnore 50 | * 51 | * @param Composer $composer 52 | * @param IOInterface $io 53 | * @return void 54 | */ 55 | public function uninstall(Composer $composer, IOInterface $io): void 56 | { 57 | // nothing to do 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/src/ComposerInstaller/PluginInstaller.php: -------------------------------------------------------------------------------- 1 | 11 | * @link https://getkirby.com 12 | * @copyright Bastian Allgeier GmbH 13 | * @license https://opensource.org/licenses/MIT 14 | */ 15 | class PluginInstaller extends Installer 16 | { 17 | /** 18 | * Decides if the installer supports the given type 19 | * 20 | * @param string $packageType 21 | * @return bool 22 | */ 23 | public function supports($packageType): bool 24 | { 25 | return $packageType === 'kirby-plugin'; 26 | } 27 | 28 | /** 29 | * Returns the installation path of a package 30 | * 31 | * @param \Composer\Package\PackageInterface $package 32 | * @return string path 33 | */ 34 | public function getInstallPath(PackageInterface $package): string 35 | { 36 | // place into `vendor` directory as usual if Pluginkit is not supported 37 | if ($this->supportsPluginkit($package) !== true) { 38 | return parent::getInstallPath($package); 39 | } 40 | 41 | // get the extra configuration of the top-level package 42 | if ($rootPackage = $this->composer->getPackage()) { 43 | $extra = $rootPackage->getExtra(); 44 | } else { 45 | $extra = []; 46 | } 47 | 48 | // use base path from configuration, otherwise fall back to default 49 | $basePath = $extra['kirby-plugin-path'] ?? 'site/plugins'; 50 | 51 | if (is_string($basePath) !== true) { 52 | throw new InvalidArgumentException('Invalid "kirby-plugin-path" option'); 53 | } 54 | 55 | // determine the plugin name from its package name; 56 | // can be overridden in the plugin's `composer.json` 57 | $prettyName = $package->getPrettyName(); 58 | $pluginExtra = $package->getExtra(); 59 | if (empty($pluginExtra['installer-name']) === false) { 60 | $name = $pluginExtra['installer-name']; 61 | 62 | if (is_string($name) !== true) { 63 | throw new InvalidArgumentException('Invalid "installer-name" option in plugin ' . $prettyName); 64 | } 65 | } elseif (strpos($prettyName, '/') !== false) { 66 | // use name after the slash 67 | $name = explode('/', $prettyName)[1]; 68 | } else { 69 | $name = $prettyName; 70 | } 71 | 72 | // build destination path from base path and plugin name 73 | return $basePath . '/' . $name; 74 | } 75 | 76 | /** 77 | * Custom handler that will be called after each package 78 | * installation or update 79 | * 80 | * @param \Composer\Package\PackageInterface $package 81 | * @return void 82 | */ 83 | protected function postInstall(PackageInterface $package): void 84 | { 85 | // only continue if Pluginkit is supported 86 | if ($this->supportsPluginkit($package) !== true) { 87 | return; 88 | } 89 | 90 | parent::postInstall($package); 91 | } 92 | 93 | /** 94 | * Checks if the package has explicitly required this installer; 95 | * otherwise (if the Pluginkit is not yet supported by the plugin) 96 | * the installer will fall back to the behavior of the LibraryInstaller 97 | * 98 | * @param \Composer\Package\PackageInterface $package 99 | * @return bool 100 | */ 101 | protected function supportsPluginkit(PackageInterface $package): bool 102 | { 103 | foreach ($package->getRequires() as $link) { 104 | if ($link->getTarget() === 'getkirby/composer-installer') { 105 | return true; 106 | } 107 | } 108 | 109 | // no required package is the installer 110 | return false; 111 | } 112 | } 113 | --------------------------------------------------------------------------------