├── docs ├── index.html └── icon.svg ├── .idea ├── .name ├── misc.xml ├── vcs.xml ├── modules.xml ├── php.xml └── micro.iml ├── boilerplates └── blank │ ├── cache │ └── .gitkeep │ ├── store │ └── .gitkeep │ ├── .gitignore │ ├── public │ ├── favicon.ico │ ├── manifest.json │ ├── assets │ │ ├── css │ │ │ └── styles.css │ │ └── images │ │ │ └── micro.svg │ ├── index.php │ └── .htaccess │ ├── views │ ├── index.php │ ├── _layouts │ │ └── default.php │ └── 404.php │ └── configs │ └── master.yaml ├── media ├── logo.png ├── logo.sketch └── logo.svg ├── init.php ├── micro.php ├── micro ├── functions │ ├── config.php │ ├── router.php │ ├── validator.php │ ├── database.php │ ├── template.php │ ├── error.php │ └── cache.php └── classes │ ├── Router.php │ ├── ConfigurationObserver.php │ ├── Database.php │ └── Configuration.php ├── composer.json ├── LICENSE ├── bootstrap ├── .gitignore ├── CHANGELOG.md ├── README.md └── composer.lock /docs/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | @mzdr/micro -------------------------------------------------------------------------------- /boilerplates/blank/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /boilerplates/blank/store/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /boilerplates/blank/.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | -------------------------------------------------------------------------------- /media/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzdr/micro/HEAD/media/logo.png -------------------------------------------------------------------------------- /media/logo.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzdr/micro/HEAD/media/logo.sketch -------------------------------------------------------------------------------- /boilerplates/blank/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mzdr/micro/HEAD/boilerplates/blank/public/favicon.ico -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /boilerplates/blank/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "micro", 3 | "short_name": "micro", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color" : "#fff" 7 | } 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /boilerplates/blank/views/index.php: -------------------------------------------------------------------------------- 1 | layout('_layouts/default') ?> 2 | 3 |

A tiny multi-tool for your next big PHP adventure.

4 | 5 |

Enjoy and have fun! 👋

6 | -------------------------------------------------------------------------------- /init.php: -------------------------------------------------------------------------------- 1 | attach( 7 | new ConfigurationObserver() 8 | ); 9 | 10 | // Make sure the error handler is registered. 11 | error(); 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /micro.php: -------------------------------------------------------------------------------- 1 | enableAnnotationMapping() 24 | ->getValidator(); 25 | 26 | return $validator; 27 | } 28 | -------------------------------------------------------------------------------- /boilerplates/blank/views/_layouts/default.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | µ was here. 8 | 9 | 10 | 11 | 12 | 13 |
14 | micro framework 15 | 16 | section('content') ?> 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mzdr/micro", 3 | "description": "A tiny multi-tool for your next big PHP adventure.", 4 | "version": "3.0.0", 5 | "homepage": "https://mzdr.github.io/micro/", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Sebastian Prein", 10 | "email": "hi@sebastianprein.com" 11 | } 12 | ], 13 | "require": { 14 | "league/plates": "^3.3", 15 | "samrap/gestalt": "^0.3.1", 16 | "symfony/yaml": "^4.0", 17 | "league/booboo": "^2.0", 18 | "nikic/fast-route": "^1.2", 19 | "matthiasmullie/scrapbook": "^1.4", 20 | "league/flysystem": "^1.0", 21 | "php": "^8.2", 22 | "jasny/php-functions": "^3.2", 23 | "webmozart/path-util": "^2.3", 24 | "mzdr/oh-snap": "^1.0", 25 | "doctrine/orm": "^2.6", 26 | "doctrine/dbal": "^2.8", 27 | "symfony/validator": "^4.1" 28 | }, 29 | "autoload": { 30 | "files": ["micro.php"], 31 | "psr-4": { 32 | "µ\\": "micro/classes/" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Sebastian Prein 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 | -------------------------------------------------------------------------------- /micro/functions/database.php: -------------------------------------------------------------------------------- 1 | get('µ.db'); 24 | 25 | // If no configuration was found but this function was called, 26 | // throw an RuntimeException and let the user know why things went wrong. 27 | if ($config === null) { 28 | throw new RuntimeException( 29 | "No database configuration has been found. Use µ\config()->set('µ.db', []) to provide configuration. See Doctrine/DBAL documentation for additional details." 30 | ); 31 | } 32 | 33 | // Use wrapper class to ease access to Doctrine’s DBAL/ORM… 34 | return $db = new Database($config, config()->get('µ.env')); 35 | } 36 | 37 | /** 38 | * Just an alias of µ\db(). 39 | * 40 | * @see db 41 | */ 42 | function database(): Database 43 | { 44 | return db(); 45 | } 46 | -------------------------------------------------------------------------------- /micro/functions/template.php: -------------------------------------------------------------------------------- 1 | get('µ.paths'); 28 | 29 | // Set default path for views directory… 30 | $defaultViewsPath = Path::canonicalize((is_string($cwd) ? $cwd : '') . '/../views'); 31 | 32 | // Create Plates instance and prefer the configured views path, 33 | // otherwise take the default path as fallback 34 | $plates = new Engine($paths->views ?? $defaultViewsPath); 35 | 36 | // If an assets path is given, also load the asset extension 37 | // @see http://platesphp.com/v3/extensions/asset/ 38 | if (isset($paths->assets)) { 39 | $plates->loadExtension( 40 | new Asset($paths->assets, true) 41 | ); 42 | } 43 | 44 | return $plates; 45 | } 46 | -------------------------------------------------------------------------------- /micro/functions/error.php: -------------------------------------------------------------------------------- 1 | register(); 30 | 31 | return $eh; 32 | } 33 | 34 | // Otherwise prepare pretty formatters… 35 | $trivial = new HtmlFormatter; 36 | $fatal = new PrettyFormatter([ 37 | 'footer' => sprintf('µ v%s', VERSION) 38 | ]); 39 | 40 | // Use OhSnap formatter only for fatal errors… 41 | $fatal->setErrorLimit(E_ERROR | E_USER_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_PARSE); 42 | 43 | // Everything else should be printed just like PHP does it… 44 | $trivial->setErrorLimit(E_ALL); 45 | 46 | $eh = new BooBoo([$trivial, $fatal]); 47 | $eh->register(); 48 | 49 | return $eh; 50 | } 51 | -------------------------------------------------------------------------------- /boilerplates/blank/views/404.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /media/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /boilerplates/blank/public/assets/images/micro.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.idea/php.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /micro/classes/Router.php: -------------------------------------------------------------------------------- 1 | getData(); 46 | $useCache = config()->get('µ.router.cache', false); 47 | 48 | if ($useCache === false) { 49 | return $this->handle( 50 | ...(new Dispatcher($data))->dispatch($httpMethod, $uri) 51 | ); 52 | } 53 | 54 | $cacheFile = config()->get('µ.router.cacheFile'); 55 | 56 | if (isset($cacheFile) === false) { 57 | throw new LogicException('Must specify “router.cacheFile” option when caching is enabled.'); 58 | } 59 | 60 | if (file_exists($cacheFile) === false) { 61 | file_put_contents( 62 | $cacheFile, 63 | sprintf('handle( 74 | ...(new Dispatcher($data))->dispatch($httpMethod, $uri) 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /bootstrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | version); 62 | 63 | 64 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 65 | $go = stream_get_line(STDIN, 1024, PHP_EOL); 66 | } else { 67 | $go = readline(); 68 | } 69 | 70 | if ($go && strtolower($go) !== 'y') { 71 | printf(" 72 | Okay, cool. 👋 73 | "); 74 | 75 | return; 76 | } 77 | 78 | printf("\e[90m 79 | 80 | %s\e[0m 81 | 82 | Done. 👍 83 | ", 84 | implode( 85 | "\n ", 86 | array_map( 87 | function($item) { 88 | return sprintf( 89 | "%s \e[97m→\e[90m %s", 90 | str_replace(__DIR__, '.', $item[0]), 91 | str_replace(getcwd(), '.', $item[1]) 92 | ); 93 | }, 94 | recursive_copy( 95 | join(DIRECTORY_SEPARATOR, [__DIR__, 'boilerplates', 'blank']), 96 | getcwd() 97 | ) 98 | ) 99 | ) 100 | ); 101 | -------------------------------------------------------------------------------- /boilerplates/blank/configs/master.yaml: -------------------------------------------------------------------------------- 1 | # All settings that are used internally by micro 2 | # go under the µ key. 3 | µ: 4 | # Settings (mostly) used by Plates. 5 | paths: 6 | 7 | # Physical path to your assets. Use this if you want 8 | # to use the asset extension for cache busting files. 9 | # 10 | # @see http://platesphp.com/v3/extensions/asset/ 11 | assets: ./ 12 | 13 | # Not used by Plates, but useful for handling different environments. 14 | public: '' 15 | 16 | # Path to templates. 17 | views: ../views 18 | 19 | 20 | # Database settings for Doctrine. 21 | # 22 | # @see https://www.doctrine-project.org/projects/doctrine-dbal/en/2.8/reference/configuration.html 23 | # db: 24 | # driver: pdo_sqlite 25 | # path: ../store/example.db 26 | # proxy: 27 | # path: /tmp 28 | # metadata: 29 | # path: ../entities 30 | 31 | 32 | # Settings for FastRoute. 33 | # router: 34 | # cache: true 35 | # cacheFile: ../cache/router.cache 36 | 37 | 38 | # Settings for BooBoo. 39 | # error: 40 | # formatter: json 41 | 42 | 43 | # Settings for Scrapbook. 44 | # 45 | # @see https://www.scrapbook.cash/ 46 | # cache: 47 | 48 | # Return PSR-16 compliant cache. 49 | # 50 | # @see https://www.php-fig.org/psr/psr-16/ 51 | # psr16: true 52 | 53 | # Return PSR-6 compliant cache. 54 | # 55 | # @see https://www.php-fig.org/psr/psr-6/ 56 | # psr6: true 57 | 58 | # @see https://github.com/matthiasmullie/scrapbook#local-buffer 59 | # localBuffer: true 60 | 61 | # @see https://github.com/matthiasmullie/scrapbook#stampede-protection 62 | # stampedeProtection: true 63 | 64 | # @see https://github.com/matthiasmullie/scrapbook#transactions 65 | # transactions: true 66 | 67 | # @see https://github.com/matthiasmullie/scrapbook#adapters 68 | # adapter: files 69 | 70 | # Common settings for database based adapters. 71 | # name: cache 72 | # host: 127.0.0.1 73 | # port: 11211 74 | # user: 75 | # password: 76 | 77 | # If adapter is files/flysystem/sqlite this path 78 | # will be used to write cache files to. 79 | # 80 | # Default: sys_get_temp_dir() 81 | # path: ../cache 82 | 83 | # If sharding is used, global cache configuration is 84 | # ignored except for those keys: localBuffer, 85 | # stampedeProtection, transactions, psr6, psr16. 86 | # 87 | # Provide those settings individually for each sharding entry. 88 | # 89 | # @see https://github.com/matthiasmullie/scrapbook#sharding 90 | # sharding: 91 | # - adapter: files 92 | # path: ../cache/1 93 | # - adapter: files 94 | # path: ../cache/2 95 | 96 | # Set environment for this configuration. 97 | env: development 98 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/intellij,composer 3 | # Edit at https://www.gitignore.io/?templates=intellij,composer 4 | 5 | ### Composer ### 6 | composer.phar 7 | /vendor/ 8 | 9 | # Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control 10 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file 11 | # composer.lock 12 | 13 | ### Intellij ### 14 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 15 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 16 | 17 | # User-specific stuff 18 | .idea/**/workspace.xml 19 | .idea/**/tasks.xml 20 | .idea/**/usage.statistics.xml 21 | .idea/**/dictionaries 22 | .idea/**/shelf 23 | 24 | # Generated files 25 | .idea/**/contentModel.xml 26 | 27 | # Sensitive or high-churn files 28 | .idea/**/dataSources/ 29 | .idea/**/dataSources.ids 30 | .idea/**/dataSources.local.xml 31 | .idea/**/sqlDataSources.xml 32 | .idea/**/dynamic.xml 33 | .idea/**/uiDesigner.xml 34 | .idea/**/dbnavigator.xml 35 | 36 | # Gradle 37 | .idea/**/gradle.xml 38 | .idea/**/libraries 39 | 40 | # Gradle and Maven with auto-import 41 | # When using Gradle or Maven with auto-import, you should exclude module files, 42 | # since they will be recreated, and may cause churn. Uncomment if using 43 | # auto-import. 44 | # .idea/modules.xml 45 | # .idea/*.iml 46 | # .idea/modules 47 | # *.iml 48 | # *.ipr 49 | 50 | # CMake 51 | cmake-build-*/ 52 | 53 | # Mongo Explorer plugin 54 | .idea/**/mongoSettings.xml 55 | 56 | # File-based project format 57 | *.iws 58 | 59 | # IntelliJ 60 | out/ 61 | 62 | # mpeltonen/sbt-idea plugin 63 | .idea_modules/ 64 | 65 | # JIRA plugin 66 | atlassian-ide-plugin.xml 67 | 68 | # Cursive Clojure plugin 69 | .idea/replstate.xml 70 | 71 | # Crashlytics plugin (for Android Studio and IntelliJ) 72 | com_crashlytics_export_strings.xml 73 | crashlytics.properties 74 | crashlytics-build.properties 75 | fabric.properties 76 | 77 | # Editor-based Rest Client 78 | .idea/httpRequests 79 | 80 | # Android studio 3.1+ serialized cache file 81 | .idea/caches/build_file_checksums.ser 82 | 83 | ### Intellij Patch ### 84 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 85 | 86 | # *.iml 87 | # modules.xml 88 | # .idea/misc.xml 89 | # *.ipr 90 | 91 | # Sonarlint plugin 92 | .idea/**/sonarlint/ 93 | 94 | # SonarQube Plugin 95 | .idea/**/sonarIssues.xml 96 | 97 | # Markdown Navigator plugin 98 | .idea/**/markdown-navigator.xml 99 | .idea/**/markdown-navigator/ 100 | 101 | # End of https://www.gitignore.io/api/intellij,composer 102 | -------------------------------------------------------------------------------- /micro/classes/ConfigurationObserver.php: -------------------------------------------------------------------------------- 1 | HtmlFormatter::class, 24 | 'html_table' => HtmlTableFormatter::class, 25 | 'json' => JsonFormatter::class, 26 | 'cmd' => CommandLineFormatter::class, 27 | 'null' => NullFormatter::class, 28 | 'ohsnap' => PrettyFormatter::class 29 | ]; 30 | 31 | /** 32 | * Currently set formatter. 33 | * 34 | * @var AbstractFormatter|null 35 | */ 36 | private $currentFormatter = null; 37 | 38 | /** 39 | * The update function that is getting called once the observer 40 | * receives an update. 41 | * 42 | * @param Observable $config 43 | */ 44 | public function update(Observable $config): void 45 | { 46 | $error = $config->get('µ.error'); 47 | $formatter = json_encode($error); 48 | 49 | // Do we have error formatting configuration and 50 | // if so, is the formatter supported? 51 | if (isset($error->formatter, $this->formatters[$error->formatter]) === false) { 52 | return; 53 | } 54 | 55 | // Given error settings do not differ from current settings… 56 | if ($formatter === $this->currentFormatter) { 57 | return; 58 | } 59 | 60 | // If micro is being run in command line interface mode, 61 | // it’s already set up for perfect formatting. 62 | // 63 | // If you really need to adjust formatters in CLI mode, do it 64 | // manually and directly on the BooBoo instance via error() calls. 65 | if (php_sapi_name() === 'cli') { 66 | return; 67 | } 68 | 69 | $this->currentFormatter = $error->formatter; 70 | 71 | // Setting up BooBoo via configuration files is currently 72 | // rather “basic”. This means you cannot set up certain 73 | // formatters for particular types of errors. If you need 74 | // advanced possibilities you should configure it customly 75 | // via error() calls. 76 | error() 77 | ->clearFormatters() 78 | ->pushFormatter( 79 | new $this->formatters[$error->formatter]($error) 80 | ); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /micro/classes/Database.php: -------------------------------------------------------------------------------- 1 | connection = DriverManager::getConnection((array) $config); 39 | 40 | $isDevMode = in_array(strtolower($env), ['prod', 'production', 'live']) === false; 41 | $proxyDir = $config->proxy->path ?? null; 42 | $cache = null; 43 | $useSimpleAnnotationReader = $config->metadata->useSimple ?? true; 44 | 45 | if (isset($config->metadata)) { 46 | $args = [ 47 | (array) ($config->metadata->path ?? null), 48 | $isDevMode, 49 | $proxyDir, 50 | $cache, 51 | $useSimpleAnnotationReader 52 | ]; 53 | 54 | switch (strtolower($config->metadata->driver ?? null)) { 55 | case 'xml': 56 | $this->config = Setup::createXMLMetadataConfiguration(...$args); 57 | break; 58 | 59 | case 'yaml': 60 | case 'yml': 61 | $this->config = Setup::createYAMLMetadataConfiguration(...$args); 62 | break; 63 | 64 | default: 65 | $this->config = Setup::createAnnotationMetadataConfiguration(...$args); 66 | } 67 | } else { 68 | $this->config = Setup::createConfiguration($isDevMode, $proxyDir); 69 | } 70 | 71 | $this->entityManager = EntityManager::create($this->connection, $this->config); 72 | 73 | // @see https://github.com/schmittjoh/serializer/issues/179 74 | AnnotationRegistry::registerLoader('class_exists'); 75 | } 76 | 77 | /** 78 | * Returns the Doctrine Connection object. 79 | * 80 | * @return Connection 81 | */ 82 | public function connection(): Connection 83 | { 84 | return $this->connection; 85 | } 86 | 87 | /** 88 | * 89 | * Returns the Doctrine EntityManager object. 90 | * 91 | * @return EntityManager 92 | */ 93 | public function entity(): EntityManager 94 | { 95 | return $this->entityManager; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /boilerplates/blank/public/index.php: -------------------------------------------------------------------------------- 1 | append(__DIR__ . '/../configs/master.yaml'); 53 | 54 | 55 | /** 56 | * Add global data/functions that should be available in all templates. 57 | */ 58 | template()->addData([ 59 | 'paths' => config()->get('µ.paths'), 60 | 'pageload' => function () use ($start) { 61 | return number_format((microtime(true) - $start) * 1000, 2) . 'ms'; 62 | } 63 | ]); 64 | 65 | 66 | /** 67 | * Register routes… 68 | */ 69 | router()->get('/', function () { 70 | echo template()->render('index'); 71 | }); 72 | 73 | 74 | /** 75 | * Dispatch the request and retrieve the response status code. 76 | */ 77 | list($statusCode) = router()->dispatch(); 78 | 79 | 80 | /** 81 | * A really basic handler function for 404 errors. Can be used anywhere 82 | * in any context. For example if a given route was matched but the 83 | * provided data was malicious. 84 | * 85 | * @param array $data Additional template data. 86 | */ 87 | function handle404(array $data = []) 88 | { 89 | http_response_code(404); 90 | 91 | echo template()->render('404', $data); 92 | } 93 | 94 | 95 | if ($statusCode === 404) { 96 | handle404(); 97 | } 98 | -------------------------------------------------------------------------------- /.idea/micro.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # [3.0.0] 2 | ###### 2019-10-12 3 | 4 | ###### Addded 5 | - `validator()` function to provide access to Symfony’s validation package ([093c3eb]) 6 | 7 | ###### Changed 8 | - **BREAKING** Replaced [Medoo] in favor of [Doctrine]’s [DBAL] and [ORM]. ([b9dc841]) 9 | - Return result of routing dispatcher even on success ([380d221]) 10 | 11 | 12 | # [2.1.1] 13 | ###### 2019-09-16 14 | 15 | ###### Fixed 16 | - Appending `json` or `php` configuration files could result in keys missing. ([#1]) 17 | 18 | 19 | # [2.1.0] 20 | ###### 2018-05-01 21 | 22 | ###### Added 23 | - `µ\VERSION` constant representing the version number of micro. 24 | - [Oh Snap!] as default error formatter for BooBoo. ([e526bf0]) 25 | 26 | ###### Changed 27 | - Throw RuntimeException if configuration file is not readable. ([b287474]) 28 | 29 | ###### Fixed 30 | - `template()` resulting in a misconfigured Plates instance. ([4998a87]) 31 | - Unnecessary processing of empty/incompatible configuration files. ([97d1d0a]) 32 | - [`./bootstrap`] input always resulting in a bail out. ([56b5315]) 33 | 34 | 35 | # [2.0.2] 36 | ###### 2018-03-17 37 | 38 | Replace [`$objectify()`] function with the one from [Jasny’s PHP functions]. 39 | 40 | 41 | # [2.0.1] 42 | ###### 2018-03-14 43 | 44 | Fix composer not requiring correct PHP version. 45 | 46 | 47 | # [2.0.0] 48 | ###### 2018-03-11 49 | 50 | ###### Added 51 | - Caching using [Scrapbook]. ⚡️ ([8b9c210]) 52 | 53 | ###### Changed 54 | - **BREAKING** Put all µ configuration under single “µ” key. ([33505bf]) 55 | 56 | 57 | # [1.0.1] 58 | ###### 2018-03-03 59 | 60 | Changing the error formatter in your configuration (e.g. `config()->set('µ.error.formatter', 'json')`), should *only* trigger an update if the formatter *is different* to the currently set one. 61 | 62 | 63 | # 1.0.0 64 | ###### 2018-02-19 65 | 66 | You gotta start somewhere, right? 🌟 67 | 68 | [3.0.0]: https://github.com/mzdr/micro/compare/2.1.1...3.0.0 69 | [2.1.1]: https://github.com/mzdr/micro/compare/2.1.0...2.1.1 70 | [2.1.0]: https://github.com/mzdr/micro/compare/2.0.2...2.1.0 71 | [2.0.2]: https://github.com/mzdr/micro/compare/2.0.1...2.0.2 72 | [2.0.1]: https://github.com/mzdr/micro/compare/2.0.0...2.0.1 73 | [2.0.0]: https://github.com/mzdr/micro/compare/1.0.1...2.0.0 74 | [1.0.1]: https://github.com/mzdr/micro/compare/1.0.0...1.0.1 75 | 76 | [Jasny’s PHP functions]: https://github.com/jasny/php-functions 77 | [Scrapbook]: https://github.com/matthiasmullie/scrapbook 78 | [Oh Snap!]: https://github.com/mzdr/oh-snap 79 | [Doctrine]: https://www.doctrine-project.org/ 80 | [DBAL]: https://www.doctrine-project.org/projects/dbal.html 81 | [ORM]: https://www.doctrine-project.org/projects/orm.html 82 | [Medoo]: https://medoo.in/ 83 | 84 | [8b9c210]: https://github.com/mzdr/micro/commit/8b9c210 85 | [33505bf]: https://github.com/mzdr/micro/commit/33505bf 86 | [56b5315]: https://github.com/mzdr/micro/commit/56b5315 87 | [b287474]: https://github.com/mzdr/micro/commit/b287474 88 | [97d1d0a]: https://github.com/mzdr/micro/commit/97d1d0a 89 | [4998a87]: https://github.com/mzdr/micro/commit/4998a87 90 | [e526bf0]: https://github.com/mzdr/micro/commit/e526bf0 91 | [380d221]: https://github.com/mzdr/micro/commit/380d221 92 | [093c3eb]: https://github.com/mzdr/micro/commit/093c3eb 93 | [b9dc841]: https://github.com/mzdr/micro/commit/b9dc841 94 | 95 | [#1]: https://github.com/mzdr/micro/issues/1 96 | 97 | 98 | [`$objectify()`]: https://github.com/mzdr/micro/blob/ac77047844a6fa306b742910e71834503710ac29/lib/config.php#L100 99 | [`./bootstrap`]: https://github.com/mzdr/micro/blob/master/bootstrap 100 | -------------------------------------------------------------------------------- /micro/functions/cache.php: -------------------------------------------------------------------------------- 1 | get('µ.cache', null); 28 | 29 | if ($config === null) { 30 | return null; 31 | } 32 | 33 | $createCache = function ($config) { 34 | switch (strtolower($config->adapter)) { 35 | case 'memcached': 36 | $client = new Memcached(); 37 | $client->addServer($config->host, $config->port); 38 | $scrapbook = new Scrapbook\Adapters\Memcached($client); 39 | 40 | break; 41 | 42 | case 'redis': 43 | $client = new Redis(); 44 | $client->connect($config->host); 45 | $scrapbook = new Scrapbook\Adapters\Redis($client); 46 | 47 | break; 48 | 49 | case 'couchbase': 50 | $cluster = new CouchbaseCluster('couchbase://' . $config->host); 51 | $bucket = $cluster->openBucket($config->name); 52 | $scrapbook = new Scrapbook\Adapters\Couchbase($bucket); 53 | 54 | break; 55 | 56 | case 'apc': 57 | case 'apcu': 58 | $scrapbook = new Scrapbook\Adapters\Apc(); 59 | 60 | break; 61 | 62 | case 'mysql': 63 | $client = new PDO( 64 | "mysql:dbname={$config->name};host={$config->host}", 65 | $config->user, 66 | $config->password 67 | ); 68 | $scrapbook = new Scrapbook\Adapters\MySQL($client); 69 | 70 | break; 71 | 72 | case 'sqlite': 73 | $client = new PDO("sqlite:{$config->path}"); 74 | $scrapbook = new Scrapbook\Adapters\SQLite($client); 75 | 76 | break; 77 | 78 | case 'postgresql': 79 | $client = new PDO("pgsql:user={$config->user} dbname={$config->name} password={$config->password}"); 80 | $scrapbook = new Scrapbook\Adapters\PostgreSQL($client); 81 | 82 | break; 83 | 84 | case 'memory': 85 | $scrapbook = new Scrapbook\Adapters\MemoryStore(); 86 | 87 | break; 88 | 89 | case 'flysystem': 90 | case 'files': 91 | $adapter = new Flysystem\Adapter\Local($config->path ?? sys_get_temp_dir()); 92 | $filesystem = new Flysystem\Filesystem($adapter); 93 | $scrapbook = new Scrapbook\Adapters\Flysystem($filesystem); 94 | 95 | break; 96 | 97 | default: 98 | throw new InvalidArgumentException("Given adapter “{$config->adapter}” is not supported."); 99 | } 100 | 101 | return $scrapbook; 102 | }; 103 | 104 | if (isset($config->sharding) === true) { 105 | if (is_iterable($config->sharding) === false && is_object($config->sharding) === false) { 106 | throw new InvalidArgumentException('Sharding parameter needs to be iterable.'); 107 | } 108 | 109 | $scrapbook = []; 110 | 111 | foreach ($config->sharding as $cacheConfig) { 112 | $scrapbook[] = $createCache($cacheConfig); 113 | } 114 | 115 | $scrapbook = new Scrapbook\Scale\Shard(...$scrapbook); 116 | } else { 117 | $scrapbook = $createCache($config); 118 | } 119 | 120 | if (empty($config->localBuffer) === false) { 121 | $scrapbook = new Scrapbook\Buffered\BufferedStore($scrapbook); 122 | } 123 | 124 | if (empty($config->stampedeProtection) === false) { 125 | $scrapbook = new Scrapbook\Scale\StampedeProtector($scrapbook); 126 | } 127 | 128 | if (empty($config->transactions) === false) { 129 | $scrapbook = new Scrapbook\Buffered\TransactionalStore($scrapbook); 130 | } 131 | 132 | if (empty($config->psr16) === false) { 133 | $cache = new Scrapbook\Psr16\SimpleCache($scrapbook); 134 | } elseif (empty($config->psr6) === false) { 135 | $cache = new Scrapbook\Psr6\Pool($scrapbook); 136 | } else { 137 | $cache = $scrapbook; 138 | } 139 | 140 | return $cache; 141 | } 142 | -------------------------------------------------------------------------------- /micro/classes/Configuration.php: -------------------------------------------------------------------------------- 1 | 'parseIni', 21 | 'json' => 'parseJson', 22 | 'php' => 'parsePhp', 23 | 'yaml' => 'parseYaml' 24 | ]; 25 | 26 | /** 27 | * Parses an INI file and returns the content of it. 28 | * 29 | * @param string $filename Path to INI file. 30 | * @return array|bool 31 | */ 32 | protected function parseIni($filename) 33 | { 34 | return parse_ini_file($filename, true); 35 | } 36 | 37 | /** 38 | * Parses a JSON file and returns the content of it. 39 | * 40 | * @param string $filename Path to JSON file. 41 | * @return mixed 42 | */ 43 | protected function parseJson($filename) 44 | { 45 | return json_decode(file_get_contents($filename), true); 46 | } 47 | 48 | /** 49 | * Parses a PHP file and returns the content of it. 50 | * 51 | * @param string $filename Path to PHP file. 52 | * @return mixed 53 | */ 54 | protected function parsePhp($filename) 55 | { 56 | return Jasny\arrayify(require $filename); 57 | } 58 | 59 | /** 60 | * Parses a YAML file and returns the content of it. 61 | * 62 | * @param string $filename Path to YAML file. 63 | * @return mixed 64 | */ 65 | protected function parseYaml($filename) 66 | { 67 | return Yaml::parseFile($filename, Yaml::PARSE_CONSTANT); 68 | } 69 | 70 | /** 71 | * Appends a single configuration file or all files 72 | * from a given directory into the current configuration. 73 | * 74 | * @param string|SplFileInfo $path Path of configuration file or directory. 75 | * @param string $preferredExtension Preferred files to use when scanning directory. Defaults to `php`. 76 | * @return Configuration 77 | */ 78 | public function append($path, string $preferredExtension = 'php'): Configuration 79 | { 80 | $resource = $path instanceof SplFileInfo ? $path : new SplFileInfo($path); 81 | $extension = $resource->getExtension(); 82 | 83 | // If configuration file/resource is not readable, 84 | // stop right here and let the user know. 85 | if ($resource->isReadable() === false) { 86 | throw new RuntimeException("Unable to read “{$resource->getPathname()}”."); 87 | } 88 | 89 | // Resource is a file, try to parse it. 90 | if ($resource->isFile() && isset($this->parsers[$extension])) { 91 | $parser = $this->parsers[$extension]; 92 | $append = new static; 93 | $raw = call_user_func([$this, $parser], $resource->getPathname()); 94 | 95 | // Configuration file did not provide any meaningful data… 96 | if (is_object($raw) === false && is_array($raw) === false) { 97 | return $this; 98 | } 99 | 100 | foreach ($raw as $key => $value) { 101 | $append->set($key, $value); 102 | } 103 | 104 | $append = $append->all(); 105 | $this->original = array_merge($this->original, $append); 106 | $this->items = array_merge($this->items, $append); 107 | 108 | $this->notify(); 109 | 110 | return $this; 111 | } 112 | 113 | // Resource is a directory, so try to find any possible configuration file 114 | // using the set preferred extension. 115 | if ($resource->isDir()) { 116 | $directory = new DirectoryIterator(realpath($path)); 117 | 118 | foreach ($directory as $file) { 119 | if ($file->isFile() && $file->getExtension() === $preferredExtension) { 120 | $this->append($file); 121 | } 122 | } 123 | } 124 | 125 | return $this; 126 | } 127 | 128 | /** 129 | * Get a configuration item. 130 | * 131 | * @param string $key Key to look for. 132 | * @param mixed $default Default data to return if key wasn’t found. 133 | * @param bool $noCast Do not cast arrays to objects. Default: false 134 | * @return mixed 135 | */ 136 | public function get($key, $default = null, $noCast = false) 137 | { 138 | $result = parent::get($key, $default); 139 | 140 | if ($noCast === true) { 141 | return $result; 142 | } 143 | 144 | return Jasny\objectify($result); 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | micro 4 |

5 |

6 |

A tiny multi-tool for your next big PHP adventure.1


7 | 8 | ## Features 9 | 10 | - Easily manage your application’s **configuration** with [Gestalt]. 11 | 12 | > Supports PHP, YAML, INI and JSON files out of the box. 13 | 14 | - Handle **databases** with [Doctrine]’s [DBAL] and optionally use their [ORM]. 15 | 16 | > The Doctrine database abstraction & access layer (DBAL) offers a lightweight and thin runtime layer around a PDO-like API and a lot of additional, horizontal features like database schema introspection and manipulation through an OO API. 17 | 18 | - Have **error handling and formatting** to your preference with [BooBoo]. 19 | 20 | > BooBoo is an error handler for PHP that allows for the execution of handlers and formatters for viewing and managing errors in development and production. It won’t end up in your stack trace, is built for logging, designed for extension and handles errors non-blocking by default. 21 | 22 | - Set up lightning fast **routing** with [FastRoute]. 23 | 24 | > A fast regular expression based request router for PHP. See this [article](http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html) for more details. 25 | 26 | - Use _native_ PHP **templates** with [Plates]. 27 | 28 | > Plates is designed for developers who prefer to use native PHP templates over compiled template languages, such as Twig or Blade. It supports layouts, inheritance, namespaces, data sharing and comes with built-in escaping helpers. 29 | 30 | - ⚡️ Speed up your (dynamic) web applications by **caching** with [Scrapbook]. 31 | 32 | > PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top. 33 | 34 |
35 | 36 | ## Requirements 37 | 38 | [PHP] 7.1.3+ and preferably [URL Rewriting] enabled. 39 | 40 |
41 | 42 | ## Installation 43 | 44 | It is recommended that you install this framework using [Composer]. 45 | 46 | ```bash 47 | composer require mzdr/micro 48 | ``` 49 | 50 |
51 | 52 | ## Usage 53 | 54 | **micro** is basically just a bunch of _wrapper functions_ located under a _single_ namespace called `µ`. Every file you see in [`./micro/functions`] is also available as a function with the same name. 55 | 56 | Let me talk in code to you… 😎 57 | 58 | ```php 59 | get('my.stored.variable'); 67 | 68 | 69 | // Need to register routes with the 70 | // FastRoute (@nikic/FastRoute) instance? 71 | µ\router()->get('/home', function () { 72 | 73 | // 🌈 Use your imagination… 74 | 75 | // How about we use the Plates 76 | // (@thephpleague/plates) template engine? 🤩 77 | echo µ\template()->render('home'); 78 | }); 79 | 80 | 81 | // Tired of typing µ? 😫 Join the club! 82 | namespace µ { 83 | router()->get('/', function () { 84 | $key = 'my-heavy-op'; 85 | $ttl = 300; 86 | $value = "cached for $ttl seconds."; 87 | 88 | if (cache()->has($key) === false) { 89 | sleep(2); // So so heavy… 90 | 91 | cache()->set($key, $value, $ttl); 92 | 93 | return $value; 94 | } 95 | 96 | return cache()->get($key); 97 | }); 98 | } 99 | 100 | // Out there in strange places? 👽 Import it! 101 | namespace alien { 102 | use function µ\config; 103 | 104 | $done = config()->get('get.it.done'); 105 | } 106 | ``` 107 | 108 |
109 | 110 | Just follow the official documentation of each library listed below or jump into the [`./micro/functions`] folder to get a look under the hood. 111 | 112 | | Function | Documentation | 113 | | ------------------ | ---------------------------------------- | 114 | | `µ\config()` | https://github.com/samrap/gestalt-docs | 115 | | `µ\database()` | https://www.doctrine-project.org/ | 116 | | `µ\error()` | http://booboo.thephpleague.com/ | 117 | | `µ\router()` | https://github.com/nikic/FastRoute | 118 | | `µ\template()` | http://platesphp.com/ | 119 | | `µ\cache()` | https://www.scrapbook.cash/ | 120 | 121 |
122 | 123 | ## Bootstrapping 124 | 125 | You’re in a hurry? Bootstrap a [blank], ready-to-view **µ** project! 126 | 127 | 1. Make new project directory and jump into it. 128 | 129 | ```bash 130 | mkdir fancy-project && cd $_ 131 | ``` 132 | 133 | 2. Install **µ**. 134 | 135 | ```bash 136 | composer require mzdr/micro 137 | ``` 138 | 139 | 3. Boostrap it. 140 | 141 | ```bash 142 | ./vendor/mzdr/micro/bootstrap 143 | ``` 144 | 145 | 4. **That’s it!** Now how do you check out your project? 146 | 147 | - Create a virtual host and point the document root to the `public` folder, _**or…**_ 148 | 149 | - Fire up [PHP’s built-in web server], _**or**…_ 150 | (Doesn’t support .htaccess, you have to [include assets](https://github.com/mzdr/micro/blob/master/boilerplates/blank/views/_layouts/default.php#L8) _without_ $this->asset(…) cache busting) 151 | 152 | - Just browse to the `public` folder via your local webserver. 153 | (You probably need to adjust `µ.paths.public` in your `configs/master.yaml`) 154 | 155 | 156 |
157 | 158 | ## License 159 | 160 | This project is licensed under [MIT license]. 161 | 162 |
163 |
164 |
165 | 166 | 167 | 1 It may be tiny and powerful, but it’s not the right tool for every job.
168 |
169 | 170 | [Gestalt]: https://github.com/samrap/gestalt 171 | [Doctrine]: https://www.doctrine-project.org/ 172 | [DBAL]: https://www.doctrine-project.org/projects/dbal.html 173 | [ORM]: https://www.doctrine-project.org/projects/orm.html 174 | [BooBoo]: https://github.com/thephpleague/booboo 175 | [FastRoute]: https://github.com/nikic/FastRoute 176 | [Plates]: https://github.com/thephpleague/plates 177 | [Scrapbook]: https://github.com/matthiasmullie/scrapbook#keyvaluestore 178 | [PHP]: http://php.net 179 | [PHP’s built-in web server]: https://secure.php.net/manual/en/features.commandline.webserver.php 180 | [Composer]: https://getcomposer.org/doc/00-intro.md 181 | [URL Rewriting]: https://github.com/mzdr/micro/wiki/URL-Rewriting 182 | [MIT license]: ./LICENSE 183 | [`./micro/functions`]: ./micro/functions 184 | [blank]: ./boilerplates/blank 185 | -------------------------------------------------------------------------------- /boilerplates/blank/public/.htaccess: -------------------------------------------------------------------------------- 1 | # @see https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess 2 | 3 | # ---------------------------------------------------------------------- 4 | # | Media types | 5 | # ---------------------------------------------------------------------- 6 | 7 | # Serve resources with the proper media types (f.k.a. MIME types). 8 | # 9 | # https://www.iana.org/assignments/media-types/media-types.xhtml 10 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype 11 | 12 | 13 | 14 | # Data interchange 15 | 16 | AddType application/atom+xml atom 17 | AddType application/json json map topojson 18 | AddType application/ld+json jsonld 19 | AddType application/rss+xml rss 20 | AddType application/vnd.geo+json geojson 21 | AddType application/xml rdf xml 22 | 23 | 24 | # JavaScript 25 | 26 | # Servers should use text/javascript for JavaScript resources. 27 | # https://html.spec.whatwg.org/multipage/scripting.html#scriptingLanguages 28 | 29 | AddType text/javascript js mjs 30 | 31 | 32 | # Manifest files 33 | 34 | AddType application/manifest+json webmanifest 35 | AddType application/x-web-app-manifest+json webapp 36 | AddType text/cache-manifest appcache 37 | 38 | 39 | # Media files 40 | 41 | AddType audio/mp4 f4a f4b m4a 42 | AddType audio/ogg oga ogg opus 43 | AddType image/bmp bmp 44 | AddType image/svg+xml svg svgz 45 | AddType image/webp webp 46 | AddType video/mp4 f4v f4p m4v mp4 47 | AddType video/ogg ogv 48 | AddType video/webm webm 49 | AddType video/x-flv flv 50 | 51 | # Serving `.ico` image files with a different media type 52 | # prevents Internet Explorer from displaying them as images: 53 | # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee 54 | 55 | AddType image/x-icon cur ico 56 | 57 | 58 | # Web fonts 59 | 60 | AddType font/woff woff 61 | AddType font/woff2 woff2 62 | AddType application/vnd.ms-fontobject eot 63 | AddType font/ttf ttf 64 | AddType font/collection ttc 65 | AddType font/otf otf 66 | 67 | 68 | # Other 69 | 70 | AddType application/octet-stream safariextz 71 | AddType application/x-bb-appworld bbaw 72 | AddType application/x-chrome-extension crx 73 | AddType application/x-opera-extension oex 74 | AddType application/x-xpinstall xpi 75 | AddType text/calendar ics 76 | AddType text/markdown markdown md 77 | AddType text/vcard vcard vcf 78 | AddType text/vnd.rim.location.xloc xloc 79 | AddType text/vtt vtt 80 | AddType text/x-component htc 81 | 82 | 83 | 84 | 85 | # ---------------------------------------------------------------------- 86 | # | Character encodings | 87 | # ---------------------------------------------------------------------- 88 | 89 | # Serve all resources labeled as `text/html` or `text/plain` 90 | # with the media type `charset` parameter set to `UTF-8`. 91 | # 92 | # https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset 93 | 94 | AddDefaultCharset utf-8 95 | 96 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 97 | 98 | # Serve the following file types with the media type `charset` 99 | # parameter set to `UTF-8`. 100 | # 101 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset 102 | 103 | 104 | AddCharset utf-8 .atom \ 105 | .bbaw \ 106 | .css \ 107 | .geojson \ 108 | .ics \ 109 | .js \ 110 | .json \ 111 | .jsonld \ 112 | .manifest \ 113 | .markdown \ 114 | .md \ 115 | .mjs \ 116 | .rdf \ 117 | .rss \ 118 | .topojson \ 119 | .vtt \ 120 | .webapp \ 121 | .webmanifest \ 122 | .xloc \ 123 | .xml 124 | 125 | 126 | 127 | # ---------------------------------------------------------------------- 128 | # | Compression | 129 | # ---------------------------------------------------------------------- 130 | 131 | 132 | 133 | # Force compression for mangled `Accept-Encoding` request headers 134 | # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html 135 | 136 | 137 | 138 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding 139 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding 140 | 141 | 142 | 143 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 144 | 145 | # Compress all output labeled with one of the following media types. 146 | # 147 | # (!) For Apache versions below version 2.3.7 you don't need to 148 | # enable `mod_filter` and can remove the `` 149 | # and `` lines as `AddOutputFilterByType` is still in 150 | # the core directives. 151 | # 152 | # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype 153 | 154 | 155 | AddOutputFilterByType DEFLATE "application/atom+xml" \ 156 | "application/javascript" \ 157 | "application/json" \ 158 | "application/ld+json" \ 159 | "application/manifest+json" \ 160 | "application/rdf+xml" \ 161 | "application/rss+xml" \ 162 | "application/schema+json" \ 163 | "application/vnd.geo+json" \ 164 | "application/vnd.ms-fontobject" \ 165 | "application/x-font-ttf" \ 166 | "application/x-javascript" \ 167 | "application/x-web-app-manifest+json" \ 168 | "application/xhtml+xml" \ 169 | "application/xml" \ 170 | "font/collection" \ 171 | "font/eot" \ 172 | "font/opentype" \ 173 | "font/otf" \ 174 | "font/ttf" \ 175 | "image/bmp" \ 176 | "image/svg+xml" \ 177 | "image/vnd.microsoft.icon" \ 178 | "image/x-icon" \ 179 | "text/cache-manifest" \ 180 | "text/calendar" \ 181 | "text/css" \ 182 | "text/html" \ 183 | "text/javascript" \ 184 | "text/plain" \ 185 | "text/markdown" \ 186 | "text/vcard" \ 187 | "text/vnd.rim.location.xloc" \ 188 | "text/vtt" \ 189 | "text/x-component" \ 190 | "text/x-cross-domain-policy" \ 191 | "text/xml" 192 | 193 | 194 | 195 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 196 | 197 | # Map the following filename extensions to the specified 198 | # encoding type in order to make Apache serve the file types 199 | # with the appropriate `Content-Encoding` response header 200 | # (do note that this will NOT make Apache compress them!). 201 | # 202 | # If these files types would be served without an appropriate 203 | # `Content-Enable` response header, client applications (e.g.: 204 | # browsers) wouldn't know that they first need to uncompress 205 | # the response, and thus, wouldn't be able to understand the 206 | # content. 207 | # 208 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding 209 | 210 | 211 | AddEncoding gzip svgz 212 | 213 | 214 | 215 | 216 | 217 | # ---------------------------------------------------------------------- 218 | # | Rewrite engine | 219 | # ---------------------------------------------------------------------- 220 | 221 | # (1) Turn on the rewrite engine (this is necessary in order for 222 | # the `RewriteRule` directives to work). 223 | # 224 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine 225 | # 226 | # (2) Enable the `FollowSymLinks` option if it isn't already. 227 | # 228 | # https://httpd.apache.org/docs/current/mod/core.html#options 229 | # 230 | # (3) If your web host doesn't allow the `FollowSymlinks` option, 231 | # you need to comment it out or remove it, and then uncomment 232 | # the `Options +SymLinksIfOwnerMatch` line (4), but be aware 233 | # of the performance impact. 234 | # 235 | # https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks 236 | # 237 | # (4) Some cloud hosting services will require you set `RewriteBase`. 238 | # 239 | # https://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site 240 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase 241 | # 242 | # (5) Depending on how your server is set up, you may also need to 243 | # use the `RewriteOptions` directive to enable some options for 244 | # the rewrite engine. 245 | # 246 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions 247 | # 248 | # (6) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the 249 | # appropriate schema automatically (http or https). 250 | 251 | 252 | 253 | # (1) 254 | RewriteEngine On 255 | 256 | # (2) 257 | Options +FollowSymlinks 258 | 259 | # (3) 260 | # Options +SymLinksIfOwnerMatch 261 | 262 | # (4) 263 | # RewriteBase / 264 | 265 | # (5) 266 | # RewriteOptions 267 | 268 | # (6) 269 | RewriteCond %{HTTPS} =on 270 | RewriteRule ^ - [env=proto:https] 271 | RewriteCond %{HTTPS} !=on 272 | RewriteRule ^ - [env=proto:http] 273 | 274 | # ---------------------------------------------------------------------- 275 | # | Forcing `https://` | 276 | # ---------------------------------------------------------------------- 277 | 278 | # Redirect from the `http://` to the `https://` version of the URL. 279 | # https://wiki.apache.org/httpd/RewriteHTTPToHTTPS 280 | 281 | # RewriteCond %{HTTPS} !=on 282 | # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 283 | 284 | # ---------------------------------------------------------------------- 285 | # | Filename-based cache busting | 286 | # ---------------------------------------------------------------------- 287 | 288 | # If you're not using a build process to manage your filename version 289 | # revving, you might want to consider enabling the following directives 290 | # to route all requests such as `/style.12345.css` to `/style.css`. 291 | # 292 | # To understand why this is important and even a better solution than 293 | # using something like `*.css?v231`, please see: 294 | # http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ 295 | 296 | RewriteCond %{REQUEST_FILENAME} !-f 297 | RewriteRule ^(.+)\.(\w+)\.(bmp|css|cur|gif|ico|jpe?g|m?js|png|svgz?|webp|webmanifest)$ $1.$3 [L] 298 | 299 | 300 | # ---------------------------------------------------------------------- 301 | # | Enforce a trailing slash for all URLs | 302 | # ---------------------------------------------------------------------- 303 | 304 | # Recommended to avoid duplicate content. Make sure to be consistent 305 | # and use it in your internal links in order to avoid unnecessary redirects. 306 | # 307 | # https://webmasters.googleblog.com/2010/04/to-slash-or-not-to-slash.html 308 | 309 | # Adjust the second condition if you want to exclude requests for 310 | # specific file type extensions. 311 | 312 | RewriteCond %{REQUEST_FILENAME} !-f 313 | RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif|svg|png|bmp|ico|css|js)$ 314 | 315 | RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301] 316 | 317 | 318 | # ---------------------------------------------------------------------- 319 | # | Redirect everything that doesn’t exist to the index.php | 320 | # ---------------------------------------------------------------------- 321 | 322 | RewriteCond %{REQUEST_FILENAME} !-f 323 | RewriteCond %{REQUEST_FILENAME} !-d 324 | 325 | RewriteRule ^(.*)$ index.php [QSA,L] 326 | 327 | 328 | 329 | # ---------------------------------------------------------------------- 330 | # | Server-side technology information | 331 | # ---------------------------------------------------------------------- 332 | 333 | # Remove the `X-Powered-By` response header that: 334 | # 335 | # * is set by some frameworks and server-side languages 336 | # (e.g.: ASP.NET, PHP), and its value contains information 337 | # about them (e.g.: their name, version number) 338 | # 339 | # * doesn't provide any value to users, contributes to header 340 | # bloat, and in some cases, the information it provides can 341 | # expose vulnerabilities 342 | # 343 | # (!) If you can, you should disable the `X-Powered-By` header from the 344 | # language / framework level (e.g.: for PHP, you can do that by setting 345 | # `expose_php = off` in `php.ini`) 346 | # 347 | # https://php.net/manual/en/ini.core.php#ini.expose-php 348 | 349 | 350 | Header unset X-Powered-By 351 | 352 | 353 | 354 | # ---------------------------------------------------------------------- 355 | # | Server software information | 356 | # ---------------------------------------------------------------------- 357 | 358 | # Prevent Apache from adding a trailing footer line containing 359 | # information about the server to the server-generated documents 360 | # (e.g.: error messages, directory listings, etc.) 361 | # 362 | # https://httpd.apache.org/docs/current/mod/core.html#serversignature 363 | 364 | ServerSignature Off 365 | -------------------------------------------------------------------------------- /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": "a34cac2009d88d3a07485939207ece8c", 8 | "packages": [ 9 | { 10 | "name": "doctrine/cache", 11 | "version": "2.2.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/cache.git", 15 | "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", 20 | "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "~7.1 || ^8.0" 25 | }, 26 | "conflict": { 27 | "doctrine/common": ">2.2,<2.4" 28 | }, 29 | "require-dev": { 30 | "cache/integration-tests": "dev-master", 31 | "doctrine/coding-standard": "^9", 32 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 33 | "psr/cache": "^1.0 || ^2.0 || ^3.0", 34 | "symfony/cache": "^4.4 || ^5.4 || ^6", 35 | "symfony/var-exporter": "^4.4 || ^5.4 || ^6" 36 | }, 37 | "type": "library", 38 | "autoload": { 39 | "psr-4": { 40 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Guilherme Blanco", 50 | "email": "guilhermeblanco@gmail.com" 51 | }, 52 | { 53 | "name": "Roman Borschel", 54 | "email": "roman@code-factory.org" 55 | }, 56 | { 57 | "name": "Benjamin Eberlei", 58 | "email": "kontakt@beberlei.de" 59 | }, 60 | { 61 | "name": "Jonathan Wage", 62 | "email": "jonwage@gmail.com" 63 | }, 64 | { 65 | "name": "Johannes Schmitt", 66 | "email": "schmittjoh@gmail.com" 67 | } 68 | ], 69 | "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", 70 | "homepage": "https://www.doctrine-project.org/projects/cache.html", 71 | "keywords": [ 72 | "abstraction", 73 | "apcu", 74 | "cache", 75 | "caching", 76 | "couchdb", 77 | "memcached", 78 | "php", 79 | "redis", 80 | "xcache" 81 | ], 82 | "support": { 83 | "issues": "https://github.com/doctrine/cache/issues", 84 | "source": "https://github.com/doctrine/cache/tree/2.2.0" 85 | }, 86 | "funding": [ 87 | { 88 | "url": "https://www.doctrine-project.org/sponsorship.html", 89 | "type": "custom" 90 | }, 91 | { 92 | "url": "https://www.patreon.com/phpdoctrine", 93 | "type": "patreon" 94 | }, 95 | { 96 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", 97 | "type": "tidelift" 98 | } 99 | ], 100 | "time": "2022-05-20T20:07:39+00:00" 101 | }, 102 | { 103 | "name": "doctrine/collections", 104 | "version": "2.1.2", 105 | "source": { 106 | "type": "git", 107 | "url": "https://github.com/doctrine/collections.git", 108 | "reference": "db8cda536a034337f7dd63febecc713d4957f9ee" 109 | }, 110 | "dist": { 111 | "type": "zip", 112 | "url": "https://api.github.com/repos/doctrine/collections/zipball/db8cda536a034337f7dd63febecc713d4957f9ee", 113 | "reference": "db8cda536a034337f7dd63febecc713d4957f9ee", 114 | "shasum": "" 115 | }, 116 | "require": { 117 | "doctrine/deprecations": "^1", 118 | "php": "^8.1" 119 | }, 120 | "require-dev": { 121 | "doctrine/coding-standard": "^10.0", 122 | "ext-json": "*", 123 | "phpstan/phpstan": "^1.8", 124 | "phpstan/phpstan-phpunit": "^1.0", 125 | "phpunit/phpunit": "^9.5", 126 | "vimeo/psalm": "^4.22" 127 | }, 128 | "type": "library", 129 | "autoload": { 130 | "psr-4": { 131 | "Doctrine\\Common\\Collections\\": "src" 132 | } 133 | }, 134 | "notification-url": "https://packagist.org/downloads/", 135 | "license": [ 136 | "MIT" 137 | ], 138 | "authors": [ 139 | { 140 | "name": "Guilherme Blanco", 141 | "email": "guilhermeblanco@gmail.com" 142 | }, 143 | { 144 | "name": "Roman Borschel", 145 | "email": "roman@code-factory.org" 146 | }, 147 | { 148 | "name": "Benjamin Eberlei", 149 | "email": "kontakt@beberlei.de" 150 | }, 151 | { 152 | "name": "Jonathan Wage", 153 | "email": "jonwage@gmail.com" 154 | }, 155 | { 156 | "name": "Johannes Schmitt", 157 | "email": "schmittjoh@gmail.com" 158 | } 159 | ], 160 | "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", 161 | "homepage": "https://www.doctrine-project.org/projects/collections.html", 162 | "keywords": [ 163 | "array", 164 | "collections", 165 | "iterators", 166 | "php" 167 | ], 168 | "support": { 169 | "issues": "https://github.com/doctrine/collections/issues", 170 | "source": "https://github.com/doctrine/collections/tree/2.1.2" 171 | }, 172 | "funding": [ 173 | { 174 | "url": "https://www.doctrine-project.org/sponsorship.html", 175 | "type": "custom" 176 | }, 177 | { 178 | "url": "https://www.patreon.com/phpdoctrine", 179 | "type": "patreon" 180 | }, 181 | { 182 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", 183 | "type": "tidelift" 184 | } 185 | ], 186 | "time": "2022-12-27T23:41:38+00:00" 187 | }, 188 | { 189 | "name": "doctrine/common", 190 | "version": "3.4.3", 191 | "source": { 192 | "type": "git", 193 | "url": "https://github.com/doctrine/common.git", 194 | "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" 195 | }, 196 | "dist": { 197 | "type": "zip", 198 | "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", 199 | "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", 200 | "shasum": "" 201 | }, 202 | "require": { 203 | "doctrine/persistence": "^2.0 || ^3.0", 204 | "php": "^7.1 || ^8.0" 205 | }, 206 | "require-dev": { 207 | "doctrine/coding-standard": "^9.0 || ^10.0", 208 | "doctrine/collections": "^1", 209 | "phpstan/phpstan": "^1.4.1", 210 | "phpstan/phpstan-phpunit": "^1", 211 | "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", 212 | "squizlabs/php_codesniffer": "^3.0", 213 | "symfony/phpunit-bridge": "^6.1", 214 | "vimeo/psalm": "^4.4" 215 | }, 216 | "type": "library", 217 | "autoload": { 218 | "psr-4": { 219 | "Doctrine\\Common\\": "src" 220 | } 221 | }, 222 | "notification-url": "https://packagist.org/downloads/", 223 | "license": [ 224 | "MIT" 225 | ], 226 | "authors": [ 227 | { 228 | "name": "Guilherme Blanco", 229 | "email": "guilhermeblanco@gmail.com" 230 | }, 231 | { 232 | "name": "Roman Borschel", 233 | "email": "roman@code-factory.org" 234 | }, 235 | { 236 | "name": "Benjamin Eberlei", 237 | "email": "kontakt@beberlei.de" 238 | }, 239 | { 240 | "name": "Jonathan Wage", 241 | "email": "jonwage@gmail.com" 242 | }, 243 | { 244 | "name": "Johannes Schmitt", 245 | "email": "schmittjoh@gmail.com" 246 | }, 247 | { 248 | "name": "Marco Pivetta", 249 | "email": "ocramius@gmail.com" 250 | } 251 | ], 252 | "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", 253 | "homepage": "https://www.doctrine-project.org/projects/common.html", 254 | "keywords": [ 255 | "common", 256 | "doctrine", 257 | "php" 258 | ], 259 | "support": { 260 | "issues": "https://github.com/doctrine/common/issues", 261 | "source": "https://github.com/doctrine/common/tree/3.4.3" 262 | }, 263 | "funding": [ 264 | { 265 | "url": "https://www.doctrine-project.org/sponsorship.html", 266 | "type": "custom" 267 | }, 268 | { 269 | "url": "https://www.patreon.com/phpdoctrine", 270 | "type": "patreon" 271 | }, 272 | { 273 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", 274 | "type": "tidelift" 275 | } 276 | ], 277 | "time": "2022-10-09T11:47:59+00:00" 278 | }, 279 | { 280 | "name": "doctrine/dbal", 281 | "version": "2.13.9", 282 | "source": { 283 | "type": "git", 284 | "url": "https://github.com/doctrine/dbal.git", 285 | "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" 286 | }, 287 | "dist": { 288 | "type": "zip", 289 | "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", 290 | "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", 291 | "shasum": "" 292 | }, 293 | "require": { 294 | "doctrine/cache": "^1.0|^2.0", 295 | "doctrine/deprecations": "^0.5.3|^1", 296 | "doctrine/event-manager": "^1.0", 297 | "ext-pdo": "*", 298 | "php": "^7.1 || ^8" 299 | }, 300 | "require-dev": { 301 | "doctrine/coding-standard": "9.0.0", 302 | "jetbrains/phpstorm-stubs": "2021.1", 303 | "phpstan/phpstan": "1.4.6", 304 | "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", 305 | "psalm/plugin-phpunit": "0.16.1", 306 | "squizlabs/php_codesniffer": "3.6.2", 307 | "symfony/cache": "^4.4", 308 | "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", 309 | "vimeo/psalm": "4.22.0" 310 | }, 311 | "suggest": { 312 | "symfony/console": "For helpful console commands such as SQL execution and import of files." 313 | }, 314 | "bin": [ 315 | "bin/doctrine-dbal" 316 | ], 317 | "type": "library", 318 | "autoload": { 319 | "psr-4": { 320 | "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" 321 | } 322 | }, 323 | "notification-url": "https://packagist.org/downloads/", 324 | "license": [ 325 | "MIT" 326 | ], 327 | "authors": [ 328 | { 329 | "name": "Guilherme Blanco", 330 | "email": "guilhermeblanco@gmail.com" 331 | }, 332 | { 333 | "name": "Roman Borschel", 334 | "email": "roman@code-factory.org" 335 | }, 336 | { 337 | "name": "Benjamin Eberlei", 338 | "email": "kontakt@beberlei.de" 339 | }, 340 | { 341 | "name": "Jonathan Wage", 342 | "email": "jonwage@gmail.com" 343 | } 344 | ], 345 | "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", 346 | "homepage": "https://www.doctrine-project.org/projects/dbal.html", 347 | "keywords": [ 348 | "abstraction", 349 | "database", 350 | "db2", 351 | "dbal", 352 | "mariadb", 353 | "mssql", 354 | "mysql", 355 | "oci8", 356 | "oracle", 357 | "pdo", 358 | "pgsql", 359 | "postgresql", 360 | "queryobject", 361 | "sasql", 362 | "sql", 363 | "sqlanywhere", 364 | "sqlite", 365 | "sqlserver", 366 | "sqlsrv" 367 | ], 368 | "support": { 369 | "issues": "https://github.com/doctrine/dbal/issues", 370 | "source": "https://github.com/doctrine/dbal/tree/2.13.9" 371 | }, 372 | "funding": [ 373 | { 374 | "url": "https://www.doctrine-project.org/sponsorship.html", 375 | "type": "custom" 376 | }, 377 | { 378 | "url": "https://www.patreon.com/phpdoctrine", 379 | "type": "patreon" 380 | }, 381 | { 382 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", 383 | "type": "tidelift" 384 | } 385 | ], 386 | "time": "2022-05-02T20:28:55+00:00" 387 | }, 388 | { 389 | "name": "doctrine/deprecations", 390 | "version": "v1.0.0", 391 | "source": { 392 | "type": "git", 393 | "url": "https://github.com/doctrine/deprecations.git", 394 | "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" 395 | }, 396 | "dist": { 397 | "type": "zip", 398 | "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", 399 | "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", 400 | "shasum": "" 401 | }, 402 | "require": { 403 | "php": "^7.1|^8.0" 404 | }, 405 | "require-dev": { 406 | "doctrine/coding-standard": "^9", 407 | "phpunit/phpunit": "^7.5|^8.5|^9.5", 408 | "psr/log": "^1|^2|^3" 409 | }, 410 | "suggest": { 411 | "psr/log": "Allows logging deprecations via PSR-3 logger implementation" 412 | }, 413 | "type": "library", 414 | "autoload": { 415 | "psr-4": { 416 | "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" 417 | } 418 | }, 419 | "notification-url": "https://packagist.org/downloads/", 420 | "license": [ 421 | "MIT" 422 | ], 423 | "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", 424 | "homepage": "https://www.doctrine-project.org/", 425 | "support": { 426 | "issues": "https://github.com/doctrine/deprecations/issues", 427 | "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" 428 | }, 429 | "time": "2022-05-02T15:47:09+00:00" 430 | }, 431 | { 432 | "name": "doctrine/event-manager", 433 | "version": "1.2.0", 434 | "source": { 435 | "type": "git", 436 | "url": "https://github.com/doctrine/event-manager.git", 437 | "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" 438 | }, 439 | "dist": { 440 | "type": "zip", 441 | "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", 442 | "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", 443 | "shasum": "" 444 | }, 445 | "require": { 446 | "doctrine/deprecations": "^0.5.3 || ^1", 447 | "php": "^7.1 || ^8.0" 448 | }, 449 | "conflict": { 450 | "doctrine/common": "<2.9" 451 | }, 452 | "require-dev": { 453 | "doctrine/coding-standard": "^9 || ^10", 454 | "phpstan/phpstan": "~1.4.10 || ^1.8.8", 455 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 456 | "vimeo/psalm": "^4.24" 457 | }, 458 | "type": "library", 459 | "autoload": { 460 | "psr-4": { 461 | "Doctrine\\Common\\": "src" 462 | } 463 | }, 464 | "notification-url": "https://packagist.org/downloads/", 465 | "license": [ 466 | "MIT" 467 | ], 468 | "authors": [ 469 | { 470 | "name": "Guilherme Blanco", 471 | "email": "guilhermeblanco@gmail.com" 472 | }, 473 | { 474 | "name": "Roman Borschel", 475 | "email": "roman@code-factory.org" 476 | }, 477 | { 478 | "name": "Benjamin Eberlei", 479 | "email": "kontakt@beberlei.de" 480 | }, 481 | { 482 | "name": "Jonathan Wage", 483 | "email": "jonwage@gmail.com" 484 | }, 485 | { 486 | "name": "Johannes Schmitt", 487 | "email": "schmittjoh@gmail.com" 488 | }, 489 | { 490 | "name": "Marco Pivetta", 491 | "email": "ocramius@gmail.com" 492 | } 493 | ], 494 | "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", 495 | "homepage": "https://www.doctrine-project.org/projects/event-manager.html", 496 | "keywords": [ 497 | "event", 498 | "event dispatcher", 499 | "event manager", 500 | "event system", 501 | "events" 502 | ], 503 | "support": { 504 | "issues": "https://github.com/doctrine/event-manager/issues", 505 | "source": "https://github.com/doctrine/event-manager/tree/1.2.0" 506 | }, 507 | "funding": [ 508 | { 509 | "url": "https://www.doctrine-project.org/sponsorship.html", 510 | "type": "custom" 511 | }, 512 | { 513 | "url": "https://www.patreon.com/phpdoctrine", 514 | "type": "patreon" 515 | }, 516 | { 517 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", 518 | "type": "tidelift" 519 | } 520 | ], 521 | "time": "2022-10-12T20:51:15+00:00" 522 | }, 523 | { 524 | "name": "doctrine/inflector", 525 | "version": "2.0.6", 526 | "source": { 527 | "type": "git", 528 | "url": "https://github.com/doctrine/inflector.git", 529 | "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" 530 | }, 531 | "dist": { 532 | "type": "zip", 533 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", 534 | "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", 535 | "shasum": "" 536 | }, 537 | "require": { 538 | "php": "^7.2 || ^8.0" 539 | }, 540 | "require-dev": { 541 | "doctrine/coding-standard": "^10", 542 | "phpstan/phpstan": "^1.8", 543 | "phpstan/phpstan-phpunit": "^1.1", 544 | "phpstan/phpstan-strict-rules": "^1.3", 545 | "phpunit/phpunit": "^8.5 || ^9.5", 546 | "vimeo/psalm": "^4.25" 547 | }, 548 | "type": "library", 549 | "autoload": { 550 | "psr-4": { 551 | "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" 552 | } 553 | }, 554 | "notification-url": "https://packagist.org/downloads/", 555 | "license": [ 556 | "MIT" 557 | ], 558 | "authors": [ 559 | { 560 | "name": "Guilherme Blanco", 561 | "email": "guilhermeblanco@gmail.com" 562 | }, 563 | { 564 | "name": "Roman Borschel", 565 | "email": "roman@code-factory.org" 566 | }, 567 | { 568 | "name": "Benjamin Eberlei", 569 | "email": "kontakt@beberlei.de" 570 | }, 571 | { 572 | "name": "Jonathan Wage", 573 | "email": "jonwage@gmail.com" 574 | }, 575 | { 576 | "name": "Johannes Schmitt", 577 | "email": "schmittjoh@gmail.com" 578 | } 579 | ], 580 | "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", 581 | "homepage": "https://www.doctrine-project.org/projects/inflector.html", 582 | "keywords": [ 583 | "inflection", 584 | "inflector", 585 | "lowercase", 586 | "manipulation", 587 | "php", 588 | "plural", 589 | "singular", 590 | "strings", 591 | "uppercase", 592 | "words" 593 | ], 594 | "support": { 595 | "issues": "https://github.com/doctrine/inflector/issues", 596 | "source": "https://github.com/doctrine/inflector/tree/2.0.6" 597 | }, 598 | "funding": [ 599 | { 600 | "url": "https://www.doctrine-project.org/sponsorship.html", 601 | "type": "custom" 602 | }, 603 | { 604 | "url": "https://www.patreon.com/phpdoctrine", 605 | "type": "patreon" 606 | }, 607 | { 608 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", 609 | "type": "tidelift" 610 | } 611 | ], 612 | "time": "2022-10-20T09:10:12+00:00" 613 | }, 614 | { 615 | "name": "doctrine/instantiator", 616 | "version": "1.5.0", 617 | "source": { 618 | "type": "git", 619 | "url": "https://github.com/doctrine/instantiator.git", 620 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 621 | }, 622 | "dist": { 623 | "type": "zip", 624 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 625 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 626 | "shasum": "" 627 | }, 628 | "require": { 629 | "php": "^7.1 || ^8.0" 630 | }, 631 | "require-dev": { 632 | "doctrine/coding-standard": "^9 || ^11", 633 | "ext-pdo": "*", 634 | "ext-phar": "*", 635 | "phpbench/phpbench": "^0.16 || ^1", 636 | "phpstan/phpstan": "^1.4", 637 | "phpstan/phpstan-phpunit": "^1", 638 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 639 | "vimeo/psalm": "^4.30 || ^5.4" 640 | }, 641 | "type": "library", 642 | "autoload": { 643 | "psr-4": { 644 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 645 | } 646 | }, 647 | "notification-url": "https://packagist.org/downloads/", 648 | "license": [ 649 | "MIT" 650 | ], 651 | "authors": [ 652 | { 653 | "name": "Marco Pivetta", 654 | "email": "ocramius@gmail.com", 655 | "homepage": "https://ocramius.github.io/" 656 | } 657 | ], 658 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 659 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 660 | "keywords": [ 661 | "constructor", 662 | "instantiate" 663 | ], 664 | "support": { 665 | "issues": "https://github.com/doctrine/instantiator/issues", 666 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 667 | }, 668 | "funding": [ 669 | { 670 | "url": "https://www.doctrine-project.org/sponsorship.html", 671 | "type": "custom" 672 | }, 673 | { 674 | "url": "https://www.patreon.com/phpdoctrine", 675 | "type": "patreon" 676 | }, 677 | { 678 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 679 | "type": "tidelift" 680 | } 681 | ], 682 | "time": "2022-12-30T00:15:36+00:00" 683 | }, 684 | { 685 | "name": "doctrine/lexer", 686 | "version": "2.1.0", 687 | "source": { 688 | "type": "git", 689 | "url": "https://github.com/doctrine/lexer.git", 690 | "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" 691 | }, 692 | "dist": { 693 | "type": "zip", 694 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", 695 | "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", 696 | "shasum": "" 697 | }, 698 | "require": { 699 | "doctrine/deprecations": "^1.0", 700 | "php": "^7.1 || ^8.0" 701 | }, 702 | "require-dev": { 703 | "doctrine/coding-standard": "^9 || ^10", 704 | "phpstan/phpstan": "^1.3", 705 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 706 | "psalm/plugin-phpunit": "^0.18.3", 707 | "vimeo/psalm": "^4.11 || ^5.0" 708 | }, 709 | "type": "library", 710 | "autoload": { 711 | "psr-4": { 712 | "Doctrine\\Common\\Lexer\\": "src" 713 | } 714 | }, 715 | "notification-url": "https://packagist.org/downloads/", 716 | "license": [ 717 | "MIT" 718 | ], 719 | "authors": [ 720 | { 721 | "name": "Guilherme Blanco", 722 | "email": "guilhermeblanco@gmail.com" 723 | }, 724 | { 725 | "name": "Roman Borschel", 726 | "email": "roman@code-factory.org" 727 | }, 728 | { 729 | "name": "Johannes Schmitt", 730 | "email": "schmittjoh@gmail.com" 731 | } 732 | ], 733 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 734 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 735 | "keywords": [ 736 | "annotations", 737 | "docblock", 738 | "lexer", 739 | "parser", 740 | "php" 741 | ], 742 | "support": { 743 | "issues": "https://github.com/doctrine/lexer/issues", 744 | "source": "https://github.com/doctrine/lexer/tree/2.1.0" 745 | }, 746 | "funding": [ 747 | { 748 | "url": "https://www.doctrine-project.org/sponsorship.html", 749 | "type": "custom" 750 | }, 751 | { 752 | "url": "https://www.patreon.com/phpdoctrine", 753 | "type": "patreon" 754 | }, 755 | { 756 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", 757 | "type": "tidelift" 758 | } 759 | ], 760 | "time": "2022-12-14T08:49:07+00:00" 761 | }, 762 | { 763 | "name": "doctrine/orm", 764 | "version": "2.14.1", 765 | "source": { 766 | "type": "git", 767 | "url": "https://github.com/doctrine/orm.git", 768 | "reference": "de7eee5ed7b1b35c99b118f26f210a8281e6db8e" 769 | }, 770 | "dist": { 771 | "type": "zip", 772 | "url": "https://api.github.com/repos/doctrine/orm/zipball/de7eee5ed7b1b35c99b118f26f210a8281e6db8e", 773 | "reference": "de7eee5ed7b1b35c99b118f26f210a8281e6db8e", 774 | "shasum": "" 775 | }, 776 | "require": { 777 | "composer-runtime-api": "^2", 778 | "doctrine/cache": "^1.12.1 || ^2.1.1", 779 | "doctrine/collections": "^1.5 || ^2.0", 780 | "doctrine/common": "^3.0.3", 781 | "doctrine/dbal": "^2.13.1 || ^3.2", 782 | "doctrine/deprecations": "^0.5.3 || ^1", 783 | "doctrine/event-manager": "^1.2 || ^2", 784 | "doctrine/inflector": "^1.4 || ^2.0", 785 | "doctrine/instantiator": "^1.3", 786 | "doctrine/lexer": "^1.2.3 || ^2", 787 | "doctrine/persistence": "^2.4 || ^3", 788 | "ext-ctype": "*", 789 | "php": "^7.1 || ^8.0", 790 | "psr/cache": "^1 || ^2 || ^3", 791 | "symfony/console": "^4.2 || ^5.0 || ^6.0", 792 | "symfony/polyfill-php72": "^1.23", 793 | "symfony/polyfill-php80": "^1.16" 794 | }, 795 | "conflict": { 796 | "doctrine/annotations": "<1.13 || >= 3.0" 797 | }, 798 | "require-dev": { 799 | "doctrine/annotations": "^1.13 || ^2", 800 | "doctrine/coding-standard": "^9.0.2 || ^11.0", 801 | "phpbench/phpbench": "^0.16.10 || ^1.0", 802 | "phpstan/phpstan": "~1.4.10 || 1.9.8", 803 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 804 | "psr/log": "^1 || ^2 || ^3", 805 | "squizlabs/php_codesniffer": "3.7.1", 806 | "symfony/cache": "^4.4 || ^5.4 || ^6.0", 807 | "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2", 808 | "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0", 809 | "vimeo/psalm": "4.30.0 || 5.4.0" 810 | }, 811 | "suggest": { 812 | "ext-dom": "Provides support for XSD validation for XML mapping files", 813 | "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", 814 | "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" 815 | }, 816 | "bin": [ 817 | "bin/doctrine" 818 | ], 819 | "type": "library", 820 | "autoload": { 821 | "psr-4": { 822 | "Doctrine\\ORM\\": "lib/Doctrine/ORM" 823 | } 824 | }, 825 | "notification-url": "https://packagist.org/downloads/", 826 | "license": [ 827 | "MIT" 828 | ], 829 | "authors": [ 830 | { 831 | "name": "Guilherme Blanco", 832 | "email": "guilhermeblanco@gmail.com" 833 | }, 834 | { 835 | "name": "Roman Borschel", 836 | "email": "roman@code-factory.org" 837 | }, 838 | { 839 | "name": "Benjamin Eberlei", 840 | "email": "kontakt@beberlei.de" 841 | }, 842 | { 843 | "name": "Jonathan Wage", 844 | "email": "jonwage@gmail.com" 845 | }, 846 | { 847 | "name": "Marco Pivetta", 848 | "email": "ocramius@gmail.com" 849 | } 850 | ], 851 | "description": "Object-Relational-Mapper for PHP", 852 | "homepage": "https://www.doctrine-project.org/projects/orm.html", 853 | "keywords": [ 854 | "database", 855 | "orm" 856 | ], 857 | "support": { 858 | "issues": "https://github.com/doctrine/orm/issues", 859 | "source": "https://github.com/doctrine/orm/tree/2.14.1" 860 | }, 861 | "time": "2023-01-16T18:36:59+00:00" 862 | }, 863 | { 864 | "name": "doctrine/persistence", 865 | "version": "3.1.3", 866 | "source": { 867 | "type": "git", 868 | "url": "https://github.com/doctrine/persistence.git", 869 | "reference": "920da294b4bb0bb527f2a91ed60c18213435880f" 870 | }, 871 | "dist": { 872 | "type": "zip", 873 | "url": "https://api.github.com/repos/doctrine/persistence/zipball/920da294b4bb0bb527f2a91ed60c18213435880f", 874 | "reference": "920da294b4bb0bb527f2a91ed60c18213435880f", 875 | "shasum": "" 876 | }, 877 | "require": { 878 | "doctrine/event-manager": "^1 || ^2", 879 | "php": "^7.2 || ^8.0", 880 | "psr/cache": "^1.0 || ^2.0 || ^3.0" 881 | }, 882 | "conflict": { 883 | "doctrine/common": "<2.10" 884 | }, 885 | "require-dev": { 886 | "composer/package-versions-deprecated": "^1.11", 887 | "doctrine/coding-standard": "^11", 888 | "doctrine/common": "^3.0", 889 | "phpstan/phpstan": "1.9.4", 890 | "phpstan/phpstan-phpunit": "^1", 891 | "phpstan/phpstan-strict-rules": "^1.1", 892 | "phpunit/phpunit": "^8.5 || ^9.5", 893 | "symfony/cache": "^4.4 || ^5.4 || ^6.0", 894 | "vimeo/psalm": "4.30.0 || 5.3.0" 895 | }, 896 | "type": "library", 897 | "autoload": { 898 | "psr-4": { 899 | "Doctrine\\Persistence\\": "src/Persistence" 900 | } 901 | }, 902 | "notification-url": "https://packagist.org/downloads/", 903 | "license": [ 904 | "MIT" 905 | ], 906 | "authors": [ 907 | { 908 | "name": "Guilherme Blanco", 909 | "email": "guilhermeblanco@gmail.com" 910 | }, 911 | { 912 | "name": "Roman Borschel", 913 | "email": "roman@code-factory.org" 914 | }, 915 | { 916 | "name": "Benjamin Eberlei", 917 | "email": "kontakt@beberlei.de" 918 | }, 919 | { 920 | "name": "Jonathan Wage", 921 | "email": "jonwage@gmail.com" 922 | }, 923 | { 924 | "name": "Johannes Schmitt", 925 | "email": "schmittjoh@gmail.com" 926 | }, 927 | { 928 | "name": "Marco Pivetta", 929 | "email": "ocramius@gmail.com" 930 | } 931 | ], 932 | "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", 933 | "homepage": "https://www.doctrine-project.org/projects/persistence.html", 934 | "keywords": [ 935 | "mapper", 936 | "object", 937 | "odm", 938 | "orm", 939 | "persistence" 940 | ], 941 | "support": { 942 | "issues": "https://github.com/doctrine/persistence/issues", 943 | "source": "https://github.com/doctrine/persistence/tree/3.1.3" 944 | }, 945 | "funding": [ 946 | { 947 | "url": "https://www.doctrine-project.org/sponsorship.html", 948 | "type": "custom" 949 | }, 950 | { 951 | "url": "https://www.patreon.com/phpdoctrine", 952 | "type": "patreon" 953 | }, 954 | { 955 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", 956 | "type": "tidelift" 957 | } 958 | ], 959 | "time": "2023-01-19T13:39:42+00:00" 960 | }, 961 | { 962 | "name": "jasny/php-functions", 963 | "version": "v3.3.1", 964 | "source": { 965 | "type": "git", 966 | "url": "https://github.com/jasny/php-functions.git", 967 | "reference": "2dac4273d80f7aadff8e027c8574d61c85a607ac" 968 | }, 969 | "dist": { 970 | "type": "zip", 971 | "url": "https://api.github.com/repos/jasny/php-functions/zipball/2dac4273d80f7aadff8e027c8574d61c85a607ac", 972 | "reference": "2dac4273d80f7aadff8e027c8574d61c85a607ac", 973 | "shasum": "" 974 | }, 975 | "require": { 976 | "php": ">=5.6" 977 | }, 978 | "require-dev": { 979 | "jasny/php-code-quality": "^2.0", 980 | "phpunit/phpunit": "^5.7.0" 981 | }, 982 | "type": "library", 983 | "autoload": { 984 | "files": [ 985 | "src/array_functions.php", 986 | "src/case_functions.php", 987 | "src/string_functions.php", 988 | "src/server_functions.php", 989 | "src/type_functions.php", 990 | "src/file_functions.php", 991 | "src/func_functions.php", 992 | "src/object_functions.php" 993 | ] 994 | }, 995 | "notification-url": "https://packagist.org/downloads/", 996 | "license": [ 997 | "MIT" 998 | ], 999 | "authors": [ 1000 | { 1001 | "name": "Arnold Daniels", 1002 | "email": "arnold@jasny.net", 1003 | "homepage": "http://www.jasny.net" 1004 | } 1005 | ], 1006 | "description": "A set of useful PHP functions", 1007 | "support": { 1008 | "issues": "https://github.com/jasny/php-functions/issues", 1009 | "source": "https://github.com/jasny/php-functions" 1010 | }, 1011 | "time": "2018-11-26T11:24:27+00:00" 1012 | }, 1013 | { 1014 | "name": "league/booboo", 1015 | "version": "2.1", 1016 | "source": { 1017 | "type": "git", 1018 | "url": "https://github.com/thephpleague/booboo.git", 1019 | "reference": "5f2d93a329df9ccb9edf77dac83c483829893d2e" 1020 | }, 1021 | "dist": { 1022 | "type": "zip", 1023 | "url": "https://api.github.com/repos/thephpleague/booboo/zipball/5f2d93a329df9ccb9edf77dac83c483829893d2e", 1024 | "reference": "5f2d93a329df9ccb9edf77dac83c483829893d2e", 1025 | "shasum": "" 1026 | }, 1027 | "require": { 1028 | "php": ">=5.6.0", 1029 | "psr/log": "~1.0" 1030 | }, 1031 | "require-dev": { 1032 | "mockery/mockery": "~0.9", 1033 | "phpunit/phpunit": "~5.7", 1034 | "sentry/sentry": "~1.7" 1035 | }, 1036 | "suggest": { 1037 | "sentry/sentry": "Use Sentry for passing errors to Sentry." 1038 | }, 1039 | "type": "library", 1040 | "autoload": { 1041 | "psr-4": { 1042 | "League\\BooBoo\\": "src/" 1043 | } 1044 | }, 1045 | "notification-url": "https://packagist.org/downloads/", 1046 | "license": [ 1047 | "MIT" 1048 | ], 1049 | "authors": [ 1050 | { 1051 | "name": "Brandon Savage", 1052 | "homepage": "https://www.brandonsavage.net/" 1053 | } 1054 | ], 1055 | "description": "Provides an error handler for PHP that can execute a stack of handlers for various purposes.", 1056 | "support": { 1057 | "issues": "https://github.com/thephpleague/booboo/issues", 1058 | "source": "https://github.com/thephpleague/booboo/tree/2.1" 1059 | }, 1060 | "time": "2017-12-13T15:55:44+00:00" 1061 | }, 1062 | { 1063 | "name": "league/flysystem", 1064 | "version": "1.1.10", 1065 | "source": { 1066 | "type": "git", 1067 | "url": "https://github.com/thephpleague/flysystem.git", 1068 | "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" 1069 | }, 1070 | "dist": { 1071 | "type": "zip", 1072 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", 1073 | "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", 1074 | "shasum": "" 1075 | }, 1076 | "require": { 1077 | "ext-fileinfo": "*", 1078 | "league/mime-type-detection": "^1.3", 1079 | "php": "^7.2.5 || ^8.0" 1080 | }, 1081 | "conflict": { 1082 | "league/flysystem-sftp": "<1.0.6" 1083 | }, 1084 | "require-dev": { 1085 | "phpspec/prophecy": "^1.11.1", 1086 | "phpunit/phpunit": "^8.5.8" 1087 | }, 1088 | "suggest": { 1089 | "ext-ftp": "Allows you to use FTP server storage", 1090 | "ext-openssl": "Allows you to use FTPS server storage", 1091 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 1092 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 1093 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 1094 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 1095 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 1096 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 1097 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 1098 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 1099 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 1100 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 1101 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 1102 | }, 1103 | "type": "library", 1104 | "extra": { 1105 | "branch-alias": { 1106 | "dev-master": "1.1-dev" 1107 | } 1108 | }, 1109 | "autoload": { 1110 | "psr-4": { 1111 | "League\\Flysystem\\": "src/" 1112 | } 1113 | }, 1114 | "notification-url": "https://packagist.org/downloads/", 1115 | "license": [ 1116 | "MIT" 1117 | ], 1118 | "authors": [ 1119 | { 1120 | "name": "Frank de Jonge", 1121 | "email": "info@frenky.net" 1122 | } 1123 | ], 1124 | "description": "Filesystem abstraction: Many filesystems, one API.", 1125 | "keywords": [ 1126 | "Cloud Files", 1127 | "WebDAV", 1128 | "abstraction", 1129 | "aws", 1130 | "cloud", 1131 | "copy.com", 1132 | "dropbox", 1133 | "file systems", 1134 | "files", 1135 | "filesystem", 1136 | "filesystems", 1137 | "ftp", 1138 | "rackspace", 1139 | "remote", 1140 | "s3", 1141 | "sftp", 1142 | "storage" 1143 | ], 1144 | "support": { 1145 | "issues": "https://github.com/thephpleague/flysystem/issues", 1146 | "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" 1147 | }, 1148 | "funding": [ 1149 | { 1150 | "url": "https://offset.earth/frankdejonge", 1151 | "type": "other" 1152 | } 1153 | ], 1154 | "time": "2022-10-04T09:16:37+00:00" 1155 | }, 1156 | { 1157 | "name": "league/mime-type-detection", 1158 | "version": "1.11.0", 1159 | "source": { 1160 | "type": "git", 1161 | "url": "https://github.com/thephpleague/mime-type-detection.git", 1162 | "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" 1163 | }, 1164 | "dist": { 1165 | "type": "zip", 1166 | "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", 1167 | "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", 1168 | "shasum": "" 1169 | }, 1170 | "require": { 1171 | "ext-fileinfo": "*", 1172 | "php": "^7.2 || ^8.0" 1173 | }, 1174 | "require-dev": { 1175 | "friendsofphp/php-cs-fixer": "^3.2", 1176 | "phpstan/phpstan": "^0.12.68", 1177 | "phpunit/phpunit": "^8.5.8 || ^9.3" 1178 | }, 1179 | "type": "library", 1180 | "autoload": { 1181 | "psr-4": { 1182 | "League\\MimeTypeDetection\\": "src" 1183 | } 1184 | }, 1185 | "notification-url": "https://packagist.org/downloads/", 1186 | "license": [ 1187 | "MIT" 1188 | ], 1189 | "authors": [ 1190 | { 1191 | "name": "Frank de Jonge", 1192 | "email": "info@frankdejonge.nl" 1193 | } 1194 | ], 1195 | "description": "Mime-type detection for Flysystem", 1196 | "support": { 1197 | "issues": "https://github.com/thephpleague/mime-type-detection/issues", 1198 | "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" 1199 | }, 1200 | "funding": [ 1201 | { 1202 | "url": "https://github.com/frankdejonge", 1203 | "type": "github" 1204 | }, 1205 | { 1206 | "url": "https://tidelift.com/funding/github/packagist/league/flysystem", 1207 | "type": "tidelift" 1208 | } 1209 | ], 1210 | "time": "2022-04-17T13:12:02+00:00" 1211 | }, 1212 | { 1213 | "name": "league/plates", 1214 | "version": "v3.5.0", 1215 | "source": { 1216 | "type": "git", 1217 | "url": "https://github.com/thephpleague/plates.git", 1218 | "reference": "a6a3238e46c6e19af7318fdc36bfbe49b0620231" 1219 | }, 1220 | "dist": { 1221 | "type": "zip", 1222 | "url": "https://api.github.com/repos/thephpleague/plates/zipball/a6a3238e46c6e19af7318fdc36bfbe49b0620231", 1223 | "reference": "a6a3238e46c6e19af7318fdc36bfbe49b0620231", 1224 | "shasum": "" 1225 | }, 1226 | "require": { 1227 | "php": "^7.0|^8.0" 1228 | }, 1229 | "require-dev": { 1230 | "mikey179/vfsstream": "^1.6", 1231 | "phpunit/phpunit": "^9.5", 1232 | "squizlabs/php_codesniffer": "^3.5" 1233 | }, 1234 | "type": "library", 1235 | "extra": { 1236 | "branch-alias": { 1237 | "dev-master": "3.0-dev" 1238 | } 1239 | }, 1240 | "autoload": { 1241 | "psr-4": { 1242 | "League\\Plates\\": "src" 1243 | } 1244 | }, 1245 | "notification-url": "https://packagist.org/downloads/", 1246 | "license": [ 1247 | "MIT" 1248 | ], 1249 | "authors": [ 1250 | { 1251 | "name": "Jonathan Reinink", 1252 | "email": "jonathan@reinink.ca", 1253 | "role": "Developer" 1254 | }, 1255 | { 1256 | "name": "RJ Garcia", 1257 | "email": "ragboyjr@icloud.com", 1258 | "role": "Developer" 1259 | } 1260 | ], 1261 | "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", 1262 | "homepage": "https://platesphp.com", 1263 | "keywords": [ 1264 | "league", 1265 | "package", 1266 | "templates", 1267 | "templating", 1268 | "views" 1269 | ], 1270 | "support": { 1271 | "issues": "https://github.com/thephpleague/plates/issues", 1272 | "source": "https://github.com/thephpleague/plates/tree/v3.5.0" 1273 | }, 1274 | "time": "2023-01-16T20:25:45+00:00" 1275 | }, 1276 | { 1277 | "name": "matthiasmullie/scrapbook", 1278 | "version": "1.5.1", 1279 | "source": { 1280 | "type": "git", 1281 | "url": "https://github.com/matthiasmullie/scrapbook.git", 1282 | "reference": "d49068fab714b0056c0a82ff055882e0de4e3620" 1283 | }, 1284 | "dist": { 1285 | "type": "zip", 1286 | "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/d49068fab714b0056c0a82ff055882e0de4e3620", 1287 | "reference": "d49068fab714b0056c0a82ff055882e0de4e3620", 1288 | "shasum": "" 1289 | }, 1290 | "require": { 1291 | "php": ">=8.0.0", 1292 | "psr/cache": "^2.0||^3.0", 1293 | "psr/simple-cache": "^2.0||^3.0" 1294 | }, 1295 | "provide": { 1296 | "psr/cache-implementation": "^1.0||^2.0||^3.0", 1297 | "psr/simple-cache-implementation": "^1.0||^2.0||^3.0" 1298 | }, 1299 | "require-dev": { 1300 | "ext-pcntl": "*", 1301 | "friendsofphp/php-cs-fixer": ">=2.0", 1302 | "phpunit/phpunit": ">=9.0", 1303 | "squizlabs/php_codesniffer": ">=3.0" 1304 | }, 1305 | "suggest": { 1306 | "couchbase/couchbase": ">=3.0", 1307 | "ext-apcu": ">=4.0.0", 1308 | "ext-couchbase": ">=3.0.0", 1309 | "ext-memcached": ">=2.0.0", 1310 | "ext-pdo": ">=0.1.0", 1311 | "ext-redis": ">=2.2.0||0.0.0.0", 1312 | "league/flysystem": ">=1.0" 1313 | }, 1314 | "type": "library", 1315 | "autoload": { 1316 | "psr-4": { 1317 | "MatthiasMullie\\Scrapbook\\": "src/" 1318 | } 1319 | }, 1320 | "notification-url": "https://packagist.org/downloads/", 1321 | "license": [ 1322 | "MIT" 1323 | ], 1324 | "authors": [ 1325 | { 1326 | "name": "Matthias Mullie", 1327 | "email": "scrapbook@mullie.eu", 1328 | "homepage": "https://www.mullie.eu", 1329 | "role": "Developer" 1330 | } 1331 | ], 1332 | "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.", 1333 | "homepage": "https://scrapbook.cash", 1334 | "keywords": [ 1335 | "Buffer", 1336 | "Flysystem", 1337 | "apc", 1338 | "buffered", 1339 | "cache", 1340 | "caching", 1341 | "commit", 1342 | "couchbase", 1343 | "filesystem", 1344 | "key", 1345 | "memcached", 1346 | "mitigation", 1347 | "mysql", 1348 | "postgresql", 1349 | "protection", 1350 | "psr-16", 1351 | "psr-6", 1352 | "psr-cache", 1353 | "psr-simple-cache", 1354 | "redis", 1355 | "rollback", 1356 | "sql", 1357 | "sqlite", 1358 | "stampede", 1359 | "store", 1360 | "transaction", 1361 | "transactional", 1362 | "value" 1363 | ], 1364 | "support": { 1365 | "issues": "https://github.com/matthiasmullie/scrapbook/issues", 1366 | "source": "https://github.com/matthiasmullie/scrapbook/tree/1.5.1" 1367 | }, 1368 | "funding": [ 1369 | { 1370 | "url": "https://github.com/matthiasmullie", 1371 | "type": "github" 1372 | } 1373 | ], 1374 | "time": "2023-01-26T11:04:25+00:00" 1375 | }, 1376 | { 1377 | "name": "mzdr/oh-snap", 1378 | "version": "1.0.0", 1379 | "source": { 1380 | "type": "git", 1381 | "url": "https://github.com/mzdr/oh-snap.git", 1382 | "reference": "b9da897bbf0e95fe85486b70db33e330ca5d750b" 1383 | }, 1384 | "dist": { 1385 | "type": "zip", 1386 | "url": "https://api.github.com/repos/mzdr/oh-snap/zipball/b9da897bbf0e95fe85486b70db33e330ca5d750b", 1387 | "reference": "b9da897bbf0e95fe85486b70db33e330ca5d750b", 1388 | "shasum": "" 1389 | }, 1390 | "require": { 1391 | "jasny/php-functions": "^3.2", 1392 | "league/booboo": "^2.0", 1393 | "php": ">=5.6.0" 1394 | }, 1395 | "type": "library", 1396 | "autoload": { 1397 | "psr-4": { 1398 | "mzdr\\OhSnap\\": "src/" 1399 | } 1400 | }, 1401 | "notification-url": "https://packagist.org/downloads/", 1402 | "license": [ 1403 | "MIT" 1404 | ], 1405 | "authors": [ 1406 | { 1407 | "name": "Sebastian Prein", 1408 | "email": "hi@sebastianprein.com" 1409 | } 1410 | ], 1411 | "description": "A pretty formatter for BooBoo.", 1412 | "homepage": "https://github.com/mzdr/oh-snap", 1413 | "support": { 1414 | "issues": "https://github.com/mzdr/oh-snap/issues", 1415 | "source": "https://github.com/mzdr/oh-snap/tree/master" 1416 | }, 1417 | "abandoned": true, 1418 | "time": "2018-05-01T12:24:29+00:00" 1419 | }, 1420 | { 1421 | "name": "nikic/fast-route", 1422 | "version": "v1.3.0", 1423 | "source": { 1424 | "type": "git", 1425 | "url": "https://github.com/nikic/FastRoute.git", 1426 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812" 1427 | }, 1428 | "dist": { 1429 | "type": "zip", 1430 | "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", 1431 | "reference": "181d480e08d9476e61381e04a71b34dc0432e812", 1432 | "shasum": "" 1433 | }, 1434 | "require": { 1435 | "php": ">=5.4.0" 1436 | }, 1437 | "require-dev": { 1438 | "phpunit/phpunit": "^4.8.35|~5.7" 1439 | }, 1440 | "type": "library", 1441 | "autoload": { 1442 | "files": [ 1443 | "src/functions.php" 1444 | ], 1445 | "psr-4": { 1446 | "FastRoute\\": "src/" 1447 | } 1448 | }, 1449 | "notification-url": "https://packagist.org/downloads/", 1450 | "license": [ 1451 | "BSD-3-Clause" 1452 | ], 1453 | "authors": [ 1454 | { 1455 | "name": "Nikita Popov", 1456 | "email": "nikic@php.net" 1457 | } 1458 | ], 1459 | "description": "Fast request router for PHP", 1460 | "keywords": [ 1461 | "router", 1462 | "routing" 1463 | ], 1464 | "support": { 1465 | "issues": "https://github.com/nikic/FastRoute/issues", 1466 | "source": "https://github.com/nikic/FastRoute/tree/master" 1467 | }, 1468 | "time": "2018-02-13T20:26:39+00:00" 1469 | }, 1470 | { 1471 | "name": "psr/cache", 1472 | "version": "3.0.0", 1473 | "source": { 1474 | "type": "git", 1475 | "url": "https://github.com/php-fig/cache.git", 1476 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" 1477 | }, 1478 | "dist": { 1479 | "type": "zip", 1480 | "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1481 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1482 | "shasum": "" 1483 | }, 1484 | "require": { 1485 | "php": ">=8.0.0" 1486 | }, 1487 | "type": "library", 1488 | "extra": { 1489 | "branch-alias": { 1490 | "dev-master": "1.0.x-dev" 1491 | } 1492 | }, 1493 | "autoload": { 1494 | "psr-4": { 1495 | "Psr\\Cache\\": "src/" 1496 | } 1497 | }, 1498 | "notification-url": "https://packagist.org/downloads/", 1499 | "license": [ 1500 | "MIT" 1501 | ], 1502 | "authors": [ 1503 | { 1504 | "name": "PHP-FIG", 1505 | "homepage": "https://www.php-fig.org/" 1506 | } 1507 | ], 1508 | "description": "Common interface for caching libraries", 1509 | "keywords": [ 1510 | "cache", 1511 | "psr", 1512 | "psr-6" 1513 | ], 1514 | "support": { 1515 | "source": "https://github.com/php-fig/cache/tree/3.0.0" 1516 | }, 1517 | "time": "2021-02-03T23:26:27+00:00" 1518 | }, 1519 | { 1520 | "name": "psr/container", 1521 | "version": "2.0.2", 1522 | "source": { 1523 | "type": "git", 1524 | "url": "https://github.com/php-fig/container.git", 1525 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1526 | }, 1527 | "dist": { 1528 | "type": "zip", 1529 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1530 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1531 | "shasum": "" 1532 | }, 1533 | "require": { 1534 | "php": ">=7.4.0" 1535 | }, 1536 | "type": "library", 1537 | "extra": { 1538 | "branch-alias": { 1539 | "dev-master": "2.0.x-dev" 1540 | } 1541 | }, 1542 | "autoload": { 1543 | "psr-4": { 1544 | "Psr\\Container\\": "src/" 1545 | } 1546 | }, 1547 | "notification-url": "https://packagist.org/downloads/", 1548 | "license": [ 1549 | "MIT" 1550 | ], 1551 | "authors": [ 1552 | { 1553 | "name": "PHP-FIG", 1554 | "homepage": "https://www.php-fig.org/" 1555 | } 1556 | ], 1557 | "description": "Common Container Interface (PHP FIG PSR-11)", 1558 | "homepage": "https://github.com/php-fig/container", 1559 | "keywords": [ 1560 | "PSR-11", 1561 | "container", 1562 | "container-interface", 1563 | "container-interop", 1564 | "psr" 1565 | ], 1566 | "support": { 1567 | "issues": "https://github.com/php-fig/container/issues", 1568 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1569 | }, 1570 | "time": "2021-11-05T16:47:00+00:00" 1571 | }, 1572 | { 1573 | "name": "psr/log", 1574 | "version": "1.1.4", 1575 | "source": { 1576 | "type": "git", 1577 | "url": "https://github.com/php-fig/log.git", 1578 | "reference": "d49695b909c3b7628b6289db5479a1c204601f11" 1579 | }, 1580 | "dist": { 1581 | "type": "zip", 1582 | "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", 1583 | "reference": "d49695b909c3b7628b6289db5479a1c204601f11", 1584 | "shasum": "" 1585 | }, 1586 | "require": { 1587 | "php": ">=5.3.0" 1588 | }, 1589 | "type": "library", 1590 | "extra": { 1591 | "branch-alias": { 1592 | "dev-master": "1.1.x-dev" 1593 | } 1594 | }, 1595 | "autoload": { 1596 | "psr-4": { 1597 | "Psr\\Log\\": "Psr/Log/" 1598 | } 1599 | }, 1600 | "notification-url": "https://packagist.org/downloads/", 1601 | "license": [ 1602 | "MIT" 1603 | ], 1604 | "authors": [ 1605 | { 1606 | "name": "PHP-FIG", 1607 | "homepage": "https://www.php-fig.org/" 1608 | } 1609 | ], 1610 | "description": "Common interface for logging libraries", 1611 | "homepage": "https://github.com/php-fig/log", 1612 | "keywords": [ 1613 | "log", 1614 | "psr", 1615 | "psr-3" 1616 | ], 1617 | "support": { 1618 | "source": "https://github.com/php-fig/log/tree/1.1.4" 1619 | }, 1620 | "time": "2021-05-03T11:20:27+00:00" 1621 | }, 1622 | { 1623 | "name": "psr/simple-cache", 1624 | "version": "3.0.0", 1625 | "source": { 1626 | "type": "git", 1627 | "url": "https://github.com/php-fig/simple-cache.git", 1628 | "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" 1629 | }, 1630 | "dist": { 1631 | "type": "zip", 1632 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", 1633 | "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", 1634 | "shasum": "" 1635 | }, 1636 | "require": { 1637 | "php": ">=8.0.0" 1638 | }, 1639 | "type": "library", 1640 | "extra": { 1641 | "branch-alias": { 1642 | "dev-master": "3.0.x-dev" 1643 | } 1644 | }, 1645 | "autoload": { 1646 | "psr-4": { 1647 | "Psr\\SimpleCache\\": "src/" 1648 | } 1649 | }, 1650 | "notification-url": "https://packagist.org/downloads/", 1651 | "license": [ 1652 | "MIT" 1653 | ], 1654 | "authors": [ 1655 | { 1656 | "name": "PHP-FIG", 1657 | "homepage": "https://www.php-fig.org/" 1658 | } 1659 | ], 1660 | "description": "Common interfaces for simple caching", 1661 | "keywords": [ 1662 | "cache", 1663 | "caching", 1664 | "psr", 1665 | "psr-16", 1666 | "simple-cache" 1667 | ], 1668 | "support": { 1669 | "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" 1670 | }, 1671 | "time": "2021-10-29T13:26:27+00:00" 1672 | }, 1673 | { 1674 | "name": "samrap/gestalt", 1675 | "version": "v0.3.1", 1676 | "source": { 1677 | "type": "git", 1678 | "url": "https://github.com/samrap/gestalt.git", 1679 | "reference": "aaf3e2351b0a436d525fb773a89f271f255ec503" 1680 | }, 1681 | "dist": { 1682 | "type": "zip", 1683 | "url": "https://api.github.com/repos/samrap/gestalt/zipball/aaf3e2351b0a436d525fb773a89f271f255ec503", 1684 | "reference": "aaf3e2351b0a436d525fb773a89f271f255ec503", 1685 | "shasum": "" 1686 | }, 1687 | "require": { 1688 | "php": ">=5.6" 1689 | }, 1690 | "require-dev": { 1691 | "mockery/mockery": "^0.9.5", 1692 | "phpunit/phpunit": "^5.5" 1693 | }, 1694 | "type": "library", 1695 | "autoload": { 1696 | "psr-4": { 1697 | "Gestalt\\": "src/Gestalt" 1698 | } 1699 | }, 1700 | "notification-url": "https://packagist.org/downloads/", 1701 | "license": [ 1702 | "MIT" 1703 | ], 1704 | "authors": [ 1705 | { 1706 | "name": "Sam Rapaport", 1707 | "email": "rapaport.sam7@gmail.com" 1708 | } 1709 | ], 1710 | "description": "Gestalt is a simple, elegant PHP package for managing your framework's configuration values.", 1711 | "keywords": [ 1712 | "boilerplate", 1713 | "configuration", 1714 | "php", 1715 | "wrapper" 1716 | ], 1717 | "support": { 1718 | "issues": "https://github.com/samrap/gestalt/issues", 1719 | "source": "https://github.com/samrap/gestalt/tree/master" 1720 | }, 1721 | "time": "2016-10-06T18:15:52+00:00" 1722 | }, 1723 | { 1724 | "name": "symfony/console", 1725 | "version": "v6.2.5", 1726 | "source": { 1727 | "type": "git", 1728 | "url": "https://github.com/symfony/console.git", 1729 | "reference": "3e294254f2191762c1d137aed4b94e966965e985" 1730 | }, 1731 | "dist": { 1732 | "type": "zip", 1733 | "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985", 1734 | "reference": "3e294254f2191762c1d137aed4b94e966965e985", 1735 | "shasum": "" 1736 | }, 1737 | "require": { 1738 | "php": ">=8.1", 1739 | "symfony/deprecation-contracts": "^2.1|^3", 1740 | "symfony/polyfill-mbstring": "~1.0", 1741 | "symfony/service-contracts": "^1.1|^2|^3", 1742 | "symfony/string": "^5.4|^6.0" 1743 | }, 1744 | "conflict": { 1745 | "symfony/dependency-injection": "<5.4", 1746 | "symfony/dotenv": "<5.4", 1747 | "symfony/event-dispatcher": "<5.4", 1748 | "symfony/lock": "<5.4", 1749 | "symfony/process": "<5.4" 1750 | }, 1751 | "provide": { 1752 | "psr/log-implementation": "1.0|2.0|3.0" 1753 | }, 1754 | "require-dev": { 1755 | "psr/log": "^1|^2|^3", 1756 | "symfony/config": "^5.4|^6.0", 1757 | "symfony/dependency-injection": "^5.4|^6.0", 1758 | "symfony/event-dispatcher": "^5.4|^6.0", 1759 | "symfony/lock": "^5.4|^6.0", 1760 | "symfony/process": "^5.4|^6.0", 1761 | "symfony/var-dumper": "^5.4|^6.0" 1762 | }, 1763 | "suggest": { 1764 | "psr/log": "For using the console logger", 1765 | "symfony/event-dispatcher": "", 1766 | "symfony/lock": "", 1767 | "symfony/process": "" 1768 | }, 1769 | "type": "library", 1770 | "autoload": { 1771 | "psr-4": { 1772 | "Symfony\\Component\\Console\\": "" 1773 | }, 1774 | "exclude-from-classmap": [ 1775 | "/Tests/" 1776 | ] 1777 | }, 1778 | "notification-url": "https://packagist.org/downloads/", 1779 | "license": [ 1780 | "MIT" 1781 | ], 1782 | "authors": [ 1783 | { 1784 | "name": "Fabien Potencier", 1785 | "email": "fabien@symfony.com" 1786 | }, 1787 | { 1788 | "name": "Symfony Community", 1789 | "homepage": "https://symfony.com/contributors" 1790 | } 1791 | ], 1792 | "description": "Eases the creation of beautiful and testable command line interfaces", 1793 | "homepage": "https://symfony.com", 1794 | "keywords": [ 1795 | "cli", 1796 | "command line", 1797 | "console", 1798 | "terminal" 1799 | ], 1800 | "support": { 1801 | "source": "https://github.com/symfony/console/tree/v6.2.5" 1802 | }, 1803 | "funding": [ 1804 | { 1805 | "url": "https://symfony.com/sponsor", 1806 | "type": "custom" 1807 | }, 1808 | { 1809 | "url": "https://github.com/fabpot", 1810 | "type": "github" 1811 | }, 1812 | { 1813 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1814 | "type": "tidelift" 1815 | } 1816 | ], 1817 | "time": "2023-01-01T08:38:09+00:00" 1818 | }, 1819 | { 1820 | "name": "symfony/deprecation-contracts", 1821 | "version": "v3.2.0", 1822 | "source": { 1823 | "type": "git", 1824 | "url": "https://github.com/symfony/deprecation-contracts.git", 1825 | "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" 1826 | }, 1827 | "dist": { 1828 | "type": "zip", 1829 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", 1830 | "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", 1831 | "shasum": "" 1832 | }, 1833 | "require": { 1834 | "php": ">=8.1" 1835 | }, 1836 | "type": "library", 1837 | "extra": { 1838 | "branch-alias": { 1839 | "dev-main": "3.3-dev" 1840 | }, 1841 | "thanks": { 1842 | "name": "symfony/contracts", 1843 | "url": "https://github.com/symfony/contracts" 1844 | } 1845 | }, 1846 | "autoload": { 1847 | "files": [ 1848 | "function.php" 1849 | ] 1850 | }, 1851 | "notification-url": "https://packagist.org/downloads/", 1852 | "license": [ 1853 | "MIT" 1854 | ], 1855 | "authors": [ 1856 | { 1857 | "name": "Nicolas Grekas", 1858 | "email": "p@tchwork.com" 1859 | }, 1860 | { 1861 | "name": "Symfony Community", 1862 | "homepage": "https://symfony.com/contributors" 1863 | } 1864 | ], 1865 | "description": "A generic function and convention to trigger deprecation notices", 1866 | "homepage": "https://symfony.com", 1867 | "support": { 1868 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" 1869 | }, 1870 | "funding": [ 1871 | { 1872 | "url": "https://symfony.com/sponsor", 1873 | "type": "custom" 1874 | }, 1875 | { 1876 | "url": "https://github.com/fabpot", 1877 | "type": "github" 1878 | }, 1879 | { 1880 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1881 | "type": "tidelift" 1882 | } 1883 | ], 1884 | "time": "2022-11-25T10:21:52+00:00" 1885 | }, 1886 | { 1887 | "name": "symfony/polyfill-ctype", 1888 | "version": "v1.27.0", 1889 | "source": { 1890 | "type": "git", 1891 | "url": "https://github.com/symfony/polyfill-ctype.git", 1892 | "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" 1893 | }, 1894 | "dist": { 1895 | "type": "zip", 1896 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", 1897 | "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", 1898 | "shasum": "" 1899 | }, 1900 | "require": { 1901 | "php": ">=7.1" 1902 | }, 1903 | "provide": { 1904 | "ext-ctype": "*" 1905 | }, 1906 | "suggest": { 1907 | "ext-ctype": "For best performance" 1908 | }, 1909 | "type": "library", 1910 | "extra": { 1911 | "branch-alias": { 1912 | "dev-main": "1.27-dev" 1913 | }, 1914 | "thanks": { 1915 | "name": "symfony/polyfill", 1916 | "url": "https://github.com/symfony/polyfill" 1917 | } 1918 | }, 1919 | "autoload": { 1920 | "files": [ 1921 | "bootstrap.php" 1922 | ], 1923 | "psr-4": { 1924 | "Symfony\\Polyfill\\Ctype\\": "" 1925 | } 1926 | }, 1927 | "notification-url": "https://packagist.org/downloads/", 1928 | "license": [ 1929 | "MIT" 1930 | ], 1931 | "authors": [ 1932 | { 1933 | "name": "Gert de Pagter", 1934 | "email": "BackEndTea@gmail.com" 1935 | }, 1936 | { 1937 | "name": "Symfony Community", 1938 | "homepage": "https://symfony.com/contributors" 1939 | } 1940 | ], 1941 | "description": "Symfony polyfill for ctype functions", 1942 | "homepage": "https://symfony.com", 1943 | "keywords": [ 1944 | "compatibility", 1945 | "ctype", 1946 | "polyfill", 1947 | "portable" 1948 | ], 1949 | "support": { 1950 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" 1951 | }, 1952 | "funding": [ 1953 | { 1954 | "url": "https://symfony.com/sponsor", 1955 | "type": "custom" 1956 | }, 1957 | { 1958 | "url": "https://github.com/fabpot", 1959 | "type": "github" 1960 | }, 1961 | { 1962 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1963 | "type": "tidelift" 1964 | } 1965 | ], 1966 | "time": "2022-11-03T14:55:06+00:00" 1967 | }, 1968 | { 1969 | "name": "symfony/polyfill-intl-grapheme", 1970 | "version": "v1.27.0", 1971 | "source": { 1972 | "type": "git", 1973 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 1974 | "reference": "511a08c03c1960e08a883f4cffcacd219b758354" 1975 | }, 1976 | "dist": { 1977 | "type": "zip", 1978 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", 1979 | "reference": "511a08c03c1960e08a883f4cffcacd219b758354", 1980 | "shasum": "" 1981 | }, 1982 | "require": { 1983 | "php": ">=7.1" 1984 | }, 1985 | "suggest": { 1986 | "ext-intl": "For best performance" 1987 | }, 1988 | "type": "library", 1989 | "extra": { 1990 | "branch-alias": { 1991 | "dev-main": "1.27-dev" 1992 | }, 1993 | "thanks": { 1994 | "name": "symfony/polyfill", 1995 | "url": "https://github.com/symfony/polyfill" 1996 | } 1997 | }, 1998 | "autoload": { 1999 | "files": [ 2000 | "bootstrap.php" 2001 | ], 2002 | "psr-4": { 2003 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2004 | } 2005 | }, 2006 | "notification-url": "https://packagist.org/downloads/", 2007 | "license": [ 2008 | "MIT" 2009 | ], 2010 | "authors": [ 2011 | { 2012 | "name": "Nicolas Grekas", 2013 | "email": "p@tchwork.com" 2014 | }, 2015 | { 2016 | "name": "Symfony Community", 2017 | "homepage": "https://symfony.com/contributors" 2018 | } 2019 | ], 2020 | "description": "Symfony polyfill for intl's grapheme_* functions", 2021 | "homepage": "https://symfony.com", 2022 | "keywords": [ 2023 | "compatibility", 2024 | "grapheme", 2025 | "intl", 2026 | "polyfill", 2027 | "portable", 2028 | "shim" 2029 | ], 2030 | "support": { 2031 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" 2032 | }, 2033 | "funding": [ 2034 | { 2035 | "url": "https://symfony.com/sponsor", 2036 | "type": "custom" 2037 | }, 2038 | { 2039 | "url": "https://github.com/fabpot", 2040 | "type": "github" 2041 | }, 2042 | { 2043 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2044 | "type": "tidelift" 2045 | } 2046 | ], 2047 | "time": "2022-11-03T14:55:06+00:00" 2048 | }, 2049 | { 2050 | "name": "symfony/polyfill-intl-normalizer", 2051 | "version": "v1.27.0", 2052 | "source": { 2053 | "type": "git", 2054 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2055 | "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" 2056 | }, 2057 | "dist": { 2058 | "type": "zip", 2059 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", 2060 | "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", 2061 | "shasum": "" 2062 | }, 2063 | "require": { 2064 | "php": ">=7.1" 2065 | }, 2066 | "suggest": { 2067 | "ext-intl": "For best performance" 2068 | }, 2069 | "type": "library", 2070 | "extra": { 2071 | "branch-alias": { 2072 | "dev-main": "1.27-dev" 2073 | }, 2074 | "thanks": { 2075 | "name": "symfony/polyfill", 2076 | "url": "https://github.com/symfony/polyfill" 2077 | } 2078 | }, 2079 | "autoload": { 2080 | "files": [ 2081 | "bootstrap.php" 2082 | ], 2083 | "psr-4": { 2084 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2085 | }, 2086 | "classmap": [ 2087 | "Resources/stubs" 2088 | ] 2089 | }, 2090 | "notification-url": "https://packagist.org/downloads/", 2091 | "license": [ 2092 | "MIT" 2093 | ], 2094 | "authors": [ 2095 | { 2096 | "name": "Nicolas Grekas", 2097 | "email": "p@tchwork.com" 2098 | }, 2099 | { 2100 | "name": "Symfony Community", 2101 | "homepage": "https://symfony.com/contributors" 2102 | } 2103 | ], 2104 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2105 | "homepage": "https://symfony.com", 2106 | "keywords": [ 2107 | "compatibility", 2108 | "intl", 2109 | "normalizer", 2110 | "polyfill", 2111 | "portable", 2112 | "shim" 2113 | ], 2114 | "support": { 2115 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" 2116 | }, 2117 | "funding": [ 2118 | { 2119 | "url": "https://symfony.com/sponsor", 2120 | "type": "custom" 2121 | }, 2122 | { 2123 | "url": "https://github.com/fabpot", 2124 | "type": "github" 2125 | }, 2126 | { 2127 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2128 | "type": "tidelift" 2129 | } 2130 | ], 2131 | "time": "2022-11-03T14:55:06+00:00" 2132 | }, 2133 | { 2134 | "name": "symfony/polyfill-mbstring", 2135 | "version": "v1.27.0", 2136 | "source": { 2137 | "type": "git", 2138 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2139 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" 2140 | }, 2141 | "dist": { 2142 | "type": "zip", 2143 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 2144 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 2145 | "shasum": "" 2146 | }, 2147 | "require": { 2148 | "php": ">=7.1" 2149 | }, 2150 | "provide": { 2151 | "ext-mbstring": "*" 2152 | }, 2153 | "suggest": { 2154 | "ext-mbstring": "For best performance" 2155 | }, 2156 | "type": "library", 2157 | "extra": { 2158 | "branch-alias": { 2159 | "dev-main": "1.27-dev" 2160 | }, 2161 | "thanks": { 2162 | "name": "symfony/polyfill", 2163 | "url": "https://github.com/symfony/polyfill" 2164 | } 2165 | }, 2166 | "autoload": { 2167 | "files": [ 2168 | "bootstrap.php" 2169 | ], 2170 | "psr-4": { 2171 | "Symfony\\Polyfill\\Mbstring\\": "" 2172 | } 2173 | }, 2174 | "notification-url": "https://packagist.org/downloads/", 2175 | "license": [ 2176 | "MIT" 2177 | ], 2178 | "authors": [ 2179 | { 2180 | "name": "Nicolas Grekas", 2181 | "email": "p@tchwork.com" 2182 | }, 2183 | { 2184 | "name": "Symfony Community", 2185 | "homepage": "https://symfony.com/contributors" 2186 | } 2187 | ], 2188 | "description": "Symfony polyfill for the Mbstring extension", 2189 | "homepage": "https://symfony.com", 2190 | "keywords": [ 2191 | "compatibility", 2192 | "mbstring", 2193 | "polyfill", 2194 | "portable", 2195 | "shim" 2196 | ], 2197 | "support": { 2198 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" 2199 | }, 2200 | "funding": [ 2201 | { 2202 | "url": "https://symfony.com/sponsor", 2203 | "type": "custom" 2204 | }, 2205 | { 2206 | "url": "https://github.com/fabpot", 2207 | "type": "github" 2208 | }, 2209 | { 2210 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2211 | "type": "tidelift" 2212 | } 2213 | ], 2214 | "time": "2022-11-03T14:55:06+00:00" 2215 | }, 2216 | { 2217 | "name": "symfony/polyfill-php72", 2218 | "version": "v1.27.0", 2219 | "source": { 2220 | "type": "git", 2221 | "url": "https://github.com/symfony/polyfill-php72.git", 2222 | "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" 2223 | }, 2224 | "dist": { 2225 | "type": "zip", 2226 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", 2227 | "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", 2228 | "shasum": "" 2229 | }, 2230 | "require": { 2231 | "php": ">=7.1" 2232 | }, 2233 | "type": "library", 2234 | "extra": { 2235 | "branch-alias": { 2236 | "dev-main": "1.27-dev" 2237 | }, 2238 | "thanks": { 2239 | "name": "symfony/polyfill", 2240 | "url": "https://github.com/symfony/polyfill" 2241 | } 2242 | }, 2243 | "autoload": { 2244 | "files": [ 2245 | "bootstrap.php" 2246 | ], 2247 | "psr-4": { 2248 | "Symfony\\Polyfill\\Php72\\": "" 2249 | } 2250 | }, 2251 | "notification-url": "https://packagist.org/downloads/", 2252 | "license": [ 2253 | "MIT" 2254 | ], 2255 | "authors": [ 2256 | { 2257 | "name": "Nicolas Grekas", 2258 | "email": "p@tchwork.com" 2259 | }, 2260 | { 2261 | "name": "Symfony Community", 2262 | "homepage": "https://symfony.com/contributors" 2263 | } 2264 | ], 2265 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 2266 | "homepage": "https://symfony.com", 2267 | "keywords": [ 2268 | "compatibility", 2269 | "polyfill", 2270 | "portable", 2271 | "shim" 2272 | ], 2273 | "support": { 2274 | "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" 2275 | }, 2276 | "funding": [ 2277 | { 2278 | "url": "https://symfony.com/sponsor", 2279 | "type": "custom" 2280 | }, 2281 | { 2282 | "url": "https://github.com/fabpot", 2283 | "type": "github" 2284 | }, 2285 | { 2286 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2287 | "type": "tidelift" 2288 | } 2289 | ], 2290 | "time": "2022-11-03T14:55:06+00:00" 2291 | }, 2292 | { 2293 | "name": "symfony/polyfill-php80", 2294 | "version": "v1.27.0", 2295 | "source": { 2296 | "type": "git", 2297 | "url": "https://github.com/symfony/polyfill-php80.git", 2298 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" 2299 | }, 2300 | "dist": { 2301 | "type": "zip", 2302 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", 2303 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", 2304 | "shasum": "" 2305 | }, 2306 | "require": { 2307 | "php": ">=7.1" 2308 | }, 2309 | "type": "library", 2310 | "extra": { 2311 | "branch-alias": { 2312 | "dev-main": "1.27-dev" 2313 | }, 2314 | "thanks": { 2315 | "name": "symfony/polyfill", 2316 | "url": "https://github.com/symfony/polyfill" 2317 | } 2318 | }, 2319 | "autoload": { 2320 | "files": [ 2321 | "bootstrap.php" 2322 | ], 2323 | "psr-4": { 2324 | "Symfony\\Polyfill\\Php80\\": "" 2325 | }, 2326 | "classmap": [ 2327 | "Resources/stubs" 2328 | ] 2329 | }, 2330 | "notification-url": "https://packagist.org/downloads/", 2331 | "license": [ 2332 | "MIT" 2333 | ], 2334 | "authors": [ 2335 | { 2336 | "name": "Ion Bazan", 2337 | "email": "ion.bazan@gmail.com" 2338 | }, 2339 | { 2340 | "name": "Nicolas Grekas", 2341 | "email": "p@tchwork.com" 2342 | }, 2343 | { 2344 | "name": "Symfony Community", 2345 | "homepage": "https://symfony.com/contributors" 2346 | } 2347 | ], 2348 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2349 | "homepage": "https://symfony.com", 2350 | "keywords": [ 2351 | "compatibility", 2352 | "polyfill", 2353 | "portable", 2354 | "shim" 2355 | ], 2356 | "support": { 2357 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" 2358 | }, 2359 | "funding": [ 2360 | { 2361 | "url": "https://symfony.com/sponsor", 2362 | "type": "custom" 2363 | }, 2364 | { 2365 | "url": "https://github.com/fabpot", 2366 | "type": "github" 2367 | }, 2368 | { 2369 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2370 | "type": "tidelift" 2371 | } 2372 | ], 2373 | "time": "2022-11-03T14:55:06+00:00" 2374 | }, 2375 | { 2376 | "name": "symfony/service-contracts", 2377 | "version": "v3.2.0", 2378 | "source": { 2379 | "type": "git", 2380 | "url": "https://github.com/symfony/service-contracts.git", 2381 | "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" 2382 | }, 2383 | "dist": { 2384 | "type": "zip", 2385 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", 2386 | "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", 2387 | "shasum": "" 2388 | }, 2389 | "require": { 2390 | "php": ">=8.1", 2391 | "psr/container": "^2.0" 2392 | }, 2393 | "conflict": { 2394 | "ext-psr": "<1.1|>=2" 2395 | }, 2396 | "suggest": { 2397 | "symfony/service-implementation": "" 2398 | }, 2399 | "type": "library", 2400 | "extra": { 2401 | "branch-alias": { 2402 | "dev-main": "3.3-dev" 2403 | }, 2404 | "thanks": { 2405 | "name": "symfony/contracts", 2406 | "url": "https://github.com/symfony/contracts" 2407 | } 2408 | }, 2409 | "autoload": { 2410 | "psr-4": { 2411 | "Symfony\\Contracts\\Service\\": "" 2412 | }, 2413 | "exclude-from-classmap": [ 2414 | "/Test/" 2415 | ] 2416 | }, 2417 | "notification-url": "https://packagist.org/downloads/", 2418 | "license": [ 2419 | "MIT" 2420 | ], 2421 | "authors": [ 2422 | { 2423 | "name": "Nicolas Grekas", 2424 | "email": "p@tchwork.com" 2425 | }, 2426 | { 2427 | "name": "Symfony Community", 2428 | "homepage": "https://symfony.com/contributors" 2429 | } 2430 | ], 2431 | "description": "Generic abstractions related to writing services", 2432 | "homepage": "https://symfony.com", 2433 | "keywords": [ 2434 | "abstractions", 2435 | "contracts", 2436 | "decoupling", 2437 | "interfaces", 2438 | "interoperability", 2439 | "standards" 2440 | ], 2441 | "support": { 2442 | "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" 2443 | }, 2444 | "funding": [ 2445 | { 2446 | "url": "https://symfony.com/sponsor", 2447 | "type": "custom" 2448 | }, 2449 | { 2450 | "url": "https://github.com/fabpot", 2451 | "type": "github" 2452 | }, 2453 | { 2454 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2455 | "type": "tidelift" 2456 | } 2457 | ], 2458 | "time": "2022-11-25T10:21:52+00:00" 2459 | }, 2460 | { 2461 | "name": "symfony/string", 2462 | "version": "v6.2.5", 2463 | "source": { 2464 | "type": "git", 2465 | "url": "https://github.com/symfony/string.git", 2466 | "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" 2467 | }, 2468 | "dist": { 2469 | "type": "zip", 2470 | "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", 2471 | "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", 2472 | "shasum": "" 2473 | }, 2474 | "require": { 2475 | "php": ">=8.1", 2476 | "symfony/polyfill-ctype": "~1.8", 2477 | "symfony/polyfill-intl-grapheme": "~1.0", 2478 | "symfony/polyfill-intl-normalizer": "~1.0", 2479 | "symfony/polyfill-mbstring": "~1.0" 2480 | }, 2481 | "conflict": { 2482 | "symfony/translation-contracts": "<2.0" 2483 | }, 2484 | "require-dev": { 2485 | "symfony/error-handler": "^5.4|^6.0", 2486 | "symfony/http-client": "^5.4|^6.0", 2487 | "symfony/intl": "^6.2", 2488 | "symfony/translation-contracts": "^2.0|^3.0", 2489 | "symfony/var-exporter": "^5.4|^6.0" 2490 | }, 2491 | "type": "library", 2492 | "autoload": { 2493 | "files": [ 2494 | "Resources/functions.php" 2495 | ], 2496 | "psr-4": { 2497 | "Symfony\\Component\\String\\": "" 2498 | }, 2499 | "exclude-from-classmap": [ 2500 | "/Tests/" 2501 | ] 2502 | }, 2503 | "notification-url": "https://packagist.org/downloads/", 2504 | "license": [ 2505 | "MIT" 2506 | ], 2507 | "authors": [ 2508 | { 2509 | "name": "Nicolas Grekas", 2510 | "email": "p@tchwork.com" 2511 | }, 2512 | { 2513 | "name": "Symfony Community", 2514 | "homepage": "https://symfony.com/contributors" 2515 | } 2516 | ], 2517 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 2518 | "homepage": "https://symfony.com", 2519 | "keywords": [ 2520 | "grapheme", 2521 | "i18n", 2522 | "string", 2523 | "unicode", 2524 | "utf-8", 2525 | "utf8" 2526 | ], 2527 | "support": { 2528 | "source": "https://github.com/symfony/string/tree/v6.2.5" 2529 | }, 2530 | "funding": [ 2531 | { 2532 | "url": "https://symfony.com/sponsor", 2533 | "type": "custom" 2534 | }, 2535 | { 2536 | "url": "https://github.com/fabpot", 2537 | "type": "github" 2538 | }, 2539 | { 2540 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2541 | "type": "tidelift" 2542 | } 2543 | ], 2544 | "time": "2023-01-01T08:38:09+00:00" 2545 | }, 2546 | { 2547 | "name": "symfony/translation-contracts", 2548 | "version": "v2.5.2", 2549 | "source": { 2550 | "type": "git", 2551 | "url": "https://github.com/symfony/translation-contracts.git", 2552 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" 2553 | }, 2554 | "dist": { 2555 | "type": "zip", 2556 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", 2557 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", 2558 | "shasum": "" 2559 | }, 2560 | "require": { 2561 | "php": ">=7.2.5" 2562 | }, 2563 | "suggest": { 2564 | "symfony/translation-implementation": "" 2565 | }, 2566 | "type": "library", 2567 | "extra": { 2568 | "branch-alias": { 2569 | "dev-main": "2.5-dev" 2570 | }, 2571 | "thanks": { 2572 | "name": "symfony/contracts", 2573 | "url": "https://github.com/symfony/contracts" 2574 | } 2575 | }, 2576 | "autoload": { 2577 | "psr-4": { 2578 | "Symfony\\Contracts\\Translation\\": "" 2579 | } 2580 | }, 2581 | "notification-url": "https://packagist.org/downloads/", 2582 | "license": [ 2583 | "MIT" 2584 | ], 2585 | "authors": [ 2586 | { 2587 | "name": "Nicolas Grekas", 2588 | "email": "p@tchwork.com" 2589 | }, 2590 | { 2591 | "name": "Symfony Community", 2592 | "homepage": "https://symfony.com/contributors" 2593 | } 2594 | ], 2595 | "description": "Generic abstractions related to translation", 2596 | "homepage": "https://symfony.com", 2597 | "keywords": [ 2598 | "abstractions", 2599 | "contracts", 2600 | "decoupling", 2601 | "interfaces", 2602 | "interoperability", 2603 | "standards" 2604 | ], 2605 | "support": { 2606 | "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" 2607 | }, 2608 | "funding": [ 2609 | { 2610 | "url": "https://symfony.com/sponsor", 2611 | "type": "custom" 2612 | }, 2613 | { 2614 | "url": "https://github.com/fabpot", 2615 | "type": "github" 2616 | }, 2617 | { 2618 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2619 | "type": "tidelift" 2620 | } 2621 | ], 2622 | "time": "2022-06-27T16:58:25+00:00" 2623 | }, 2624 | { 2625 | "name": "symfony/validator", 2626 | "version": "v4.4.48", 2627 | "source": { 2628 | "type": "git", 2629 | "url": "https://github.com/symfony/validator.git", 2630 | "reference": "54781a4c41efbd283b779110bf8ae7f263737775" 2631 | }, 2632 | "dist": { 2633 | "type": "zip", 2634 | "url": "https://api.github.com/repos/symfony/validator/zipball/54781a4c41efbd283b779110bf8ae7f263737775", 2635 | "reference": "54781a4c41efbd283b779110bf8ae7f263737775", 2636 | "shasum": "" 2637 | }, 2638 | "require": { 2639 | "php": ">=7.1.3", 2640 | "symfony/polyfill-ctype": "~1.8", 2641 | "symfony/polyfill-mbstring": "~1.0", 2642 | "symfony/polyfill-php80": "^1.16", 2643 | "symfony/translation-contracts": "^1.1|^2" 2644 | }, 2645 | "conflict": { 2646 | "doctrine/lexer": "<1.1", 2647 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 2648 | "symfony/dependency-injection": "<3.4", 2649 | "symfony/http-kernel": "<4.4", 2650 | "symfony/intl": "<4.3", 2651 | "symfony/translation": ">=5.0", 2652 | "symfony/yaml": "<3.4" 2653 | }, 2654 | "require-dev": { 2655 | "doctrine/annotations": "^1.10.4", 2656 | "doctrine/cache": "^1.0|^2.0", 2657 | "egulias/email-validator": "^2.1.10|^3", 2658 | "symfony/cache": "^3.4|^4.0|^5.0", 2659 | "symfony/config": "^3.4|^4.0|^5.0", 2660 | "symfony/dependency-injection": "^3.4|^4.0|^5.0", 2661 | "symfony/expression-language": "^3.4|^4.0|^5.0", 2662 | "symfony/http-client": "^4.3|^5.0", 2663 | "symfony/http-foundation": "^4.1|^5.0", 2664 | "symfony/http-kernel": "^4.4", 2665 | "symfony/intl": "^4.3|^5.0", 2666 | "symfony/mime": "^4.4|^5.0", 2667 | "symfony/property-access": "^3.4|^4.0|^5.0", 2668 | "symfony/property-info": "^3.4|^4.0|^5.0", 2669 | "symfony/translation": "^4.2", 2670 | "symfony/yaml": "^3.4|^4.0|^5.0" 2671 | }, 2672 | "suggest": { 2673 | "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", 2674 | "doctrine/cache": "For using the default cached annotation reader.", 2675 | "egulias/email-validator": "Strict (RFC compliant) email validation", 2676 | "psr/cache-implementation": "For using the mapping cache.", 2677 | "symfony/config": "", 2678 | "symfony/expression-language": "For using the Expression validator", 2679 | "symfony/http-foundation": "", 2680 | "symfony/intl": "", 2681 | "symfony/property-access": "For accessing properties within comparison constraints", 2682 | "symfony/property-info": "To automatically add NotNull and Type constraints", 2683 | "symfony/translation": "For translating validation errors.", 2684 | "symfony/yaml": "" 2685 | }, 2686 | "type": "library", 2687 | "autoload": { 2688 | "psr-4": { 2689 | "Symfony\\Component\\Validator\\": "" 2690 | }, 2691 | "exclude-from-classmap": [ 2692 | "/Tests/" 2693 | ] 2694 | }, 2695 | "notification-url": "https://packagist.org/downloads/", 2696 | "license": [ 2697 | "MIT" 2698 | ], 2699 | "authors": [ 2700 | { 2701 | "name": "Fabien Potencier", 2702 | "email": "fabien@symfony.com" 2703 | }, 2704 | { 2705 | "name": "Symfony Community", 2706 | "homepage": "https://symfony.com/contributors" 2707 | } 2708 | ], 2709 | "description": "Provides tools to validate values", 2710 | "homepage": "https://symfony.com", 2711 | "support": { 2712 | "source": "https://github.com/symfony/validator/tree/v4.4.48" 2713 | }, 2714 | "funding": [ 2715 | { 2716 | "url": "https://symfony.com/sponsor", 2717 | "type": "custom" 2718 | }, 2719 | { 2720 | "url": "https://github.com/fabpot", 2721 | "type": "github" 2722 | }, 2723 | { 2724 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2725 | "type": "tidelift" 2726 | } 2727 | ], 2728 | "time": "2022-10-25T13:54:11+00:00" 2729 | }, 2730 | { 2731 | "name": "symfony/yaml", 2732 | "version": "v4.4.45", 2733 | "source": { 2734 | "type": "git", 2735 | "url": "https://github.com/symfony/yaml.git", 2736 | "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" 2737 | }, 2738 | "dist": { 2739 | "type": "zip", 2740 | "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", 2741 | "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", 2742 | "shasum": "" 2743 | }, 2744 | "require": { 2745 | "php": ">=7.1.3", 2746 | "symfony/polyfill-ctype": "~1.8" 2747 | }, 2748 | "conflict": { 2749 | "symfony/console": "<3.4" 2750 | }, 2751 | "require-dev": { 2752 | "symfony/console": "^3.4|^4.0|^5.0" 2753 | }, 2754 | "suggest": { 2755 | "symfony/console": "For validating YAML files using the lint command" 2756 | }, 2757 | "type": "library", 2758 | "autoload": { 2759 | "psr-4": { 2760 | "Symfony\\Component\\Yaml\\": "" 2761 | }, 2762 | "exclude-from-classmap": [ 2763 | "/Tests/" 2764 | ] 2765 | }, 2766 | "notification-url": "https://packagist.org/downloads/", 2767 | "license": [ 2768 | "MIT" 2769 | ], 2770 | "authors": [ 2771 | { 2772 | "name": "Fabien Potencier", 2773 | "email": "fabien@symfony.com" 2774 | }, 2775 | { 2776 | "name": "Symfony Community", 2777 | "homepage": "https://symfony.com/contributors" 2778 | } 2779 | ], 2780 | "description": "Loads and dumps YAML files", 2781 | "homepage": "https://symfony.com", 2782 | "support": { 2783 | "source": "https://github.com/symfony/yaml/tree/v4.4.45" 2784 | }, 2785 | "funding": [ 2786 | { 2787 | "url": "https://symfony.com/sponsor", 2788 | "type": "custom" 2789 | }, 2790 | { 2791 | "url": "https://github.com/fabpot", 2792 | "type": "github" 2793 | }, 2794 | { 2795 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2796 | "type": "tidelift" 2797 | } 2798 | ], 2799 | "time": "2022-08-02T15:47:23+00:00" 2800 | }, 2801 | { 2802 | "name": "webmozart/assert", 2803 | "version": "1.11.0", 2804 | "source": { 2805 | "type": "git", 2806 | "url": "https://github.com/webmozarts/assert.git", 2807 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" 2808 | }, 2809 | "dist": { 2810 | "type": "zip", 2811 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", 2812 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", 2813 | "shasum": "" 2814 | }, 2815 | "require": { 2816 | "ext-ctype": "*", 2817 | "php": "^7.2 || ^8.0" 2818 | }, 2819 | "conflict": { 2820 | "phpstan/phpstan": "<0.12.20", 2821 | "vimeo/psalm": "<4.6.1 || 4.6.2" 2822 | }, 2823 | "require-dev": { 2824 | "phpunit/phpunit": "^8.5.13" 2825 | }, 2826 | "type": "library", 2827 | "extra": { 2828 | "branch-alias": { 2829 | "dev-master": "1.10-dev" 2830 | } 2831 | }, 2832 | "autoload": { 2833 | "psr-4": { 2834 | "Webmozart\\Assert\\": "src/" 2835 | } 2836 | }, 2837 | "notification-url": "https://packagist.org/downloads/", 2838 | "license": [ 2839 | "MIT" 2840 | ], 2841 | "authors": [ 2842 | { 2843 | "name": "Bernhard Schussek", 2844 | "email": "bschussek@gmail.com" 2845 | } 2846 | ], 2847 | "description": "Assertions to validate method input/output with nice error messages.", 2848 | "keywords": [ 2849 | "assert", 2850 | "check", 2851 | "validate" 2852 | ], 2853 | "support": { 2854 | "issues": "https://github.com/webmozarts/assert/issues", 2855 | "source": "https://github.com/webmozarts/assert/tree/1.11.0" 2856 | }, 2857 | "time": "2022-06-03T18:03:27+00:00" 2858 | }, 2859 | { 2860 | "name": "webmozart/path-util", 2861 | "version": "2.3.0", 2862 | "source": { 2863 | "type": "git", 2864 | "url": "https://github.com/webmozart/path-util.git", 2865 | "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" 2866 | }, 2867 | "dist": { 2868 | "type": "zip", 2869 | "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", 2870 | "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", 2871 | "shasum": "" 2872 | }, 2873 | "require": { 2874 | "php": ">=5.3.3", 2875 | "webmozart/assert": "~1.0" 2876 | }, 2877 | "require-dev": { 2878 | "phpunit/phpunit": "^4.6", 2879 | "sebastian/version": "^1.0.1" 2880 | }, 2881 | "type": "library", 2882 | "extra": { 2883 | "branch-alias": { 2884 | "dev-master": "2.3-dev" 2885 | } 2886 | }, 2887 | "autoload": { 2888 | "psr-4": { 2889 | "Webmozart\\PathUtil\\": "src/" 2890 | } 2891 | }, 2892 | "notification-url": "https://packagist.org/downloads/", 2893 | "license": [ 2894 | "MIT" 2895 | ], 2896 | "authors": [ 2897 | { 2898 | "name": "Bernhard Schussek", 2899 | "email": "bschussek@gmail.com" 2900 | } 2901 | ], 2902 | "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", 2903 | "support": { 2904 | "issues": "https://github.com/webmozart/path-util/issues", 2905 | "source": "https://github.com/webmozart/path-util/tree/2.3.0" 2906 | }, 2907 | "abandoned": "symfony/filesystem", 2908 | "time": "2015-12-17T08:42:14+00:00" 2909 | } 2910 | ], 2911 | "packages-dev": [], 2912 | "aliases": [], 2913 | "minimum-stability": "stable", 2914 | "stability-flags": [], 2915 | "prefer-stable": false, 2916 | "prefer-lowest": false, 2917 | "platform": { 2918 | "php": "^8.2" 2919 | }, 2920 | "platform-dev": [], 2921 | "plugin-api-version": "2.3.0" 2922 | } 2923 | --------------------------------------------------------------------------------