├── .github ├── FUNDING.yml └── workflows │ ├── continuous-integration.yml │ └── release-on-milestone-closed.yml ├── src ├── autoload.php ├── Replacements.php ├── Module.php ├── RewriteRules.php ├── Autoloader.php └── ConfigPostProcessor.php ├── COPYRIGHT.md ├── renovate.json ├── psalm.xml.dist ├── LICENSE.md ├── composer.json ├── README.md ├── psalm-baseline.xml ├── config └── replacements.php └── composer.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | community_bridge: laminas-project 2 | -------------------------------------------------------------------------------- /src/autoload.php: -------------------------------------------------------------------------------- 1 | laminas/.github:renovate-config" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.github/workflows/continuous-integration.yml: -------------------------------------------------------------------------------- 1 | name: "Continuous Integration" 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | tags: 8 | 9 | jobs: 10 | ci: 11 | uses: laminas/workflow-continuous-integration/.github/workflows/continuous-integration.yml@1.x 12 | -------------------------------------------------------------------------------- /.github/workflows/release-on-milestone-closed.yml: -------------------------------------------------------------------------------- 1 | name: "Automatic Releases" 2 | 3 | on: 4 | milestone: 5 | types: 6 | - "closed" 7 | 8 | jobs: 9 | release: 10 | uses: laminas/workflow-automatic-releases/.github/workflows/release-on-milestone-closed.yml@1.x 11 | secrets: 12 | GIT_AUTHOR_EMAIL: ${{ secrets.GIT_AUTHOR_EMAIL }} 13 | GIT_AUTHOR_NAME: ${{ secrets.GIT_AUTHOR_NAME }} 14 | ORGANIZATION_ADMIN_TOKEN: ${{ secrets.ORGANIZATION_ADMIN_TOKEN }} 15 | SIGNING_SECRET_KEY: ${{ secrets.SIGNING_SECRET_KEY }} 16 | -------------------------------------------------------------------------------- /src/Replacements.php: -------------------------------------------------------------------------------- 1 | replacements = array_merge( 18 | require __DIR__ . '/../config/replacements.php', 19 | $additionalReplacements 20 | ); 21 | 22 | // Provide multiple variants of strings containing namespace separators 23 | foreach ($this->replacements as $original => $replacement) { 24 | if (false === strpos($original, '\\')) { 25 | continue; 26 | } 27 | $this->replacements[str_replace('\\', '\\\\', $original)] = str_replace('\\', '\\\\', $replacement); 28 | $this->replacements[str_replace('\\', '\\\\\\\\', $original)] = str_replace('\\', '\\\\\\\\', $replacement); 29 | } 30 | } 31 | 32 | /** 33 | * @param string $value 34 | * @return string 35 | */ 36 | public function replace($value) 37 | { 38 | return strtr($value, $this->replacements); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /psalm.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 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 | -------------------------------------------------------------------------------- /src/Module.php: -------------------------------------------------------------------------------- 1 | getEventManager() 23 | ->attach('mergeConfig', [$this, 'onMergeConfig']); 24 | } 25 | 26 | /** 27 | * Perform substitutions in the merged configuration. 28 | * 29 | * Rewrites keys and values matching known ZF classes, namespaces, and 30 | * configuration keys to their Laminas equivalents. 31 | * 32 | * Type-hinting deliberately omitted to allow unit testing 33 | * without dependencies on packages that do not exist yet. 34 | * 35 | * @param ModuleEvent $event 36 | */ 37 | public function onMergeConfig($event) 38 | { 39 | /** @var ConfigMergerInterface */ 40 | $configMerger = $event->getConfigListener(); 41 | $processor = new ConfigPostProcessor(); 42 | $configMerger->setMergedConfig( 43 | $processor( 44 | $configMerger->getMergedConfig($returnAsObject = false) 45 | ) 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | - Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | - Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | - Neither the name of Laminas Foundation nor the names of its contributors may 14 | be used to endorse or promote products derived from this software without 15 | specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 21 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 24 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laminas/laminas-zendframework-bridge", 3 | "description": "Alias legacy ZF class names to Laminas Project equivalents.", 4 | "license": "BSD-3-Clause", 5 | "keywords": [ 6 | "autoloading", 7 | "laminas", 8 | "zf", 9 | "zendframework" 10 | ], 11 | "support": { 12 | "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", 13 | "source": "https://github.com/laminas/laminas-zendframework-bridge", 14 | "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", 15 | "forum": "https://discourse.laminas.dev/" 16 | }, 17 | "abandoned": true, 18 | "require": { 19 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0" 20 | }, 21 | "require-dev": { 22 | "phpunit/phpunit": "^10.4", 23 | "psalm/plugin-phpunit": "^0.18.0", 24 | "squizlabs/php_codesniffer": "^3.7.1", 25 | "vimeo/psalm": "^5.16.0" 26 | }, 27 | "autoload": { 28 | "files": [ 29 | "src/autoload.php" 30 | ], 31 | "psr-4": { 32 | "Laminas\\ZendFrameworkBridge\\": "src//" 33 | } 34 | }, 35 | "autoload-dev": { 36 | "files": [ 37 | "test/classes.php" 38 | ], 39 | "psr-4": { 40 | "LaminasTest\\ZendFrameworkBridge\\": "test/", 41 | "LaminasTest\\ZendFrameworkBridge\\TestAsset\\": "test/TestAsset/classes/", 42 | "Laminas\\ApiTools\\": "test/TestAsset/LaminasApiTools/", 43 | "Mezzio\\": "test/TestAsset/Mezzio/", 44 | "Laminas\\": "test/TestAsset/Laminas/" 45 | } 46 | }, 47 | "extra": { 48 | "laminas": { 49 | "module": "Laminas\\ZendFrameworkBridge" 50 | } 51 | }, 52 | "config": { 53 | "sort-packages": true, 54 | "platform": { 55 | "php": "8.1.99" 56 | } 57 | }, 58 | "scripts": { 59 | "cs-check": "phpcs", 60 | "cs-fix": "phpcbf", 61 | "static-analysis": "psalm --shepherd --stats", 62 | "test": "phpunit --colors=always", 63 | "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/RewriteRules.php: -------------------------------------------------------------------------------- 1 | 'Mezzio\\ProblemDetails\\', 15 | 'Zend\\Expressive\\' => 'Mezzio\\', 16 | 17 | // Laminas 18 | 'Zend\\' => 'Laminas\\', 19 | 'ZF\\ComposerAutoloading\\' => 'Laminas\\ComposerAutoloading\\', 20 | 'ZF\\DevelopmentMode\\' => 'Laminas\\DevelopmentMode\\', 21 | 22 | // Apigility 23 | 'ZF\\Apigility\\' => 'Laminas\\ApiTools\\', 24 | 'ZF\\' => 'Laminas\\ApiTools\\', 25 | 26 | // ZendXml, API wrappers, zend-http OAuth support, zend-diagnostics, ZendDeveloperTools 27 | 'ZendXml\\' => 'Laminas\\Xml\\', 28 | 'ZendOAuth\\' => 'Laminas\\OAuth\\', 29 | 'ZendDiagnostics\\' => 'Laminas\\Diagnostics\\', 30 | 'ZendService\\ReCaptcha\\' => 'Laminas\\ReCaptcha\\', 31 | 'ZendService\\Twitter\\' => 'Laminas\\Twitter\\', 32 | 'ZendDeveloperTools\\' => 'Laminas\\DeveloperTools\\', 33 | ]; 34 | } 35 | 36 | /** 37 | * @return array 38 | */ 39 | public static function namespaceReverse() 40 | { 41 | return [ 42 | // ZendXml, ZendOAuth, ZendDiagnostics, ZendDeveloperTools 43 | 'Laminas\\Xml\\' => 'ZendXml\\', 44 | 'Laminas\\OAuth\\' => 'ZendOAuth\\', 45 | 'Laminas\\Diagnostics\\' => 'ZendDiagnostics\\', 46 | 'Laminas\\DeveloperTools\\' => 'ZendDeveloperTools\\', 47 | 48 | // Zend Service 49 | 'Laminas\\ReCaptcha\\' => 'ZendService\\ReCaptcha\\', 50 | 'Laminas\\Twitter\\' => 'ZendService\\Twitter\\', 51 | 52 | // Zend 53 | 'Laminas\\' => 'Zend\\', 54 | 55 | // Expressive 56 | 'Mezzio\\ProblemDetails\\' => 'Zend\\ProblemDetails\\', 57 | 'Mezzio\\' => 'Zend\\Expressive\\', 58 | 59 | // Laminas to ZfCampus 60 | 'Laminas\\ComposerAutoloading\\' => 'ZF\\ComposerAutoloading\\', 61 | 'Laminas\\DevelopmentMode\\' => 'ZF\\DevelopmentMode\\', 62 | 63 | // Apigility 64 | 'Laminas\\ApiTools\\Admin\\' => 'ZF\\Apigility\\Admin\\', 65 | 'Laminas\\ApiTools\\Doctrine\\' => 'ZF\\Apigility\\Doctrine\\', 66 | 'Laminas\\ApiTools\\Documentation\\' => 'ZF\\Apigility\\Documentation\\', 67 | 'Laminas\\ApiTools\\Example\\' => 'ZF\\Apigility\\Example\\', 68 | 'Laminas\\ApiTools\\Provider\\' => 'ZF\\Apigility\\Provider\\', 69 | 'Laminas\\ApiTools\\Welcome\\' => 'ZF\\Apiglity\\Welcome\\', 70 | 'Laminas\\ApiTools\\' => 'ZF\\', 71 | ]; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # laminas-zendframework-bridge 2 | 3 | [![Build Status](https://github.com/laminas/laminas-zendframework-bridge/workflows/Continuous%20Integration/badge.svg)](https://github.com/laminas/laminas-zendframework-bridge/actions?query=workflow%3A"Continuous+Integration") 4 | 5 | > This package is considered feature-complete, and is now in **security-only** maintenance mode, following a [decision by the Technical Steering Committee](https://github.com/laminas/technical-steering-committee/blob/6dc4d8a798021f690ad8c65d0d9a0c4b21835a1e/meetings/minutes/2022-07-11-TSC-Minutes.md#future-of-the-migration-layer). 6 | > If you have a security issue, please [follow our security reporting guidelines](https://getlaminas.org/security/). 7 | > If you wish to take on the role of maintainer, please [nominate yourself](https://github.com/laminas/technical-steering-committee/issues/new?assignees=&labels=Nomination&template=Maintainer_Nomination.md&title=%5BNOMINATION%5D%5BMAINTAINER%5D%3A+%7Bname+of+person+being+nominated%7D) 8 | 9 | > ## 🇷🇺 Русским гражданам 10 | > 11 | > Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм. 12 | > 13 | > У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую. 14 | > 15 | > Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!" 16 | > 17 | > ## 🇺🇸 To Citizens of Russia 18 | > 19 | > We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism. 20 | > 21 | > One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences. 22 | > 23 | > You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!" 24 | 25 | This library provides a custom autoloader that aliases legacy Zend Framework, 26 | Apigility, and Expressive classes to their replacements under the Laminas 27 | Project. 28 | 29 | This package should be installed only if you are also using the composer plugin 30 | that installs Laminas packages to replace ZF/Apigility/Expressive packages. 31 | 32 | This tool supports: 33 | 34 | - Zend Framework MVC projects, all v2 and v3 releases 35 | - Apigility projects, all stable versions 36 | - Expressive versions, all stable versions 37 | 38 | ## Installation 39 | 40 | Run the following to install this library: 41 | 42 | ```bash 43 | $ composer require laminas/laminas-zendframework-bridge 44 | ``` 45 | 46 | ## Configuration 47 | 48 | - Since 1.6.0 49 | 50 | You may provide additional replacements for the configuration post processor. 51 | This is particularly useful if your application uses third-party components that include class names that the post processor otherwise rewrites, and which you want to never rewrite. 52 | 53 | Configuration is via the following structure: 54 | 55 | ```php 56 | return [ 57 | 'laminas-zendframework-bridge' => [ 58 | 'replacements' => [ 59 | 'to-replace' => 'replacement', 60 | // ... 61 | ], 62 | ], 63 | ]; 64 | ``` 65 | 66 | As an example, if your configuration included the following dependency mapping: 67 | 68 | ```php 69 | return [ 70 | 'controller_plugins' => [ 71 | 'factories' => [ 72 | 'customZendFormBinder' => \CustomZendFormBinder\Controller\Plugin\Factory\BinderPluginFactory::class, 73 | ], 74 | ], 75 | ]; 76 | ``` 77 | 78 | And you wanted the two strings that contain the verbiage `ZendForm` to remain untouched, you could define the following replacements mapping: 79 | 80 | ```php 81 | return [ 82 | 'laminas-zendframework-bridge' => [ 83 | 'replacements' => [ 84 | // Never rewrite! 85 | 'customZendFormBinder' => 'customZendFormBinder', 86 | 'CustomZendFormBinder' => 'CustomZendFormBinder', 87 | ], 88 | ], 89 | ]; 90 | ``` 91 | 92 | ## Support 93 | 94 | - [Issues](https://github.com/laminas/laminas-zendframework-bridge/issues/) 95 | - [Forum](https://discourse.laminas.dev/) 96 | -------------------------------------------------------------------------------- /src/Autoloader.php: -------------------------------------------------------------------------------- 1 | $namespaces 80 | * @return callable(string): void 81 | */ 82 | private static function createPrependAutoloader(array $namespaces, ClassLoader $classLoader, ArrayObject $loaded) 83 | { 84 | /** 85 | * @param string $class Class name to autoload 86 | * @return void 87 | */ 88 | return static function ($class) use ($namespaces, $classLoader, $loaded): void { 89 | if (isset($loaded[$class])) { 90 | return; 91 | } 92 | 93 | $segments = explode('\\', $class); 94 | 95 | $i = 0; 96 | $check = ''; 97 | 98 | while (isset($segments[$i + 1], $namespaces[$check . $segments[$i] . '\\'])) { 99 | $check .= $segments[$i] . '\\'; 100 | ++$i; 101 | } 102 | 103 | if ($check === '') { 104 | return; 105 | } 106 | 107 | if ($classLoader->loadClass($class)) { 108 | $legacy = $namespaces[$check] 109 | . strtr(substr($class, strlen($check)), [ 110 | 'ApiTools' => 'Apigility', 111 | 'Mezzio' => 'Expressive', 112 | 'Laminas' => 'Zend', 113 | ]); 114 | class_alias($class, $legacy); 115 | } 116 | }; 117 | } 118 | 119 | /** 120 | * @param array $namespaces 121 | * @return callable(string): void 122 | */ 123 | private static function createAppendAutoloader(array $namespaces, ArrayObject $loaded) 124 | { 125 | /** 126 | * @param string $class Class name to autoload 127 | * @return void 128 | */ 129 | return static function ($class) use ($namespaces, $loaded) { 130 | $segments = explode('\\', $class); 131 | 132 | if ($segments[0] === 'ZendService' && isset($segments[1])) { 133 | $segments[0] .= '\\' . $segments[1]; 134 | unset($segments[1]); 135 | /** @psalm-suppress RedundantFunctionCall */ 136 | $segments = array_values($segments); 137 | } 138 | 139 | $i = 0; 140 | $check = ''; 141 | 142 | // We are checking segments of the namespace to match quicker 143 | while (isset($segments[$i + 1], $namespaces[$check . $segments[$i] . '\\'])) { 144 | $check .= $segments[$i] . '\\'; 145 | ++$i; 146 | } 147 | 148 | if ($check === '') { 149 | return; 150 | } 151 | 152 | $alias = $namespaces[$check] 153 | . strtr(substr($class, strlen($check)), [ 154 | 'Apigility' => 'ApiTools', 155 | 'Expressive' => 'Mezzio', 156 | 'Zend' => 'Laminas', 157 | 'AbstractZendServer' => 'AbstractZendServer', 158 | 'ZendServerDisk' => 'ZendServerDisk', 159 | 'ZendServerShm' => 'ZendServerShm', 160 | 'ZendMonitor' => 'ZendMonitor', 161 | ]); 162 | 163 | $loaded[$alias] = true; 164 | if (class_exists($alias) || interface_exists($alias) || trait_exists($alias)) { 165 | class_alias($alias, $class); 166 | } 167 | }; 168 | } 169 | 170 | private static function getClassLoaderFromVendorDirectory(string $composerVendorDirectory): ?ClassLoader 171 | { 172 | $filename = rtrim($composerVendorDirectory, '/') . '/autoload.php'; 173 | if (!file_exists($filename)) { 174 | return null; 175 | } 176 | 177 | /** @psalm-suppress MixedAssignment */ 178 | $loader = include $filename; 179 | if (!$loader instanceof ClassLoader) { 180 | return null; 181 | } 182 | 183 | return $loader; 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /psalm-baseline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 'LaminasAcl']]> 6 | 'LaminasRbac']]> 7 | 'LaminasRouter']]> 8 | 9 | 10 | 11 | 12 | RewriteRules::namespaceReverse() 13 | RewriteRules::namespaceRewrite() 14 | 15 | 16 | RedundantFunctionCall 17 | 18 | 19 | 20 | 21 | $keys 22 | 23 | 24 | $value 25 | $value 26 | $value 27 | $value 28 | 29 | 30 | function ($value) { 31 | function ($value) { 32 | function ($value, array $keys) { 33 | function ($value, array $keys) { 34 | 35 | 36 | replaceDependencyConfiguration 37 | replaceDependencyFactories 38 | replaceDependencyServices 39 | 40 | 41 | $config 42 | $newKey 43 | $newKey 44 | $newKey 45 | $target 46 | 47 | 48 | [$key] 49 | 50 | 51 | $config[$key] 52 | 53 | 54 | 55 | 56 | 57 | $aliases[$name] 58 | $config[$key] 59 | $keys[$key] 60 | $rewritten[$newKey] 61 | $rewritten[$newKey] 62 | $rewritten[$newKey] 63 | exactReplacements[$value]]]> 64 | 65 | 66 | $aliases[$name] 67 | 68 | 69 | $a[$key] 70 | $a[$key] 71 | $a[] 72 | $config 73 | $config 74 | $config[$key] 75 | 76 | 77 | $data 78 | $factory 79 | $factory 80 | $key 81 | $key 82 | $name 83 | $newKey 84 | $notIn[] 85 | $result 86 | $rewritten[$key] 87 | $rewritten[$key] 88 | $rewritten[$newKey] 89 | $rewritten[$newKey][] 90 | $serviceInstance 91 | $serviceInstance 92 | $target 93 | $value 94 | $value 95 | 96 | 97 | fallbackReplacement 98 | noopReplacement 99 | replaceDependencyConfiguration 100 | replaceExactValue 101 | 102 | 103 | 104 | 105 | init 106 | onMergeConfig 107 | 108 | 109 | $event 110 | $moduleManager 111 | 112 | 113 | ModuleEvent 114 | ModuleManager 115 | 116 | 117 | 118 | 119 | replacements]]> 120 | replacements]]> 121 | 122 | 123 | $replacement 124 | $replacement 125 | 126 | 127 | $original 128 | $original 129 | $original 130 | 131 | 132 | $replacement 133 | 134 | 135 | 139 | 140 | 141 | 142 | 143 | new $legacy() 144 | 145 | 146 | 147 | 148 | $config 149 | 150 | 151 | $config 152 | $expected 153 | 154 | 155 | iterable 156 | iterable 157 | 158 | 159 | require $configLocation 160 | require $expectedResultLocation 161 | 162 | 163 | 164 | 165 | $event 166 | $moduleManager 167 | 168 | 169 | $config 170 | 171 | 172 | $config 173 | $expected 174 | 175 | 176 | iterable 177 | 178 | 179 | require $configFile 180 | require $expectationsFile 181 | 182 | 183 | 184 | 185 | iterable 186 | 187 | 188 | 189 | 190 | AbstractZendServer 191 | ApiToolsModuleInterface 192 | ApiToolsProviderInterface 193 | ApiToolsVersionController 194 | Application 195 | Authentication 196 | AuthenticationAdapter 197 | Authorization 198 | Autoloading 199 | BaseModule 200 | DevelopmentMode 201 | LaminasAclFactory 202 | LaminasAuthentication 203 | LaminasBridge 204 | LaminasBridge 205 | LaminasRbac 206 | LaminasRouter 207 | LaminasViewRenderer 208 | Main 209 | Mezzio 210 | MezzioUrlGenerator 211 | MyClass 212 | MyClass 213 | OAuthService 214 | ProblemDetails 215 | Psr7Bridge 216 | Psr7Bridge 217 | Router 218 | RouterAdapter 219 | Service 220 | Tools 221 | Tools 222 | XmlService 223 | ZendMonitor 224 | ZendServerDisk 225 | ZendServerShm 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /src/ConfigPostProcessor.php: -------------------------------------------------------------------------------- 1 | true, 21 | 'factories' => true, 22 | 'invokables' => true, 23 | 'services' => true, 24 | ]; 25 | 26 | /** @var array String keys => string values */ 27 | private $exactReplacements = [ 28 | 'zend-expressive' => 'mezzio', 29 | 'zf-apigility' => 'api-tools', 30 | ]; 31 | 32 | /** 33 | * @psalm-suppress PropertyNotSetInConstructor Initialized during call to the only public method __invoke() 34 | * @var Replacements 35 | */ 36 | private $replacements; 37 | 38 | /** @var callable[] */ 39 | private $rulesets; 40 | 41 | public function __construct() 42 | { 43 | /* Define the rulesets for replacements. 44 | * 45 | * Each ruleset has the following signature: 46 | * 47 | * @param mixed $value 48 | * @param string[] $keys Full nested key hierarchy leading to the value 49 | * @return null|callable 50 | * 51 | * If no match is made, a null is returned, allowing it to fallback to 52 | * the next ruleset in the list. If a match is made, a callback is returned, 53 | * and that will be used to perform the replacement on the value. 54 | * 55 | * The callback should have the following signature: 56 | * 57 | * @param mixed $value 58 | * @param string[] $keys 59 | * @return mixed The transformed value 60 | */ 61 | $this->rulesets = [ 62 | // Exact values 63 | function ($value) { 64 | return is_string($value) && isset($this->exactReplacements[$value]) 65 | ? [$this, 'replaceExactValue'] 66 | : null; 67 | }, 68 | 69 | // Router (MVC applications) 70 | // We do not want to rewrite these. 71 | function ($value, array $keys) { 72 | $key = array_pop($keys); 73 | // Only worried about a top-level "router" key. 74 | return $key === 'router' && $keys === [] && is_array($value) 75 | ? [$this, 'noopReplacement'] 76 | : null; 77 | }, 78 | 79 | // service- and pluginmanager handling 80 | function ($value) { 81 | return is_array($value) && array_intersect_key(self::SERVICE_MANAGER_KEYS_OF_INTEREST, $value) !== [] 82 | ? [$this, 'replaceDependencyConfiguration'] 83 | : null; 84 | }, 85 | 86 | // Array values 87 | function ($value, array $keys) { 88 | return $keys !== [] && is_array($value) 89 | ? [$this, 'processConfig'] 90 | : null; 91 | }, 92 | ]; 93 | } 94 | 95 | /** 96 | * @param string[] $keys Hierarchy of keys, for determining location in 97 | * nested configuration. 98 | * @return array 99 | */ 100 | public function __invoke(array $config, array $keys = []) 101 | { 102 | $this->replacements = $this->initializeReplacements($config); 103 | return $this->processConfig($config, $keys); 104 | } 105 | 106 | /** 107 | * Perform substitutions as needed on an individual value. 108 | * 109 | * The $key is provided to allow fine-grained selection of rewrite rules. 110 | * 111 | * @param mixed $value 112 | * @param string[] $keys Key hierarchy 113 | * @param null|int|string $key 114 | * @return mixed 115 | */ 116 | private function replace($value, array $keys, $key = null) 117 | { 118 | // Add new key to the list of keys. 119 | // We do not need to remove it later, as we are working on a copy of the array. 120 | $keys[] = $key; 121 | 122 | // Identify rewrite strategy and perform replacements 123 | $rewriteRule = $this->replacementRuleMatch($value, $keys); 124 | return $rewriteRule($value, $keys); 125 | } 126 | 127 | /** 128 | * Merge two arrays together. 129 | * 130 | * If an integer key exists in both arrays, the value from the second array 131 | * will be appended to the first array. If both values are arrays, they are 132 | * merged together, else the value of the second array overwrites the one 133 | * of the first array. 134 | * 135 | * Based on zend-stdlib Zend\Stdlib\ArrayUtils::merge 136 | * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 137 | * 138 | * @return array 139 | */ 140 | public static function merge(array $a, array $b) 141 | { 142 | foreach ($b as $key => $value) { 143 | if (! isset($a[$key]) && ! array_key_exists($key, $a)) { 144 | $a[$key] = $value; 145 | continue; 146 | } 147 | 148 | if (null === $value && array_key_exists($key, $a)) { 149 | // Leave as-is if value from $b is null 150 | continue; 151 | } 152 | 153 | if (is_int($key)) { 154 | $a[] = $value; 155 | continue; 156 | } 157 | 158 | if (is_array($value) && is_array($a[$key])) { 159 | $a[$key] = static::merge($a[$key], $value); 160 | continue; 161 | } 162 | 163 | $a[$key] = $value; 164 | } 165 | 166 | return $a; 167 | } 168 | 169 | /** 170 | * @param mixed $value 171 | * @param null|int|string $key 172 | * @return callable Callable to invoke with value 173 | */ 174 | private function replacementRuleMatch($value, $key = null) 175 | { 176 | foreach ($this->rulesets as $ruleset) { 177 | $result = $ruleset($value, $key); 178 | if (is_callable($result)) { 179 | return $result; 180 | } 181 | } 182 | return [$this, 'fallbackReplacement']; 183 | } 184 | 185 | /** 186 | * Replace a value using the translation table, if the value is a string. 187 | * 188 | * @param mixed $value 189 | * @return mixed 190 | */ 191 | private function fallbackReplacement($value) 192 | { 193 | return is_string($value) 194 | ? $this->replacements->replace($value) 195 | : $value; 196 | } 197 | 198 | /** 199 | * Replace a value matched exactly. 200 | * 201 | * @param mixed $value 202 | * @return mixed 203 | */ 204 | private function replaceExactValue($value) 205 | { 206 | return $this->exactReplacements[$value]; 207 | } 208 | 209 | private function replaceDependencyConfiguration(array $config) 210 | { 211 | $aliases = isset($config['aliases']) && is_array($config['aliases']) 212 | ? $this->replaceDependencyAliases($config['aliases']) 213 | : []; 214 | 215 | if ($aliases) { 216 | $config['aliases'] = $aliases; 217 | } 218 | 219 | $config = $this->replaceDependencyInvokables($config); 220 | $config = $this->replaceDependencyFactories($config); 221 | $config = $this->replaceDependencyServices($config); 222 | 223 | $keys = self::SERVICE_MANAGER_KEYS_OF_INTEREST; 224 | foreach ($config as $key => $data) { 225 | if (isset($keys[$key])) { 226 | continue; 227 | } 228 | 229 | $config[$key] = is_array($data) ? $this->processConfig($data, [$key]) : $data; 230 | } 231 | 232 | return $config; 233 | } 234 | 235 | /** 236 | * Rewrite dependency aliases array 237 | * 238 | * In this case, we want to keep the alias as-is, but rewrite the target. 239 | * 240 | * We need also provide an additional alias if the alias key is a legacy class. 241 | * 242 | * @return array 243 | */ 244 | private function replaceDependencyAliases(array $aliases) 245 | { 246 | foreach ($aliases as $alias => $target) { 247 | if (! is_string($alias) || ! is_string($target)) { 248 | continue; 249 | } 250 | 251 | $newTarget = $this->replacements->replace($target); 252 | $newAlias = $this->replacements->replace($alias); 253 | 254 | $notIn = [$newTarget]; 255 | $name = $newTarget; 256 | while (isset($aliases[$name])) { 257 | $notIn[] = $aliases[$name]; 258 | $name = $aliases[$name]; 259 | } 260 | 261 | if ($newAlias === $alias && ! in_array($alias, $notIn, true)) { 262 | $aliases[$alias] = $newTarget; 263 | continue; 264 | } 265 | 266 | if (isset($aliases[$newAlias])) { 267 | continue; 268 | } 269 | 270 | if (! in_array($newAlias, $notIn, true)) { 271 | $aliases[$alias] = $newAlias; 272 | $aliases[$newAlias] = $newTarget; 273 | } 274 | } 275 | 276 | return $aliases; 277 | } 278 | 279 | /** 280 | * Rewrite dependency invokables array 281 | * 282 | * In this case, we want to keep the alias as-is, but rewrite the target. 283 | * 284 | * We need also provide an additional alias if invokable is defined with 285 | * an alias which is a legacy class. 286 | * 287 | * @return array 288 | */ 289 | private function replaceDependencyInvokables(array $config) 290 | { 291 | if (empty($config['invokables']) || ! is_array($config['invokables'])) { 292 | return $config; 293 | } 294 | 295 | foreach ($config['invokables'] as $alias => $target) { 296 | if (! is_string($alias)) { 297 | continue; 298 | } 299 | 300 | $newTarget = $this->replacements->replace($target); 301 | $newAlias = $this->replacements->replace($alias); 302 | 303 | if ($alias === $target || isset($config['aliases'][$newAlias])) { 304 | $config['invokables'][$alias] = $newTarget; 305 | continue; 306 | } 307 | 308 | $config['invokables'][$newAlias] = $newTarget; 309 | 310 | if ($newAlias === $alias) { 311 | continue; 312 | } 313 | 314 | $config['aliases'][$alias] = $newAlias; 315 | 316 | unset($config['invokables'][$alias]); 317 | } 318 | 319 | return $config; 320 | } 321 | 322 | /** 323 | * @param mixed $value 324 | * @return mixed Returns $value verbatim. 325 | */ 326 | private function noopReplacement($value) 327 | { 328 | return $value; 329 | } 330 | 331 | private function replaceDependencyFactories(array $config) 332 | { 333 | if (empty($config['factories']) || ! is_array($config['factories'])) { 334 | return $config; 335 | } 336 | 337 | foreach ($config['factories'] as $service => $factory) { 338 | if (! is_string($service)) { 339 | continue; 340 | } 341 | 342 | $replacedService = $this->replacements->replace($service); 343 | $factory = is_string($factory) ? $this->replacements->replace($factory) : $factory; 344 | $config['factories'][$replacedService] = $factory; 345 | 346 | if ($replacedService === $service) { 347 | continue; 348 | } 349 | 350 | unset($config['factories'][$service]); 351 | if (isset($config['aliases'][$service])) { 352 | continue; 353 | } 354 | 355 | $config['aliases'][$service] = $replacedService; 356 | } 357 | 358 | return $config; 359 | } 360 | 361 | private function replaceDependencyServices(array $config) 362 | { 363 | if (empty($config['services']) || ! is_array($config['services'])) { 364 | return $config; 365 | } 366 | 367 | foreach ($config['services'] as $service => $serviceInstance) { 368 | if (! is_string($service)) { 369 | continue; 370 | } 371 | 372 | $replacedService = $this->replacements->replace($service); 373 | $serviceInstance = is_array($serviceInstance) ? $this->processConfig($serviceInstance) : $serviceInstance; 374 | 375 | $config['services'][$replacedService] = $serviceInstance; 376 | 377 | if ($service === $replacedService) { 378 | continue; 379 | } 380 | 381 | unset($config['services'][$service]); 382 | 383 | if (isset($config['aliases'][$service])) { 384 | continue; 385 | } 386 | 387 | $config['aliases'][$service] = $replacedService; 388 | } 389 | 390 | return $config; 391 | } 392 | 393 | private function initializeReplacements(array $config): Replacements 394 | { 395 | $replacements = $config['laminas-zendframework-bridge']['replacements'] ?? []; 396 | if (! is_array($replacements)) { 397 | throw new RuntimeException(sprintf( 398 | 'Invalid laminas-zendframework-bridge.replacements configuration;' 399 | . ' value MUST be an array; received %s', 400 | is_object($replacements) ? get_class($replacements) : gettype($replacements) 401 | )); 402 | } 403 | 404 | foreach ($replacements as $lookup => $replacement) { 405 | if ( 406 | ! is_string($lookup) 407 | || ! is_string($replacement) 408 | || preg_match('/^\s*$/', $lookup) 409 | || preg_match('/^\s*$/', $replacement) 410 | ) { 411 | throw new RuntimeException( 412 | 'Invalid lookup or replacement in laminas-zendframework-bridge.replacements configuration;' 413 | . ' all keys and values MUST be non-empty strings.' 414 | ); 415 | } 416 | } 417 | 418 | return new Replacements($replacements); 419 | } 420 | 421 | /** 422 | * @param string[] $keys Hierarchy of keys, for determining location in 423 | * nested configuration. 424 | */ 425 | private function processConfig(array $config, array $keys = []): array 426 | { 427 | $rewritten = []; 428 | 429 | foreach ($config as $key => $value) { 430 | // Do not rewrite configuration for the bridge 431 | if ($key === 'laminas-zendframework-bridge') { 432 | $rewritten[$key] = $value; 433 | continue; 434 | } 435 | 436 | // Determine new key from replacements 437 | $newKey = is_string($key) ? $this->replace($key, $keys) : $key; 438 | 439 | // Keep original values with original key, if the key has changed, but only at the top-level. 440 | if (empty($keys) && $newKey !== $key) { 441 | $rewritten[$key] = $value; 442 | } 443 | 444 | // Perform value replacements, if any 445 | $newValue = $this->replace($value, $keys, $newKey); 446 | 447 | // Key does not already exist and/or is not an array value 448 | if (!array_key_exists($newKey, $rewritten) || !is_array($rewritten[$newKey])) { 449 | // Do not overwrite existing values with null values 450 | $rewritten[$newKey] = array_key_exists($newKey, $rewritten) && null === $newValue 451 | ? $rewritten[$newKey] 452 | : $newValue; 453 | continue; 454 | } 455 | 456 | // New value is null; nothing to do. 457 | if (null === $newValue) { 458 | continue; 459 | } 460 | 461 | // Key already exists as an array value, but $value is not an array 462 | if (!is_array($newValue)) { 463 | $rewritten[$newKey][] = $newValue; 464 | continue; 465 | } 466 | 467 | // Key already exists as an array value, and $value is also an array 468 | $rewritten[$newKey] = static::merge($rewritten[$newKey], $newValue); 469 | } 470 | 471 | return $rewritten; 472 | } 473 | } 474 | -------------------------------------------------------------------------------- /config/replacements.php: -------------------------------------------------------------------------------- 1 | 'zendframework/zendframework', 6 | 'zend-developer-tools/toolbar/bjy' => 'zend-developer-tools/toolbar/bjy', 7 | 'zend-developer-tools/toolbar/doctrine' => 'zend-developer-tools/toolbar/doctrine', 8 | 9 | // NAMESPACES 10 | // Zend Framework components 11 | 'Zend\\AuraDi\\Config' => 'Laminas\\AuraDi\\Config', 12 | 'Zend\\Authentication' => 'Laminas\\Authentication', 13 | 'Zend\\Barcode' => 'Laminas\\Barcode', 14 | 'Zend\\Cache' => 'Laminas\\Cache', 15 | 'Zend\\Captcha' => 'Laminas\\Captcha', 16 | 'Zend\\Code' => 'Laminas\\Code', 17 | 'ZendCodingStandard\\Sniffs' => 'LaminasCodingStandard\\Sniffs', 18 | 'ZendCodingStandard\\Utils' => 'LaminasCodingStandard\\Utils', 19 | 'Zend\\ComponentInstaller' => 'Laminas\\ComponentInstaller', 20 | 'Zend\\Config' => 'Laminas\\Config', 21 | 'Zend\\ConfigAggregator' => 'Laminas\\ConfigAggregator', 22 | 'Zend\\ConfigAggregatorModuleManager' => 'Laminas\\ConfigAggregatorModuleManager', 23 | 'Zend\\ConfigAggregatorParameters' => 'Laminas\\ConfigAggregatorParameters', 24 | 'Zend\\Console' => 'Laminas\\Console', 25 | 'Zend\\ContainerConfigTest' => 'Laminas\\ContainerConfigTest', 26 | 'Zend\\Crypt' => 'Laminas\\Crypt', 27 | 'Zend\\Db' => 'Laminas\\Db', 28 | 'ZendDeveloperTools' => 'Laminas\\DeveloperTools', 29 | 'Zend\\Di' => 'Laminas\\Di', 30 | 'Zend\\Diactoros' => 'Laminas\\Diactoros', 31 | 'ZendDiagnostics\\Check' => 'Laminas\\Diagnostics\\Check', 32 | 'ZendDiagnostics\\Result' => 'Laminas\\Diagnostics\\Result', 33 | 'ZendDiagnostics\\Runner' => 'Laminas\\Diagnostics\\Runner', 34 | 'Zend\\Dom' => 'Laminas\\Dom', 35 | 'Zend\\Escaper' => 'Laminas\\Escaper', 36 | 'Zend\\EventManager' => 'Laminas\\EventManager', 37 | 'Zend\\Feed' => 'Laminas\\Feed', 38 | 'Zend\\File' => 'Laminas\\File', 39 | 'Zend\\Filter' => 'Laminas\\Filter', 40 | 'Zend\\Form' => 'Laminas\\Form', 41 | 'Zend\\Http' => 'Laminas\\Http', 42 | 'Zend\\HttpHandlerRunner' => 'Laminas\\HttpHandlerRunner', 43 | 'Zend\\Hydrator' => 'Laminas\\Hydrator', 44 | 'Zend\\I18n' => 'Laminas\\I18n', 45 | 'Zend\\InputFilter' => 'Laminas\\InputFilter', 46 | 'Zend\\Json' => 'Laminas\\Json', 47 | 'Zend\\Ldap' => 'Laminas\\Ldap', 48 | 'Zend\\Loader' => 'Laminas\\Loader', 49 | 'Zend\\Log' => 'Laminas\\Log', 50 | 'Zend\\Mail' => 'Laminas\\Mail', 51 | 'Zend\\Math' => 'Laminas\\Math', 52 | 'Zend\\Memory' => 'Laminas\\Memory', 53 | 'Zend\\Mime' => 'Laminas\\Mime', 54 | 'Zend\\ModuleManager' => 'Laminas\\ModuleManager', 55 | 'Zend\\Mvc' => 'Laminas\\Mvc', 56 | 'Zend\\Navigation' => 'Laminas\\Navigation', 57 | 'Zend\\Paginator' => 'Laminas\\Paginator', 58 | 'Zend\\Permissions' => 'Laminas\\Permissions', 59 | 'Zend\\Pimple\\Config' => 'Laminas\\Pimple\\Config', 60 | 'Zend\\ProblemDetails' => 'Mezzio\\ProblemDetails', 61 | 'Zend\\ProgressBar' => 'Laminas\\ProgressBar', 62 | 'Zend\\Psr7Bridge' => 'Laminas\\Psr7Bridge', 63 | 'Zend\\Router' => 'Laminas\\Router', 64 | 'Zend\\Serializer' => 'Laminas\\Serializer', 65 | 'Zend\\Server' => 'Laminas\\Server', 66 | 'Zend\\ServiceManager' => 'Laminas\\ServiceManager', 67 | 'ZendService\\ReCaptcha' => 'Laminas\\ReCaptcha', 68 | 'ZendService\\Twitter' => 'Laminas\\Twitter', 69 | 'Zend\\Session' => 'Laminas\\Session', 70 | 'Zend\\SkeletonInstaller' => 'Laminas\\SkeletonInstaller', 71 | 'Zend\\Soap' => 'Laminas\\Soap', 72 | 'Zend\\Stdlib' => 'Laminas\\Stdlib', 73 | 'Zend\\Stratigility' => 'Laminas\\Stratigility', 74 | 'Zend\\Tag' => 'Laminas\\Tag', 75 | 'Zend\\Test' => 'Laminas\\Test', 76 | 'Zend\\Text' => 'Laminas\\Text', 77 | 'Zend\\Uri' => 'Laminas\\Uri', 78 | 'Zend\\Validator' => 'Laminas\\Validator', 79 | 'Zend\\View' => 'Laminas\\View', 80 | 'ZendXml' => 'Laminas\\Xml', 81 | 'Zend\\Xml2Json' => 'Laminas\\Xml2Json', 82 | 'Zend\\XmlRpc' => 'Laminas\\XmlRpc', 83 | 'ZendOAuth' => 'Laminas\\OAuth', 84 | 85 | // class ZendAcl in zend-expressive-authorization-acl 86 | 'ZendAcl' => 'LaminasAcl', 87 | 'Zend\\Expressive\\Authorization\\Acl\\ZendAcl' => 'Mezzio\\Authorization\\Acl\\LaminasAcl', 88 | // class ZendHttpClientDecorator in zend-feed 89 | 'ZendHttp' => 'LaminasHttp', 90 | // class ZendModuleProvider in zend-config-aggregator-modulemanager 91 | 'ZendModule' => 'LaminasModule', 92 | // class ZendRbac in zend-expressive-authorization-rbac 93 | 'ZendRbac' => 'LaminasRbac', 94 | 'Zend\\Expressive\\Authorization\\Rbac\\ZendRbac' => 'Mezzio\\Authorization\\Rbac\\LaminasRbac', 95 | // class ZendRouter in zend-expressive-router-zendrouter 96 | 'ZendRouter' => 'LaminasRouter', 97 | 'Zend\\Expressive\\Router\\ZendRouter' => 'Mezzio\\Router\\LaminasRouter', 98 | // class ZendViewRenderer in zend-expressive-zendviewrenderer 99 | 'ZendViewRenderer' => 'LaminasViewRenderer', 100 | 'Zend\\Expressive\\ZendView\\ZendViewRenderer' => 'Mezzio\\LaminasView\\LaminasViewRenderer', 101 | 'a\\Zend' => 'a\\Zend', 102 | 'b\\Zend' => 'b\\Zend', 103 | 'c\\Zend' => 'c\\Zend', 104 | 'd\\Zend' => 'd\\Zend', 105 | 'e\\Zend' => 'e\\Zend', 106 | 'f\\Zend' => 'f\\Zend', 107 | 'g\\Zend' => 'g\\Zend', 108 | 'h\\Zend' => 'h\\Zend', 109 | 'i\\Zend' => 'i\\Zend', 110 | 'j\\Zend' => 'j\\Zend', 111 | 'k\\Zend' => 'k\\Zend', 112 | 'l\\Zend' => 'l\\Zend', 113 | 'm\\Zend' => 'm\\Zend', 114 | 'n\\Zend' => 'n\\Zend', 115 | 'o\\Zend' => 'o\\Zend', 116 | 'p\\Zend' => 'p\\Zend', 117 | 'q\\Zend' => 'q\\Zend', 118 | 'r\\Zend' => 'r\\Zend', 119 | 's\\Zend' => 's\\Zend', 120 | 't\\Zend' => 't\\Zend', 121 | 'u\\Zend' => 'u\\Zend', 122 | 'v\\Zend' => 'v\\Zend', 123 | 'w\\Zend' => 'w\\Zend', 124 | 'x\\Zend' => 'x\\Zend', 125 | 'y\\Zend' => 'y\\Zend', 126 | 'z\\Zend' => 'z\\Zend', 127 | 128 | // Expressive 129 | 'Zend\\Expressive' => 'Mezzio', 130 | 'ZendAuthentication' => 'LaminasAuthentication', 131 | 'ZendAcl' => 'LaminasAcl', 132 | 'ZendRbac' => 'LaminasRbac', 133 | 'ZendRouter' => 'LaminasRouter', 134 | 'ExpressiveUrlGenerator' => 'MezzioUrlGenerator', 135 | 'ExpressiveInstaller' => 'MezzioInstaller', 136 | 137 | // Apigility 138 | 'ZF\\Apigility' => 'Laminas\\ApiTools', 139 | 'ZF\\ApiProblem' => 'Laminas\\ApiTools\\ApiProblem', 140 | 'ZF\\AssetManager' => 'Laminas\\ApiTools\\AssetManager', 141 | 'ZF\\ComposerAutoloading' => 'Laminas\\ComposerAutoloading', 142 | 'ZF\\Configuration' => 'Laminas\\ApiTools\\Configuration', 143 | 'ZF\\ContentNegotiation' => 'Laminas\\ApiTools\\ContentNegotiation', 144 | 'ZF\\ContentValidation' => 'Laminas\\ApiTools\\ContentValidation', 145 | 'ZF\\DevelopmentMode' => 'Laminas\\DevelopmentMode', 146 | 'ZF\\Doctrine\\QueryBuilder' => 'Laminas\\ApiTools\\Doctrine\\QueryBuilder', 147 | 'ZF\\Hal' => 'Laminas\\ApiTools\\Hal', 148 | 'ZF\\HttpCache' => 'Laminas\\ApiTools\\HttpCache', 149 | 'ZF\\MvcAuth' => 'Laminas\\ApiTools\\MvcAuth', 150 | 'ZF\\OAuth2' => 'Laminas\\ApiTools\\OAuth2', 151 | 'ZF\\Rest' => 'Laminas\\ApiTools\\Rest', 152 | 'ZF\\Rpc' => 'Laminas\\ApiTools\\Rpc', 153 | 'ZF\\Versioning' => 'Laminas\\ApiTools\\Versioning', 154 | 'a\\ZF' => 'a\\ZF', 155 | 'b\\ZF' => 'b\\ZF', 156 | 'c\\ZF' => 'c\\ZF', 157 | 'd\\ZF' => 'd\\ZF', 158 | 'e\\ZF' => 'e\\ZF', 159 | 'f\\ZF' => 'f\\ZF', 160 | 'g\\ZF' => 'g\\ZF', 161 | 'h\\ZF' => 'h\\ZF', 162 | 'i\\ZF' => 'i\\ZF', 163 | 'j\\ZF' => 'j\\ZF', 164 | 'k\\ZF' => 'k\\ZF', 165 | 'l\\ZF' => 'l\\ZF', 166 | 'm\\ZF' => 'm\\ZF', 167 | 'n\\ZF' => 'n\\ZF', 168 | 'o\\ZF' => 'o\\ZF', 169 | 'p\\ZF' => 'p\\ZF', 170 | 'q\\ZF' => 'q\\ZF', 171 | 'r\\ZF' => 'r\\ZF', 172 | 's\\ZF' => 's\\ZF', 173 | 't\\ZF' => 't\\ZF', 174 | 'u\\ZF' => 'u\\ZF', 175 | 'v\\ZF' => 'v\\ZF', 176 | 'w\\ZF' => 'w\\ZF', 177 | 'x\\ZF' => 'x\\ZF', 178 | 'y\\ZF' => 'y\\ZF', 179 | 'z\\ZF' => 'z\\ZF', 180 | 181 | 'ApigilityModuleInterface' => 'ApiToolsModuleInterface', 182 | 'ApigilityProviderInterface' => 'ApiToolsProviderInterface', 183 | 'ApigilityVersionController' => 'ApiToolsVersionController', 184 | 185 | // PACKAGES 186 | // ZF components, MVC 187 | 'zendframework/skeleton-application' => 'laminas/skeleton-application', 188 | 'zendframework/zend-auradi-config' => 'laminas/laminas-auradi-config', 189 | 'zendframework/zend-authentication' => 'laminas/laminas-authentication', 190 | 'zendframework/zend-barcode' => 'laminas/laminas-barcode', 191 | 'zendframework/zend-cache' => 'laminas/laminas-cache', 192 | 'zendframework/zend-captcha' => 'laminas/laminas-captcha', 193 | 'zendframework/zend-code' => 'laminas/laminas-code', 194 | 'zendframework/zend-coding-standard' => 'laminas/laminas-coding-standard', 195 | 'zendframework/zend-component-installer' => 'laminas/laminas-component-installer', 196 | 'zendframework/zend-composer-autoloading' => 'laminas/laminas-composer-autoloading', 197 | 'zendframework/zend-config-aggregator' => 'laminas/laminas-config-aggregator', 198 | 'zendframework/zend-config' => 'laminas/laminas-config', 199 | 'zendframework/zend-console' => 'laminas/laminas-console', 200 | 'zendframework/zend-container-config-test' => 'laminas/laminas-container-config-test', 201 | 'zendframework/zend-crypt' => 'laminas/laminas-crypt', 202 | 'zendframework/zend-db' => 'laminas/laminas-db', 203 | 'zendframework/zend-developer-tools' => 'laminas/laminas-developer-tools', 204 | 'zendframework/zend-diactoros' => 'laminas/laminas-diactoros', 205 | 'zendframework/zenddiagnostics' => 'laminas/laminas-diagnostics', 206 | 'zendframework/zend-di' => 'laminas/laminas-di', 207 | 'zendframework/zend-dom' => 'laminas/laminas-dom', 208 | 'zendframework/zend-escaper' => 'laminas/laminas-escaper', 209 | 'zendframework/zend-eventmanager' => 'laminas/laminas-eventmanager', 210 | 'zendframework/zend-feed' => 'laminas/laminas-feed', 211 | 'zendframework/zend-file' => 'laminas/laminas-file', 212 | 'zendframework/zend-filter' => 'laminas/laminas-filter', 213 | 'zendframework/zend-form' => 'laminas/laminas-form', 214 | 'zendframework/zend-httphandlerrunner' => 'laminas/laminas-httphandlerrunner', 215 | 'zendframework/zend-http' => 'laminas/laminas-http', 216 | 'zendframework/zend-hydrator' => 'laminas/laminas-hydrator', 217 | 'zendframework/zend-i18n' => 'laminas/laminas-i18n', 218 | 'zendframework/zend-i18n-resources' => 'laminas/laminas-i18n-resources', 219 | 'zendframework/zend-inputfilter' => 'laminas/laminas-inputfilter', 220 | 'zendframework/zend-json' => 'laminas/laminas-json', 221 | 'zendframework/zend-json-server' => 'laminas/laminas-json-server', 222 | 'zendframework/zend-ldap' => 'laminas/laminas-ldap', 223 | 'zendframework/zend-loader' => 'laminas/laminas-loader', 224 | 'zendframework/zend-log' => 'laminas/laminas-log', 225 | 'zendframework/zend-mail' => 'laminas/laminas-mail', 226 | 'zendframework/zend-math' => 'laminas/laminas-math', 227 | 'zendframework/zend-memory' => 'laminas/laminas-memory', 228 | 'zendframework/zend-mime' => 'laminas/laminas-mime', 229 | 'zendframework/zend-modulemanager' => 'laminas/laminas-modulemanager', 230 | 'zendframework/zend-mvc' => 'laminas/laminas-mvc', 231 | 'zendframework/zend-navigation' => 'laminas/laminas-navigation', 232 | 'zendframework/zend-oauth' => 'laminas/laminas-oauth', 233 | 'zendframework/zend-paginator' => 'laminas/laminas-paginator', 234 | 'zendframework/zend-permissions-acl' => 'laminas/laminas-permissions-acl', 235 | 'zendframework/zend-permissions-rbac' => 'laminas/laminas-permissions-rbac', 236 | 'zendframework/zend-pimple-config' => 'laminas/laminas-pimple-config', 237 | 'zendframework/zend-progressbar' => 'laminas/laminas-progressbar', 238 | 'zendframework/zend-psr7bridge' => 'laminas/laminas-psr7bridge', 239 | 'zendframework/zend-recaptcha' => 'laminas/laminas-recaptcha', 240 | 'zendframework/zend-router' => 'laminas/laminas-router', 241 | 'zendframework/zend-serializer' => 'laminas/laminas-serializer', 242 | 'zendframework/zend-server' => 'laminas/laminas-server', 243 | 'zendframework/zend-servicemanager' => 'laminas/laminas-servicemanager', 244 | 'zendframework/zendservice-recaptcha' => 'laminas/laminas-recaptcha', 245 | 'zendframework/zendservice-twitter' => 'laminas/laminas-twitter', 246 | 'zendframework/zend-session' => 'laminas/laminas-session', 247 | 'zendframework/zend-skeleton-installer' => 'laminas/laminas-skeleton-installer', 248 | 'zendframework/zend-soap' => 'laminas/laminas-soap', 249 | 'zendframework/zend-stdlib' => 'laminas/laminas-stdlib', 250 | 'zendframework/zend-stratigility' => 'laminas/laminas-stratigility', 251 | 'zendframework/zend-tag' => 'laminas/laminas-tag', 252 | 'zendframework/zend-test' => 'laminas/laminas-test', 253 | 'zendframework/zend-text' => 'laminas/laminas-text', 254 | 'zendframework/zend-uri' => 'laminas/laminas-uri', 255 | 'zendframework/zend-validator' => 'laminas/laminas-validator', 256 | 'zendframework/zend-view' => 'laminas/laminas-view', 257 | 'zendframework/zend-xml2json' => 'laminas/laminas-xml2json', 258 | 'zendframework/zend-xml' => 'laminas/laminas-xml', 259 | 'zendframework/zend-xmlrpc' => 'laminas/laminas-xmlrpc', 260 | 261 | // Expressive packages 262 | 'zendframework/zend-expressive' => 'mezzio/mezzio', 263 | 'zendframework/zend-expressive-zendrouter' => 'mezzio/mezzio-laminasrouter', 264 | 'zendframework/zend-problem-details' => 'mezzio/mezzio-problem-details', 265 | 'zendframework/zend-expressive-zendviewrenderer' => 'mezzio/mezzio-laminasviewrenderer', 266 | 267 | // Apigility packages 268 | 'zfcampus/apigility-documentation' => 'laminas-api-tools/documentation', 269 | 'zfcampus/statuslib-example' => 'laminas-api-tools/statuslib-example', 270 | 'zfcampus/zf-apigility' => 'laminas-api-tools/api-tools', 271 | 'zfcampus/zf-api-problem' => 'laminas-api-tools/api-tools-api-problem', 272 | 'zfcampus/zf-asset-manager' => 'laminas-api-tools/api-tools-asset-manager', 273 | 'zfcampus/zf-configuration' => 'laminas-api-tools/api-tools-configuration', 274 | 'zfcampus/zf-content-negotiation' => 'laminas-api-tools/api-tools-content-negotiation', 275 | 'zfcampus/zf-content-validation' => 'laminas-api-tools/api-tools-content-validation', 276 | 'zfcampus/zf-development-mode' => 'laminas/laminas-development-mode', 277 | 'zfcampus/zf-doctrine-querybuilder' => 'laminas-api-tools/api-tools-doctrine-querybuilder', 278 | 'zfcampus/zf-hal' => 'laminas-api-tools/api-tools-hal', 279 | 'zfcampus/zf-http-cache' => 'laminas-api-tools/api-tools-http-cache', 280 | 'zfcampus/zf-mvc-auth' => 'laminas-api-tools/api-tools-mvc-auth', 281 | 'zfcampus/zf-oauth2' => 'laminas-api-tools/api-tools-oauth2', 282 | 'zfcampus/zf-rest' => 'laminas-api-tools/api-tools-rest', 283 | 'zfcampus/zf-rpc' => 'laminas-api-tools/api-tools-rpc', 284 | 'zfcampus/zf-versioning' => 'laminas-api-tools/api-tools-versioning', 285 | 286 | // CONFIG KEYS, SCRIPT NAMES, ETC 287 | // ZF components 288 | '::fromZend' => '::fromLaminas', // psr7bridge 289 | '::toZend' => '::toLaminas', // psr7bridge 290 | 'use_zend_loader' => 'use_laminas_loader', // zend-modulemanager 291 | 'zend-config' => 'laminas-config', 292 | 'zend-developer-tools/' => 'laminas-developer-tools/', 293 | 'zend-tag-cloud' => 'laminas-tag-cloud', 294 | 'zenddevelopertools' => 'laminas-developer-tools', 295 | 'zendbarcode' => 'laminasbarcode', 296 | 'ZendBarcode' => 'LaminasBarcode', 297 | 'zendcache' => 'laminascache', 298 | 'ZendCache' => 'LaminasCache', 299 | 'zendconfig' => 'laminasconfig', 300 | 'ZendConfig' => 'LaminasConfig', 301 | 'zendfeed' => 'laminasfeed', 302 | 'ZendFeed' => 'LaminasFeed', 303 | 'zendfilter' => 'laminasfilter', 304 | 'ZendFilter' => 'LaminasFilter', 305 | 'zendform' => 'laminasform', 306 | 'ZendForm' => 'LaminasForm', 307 | 'zendi18n' => 'laminasi18n', 308 | 'ZendI18n' => 'LaminasI18n', 309 | 'zendinputfilter' => 'laminasinputfilter', 310 | 'ZendInputFilter' => 'LaminasInputFilter', 311 | 'zendlog' => 'laminaslog', 312 | 'ZendLog' => 'LaminasLog', 313 | 'zendmail' => 'laminasmail', 314 | 'ZendMail' => 'LaminasMail', 315 | 'zendmvc' => 'laminasmvc', 316 | 'ZendMvc' => 'LaminasMvc', 317 | 'zendpaginator' => 'laminaspaginator', 318 | 'ZendPaginator' => 'LaminasPaginator', 319 | 'zendserializer' => 'laminasserializer', 320 | 'ZendSerializer' => 'LaminasSerializer', 321 | 'zendtag' => 'laminastag', 322 | 'ZendTag' => 'LaminasTag', 323 | 'zendtext' => 'laminastext', 324 | 'ZendText' => 'LaminasText', 325 | 'zendvalidator' => 'laminasvalidator', 326 | 'ZendValidator' => 'LaminasValidator', 327 | 'zendview' => 'laminasview', 328 | 'ZendView' => 'LaminasView', 329 | 'zend-framework.flf' => 'laminas-project.flf', 330 | 331 | // Expressive-related 332 | "'zend-expressive'" => "'mezzio'", 333 | '"zend-expressive"' => '"mezzio"', 334 | 'zend-expressive.' => 'mezzio.', 335 | 'zend-expressive-authorization' => 'mezzio-authorization', 336 | 'zend-expressive-hal' => 'mezzio-hal', 337 | 'zend-expressive-session' => 'mezzio-session', 338 | 'zend-expressive-swoole' => 'mezzio-swoole', 339 | 'zend-expressive-tooling' => 'mezzio-tooling', 340 | 341 | // Apigility-related 342 | "'zf-apigility'" => "'api-tools'", 343 | '"zf-apigility"' => '"api-tools"', 344 | 'zf-apigility/' => 'api-tools/', 345 | 'zf-apigility-admin' => 'api-tools-admin', 346 | 'zf-content-negotiation' => 'api-tools-content-negotiation', 347 | 'zf-hal' => 'api-tools-hal', 348 | 'zf-rest' => 'api-tools-rest', 349 | 'zf-rpc' => 'api-tools-rpc', 350 | 'zf-content-validation' => 'api-tools-content-validation', 351 | 'zf-apigility-ui' => 'api-tools-ui', 352 | 'zf-apigility-documentation-blueprint' => 'api-tools-documentation-blueprint', 353 | 'zf-apigility-documentation-swagger' => 'api-tools-documentation-swagger', 354 | 'zf-apigility-welcome' => 'api-tools-welcome', 355 | 'zf-api-problem' => 'api-tools-api-problem', 356 | 'zf-configuration' => 'api-tools-configuration', 357 | 'zf-http-cache' => 'api-tools-http-cache', 358 | 'zf-mvc-auth' => 'api-tools-mvc-auth', 359 | 'zf-oauth2' => 'api-tools-oauth2', 360 | 'zf-versioning' => 'api-tools-versioning', 361 | 'ZfApigilityDoctrineQueryProviderManager' => 'LaminasApiToolsDoctrineQueryProviderManager', 362 | 'ZfApigilityDoctrineQueryCreateFilterManager' => 'LaminasApiToolsDoctrineQueryCreateFilterManager', 363 | 'zf-apigility-doctrine' => 'api-tools-doctrine', 364 | 'zf-development-mode' => 'laminas-development-mode', 365 | 'zf-doctrine-querybuilder' => 'api-tools-doctrine-querybuilder', 366 | 367 | // 3rd party Apigility packages 368 | 'api-skeletons/zf-' => 'api-skeletons/zf-', // api-skeletons packages 369 | 'zf-oauth2-' => 'zf-oauth2-', // api-skeletons OAuth2-related packages 370 | 'ZF\\OAuth2\\Client' => 'ZF\\OAuth2\\Client', // api-skeletons/zf-oauth2-client 371 | 'ZF\\OAuth2\\Doctrine' => 'ZF\\OAuth2\\Doctrine', // api-skeletons/zf-oauth2-doctrine 372 | ]; 373 | -------------------------------------------------------------------------------- /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": "7748ecdfd98016b0223c9c32975d1c2b", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "amphp/amp", 12 | "version": "v2.6.5", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/amphp/amp.git", 16 | "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/amphp/amp/zipball/d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", 21 | "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=7.1" 26 | }, 27 | "require-dev": { 28 | "amphp/php-cs-fixer-config": "dev-master", 29 | "amphp/phpunit-util": "^1", 30 | "ext-json": "*", 31 | "jetbrains/phpstorm-stubs": "^2019.3", 32 | "phpunit/phpunit": "^7 | ^8 | ^9", 33 | "react/promise": "^2", 34 | "vimeo/psalm": "^3.12" 35 | }, 36 | "type": "library", 37 | "autoload": { 38 | "files": [ 39 | "lib/functions.php", 40 | "lib/Internal/functions.php" 41 | ], 42 | "psr-4": { 43 | "Amp\\": "lib" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Daniel Lowrey", 53 | "email": "rdlowrey@php.net" 54 | }, 55 | { 56 | "name": "Aaron Piotrowski", 57 | "email": "aaron@trowski.com" 58 | }, 59 | { 60 | "name": "Bob Weinand", 61 | "email": "bobwei9@hotmail.com" 62 | }, 63 | { 64 | "name": "Niklas Keller", 65 | "email": "me@kelunik.com" 66 | } 67 | ], 68 | "description": "A non-blocking concurrency framework for PHP applications.", 69 | "homepage": "https://amphp.org/amp", 70 | "keywords": [ 71 | "async", 72 | "asynchronous", 73 | "awaitable", 74 | "concurrency", 75 | "event", 76 | "event-loop", 77 | "future", 78 | "non-blocking", 79 | "promise" 80 | ], 81 | "support": { 82 | "irc": "irc://irc.freenode.org/amphp", 83 | "issues": "https://github.com/amphp/amp/issues", 84 | "source": "https://github.com/amphp/amp/tree/v2.6.5" 85 | }, 86 | "funding": [ 87 | { 88 | "url": "https://github.com/amphp", 89 | "type": "github" 90 | } 91 | ], 92 | "time": "2025-09-03T19:41:28+00:00" 93 | }, 94 | { 95 | "name": "amphp/byte-stream", 96 | "version": "v1.8.2", 97 | "source": { 98 | "type": "git", 99 | "url": "https://github.com/amphp/byte-stream.git", 100 | "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" 101 | }, 102 | "dist": { 103 | "type": "zip", 104 | "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", 105 | "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", 106 | "shasum": "" 107 | }, 108 | "require": { 109 | "amphp/amp": "^2", 110 | "php": ">=7.1" 111 | }, 112 | "require-dev": { 113 | "amphp/php-cs-fixer-config": "dev-master", 114 | "amphp/phpunit-util": "^1.4", 115 | "friendsofphp/php-cs-fixer": "^2.3", 116 | "jetbrains/phpstorm-stubs": "^2019.3", 117 | "phpunit/phpunit": "^6 || ^7 || ^8", 118 | "psalm/phar": "^3.11.4" 119 | }, 120 | "type": "library", 121 | "autoload": { 122 | "files": [ 123 | "lib/functions.php" 124 | ], 125 | "psr-4": { 126 | "Amp\\ByteStream\\": "lib" 127 | } 128 | }, 129 | "notification-url": "https://packagist.org/downloads/", 130 | "license": [ 131 | "MIT" 132 | ], 133 | "authors": [ 134 | { 135 | "name": "Aaron Piotrowski", 136 | "email": "aaron@trowski.com" 137 | }, 138 | { 139 | "name": "Niklas Keller", 140 | "email": "me@kelunik.com" 141 | } 142 | ], 143 | "description": "A stream abstraction to make working with non-blocking I/O simple.", 144 | "homepage": "https://amphp.org/byte-stream", 145 | "keywords": [ 146 | "amp", 147 | "amphp", 148 | "async", 149 | "io", 150 | "non-blocking", 151 | "stream" 152 | ], 153 | "support": { 154 | "issues": "https://github.com/amphp/byte-stream/issues", 155 | "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" 156 | }, 157 | "funding": [ 158 | { 159 | "url": "https://github.com/amphp", 160 | "type": "github" 161 | } 162 | ], 163 | "time": "2024-04-13T18:00:56+00:00" 164 | }, 165 | { 166 | "name": "composer/package-versions-deprecated", 167 | "version": "1.11.99.5", 168 | "source": { 169 | "type": "git", 170 | "url": "https://github.com/composer/package-versions-deprecated.git", 171 | "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" 172 | }, 173 | "dist": { 174 | "type": "zip", 175 | "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", 176 | "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", 177 | "shasum": "" 178 | }, 179 | "require": { 180 | "composer-plugin-api": "^1.1.0 || ^2.0", 181 | "php": "^7 || ^8" 182 | }, 183 | "replace": { 184 | "ocramius/package-versions": "1.11.99" 185 | }, 186 | "require-dev": { 187 | "composer/composer": "^1.9.3 || ^2.0@dev", 188 | "ext-zip": "^1.13", 189 | "phpunit/phpunit": "^6.5 || ^7" 190 | }, 191 | "type": "composer-plugin", 192 | "extra": { 193 | "class": "PackageVersions\\Installer", 194 | "branch-alias": { 195 | "dev-master": "1.x-dev" 196 | } 197 | }, 198 | "autoload": { 199 | "psr-4": { 200 | "PackageVersions\\": "src/PackageVersions" 201 | } 202 | }, 203 | "notification-url": "https://packagist.org/downloads/", 204 | "license": [ 205 | "MIT" 206 | ], 207 | "authors": [ 208 | { 209 | "name": "Marco Pivetta", 210 | "email": "ocramius@gmail.com" 211 | }, 212 | { 213 | "name": "Jordi Boggiano", 214 | "email": "j.boggiano@seld.be" 215 | } 216 | ], 217 | "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", 218 | "support": { 219 | "issues": "https://github.com/composer/package-versions-deprecated/issues", 220 | "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" 221 | }, 222 | "funding": [ 223 | { 224 | "url": "https://packagist.com", 225 | "type": "custom" 226 | }, 227 | { 228 | "url": "https://github.com/composer", 229 | "type": "github" 230 | }, 231 | { 232 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 233 | "type": "tidelift" 234 | } 235 | ], 236 | "time": "2022-01-17T14:14:24+00:00" 237 | }, 238 | { 239 | "name": "composer/pcre", 240 | "version": "3.3.2", 241 | "source": { 242 | "type": "git", 243 | "url": "https://github.com/composer/pcre.git", 244 | "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" 245 | }, 246 | "dist": { 247 | "type": "zip", 248 | "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", 249 | "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", 250 | "shasum": "" 251 | }, 252 | "require": { 253 | "php": "^7.4 || ^8.0" 254 | }, 255 | "conflict": { 256 | "phpstan/phpstan": "<1.11.10" 257 | }, 258 | "require-dev": { 259 | "phpstan/phpstan": "^1.12 || ^2", 260 | "phpstan/phpstan-strict-rules": "^1 || ^2", 261 | "phpunit/phpunit": "^8 || ^9" 262 | }, 263 | "type": "library", 264 | "extra": { 265 | "phpstan": { 266 | "includes": [ 267 | "extension.neon" 268 | ] 269 | }, 270 | "branch-alias": { 271 | "dev-main": "3.x-dev" 272 | } 273 | }, 274 | "autoload": { 275 | "psr-4": { 276 | "Composer\\Pcre\\": "src" 277 | } 278 | }, 279 | "notification-url": "https://packagist.org/downloads/", 280 | "license": [ 281 | "MIT" 282 | ], 283 | "authors": [ 284 | { 285 | "name": "Jordi Boggiano", 286 | "email": "j.boggiano@seld.be", 287 | "homepage": "http://seld.be" 288 | } 289 | ], 290 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 291 | "keywords": [ 292 | "PCRE", 293 | "preg", 294 | "regex", 295 | "regular expression" 296 | ], 297 | "support": { 298 | "issues": "https://github.com/composer/pcre/issues", 299 | "source": "https://github.com/composer/pcre/tree/3.3.2" 300 | }, 301 | "funding": [ 302 | { 303 | "url": "https://packagist.com", 304 | "type": "custom" 305 | }, 306 | { 307 | "url": "https://github.com/composer", 308 | "type": "github" 309 | }, 310 | { 311 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 312 | "type": "tidelift" 313 | } 314 | ], 315 | "time": "2024-11-12T16:29:46+00:00" 316 | }, 317 | { 318 | "name": "composer/semver", 319 | "version": "3.4.4", 320 | "source": { 321 | "type": "git", 322 | "url": "https://github.com/composer/semver.git", 323 | "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" 324 | }, 325 | "dist": { 326 | "type": "zip", 327 | "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", 328 | "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", 329 | "shasum": "" 330 | }, 331 | "require": { 332 | "php": "^5.3.2 || ^7.0 || ^8.0" 333 | }, 334 | "require-dev": { 335 | "phpstan/phpstan": "^1.11", 336 | "symfony/phpunit-bridge": "^3 || ^7" 337 | }, 338 | "type": "library", 339 | "extra": { 340 | "branch-alias": { 341 | "dev-main": "3.x-dev" 342 | } 343 | }, 344 | "autoload": { 345 | "psr-4": { 346 | "Composer\\Semver\\": "src" 347 | } 348 | }, 349 | "notification-url": "https://packagist.org/downloads/", 350 | "license": [ 351 | "MIT" 352 | ], 353 | "authors": [ 354 | { 355 | "name": "Nils Adermann", 356 | "email": "naderman@naderman.de", 357 | "homepage": "http://www.naderman.de" 358 | }, 359 | { 360 | "name": "Jordi Boggiano", 361 | "email": "j.boggiano@seld.be", 362 | "homepage": "http://seld.be" 363 | }, 364 | { 365 | "name": "Rob Bast", 366 | "email": "rob.bast@gmail.com", 367 | "homepage": "http://robbast.nl" 368 | } 369 | ], 370 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 371 | "keywords": [ 372 | "semantic", 373 | "semver", 374 | "validation", 375 | "versioning" 376 | ], 377 | "support": { 378 | "irc": "ircs://irc.libera.chat:6697/composer", 379 | "issues": "https://github.com/composer/semver/issues", 380 | "source": "https://github.com/composer/semver/tree/3.4.4" 381 | }, 382 | "funding": [ 383 | { 384 | "url": "https://packagist.com", 385 | "type": "custom" 386 | }, 387 | { 388 | "url": "https://github.com/composer", 389 | "type": "github" 390 | } 391 | ], 392 | "time": "2025-08-20T19:15:30+00:00" 393 | }, 394 | { 395 | "name": "composer/xdebug-handler", 396 | "version": "3.0.5", 397 | "source": { 398 | "type": "git", 399 | "url": "https://github.com/composer/xdebug-handler.git", 400 | "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" 401 | }, 402 | "dist": { 403 | "type": "zip", 404 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", 405 | "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", 406 | "shasum": "" 407 | }, 408 | "require": { 409 | "composer/pcre": "^1 || ^2 || ^3", 410 | "php": "^7.2.5 || ^8.0", 411 | "psr/log": "^1 || ^2 || ^3" 412 | }, 413 | "require-dev": { 414 | "phpstan/phpstan": "^1.0", 415 | "phpstan/phpstan-strict-rules": "^1.1", 416 | "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" 417 | }, 418 | "type": "library", 419 | "autoload": { 420 | "psr-4": { 421 | "Composer\\XdebugHandler\\": "src" 422 | } 423 | }, 424 | "notification-url": "https://packagist.org/downloads/", 425 | "license": [ 426 | "MIT" 427 | ], 428 | "authors": [ 429 | { 430 | "name": "John Stevenson", 431 | "email": "john-stevenson@blueyonder.co.uk" 432 | } 433 | ], 434 | "description": "Restarts a process without Xdebug.", 435 | "keywords": [ 436 | "Xdebug", 437 | "performance" 438 | ], 439 | "support": { 440 | "irc": "ircs://irc.libera.chat:6697/composer", 441 | "issues": "https://github.com/composer/xdebug-handler/issues", 442 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" 443 | }, 444 | "funding": [ 445 | { 446 | "url": "https://packagist.com", 447 | "type": "custom" 448 | }, 449 | { 450 | "url": "https://github.com/composer", 451 | "type": "github" 452 | }, 453 | { 454 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 455 | "type": "tidelift" 456 | } 457 | ], 458 | "time": "2024-05-06T16:37:16+00:00" 459 | }, 460 | { 461 | "name": "dnoegel/php-xdg-base-dir", 462 | "version": "v0.1.1", 463 | "source": { 464 | "type": "git", 465 | "url": "https://github.com/dnoegel/php-xdg-base-dir.git", 466 | "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" 467 | }, 468 | "dist": { 469 | "type": "zip", 470 | "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", 471 | "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", 472 | "shasum": "" 473 | }, 474 | "require": { 475 | "php": ">=5.3.2" 476 | }, 477 | "require-dev": { 478 | "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" 479 | }, 480 | "type": "library", 481 | "autoload": { 482 | "psr-4": { 483 | "XdgBaseDir\\": "src/" 484 | } 485 | }, 486 | "notification-url": "https://packagist.org/downloads/", 487 | "license": [ 488 | "MIT" 489 | ], 490 | "description": "implementation of xdg base directory specification for php", 491 | "support": { 492 | "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", 493 | "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" 494 | }, 495 | "time": "2019-12-04T15:06:13+00:00" 496 | }, 497 | { 498 | "name": "doctrine/deprecations", 499 | "version": "1.1.5", 500 | "source": { 501 | "type": "git", 502 | "url": "https://github.com/doctrine/deprecations.git", 503 | "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" 504 | }, 505 | "dist": { 506 | "type": "zip", 507 | "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", 508 | "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", 509 | "shasum": "" 510 | }, 511 | "require": { 512 | "php": "^7.1 || ^8.0" 513 | }, 514 | "conflict": { 515 | "phpunit/phpunit": "<=7.5 || >=13" 516 | }, 517 | "require-dev": { 518 | "doctrine/coding-standard": "^9 || ^12 || ^13", 519 | "phpstan/phpstan": "1.4.10 || 2.1.11", 520 | "phpstan/phpstan-phpunit": "^1.0 || ^2", 521 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", 522 | "psr/log": "^1 || ^2 || ^3" 523 | }, 524 | "suggest": { 525 | "psr/log": "Allows logging deprecations via PSR-3 logger implementation" 526 | }, 527 | "type": "library", 528 | "autoload": { 529 | "psr-4": { 530 | "Doctrine\\Deprecations\\": "src" 531 | } 532 | }, 533 | "notification-url": "https://packagist.org/downloads/", 534 | "license": [ 535 | "MIT" 536 | ], 537 | "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.", 538 | "homepage": "https://www.doctrine-project.org/", 539 | "support": { 540 | "issues": "https://github.com/doctrine/deprecations/issues", 541 | "source": "https://github.com/doctrine/deprecations/tree/1.1.5" 542 | }, 543 | "time": "2025-04-07T20:06:18+00:00" 544 | }, 545 | { 546 | "name": "felixfbecker/advanced-json-rpc", 547 | "version": "v3.2.1", 548 | "source": { 549 | "type": "git", 550 | "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", 551 | "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" 552 | }, 553 | "dist": { 554 | "type": "zip", 555 | "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", 556 | "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", 557 | "shasum": "" 558 | }, 559 | "require": { 560 | "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", 561 | "php": "^7.1 || ^8.0", 562 | "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" 563 | }, 564 | "require-dev": { 565 | "phpunit/phpunit": "^7.0 || ^8.0" 566 | }, 567 | "type": "library", 568 | "autoload": { 569 | "psr-4": { 570 | "AdvancedJsonRpc\\": "lib/" 571 | } 572 | }, 573 | "notification-url": "https://packagist.org/downloads/", 574 | "license": [ 575 | "ISC" 576 | ], 577 | "authors": [ 578 | { 579 | "name": "Felix Becker", 580 | "email": "felix.b@outlook.com" 581 | } 582 | ], 583 | "description": "A more advanced JSONRPC implementation", 584 | "support": { 585 | "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", 586 | "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" 587 | }, 588 | "time": "2021-06-11T22:34:44+00:00" 589 | }, 590 | { 591 | "name": "felixfbecker/language-server-protocol", 592 | "version": "v1.5.3", 593 | "source": { 594 | "type": "git", 595 | "url": "https://github.com/felixfbecker/php-language-server-protocol.git", 596 | "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" 597 | }, 598 | "dist": { 599 | "type": "zip", 600 | "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", 601 | "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", 602 | "shasum": "" 603 | }, 604 | "require": { 605 | "php": ">=7.1" 606 | }, 607 | "require-dev": { 608 | "phpstan/phpstan": "*", 609 | "squizlabs/php_codesniffer": "^3.1", 610 | "vimeo/psalm": "^4.0" 611 | }, 612 | "type": "library", 613 | "extra": { 614 | "branch-alias": { 615 | "dev-master": "1.x-dev" 616 | } 617 | }, 618 | "autoload": { 619 | "psr-4": { 620 | "LanguageServerProtocol\\": "src/" 621 | } 622 | }, 623 | "notification-url": "https://packagist.org/downloads/", 624 | "license": [ 625 | "ISC" 626 | ], 627 | "authors": [ 628 | { 629 | "name": "Felix Becker", 630 | "email": "felix.b@outlook.com" 631 | } 632 | ], 633 | "description": "PHP classes for the Language Server Protocol", 634 | "keywords": [ 635 | "language", 636 | "microsoft", 637 | "php", 638 | "server" 639 | ], 640 | "support": { 641 | "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", 642 | "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" 643 | }, 644 | "time": "2024-04-30T00:40:11+00:00" 645 | }, 646 | { 647 | "name": "fidry/cpu-core-counter", 648 | "version": "1.3.0", 649 | "source": { 650 | "type": "git", 651 | "url": "https://github.com/theofidry/cpu-core-counter.git", 652 | "reference": "db9508f7b1474469d9d3c53b86f817e344732678" 653 | }, 654 | "dist": { 655 | "type": "zip", 656 | "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", 657 | "reference": "db9508f7b1474469d9d3c53b86f817e344732678", 658 | "shasum": "" 659 | }, 660 | "require": { 661 | "php": "^7.2 || ^8.0" 662 | }, 663 | "require-dev": { 664 | "fidry/makefile": "^0.2.0", 665 | "fidry/php-cs-fixer-config": "^1.1.2", 666 | "phpstan/extension-installer": "^1.2.0", 667 | "phpstan/phpstan": "^2.0", 668 | "phpstan/phpstan-deprecation-rules": "^2.0.0", 669 | "phpstan/phpstan-phpunit": "^2.0", 670 | "phpstan/phpstan-strict-rules": "^2.0", 671 | "phpunit/phpunit": "^8.5.31 || ^9.5.26", 672 | "webmozarts/strict-phpunit": "^7.5" 673 | }, 674 | "type": "library", 675 | "autoload": { 676 | "psr-4": { 677 | "Fidry\\CpuCoreCounter\\": "src/" 678 | } 679 | }, 680 | "notification-url": "https://packagist.org/downloads/", 681 | "license": [ 682 | "MIT" 683 | ], 684 | "authors": [ 685 | { 686 | "name": "Théo FIDRY", 687 | "email": "theo.fidry@gmail.com" 688 | } 689 | ], 690 | "description": "Tiny utility to get the number of CPU cores.", 691 | "keywords": [ 692 | "CPU", 693 | "core" 694 | ], 695 | "support": { 696 | "issues": "https://github.com/theofidry/cpu-core-counter/issues", 697 | "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" 698 | }, 699 | "funding": [ 700 | { 701 | "url": "https://github.com/theofidry", 702 | "type": "github" 703 | } 704 | ], 705 | "time": "2025-08-14T07:29:31+00:00" 706 | }, 707 | { 708 | "name": "myclabs/deep-copy", 709 | "version": "1.13.4", 710 | "source": { 711 | "type": "git", 712 | "url": "https://github.com/myclabs/DeepCopy.git", 713 | "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" 714 | }, 715 | "dist": { 716 | "type": "zip", 717 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", 718 | "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", 719 | "shasum": "" 720 | }, 721 | "require": { 722 | "php": "^7.1 || ^8.0" 723 | }, 724 | "conflict": { 725 | "doctrine/collections": "<1.6.8", 726 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 727 | }, 728 | "require-dev": { 729 | "doctrine/collections": "^1.6.8", 730 | "doctrine/common": "^2.13.3 || ^3.2.2", 731 | "phpspec/prophecy": "^1.10", 732 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 733 | }, 734 | "type": "library", 735 | "autoload": { 736 | "files": [ 737 | "src/DeepCopy/deep_copy.php" 738 | ], 739 | "psr-4": { 740 | "DeepCopy\\": "src/DeepCopy/" 741 | } 742 | }, 743 | "notification-url": "https://packagist.org/downloads/", 744 | "license": [ 745 | "MIT" 746 | ], 747 | "description": "Create deep copies (clones) of your objects", 748 | "keywords": [ 749 | "clone", 750 | "copy", 751 | "duplicate", 752 | "object", 753 | "object graph" 754 | ], 755 | "support": { 756 | "issues": "https://github.com/myclabs/DeepCopy/issues", 757 | "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" 758 | }, 759 | "funding": [ 760 | { 761 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 762 | "type": "tidelift" 763 | } 764 | ], 765 | "time": "2025-08-01T08:46:24+00:00" 766 | }, 767 | { 768 | "name": "netresearch/jsonmapper", 769 | "version": "v4.5.0", 770 | "source": { 771 | "type": "git", 772 | "url": "https://github.com/cweiske/jsonmapper.git", 773 | "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" 774 | }, 775 | "dist": { 776 | "type": "zip", 777 | "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", 778 | "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", 779 | "shasum": "" 780 | }, 781 | "require": { 782 | "ext-json": "*", 783 | "ext-pcre": "*", 784 | "ext-reflection": "*", 785 | "ext-spl": "*", 786 | "php": ">=7.1" 787 | }, 788 | "require-dev": { 789 | "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", 790 | "squizlabs/php_codesniffer": "~3.5" 791 | }, 792 | "type": "library", 793 | "autoload": { 794 | "psr-0": { 795 | "JsonMapper": "src/" 796 | } 797 | }, 798 | "notification-url": "https://packagist.org/downloads/", 799 | "license": [ 800 | "OSL-3.0" 801 | ], 802 | "authors": [ 803 | { 804 | "name": "Christian Weiske", 805 | "email": "cweiske@cweiske.de", 806 | "homepage": "http://github.com/cweiske/jsonmapper/", 807 | "role": "Developer" 808 | } 809 | ], 810 | "description": "Map nested JSON structures onto PHP classes", 811 | "support": { 812 | "email": "cweiske@cweiske.de", 813 | "issues": "https://github.com/cweiske/jsonmapper/issues", 814 | "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" 815 | }, 816 | "time": "2024-09-08T10:13:13+00:00" 817 | }, 818 | { 819 | "name": "nikic/php-parser", 820 | "version": "v4.19.5", 821 | "source": { 822 | "type": "git", 823 | "url": "https://github.com/nikic/PHP-Parser.git", 824 | "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" 825 | }, 826 | "dist": { 827 | "type": "zip", 828 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", 829 | "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", 830 | "shasum": "" 831 | }, 832 | "require": { 833 | "ext-tokenizer": "*", 834 | "php": ">=7.1" 835 | }, 836 | "require-dev": { 837 | "ircmaxell/php-yacc": "^0.0.7", 838 | "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" 839 | }, 840 | "bin": [ 841 | "bin/php-parse" 842 | ], 843 | "type": "library", 844 | "autoload": { 845 | "psr-4": { 846 | "PhpParser\\": "lib/PhpParser" 847 | } 848 | }, 849 | "notification-url": "https://packagist.org/downloads/", 850 | "license": [ 851 | "BSD-3-Clause" 852 | ], 853 | "authors": [ 854 | { 855 | "name": "Nikita Popov" 856 | } 857 | ], 858 | "description": "A PHP parser written in PHP", 859 | "keywords": [ 860 | "parser", 861 | "php" 862 | ], 863 | "support": { 864 | "issues": "https://github.com/nikic/PHP-Parser/issues", 865 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" 866 | }, 867 | "time": "2025-12-06T11:45:25+00:00" 868 | }, 869 | { 870 | "name": "phar-io/manifest", 871 | "version": "2.0.4", 872 | "source": { 873 | "type": "git", 874 | "url": "https://github.com/phar-io/manifest.git", 875 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 876 | }, 877 | "dist": { 878 | "type": "zip", 879 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 880 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 881 | "shasum": "" 882 | }, 883 | "require": { 884 | "ext-dom": "*", 885 | "ext-libxml": "*", 886 | "ext-phar": "*", 887 | "ext-xmlwriter": "*", 888 | "phar-io/version": "^3.0.1", 889 | "php": "^7.2 || ^8.0" 890 | }, 891 | "type": "library", 892 | "extra": { 893 | "branch-alias": { 894 | "dev-master": "2.0.x-dev" 895 | } 896 | }, 897 | "autoload": { 898 | "classmap": [ 899 | "src/" 900 | ] 901 | }, 902 | "notification-url": "https://packagist.org/downloads/", 903 | "license": [ 904 | "BSD-3-Clause" 905 | ], 906 | "authors": [ 907 | { 908 | "name": "Arne Blankerts", 909 | "email": "arne@blankerts.de", 910 | "role": "Developer" 911 | }, 912 | { 913 | "name": "Sebastian Heuer", 914 | "email": "sebastian@phpeople.de", 915 | "role": "Developer" 916 | }, 917 | { 918 | "name": "Sebastian Bergmann", 919 | "email": "sebastian@phpunit.de", 920 | "role": "Developer" 921 | } 922 | ], 923 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 924 | "support": { 925 | "issues": "https://github.com/phar-io/manifest/issues", 926 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 927 | }, 928 | "funding": [ 929 | { 930 | "url": "https://github.com/theseer", 931 | "type": "github" 932 | } 933 | ], 934 | "time": "2024-03-03T12:33:53+00:00" 935 | }, 936 | { 937 | "name": "phar-io/version", 938 | "version": "3.2.1", 939 | "source": { 940 | "type": "git", 941 | "url": "https://github.com/phar-io/version.git", 942 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 943 | }, 944 | "dist": { 945 | "type": "zip", 946 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 947 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 948 | "shasum": "" 949 | }, 950 | "require": { 951 | "php": "^7.2 || ^8.0" 952 | }, 953 | "type": "library", 954 | "autoload": { 955 | "classmap": [ 956 | "src/" 957 | ] 958 | }, 959 | "notification-url": "https://packagist.org/downloads/", 960 | "license": [ 961 | "BSD-3-Clause" 962 | ], 963 | "authors": [ 964 | { 965 | "name": "Arne Blankerts", 966 | "email": "arne@blankerts.de", 967 | "role": "Developer" 968 | }, 969 | { 970 | "name": "Sebastian Heuer", 971 | "email": "sebastian@phpeople.de", 972 | "role": "Developer" 973 | }, 974 | { 975 | "name": "Sebastian Bergmann", 976 | "email": "sebastian@phpunit.de", 977 | "role": "Developer" 978 | } 979 | ], 980 | "description": "Library for handling version information and constraints", 981 | "support": { 982 | "issues": "https://github.com/phar-io/version/issues", 983 | "source": "https://github.com/phar-io/version/tree/3.2.1" 984 | }, 985 | "time": "2022-02-21T01:04:05+00:00" 986 | }, 987 | { 988 | "name": "phpdocumentor/reflection-common", 989 | "version": "2.2.0", 990 | "source": { 991 | "type": "git", 992 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 993 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 994 | }, 995 | "dist": { 996 | "type": "zip", 997 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 998 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 999 | "shasum": "" 1000 | }, 1001 | "require": { 1002 | "php": "^7.2 || ^8.0" 1003 | }, 1004 | "type": "library", 1005 | "extra": { 1006 | "branch-alias": { 1007 | "dev-2.x": "2.x-dev" 1008 | } 1009 | }, 1010 | "autoload": { 1011 | "psr-4": { 1012 | "phpDocumentor\\Reflection\\": "src/" 1013 | } 1014 | }, 1015 | "notification-url": "https://packagist.org/downloads/", 1016 | "license": [ 1017 | "MIT" 1018 | ], 1019 | "authors": [ 1020 | { 1021 | "name": "Jaap van Otterdijk", 1022 | "email": "opensource@ijaap.nl" 1023 | } 1024 | ], 1025 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1026 | "homepage": "http://www.phpdoc.org", 1027 | "keywords": [ 1028 | "FQSEN", 1029 | "phpDocumentor", 1030 | "phpdoc", 1031 | "reflection", 1032 | "static analysis" 1033 | ], 1034 | "support": { 1035 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 1036 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 1037 | }, 1038 | "time": "2020-06-27T09:03:43+00:00" 1039 | }, 1040 | { 1041 | "name": "phpdocumentor/reflection-docblock", 1042 | "version": "5.6.5", 1043 | "source": { 1044 | "type": "git", 1045 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1046 | "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" 1047 | }, 1048 | "dist": { 1049 | "type": "zip", 1050 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", 1051 | "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", 1052 | "shasum": "" 1053 | }, 1054 | "require": { 1055 | "doctrine/deprecations": "^1.1", 1056 | "ext-filter": "*", 1057 | "php": "^7.4 || ^8.0", 1058 | "phpdocumentor/reflection-common": "^2.2", 1059 | "phpdocumentor/type-resolver": "^1.7", 1060 | "phpstan/phpdoc-parser": "^1.7|^2.0", 1061 | "webmozart/assert": "^1.9.1" 1062 | }, 1063 | "require-dev": { 1064 | "mockery/mockery": "~1.3.5 || ~1.6.0", 1065 | "phpstan/extension-installer": "^1.1", 1066 | "phpstan/phpstan": "^1.8", 1067 | "phpstan/phpstan-mockery": "^1.1", 1068 | "phpstan/phpstan-webmozart-assert": "^1.2", 1069 | "phpunit/phpunit": "^9.5", 1070 | "psalm/phar": "^5.26" 1071 | }, 1072 | "type": "library", 1073 | "extra": { 1074 | "branch-alias": { 1075 | "dev-master": "5.x-dev" 1076 | } 1077 | }, 1078 | "autoload": { 1079 | "psr-4": { 1080 | "phpDocumentor\\Reflection\\": "src" 1081 | } 1082 | }, 1083 | "notification-url": "https://packagist.org/downloads/", 1084 | "license": [ 1085 | "MIT" 1086 | ], 1087 | "authors": [ 1088 | { 1089 | "name": "Mike van Riel", 1090 | "email": "me@mikevanriel.com" 1091 | }, 1092 | { 1093 | "name": "Jaap van Otterdijk", 1094 | "email": "opensource@ijaap.nl" 1095 | } 1096 | ], 1097 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1098 | "support": { 1099 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 1100 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.5" 1101 | }, 1102 | "time": "2025-11-27T19:50:05+00:00" 1103 | }, 1104 | { 1105 | "name": "phpdocumentor/type-resolver", 1106 | "version": "1.12.0", 1107 | "source": { 1108 | "type": "git", 1109 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1110 | "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" 1111 | }, 1112 | "dist": { 1113 | "type": "zip", 1114 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", 1115 | "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", 1116 | "shasum": "" 1117 | }, 1118 | "require": { 1119 | "doctrine/deprecations": "^1.0", 1120 | "php": "^7.3 || ^8.0", 1121 | "phpdocumentor/reflection-common": "^2.0", 1122 | "phpstan/phpdoc-parser": "^1.18|^2.0" 1123 | }, 1124 | "require-dev": { 1125 | "ext-tokenizer": "*", 1126 | "phpbench/phpbench": "^1.2", 1127 | "phpstan/extension-installer": "^1.1", 1128 | "phpstan/phpstan": "^1.8", 1129 | "phpstan/phpstan-phpunit": "^1.1", 1130 | "phpunit/phpunit": "^9.5", 1131 | "rector/rector": "^0.13.9", 1132 | "vimeo/psalm": "^4.25" 1133 | }, 1134 | "type": "library", 1135 | "extra": { 1136 | "branch-alias": { 1137 | "dev-1.x": "1.x-dev" 1138 | } 1139 | }, 1140 | "autoload": { 1141 | "psr-4": { 1142 | "phpDocumentor\\Reflection\\": "src" 1143 | } 1144 | }, 1145 | "notification-url": "https://packagist.org/downloads/", 1146 | "license": [ 1147 | "MIT" 1148 | ], 1149 | "authors": [ 1150 | { 1151 | "name": "Mike van Riel", 1152 | "email": "me@mikevanriel.com" 1153 | } 1154 | ], 1155 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1156 | "support": { 1157 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 1158 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" 1159 | }, 1160 | "time": "2025-11-21T15:09:14+00:00" 1161 | }, 1162 | { 1163 | "name": "phpstan/phpdoc-parser", 1164 | "version": "2.3.0", 1165 | "source": { 1166 | "type": "git", 1167 | "url": "https://github.com/phpstan/phpdoc-parser.git", 1168 | "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" 1169 | }, 1170 | "dist": { 1171 | "type": "zip", 1172 | "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", 1173 | "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", 1174 | "shasum": "" 1175 | }, 1176 | "require": { 1177 | "php": "^7.4 || ^8.0" 1178 | }, 1179 | "require-dev": { 1180 | "doctrine/annotations": "^2.0", 1181 | "nikic/php-parser": "^5.3.0", 1182 | "php-parallel-lint/php-parallel-lint": "^1.2", 1183 | "phpstan/extension-installer": "^1.0", 1184 | "phpstan/phpstan": "^2.0", 1185 | "phpstan/phpstan-phpunit": "^2.0", 1186 | "phpstan/phpstan-strict-rules": "^2.0", 1187 | "phpunit/phpunit": "^9.6", 1188 | "symfony/process": "^5.2" 1189 | }, 1190 | "type": "library", 1191 | "autoload": { 1192 | "psr-4": { 1193 | "PHPStan\\PhpDocParser\\": [ 1194 | "src/" 1195 | ] 1196 | } 1197 | }, 1198 | "notification-url": "https://packagist.org/downloads/", 1199 | "license": [ 1200 | "MIT" 1201 | ], 1202 | "description": "PHPDoc parser with support for nullable, intersection and generic types", 1203 | "support": { 1204 | "issues": "https://github.com/phpstan/phpdoc-parser/issues", 1205 | "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" 1206 | }, 1207 | "time": "2025-08-30T15:50:23+00:00" 1208 | }, 1209 | { 1210 | "name": "phpunit/php-code-coverage", 1211 | "version": "10.1.16", 1212 | "source": { 1213 | "type": "git", 1214 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1215 | "reference": "7e308268858ed6baedc8704a304727d20bc07c77" 1216 | }, 1217 | "dist": { 1218 | "type": "zip", 1219 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", 1220 | "reference": "7e308268858ed6baedc8704a304727d20bc07c77", 1221 | "shasum": "" 1222 | }, 1223 | "require": { 1224 | "ext-dom": "*", 1225 | "ext-libxml": "*", 1226 | "ext-xmlwriter": "*", 1227 | "nikic/php-parser": "^4.19.1 || ^5.1.0", 1228 | "php": ">=8.1", 1229 | "phpunit/php-file-iterator": "^4.1.0", 1230 | "phpunit/php-text-template": "^3.0.1", 1231 | "sebastian/code-unit-reverse-lookup": "^3.0.0", 1232 | "sebastian/complexity": "^3.2.0", 1233 | "sebastian/environment": "^6.1.0", 1234 | "sebastian/lines-of-code": "^2.0.2", 1235 | "sebastian/version": "^4.0.1", 1236 | "theseer/tokenizer": "^1.2.3" 1237 | }, 1238 | "require-dev": { 1239 | "phpunit/phpunit": "^10.1" 1240 | }, 1241 | "suggest": { 1242 | "ext-pcov": "PHP extension that provides line coverage", 1243 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1244 | }, 1245 | "type": "library", 1246 | "extra": { 1247 | "branch-alias": { 1248 | "dev-main": "10.1.x-dev" 1249 | } 1250 | }, 1251 | "autoload": { 1252 | "classmap": [ 1253 | "src/" 1254 | ] 1255 | }, 1256 | "notification-url": "https://packagist.org/downloads/", 1257 | "license": [ 1258 | "BSD-3-Clause" 1259 | ], 1260 | "authors": [ 1261 | { 1262 | "name": "Sebastian Bergmann", 1263 | "email": "sebastian@phpunit.de", 1264 | "role": "lead" 1265 | } 1266 | ], 1267 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1268 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1269 | "keywords": [ 1270 | "coverage", 1271 | "testing", 1272 | "xunit" 1273 | ], 1274 | "support": { 1275 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 1276 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 1277 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" 1278 | }, 1279 | "funding": [ 1280 | { 1281 | "url": "https://github.com/sebastianbergmann", 1282 | "type": "github" 1283 | } 1284 | ], 1285 | "time": "2024-08-22T04:31:57+00:00" 1286 | }, 1287 | { 1288 | "name": "phpunit/php-file-iterator", 1289 | "version": "4.1.0", 1290 | "source": { 1291 | "type": "git", 1292 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1293 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" 1294 | }, 1295 | "dist": { 1296 | "type": "zip", 1297 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", 1298 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", 1299 | "shasum": "" 1300 | }, 1301 | "require": { 1302 | "php": ">=8.1" 1303 | }, 1304 | "require-dev": { 1305 | "phpunit/phpunit": "^10.0" 1306 | }, 1307 | "type": "library", 1308 | "extra": { 1309 | "branch-alias": { 1310 | "dev-main": "4.0-dev" 1311 | } 1312 | }, 1313 | "autoload": { 1314 | "classmap": [ 1315 | "src/" 1316 | ] 1317 | }, 1318 | "notification-url": "https://packagist.org/downloads/", 1319 | "license": [ 1320 | "BSD-3-Clause" 1321 | ], 1322 | "authors": [ 1323 | { 1324 | "name": "Sebastian Bergmann", 1325 | "email": "sebastian@phpunit.de", 1326 | "role": "lead" 1327 | } 1328 | ], 1329 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1330 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1331 | "keywords": [ 1332 | "filesystem", 1333 | "iterator" 1334 | ], 1335 | "support": { 1336 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 1337 | "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", 1338 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" 1339 | }, 1340 | "funding": [ 1341 | { 1342 | "url": "https://github.com/sebastianbergmann", 1343 | "type": "github" 1344 | } 1345 | ], 1346 | "time": "2023-08-31T06:24:48+00:00" 1347 | }, 1348 | { 1349 | "name": "phpunit/php-invoker", 1350 | "version": "4.0.0", 1351 | "source": { 1352 | "type": "git", 1353 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 1354 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" 1355 | }, 1356 | "dist": { 1357 | "type": "zip", 1358 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 1359 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 1360 | "shasum": "" 1361 | }, 1362 | "require": { 1363 | "php": ">=8.1" 1364 | }, 1365 | "require-dev": { 1366 | "ext-pcntl": "*", 1367 | "phpunit/phpunit": "^10.0" 1368 | }, 1369 | "suggest": { 1370 | "ext-pcntl": "*" 1371 | }, 1372 | "type": "library", 1373 | "extra": { 1374 | "branch-alias": { 1375 | "dev-main": "4.0-dev" 1376 | } 1377 | }, 1378 | "autoload": { 1379 | "classmap": [ 1380 | "src/" 1381 | ] 1382 | }, 1383 | "notification-url": "https://packagist.org/downloads/", 1384 | "license": [ 1385 | "BSD-3-Clause" 1386 | ], 1387 | "authors": [ 1388 | { 1389 | "name": "Sebastian Bergmann", 1390 | "email": "sebastian@phpunit.de", 1391 | "role": "lead" 1392 | } 1393 | ], 1394 | "description": "Invoke callables with a timeout", 1395 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1396 | "keywords": [ 1397 | "process" 1398 | ], 1399 | "support": { 1400 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1401 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" 1402 | }, 1403 | "funding": [ 1404 | { 1405 | "url": "https://github.com/sebastianbergmann", 1406 | "type": "github" 1407 | } 1408 | ], 1409 | "time": "2023-02-03T06:56:09+00:00" 1410 | }, 1411 | { 1412 | "name": "phpunit/php-text-template", 1413 | "version": "3.0.1", 1414 | "source": { 1415 | "type": "git", 1416 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1417 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" 1418 | }, 1419 | "dist": { 1420 | "type": "zip", 1421 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", 1422 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", 1423 | "shasum": "" 1424 | }, 1425 | "require": { 1426 | "php": ">=8.1" 1427 | }, 1428 | "require-dev": { 1429 | "phpunit/phpunit": "^10.0" 1430 | }, 1431 | "type": "library", 1432 | "extra": { 1433 | "branch-alias": { 1434 | "dev-main": "3.0-dev" 1435 | } 1436 | }, 1437 | "autoload": { 1438 | "classmap": [ 1439 | "src/" 1440 | ] 1441 | }, 1442 | "notification-url": "https://packagist.org/downloads/", 1443 | "license": [ 1444 | "BSD-3-Clause" 1445 | ], 1446 | "authors": [ 1447 | { 1448 | "name": "Sebastian Bergmann", 1449 | "email": "sebastian@phpunit.de", 1450 | "role": "lead" 1451 | } 1452 | ], 1453 | "description": "Simple template engine.", 1454 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1455 | "keywords": [ 1456 | "template" 1457 | ], 1458 | "support": { 1459 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1460 | "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", 1461 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" 1462 | }, 1463 | "funding": [ 1464 | { 1465 | "url": "https://github.com/sebastianbergmann", 1466 | "type": "github" 1467 | } 1468 | ], 1469 | "time": "2023-08-31T14:07:24+00:00" 1470 | }, 1471 | { 1472 | "name": "phpunit/php-timer", 1473 | "version": "6.0.0", 1474 | "source": { 1475 | "type": "git", 1476 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1477 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" 1478 | }, 1479 | "dist": { 1480 | "type": "zip", 1481 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", 1482 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", 1483 | "shasum": "" 1484 | }, 1485 | "require": { 1486 | "php": ">=8.1" 1487 | }, 1488 | "require-dev": { 1489 | "phpunit/phpunit": "^10.0" 1490 | }, 1491 | "type": "library", 1492 | "extra": { 1493 | "branch-alias": { 1494 | "dev-main": "6.0-dev" 1495 | } 1496 | }, 1497 | "autoload": { 1498 | "classmap": [ 1499 | "src/" 1500 | ] 1501 | }, 1502 | "notification-url": "https://packagist.org/downloads/", 1503 | "license": [ 1504 | "BSD-3-Clause" 1505 | ], 1506 | "authors": [ 1507 | { 1508 | "name": "Sebastian Bergmann", 1509 | "email": "sebastian@phpunit.de", 1510 | "role": "lead" 1511 | } 1512 | ], 1513 | "description": "Utility class for timing", 1514 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1515 | "keywords": [ 1516 | "timer" 1517 | ], 1518 | "support": { 1519 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1520 | "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" 1521 | }, 1522 | "funding": [ 1523 | { 1524 | "url": "https://github.com/sebastianbergmann", 1525 | "type": "github" 1526 | } 1527 | ], 1528 | "time": "2023-02-03T06:57:52+00:00" 1529 | }, 1530 | { 1531 | "name": "phpunit/phpunit", 1532 | "version": "10.5.60", 1533 | "source": { 1534 | "type": "git", 1535 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1536 | "reference": "f2e26f52f80ef77832e359205f216eeac00e320c" 1537 | }, 1538 | "dist": { 1539 | "type": "zip", 1540 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f2e26f52f80ef77832e359205f216eeac00e320c", 1541 | "reference": "f2e26f52f80ef77832e359205f216eeac00e320c", 1542 | "shasum": "" 1543 | }, 1544 | "require": { 1545 | "ext-dom": "*", 1546 | "ext-json": "*", 1547 | "ext-libxml": "*", 1548 | "ext-mbstring": "*", 1549 | "ext-xml": "*", 1550 | "ext-xmlwriter": "*", 1551 | "myclabs/deep-copy": "^1.13.4", 1552 | "phar-io/manifest": "^2.0.4", 1553 | "phar-io/version": "^3.2.1", 1554 | "php": ">=8.1", 1555 | "phpunit/php-code-coverage": "^10.1.16", 1556 | "phpunit/php-file-iterator": "^4.1.0", 1557 | "phpunit/php-invoker": "^4.0.0", 1558 | "phpunit/php-text-template": "^3.0.1", 1559 | "phpunit/php-timer": "^6.0.0", 1560 | "sebastian/cli-parser": "^2.0.1", 1561 | "sebastian/code-unit": "^2.0.0", 1562 | "sebastian/comparator": "^5.0.4", 1563 | "sebastian/diff": "^5.1.1", 1564 | "sebastian/environment": "^6.1.0", 1565 | "sebastian/exporter": "^5.1.4", 1566 | "sebastian/global-state": "^6.0.2", 1567 | "sebastian/object-enumerator": "^5.0.0", 1568 | "sebastian/recursion-context": "^5.0.1", 1569 | "sebastian/type": "^4.0.0", 1570 | "sebastian/version": "^4.0.1" 1571 | }, 1572 | "suggest": { 1573 | "ext-soap": "To be able to generate mocks based on WSDL files" 1574 | }, 1575 | "bin": [ 1576 | "phpunit" 1577 | ], 1578 | "type": "library", 1579 | "extra": { 1580 | "branch-alias": { 1581 | "dev-main": "10.5-dev" 1582 | } 1583 | }, 1584 | "autoload": { 1585 | "files": [ 1586 | "src/Framework/Assert/Functions.php" 1587 | ], 1588 | "classmap": [ 1589 | "src/" 1590 | ] 1591 | }, 1592 | "notification-url": "https://packagist.org/downloads/", 1593 | "license": [ 1594 | "BSD-3-Clause" 1595 | ], 1596 | "authors": [ 1597 | { 1598 | "name": "Sebastian Bergmann", 1599 | "email": "sebastian@phpunit.de", 1600 | "role": "lead" 1601 | } 1602 | ], 1603 | "description": "The PHP Unit Testing framework.", 1604 | "homepage": "https://phpunit.de/", 1605 | "keywords": [ 1606 | "phpunit", 1607 | "testing", 1608 | "xunit" 1609 | ], 1610 | "support": { 1611 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1612 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1613 | "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.60" 1614 | }, 1615 | "funding": [ 1616 | { 1617 | "url": "https://phpunit.de/sponsors.html", 1618 | "type": "custom" 1619 | }, 1620 | { 1621 | "url": "https://github.com/sebastianbergmann", 1622 | "type": "github" 1623 | }, 1624 | { 1625 | "url": "https://liberapay.com/sebastianbergmann", 1626 | "type": "liberapay" 1627 | }, 1628 | { 1629 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 1630 | "type": "thanks_dev" 1631 | }, 1632 | { 1633 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1634 | "type": "tidelift" 1635 | } 1636 | ], 1637 | "time": "2025-12-06T07:50:42+00:00" 1638 | }, 1639 | { 1640 | "name": "psalm/plugin-phpunit", 1641 | "version": "0.18.4", 1642 | "source": { 1643 | "type": "git", 1644 | "url": "https://github.com/psalm/psalm-plugin-phpunit.git", 1645 | "reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc" 1646 | }, 1647 | "dist": { 1648 | "type": "zip", 1649 | "url": "https://api.github.com/repos/psalm/psalm-plugin-phpunit/zipball/e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc", 1650 | "reference": "e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc", 1651 | "shasum": "" 1652 | }, 1653 | "require": { 1654 | "composer/package-versions-deprecated": "^1.10", 1655 | "composer/semver": "^1.4 || ^2.0 || ^3.0", 1656 | "ext-simplexml": "*", 1657 | "php": "^7.1 || ^8.0", 1658 | "vimeo/psalm": "dev-master || dev-4.x || ^4.7.1 || ^5@beta || ^5.0" 1659 | }, 1660 | "conflict": { 1661 | "phpunit/phpunit": "<7.5" 1662 | }, 1663 | "require-dev": { 1664 | "codeception/codeception": "^4.0.3", 1665 | "php": "^7.3 || ^8.0", 1666 | "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0", 1667 | "squizlabs/php_codesniffer": "^3.3.1", 1668 | "weirdan/codeception-psalm-module": "^0.11.0", 1669 | "weirdan/prophecy-shim": "^1.0 || ^2.0" 1670 | }, 1671 | "type": "psalm-plugin", 1672 | "extra": { 1673 | "psalm": { 1674 | "pluginClass": "Psalm\\PhpUnitPlugin\\Plugin" 1675 | } 1676 | }, 1677 | "autoload": { 1678 | "psr-4": { 1679 | "Psalm\\PhpUnitPlugin\\": "src" 1680 | } 1681 | }, 1682 | "notification-url": "https://packagist.org/downloads/", 1683 | "license": [ 1684 | "MIT" 1685 | ], 1686 | "authors": [ 1687 | { 1688 | "name": "Matt Brown", 1689 | "email": "github@muglug.com" 1690 | } 1691 | ], 1692 | "description": "Psalm plugin for PHPUnit", 1693 | "support": { 1694 | "issues": "https://github.com/psalm/psalm-plugin-phpunit/issues", 1695 | "source": "https://github.com/psalm/psalm-plugin-phpunit/tree/0.18.4" 1696 | }, 1697 | "time": "2022-12-03T07:47:07+00:00" 1698 | }, 1699 | { 1700 | "name": "psr/container", 1701 | "version": "2.0.2", 1702 | "source": { 1703 | "type": "git", 1704 | "url": "https://github.com/php-fig/container.git", 1705 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1706 | }, 1707 | "dist": { 1708 | "type": "zip", 1709 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1710 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1711 | "shasum": "" 1712 | }, 1713 | "require": { 1714 | "php": ">=7.4.0" 1715 | }, 1716 | "type": "library", 1717 | "extra": { 1718 | "branch-alias": { 1719 | "dev-master": "2.0.x-dev" 1720 | } 1721 | }, 1722 | "autoload": { 1723 | "psr-4": { 1724 | "Psr\\Container\\": "src/" 1725 | } 1726 | }, 1727 | "notification-url": "https://packagist.org/downloads/", 1728 | "license": [ 1729 | "MIT" 1730 | ], 1731 | "authors": [ 1732 | { 1733 | "name": "PHP-FIG", 1734 | "homepage": "https://www.php-fig.org/" 1735 | } 1736 | ], 1737 | "description": "Common Container Interface (PHP FIG PSR-11)", 1738 | "homepage": "https://github.com/php-fig/container", 1739 | "keywords": [ 1740 | "PSR-11", 1741 | "container", 1742 | "container-interface", 1743 | "container-interop", 1744 | "psr" 1745 | ], 1746 | "support": { 1747 | "issues": "https://github.com/php-fig/container/issues", 1748 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1749 | }, 1750 | "time": "2021-11-05T16:47:00+00:00" 1751 | }, 1752 | { 1753 | "name": "psr/log", 1754 | "version": "3.0.2", 1755 | "source": { 1756 | "type": "git", 1757 | "url": "https://github.com/php-fig/log.git", 1758 | "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" 1759 | }, 1760 | "dist": { 1761 | "type": "zip", 1762 | "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", 1763 | "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", 1764 | "shasum": "" 1765 | }, 1766 | "require": { 1767 | "php": ">=8.0.0" 1768 | }, 1769 | "type": "library", 1770 | "extra": { 1771 | "branch-alias": { 1772 | "dev-master": "3.x-dev" 1773 | } 1774 | }, 1775 | "autoload": { 1776 | "psr-4": { 1777 | "Psr\\Log\\": "src" 1778 | } 1779 | }, 1780 | "notification-url": "https://packagist.org/downloads/", 1781 | "license": [ 1782 | "MIT" 1783 | ], 1784 | "authors": [ 1785 | { 1786 | "name": "PHP-FIG", 1787 | "homepage": "https://www.php-fig.org/" 1788 | } 1789 | ], 1790 | "description": "Common interface for logging libraries", 1791 | "homepage": "https://github.com/php-fig/log", 1792 | "keywords": [ 1793 | "log", 1794 | "psr", 1795 | "psr-3" 1796 | ], 1797 | "support": { 1798 | "source": "https://github.com/php-fig/log/tree/3.0.2" 1799 | }, 1800 | "time": "2024-09-11T13:17:53+00:00" 1801 | }, 1802 | { 1803 | "name": "sebastian/cli-parser", 1804 | "version": "2.0.1", 1805 | "source": { 1806 | "type": "git", 1807 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1808 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" 1809 | }, 1810 | "dist": { 1811 | "type": "zip", 1812 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", 1813 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", 1814 | "shasum": "" 1815 | }, 1816 | "require": { 1817 | "php": ">=8.1" 1818 | }, 1819 | "require-dev": { 1820 | "phpunit/phpunit": "^10.0" 1821 | }, 1822 | "type": "library", 1823 | "extra": { 1824 | "branch-alias": { 1825 | "dev-main": "2.0-dev" 1826 | } 1827 | }, 1828 | "autoload": { 1829 | "classmap": [ 1830 | "src/" 1831 | ] 1832 | }, 1833 | "notification-url": "https://packagist.org/downloads/", 1834 | "license": [ 1835 | "BSD-3-Clause" 1836 | ], 1837 | "authors": [ 1838 | { 1839 | "name": "Sebastian Bergmann", 1840 | "email": "sebastian@phpunit.de", 1841 | "role": "lead" 1842 | } 1843 | ], 1844 | "description": "Library for parsing CLI options", 1845 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1846 | "support": { 1847 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1848 | "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", 1849 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" 1850 | }, 1851 | "funding": [ 1852 | { 1853 | "url": "https://github.com/sebastianbergmann", 1854 | "type": "github" 1855 | } 1856 | ], 1857 | "time": "2024-03-02T07:12:49+00:00" 1858 | }, 1859 | { 1860 | "name": "sebastian/code-unit", 1861 | "version": "2.0.0", 1862 | "source": { 1863 | "type": "git", 1864 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1865 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" 1866 | }, 1867 | "dist": { 1868 | "type": "zip", 1869 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", 1870 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", 1871 | "shasum": "" 1872 | }, 1873 | "require": { 1874 | "php": ">=8.1" 1875 | }, 1876 | "require-dev": { 1877 | "phpunit/phpunit": "^10.0" 1878 | }, 1879 | "type": "library", 1880 | "extra": { 1881 | "branch-alias": { 1882 | "dev-main": "2.0-dev" 1883 | } 1884 | }, 1885 | "autoload": { 1886 | "classmap": [ 1887 | "src/" 1888 | ] 1889 | }, 1890 | "notification-url": "https://packagist.org/downloads/", 1891 | "license": [ 1892 | "BSD-3-Clause" 1893 | ], 1894 | "authors": [ 1895 | { 1896 | "name": "Sebastian Bergmann", 1897 | "email": "sebastian@phpunit.de", 1898 | "role": "lead" 1899 | } 1900 | ], 1901 | "description": "Collection of value objects that represent the PHP code units", 1902 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1903 | "support": { 1904 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1905 | "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" 1906 | }, 1907 | "funding": [ 1908 | { 1909 | "url": "https://github.com/sebastianbergmann", 1910 | "type": "github" 1911 | } 1912 | ], 1913 | "time": "2023-02-03T06:58:43+00:00" 1914 | }, 1915 | { 1916 | "name": "sebastian/code-unit-reverse-lookup", 1917 | "version": "3.0.0", 1918 | "source": { 1919 | "type": "git", 1920 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1921 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" 1922 | }, 1923 | "dist": { 1924 | "type": "zip", 1925 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 1926 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 1927 | "shasum": "" 1928 | }, 1929 | "require": { 1930 | "php": ">=8.1" 1931 | }, 1932 | "require-dev": { 1933 | "phpunit/phpunit": "^10.0" 1934 | }, 1935 | "type": "library", 1936 | "extra": { 1937 | "branch-alias": { 1938 | "dev-main": "3.0-dev" 1939 | } 1940 | }, 1941 | "autoload": { 1942 | "classmap": [ 1943 | "src/" 1944 | ] 1945 | }, 1946 | "notification-url": "https://packagist.org/downloads/", 1947 | "license": [ 1948 | "BSD-3-Clause" 1949 | ], 1950 | "authors": [ 1951 | { 1952 | "name": "Sebastian Bergmann", 1953 | "email": "sebastian@phpunit.de" 1954 | } 1955 | ], 1956 | "description": "Looks up which function or method a line of code belongs to", 1957 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1958 | "support": { 1959 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1960 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" 1961 | }, 1962 | "funding": [ 1963 | { 1964 | "url": "https://github.com/sebastianbergmann", 1965 | "type": "github" 1966 | } 1967 | ], 1968 | "time": "2023-02-03T06:59:15+00:00" 1969 | }, 1970 | { 1971 | "name": "sebastian/comparator", 1972 | "version": "5.0.4", 1973 | "source": { 1974 | "type": "git", 1975 | "url": "https://github.com/sebastianbergmann/comparator.git", 1976 | "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" 1977 | }, 1978 | "dist": { 1979 | "type": "zip", 1980 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", 1981 | "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", 1982 | "shasum": "" 1983 | }, 1984 | "require": { 1985 | "ext-dom": "*", 1986 | "ext-mbstring": "*", 1987 | "php": ">=8.1", 1988 | "sebastian/diff": "^5.0", 1989 | "sebastian/exporter": "^5.0" 1990 | }, 1991 | "require-dev": { 1992 | "phpunit/phpunit": "^10.5" 1993 | }, 1994 | "type": "library", 1995 | "extra": { 1996 | "branch-alias": { 1997 | "dev-main": "5.0-dev" 1998 | } 1999 | }, 2000 | "autoload": { 2001 | "classmap": [ 2002 | "src/" 2003 | ] 2004 | }, 2005 | "notification-url": "https://packagist.org/downloads/", 2006 | "license": [ 2007 | "BSD-3-Clause" 2008 | ], 2009 | "authors": [ 2010 | { 2011 | "name": "Sebastian Bergmann", 2012 | "email": "sebastian@phpunit.de" 2013 | }, 2014 | { 2015 | "name": "Jeff Welch", 2016 | "email": "whatthejeff@gmail.com" 2017 | }, 2018 | { 2019 | "name": "Volker Dusch", 2020 | "email": "github@wallbash.com" 2021 | }, 2022 | { 2023 | "name": "Bernhard Schussek", 2024 | "email": "bschussek@2bepublished.at" 2025 | } 2026 | ], 2027 | "description": "Provides the functionality to compare PHP values for equality", 2028 | "homepage": "https://github.com/sebastianbergmann/comparator", 2029 | "keywords": [ 2030 | "comparator", 2031 | "compare", 2032 | "equality" 2033 | ], 2034 | "support": { 2035 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 2036 | "security": "https://github.com/sebastianbergmann/comparator/security/policy", 2037 | "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" 2038 | }, 2039 | "funding": [ 2040 | { 2041 | "url": "https://github.com/sebastianbergmann", 2042 | "type": "github" 2043 | }, 2044 | { 2045 | "url": "https://liberapay.com/sebastianbergmann", 2046 | "type": "liberapay" 2047 | }, 2048 | { 2049 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 2050 | "type": "thanks_dev" 2051 | }, 2052 | { 2053 | "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", 2054 | "type": "tidelift" 2055 | } 2056 | ], 2057 | "time": "2025-09-07T05:25:07+00:00" 2058 | }, 2059 | { 2060 | "name": "sebastian/complexity", 2061 | "version": "3.2.0", 2062 | "source": { 2063 | "type": "git", 2064 | "url": "https://github.com/sebastianbergmann/complexity.git", 2065 | "reference": "68ff824baeae169ec9f2137158ee529584553799" 2066 | }, 2067 | "dist": { 2068 | "type": "zip", 2069 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", 2070 | "reference": "68ff824baeae169ec9f2137158ee529584553799", 2071 | "shasum": "" 2072 | }, 2073 | "require": { 2074 | "nikic/php-parser": "^4.18 || ^5.0", 2075 | "php": ">=8.1" 2076 | }, 2077 | "require-dev": { 2078 | "phpunit/phpunit": "^10.0" 2079 | }, 2080 | "type": "library", 2081 | "extra": { 2082 | "branch-alias": { 2083 | "dev-main": "3.2-dev" 2084 | } 2085 | }, 2086 | "autoload": { 2087 | "classmap": [ 2088 | "src/" 2089 | ] 2090 | }, 2091 | "notification-url": "https://packagist.org/downloads/", 2092 | "license": [ 2093 | "BSD-3-Clause" 2094 | ], 2095 | "authors": [ 2096 | { 2097 | "name": "Sebastian Bergmann", 2098 | "email": "sebastian@phpunit.de", 2099 | "role": "lead" 2100 | } 2101 | ], 2102 | "description": "Library for calculating the complexity of PHP code units", 2103 | "homepage": "https://github.com/sebastianbergmann/complexity", 2104 | "support": { 2105 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 2106 | "security": "https://github.com/sebastianbergmann/complexity/security/policy", 2107 | "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" 2108 | }, 2109 | "funding": [ 2110 | { 2111 | "url": "https://github.com/sebastianbergmann", 2112 | "type": "github" 2113 | } 2114 | ], 2115 | "time": "2023-12-21T08:37:17+00:00" 2116 | }, 2117 | { 2118 | "name": "sebastian/diff", 2119 | "version": "5.1.1", 2120 | "source": { 2121 | "type": "git", 2122 | "url": "https://github.com/sebastianbergmann/diff.git", 2123 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" 2124 | }, 2125 | "dist": { 2126 | "type": "zip", 2127 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", 2128 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", 2129 | "shasum": "" 2130 | }, 2131 | "require": { 2132 | "php": ">=8.1" 2133 | }, 2134 | "require-dev": { 2135 | "phpunit/phpunit": "^10.0", 2136 | "symfony/process": "^6.4" 2137 | }, 2138 | "type": "library", 2139 | "extra": { 2140 | "branch-alias": { 2141 | "dev-main": "5.1-dev" 2142 | } 2143 | }, 2144 | "autoload": { 2145 | "classmap": [ 2146 | "src/" 2147 | ] 2148 | }, 2149 | "notification-url": "https://packagist.org/downloads/", 2150 | "license": [ 2151 | "BSD-3-Clause" 2152 | ], 2153 | "authors": [ 2154 | { 2155 | "name": "Sebastian Bergmann", 2156 | "email": "sebastian@phpunit.de" 2157 | }, 2158 | { 2159 | "name": "Kore Nordmann", 2160 | "email": "mail@kore-nordmann.de" 2161 | } 2162 | ], 2163 | "description": "Diff implementation", 2164 | "homepage": "https://github.com/sebastianbergmann/diff", 2165 | "keywords": [ 2166 | "diff", 2167 | "udiff", 2168 | "unidiff", 2169 | "unified diff" 2170 | ], 2171 | "support": { 2172 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2173 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 2174 | "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" 2175 | }, 2176 | "funding": [ 2177 | { 2178 | "url": "https://github.com/sebastianbergmann", 2179 | "type": "github" 2180 | } 2181 | ], 2182 | "time": "2024-03-02T07:15:17+00:00" 2183 | }, 2184 | { 2185 | "name": "sebastian/environment", 2186 | "version": "6.1.0", 2187 | "source": { 2188 | "type": "git", 2189 | "url": "https://github.com/sebastianbergmann/environment.git", 2190 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" 2191 | }, 2192 | "dist": { 2193 | "type": "zip", 2194 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", 2195 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", 2196 | "shasum": "" 2197 | }, 2198 | "require": { 2199 | "php": ">=8.1" 2200 | }, 2201 | "require-dev": { 2202 | "phpunit/phpunit": "^10.0" 2203 | }, 2204 | "suggest": { 2205 | "ext-posix": "*" 2206 | }, 2207 | "type": "library", 2208 | "extra": { 2209 | "branch-alias": { 2210 | "dev-main": "6.1-dev" 2211 | } 2212 | }, 2213 | "autoload": { 2214 | "classmap": [ 2215 | "src/" 2216 | ] 2217 | }, 2218 | "notification-url": "https://packagist.org/downloads/", 2219 | "license": [ 2220 | "BSD-3-Clause" 2221 | ], 2222 | "authors": [ 2223 | { 2224 | "name": "Sebastian Bergmann", 2225 | "email": "sebastian@phpunit.de" 2226 | } 2227 | ], 2228 | "description": "Provides functionality to handle HHVM/PHP environments", 2229 | "homepage": "https://github.com/sebastianbergmann/environment", 2230 | "keywords": [ 2231 | "Xdebug", 2232 | "environment", 2233 | "hhvm" 2234 | ], 2235 | "support": { 2236 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2237 | "security": "https://github.com/sebastianbergmann/environment/security/policy", 2238 | "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" 2239 | }, 2240 | "funding": [ 2241 | { 2242 | "url": "https://github.com/sebastianbergmann", 2243 | "type": "github" 2244 | } 2245 | ], 2246 | "time": "2024-03-23T08:47:14+00:00" 2247 | }, 2248 | { 2249 | "name": "sebastian/exporter", 2250 | "version": "5.1.4", 2251 | "source": { 2252 | "type": "git", 2253 | "url": "https://github.com/sebastianbergmann/exporter.git", 2254 | "reference": "0735b90f4da94969541dac1da743446e276defa6" 2255 | }, 2256 | "dist": { 2257 | "type": "zip", 2258 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", 2259 | "reference": "0735b90f4da94969541dac1da743446e276defa6", 2260 | "shasum": "" 2261 | }, 2262 | "require": { 2263 | "ext-mbstring": "*", 2264 | "php": ">=8.1", 2265 | "sebastian/recursion-context": "^5.0" 2266 | }, 2267 | "require-dev": { 2268 | "phpunit/phpunit": "^10.5" 2269 | }, 2270 | "type": "library", 2271 | "extra": { 2272 | "branch-alias": { 2273 | "dev-main": "5.1-dev" 2274 | } 2275 | }, 2276 | "autoload": { 2277 | "classmap": [ 2278 | "src/" 2279 | ] 2280 | }, 2281 | "notification-url": "https://packagist.org/downloads/", 2282 | "license": [ 2283 | "BSD-3-Clause" 2284 | ], 2285 | "authors": [ 2286 | { 2287 | "name": "Sebastian Bergmann", 2288 | "email": "sebastian@phpunit.de" 2289 | }, 2290 | { 2291 | "name": "Jeff Welch", 2292 | "email": "whatthejeff@gmail.com" 2293 | }, 2294 | { 2295 | "name": "Volker Dusch", 2296 | "email": "github@wallbash.com" 2297 | }, 2298 | { 2299 | "name": "Adam Harvey", 2300 | "email": "aharvey@php.net" 2301 | }, 2302 | { 2303 | "name": "Bernhard Schussek", 2304 | "email": "bschussek@gmail.com" 2305 | } 2306 | ], 2307 | "description": "Provides the functionality to export PHP variables for visualization", 2308 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 2309 | "keywords": [ 2310 | "export", 2311 | "exporter" 2312 | ], 2313 | "support": { 2314 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2315 | "security": "https://github.com/sebastianbergmann/exporter/security/policy", 2316 | "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" 2317 | }, 2318 | "funding": [ 2319 | { 2320 | "url": "https://github.com/sebastianbergmann", 2321 | "type": "github" 2322 | }, 2323 | { 2324 | "url": "https://liberapay.com/sebastianbergmann", 2325 | "type": "liberapay" 2326 | }, 2327 | { 2328 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 2329 | "type": "thanks_dev" 2330 | }, 2331 | { 2332 | "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", 2333 | "type": "tidelift" 2334 | } 2335 | ], 2336 | "time": "2025-09-24T06:09:11+00:00" 2337 | }, 2338 | { 2339 | "name": "sebastian/global-state", 2340 | "version": "6.0.2", 2341 | "source": { 2342 | "type": "git", 2343 | "url": "https://github.com/sebastianbergmann/global-state.git", 2344 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" 2345 | }, 2346 | "dist": { 2347 | "type": "zip", 2348 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 2349 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 2350 | "shasum": "" 2351 | }, 2352 | "require": { 2353 | "php": ">=8.1", 2354 | "sebastian/object-reflector": "^3.0", 2355 | "sebastian/recursion-context": "^5.0" 2356 | }, 2357 | "require-dev": { 2358 | "ext-dom": "*", 2359 | "phpunit/phpunit": "^10.0" 2360 | }, 2361 | "type": "library", 2362 | "extra": { 2363 | "branch-alias": { 2364 | "dev-main": "6.0-dev" 2365 | } 2366 | }, 2367 | "autoload": { 2368 | "classmap": [ 2369 | "src/" 2370 | ] 2371 | }, 2372 | "notification-url": "https://packagist.org/downloads/", 2373 | "license": [ 2374 | "BSD-3-Clause" 2375 | ], 2376 | "authors": [ 2377 | { 2378 | "name": "Sebastian Bergmann", 2379 | "email": "sebastian@phpunit.de" 2380 | } 2381 | ], 2382 | "description": "Snapshotting of global state", 2383 | "homepage": "https://www.github.com/sebastianbergmann/global-state", 2384 | "keywords": [ 2385 | "global state" 2386 | ], 2387 | "support": { 2388 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2389 | "security": "https://github.com/sebastianbergmann/global-state/security/policy", 2390 | "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" 2391 | }, 2392 | "funding": [ 2393 | { 2394 | "url": "https://github.com/sebastianbergmann", 2395 | "type": "github" 2396 | } 2397 | ], 2398 | "time": "2024-03-02T07:19:19+00:00" 2399 | }, 2400 | { 2401 | "name": "sebastian/lines-of-code", 2402 | "version": "2.0.2", 2403 | "source": { 2404 | "type": "git", 2405 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2406 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" 2407 | }, 2408 | "dist": { 2409 | "type": "zip", 2410 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", 2411 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", 2412 | "shasum": "" 2413 | }, 2414 | "require": { 2415 | "nikic/php-parser": "^4.18 || ^5.0", 2416 | "php": ">=8.1" 2417 | }, 2418 | "require-dev": { 2419 | "phpunit/phpunit": "^10.0" 2420 | }, 2421 | "type": "library", 2422 | "extra": { 2423 | "branch-alias": { 2424 | "dev-main": "2.0-dev" 2425 | } 2426 | }, 2427 | "autoload": { 2428 | "classmap": [ 2429 | "src/" 2430 | ] 2431 | }, 2432 | "notification-url": "https://packagist.org/downloads/", 2433 | "license": [ 2434 | "BSD-3-Clause" 2435 | ], 2436 | "authors": [ 2437 | { 2438 | "name": "Sebastian Bergmann", 2439 | "email": "sebastian@phpunit.de", 2440 | "role": "lead" 2441 | } 2442 | ], 2443 | "description": "Library for counting the lines of code in PHP source code", 2444 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2445 | "support": { 2446 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2447 | "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", 2448 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" 2449 | }, 2450 | "funding": [ 2451 | { 2452 | "url": "https://github.com/sebastianbergmann", 2453 | "type": "github" 2454 | } 2455 | ], 2456 | "time": "2023-12-21T08:38:20+00:00" 2457 | }, 2458 | { 2459 | "name": "sebastian/object-enumerator", 2460 | "version": "5.0.0", 2461 | "source": { 2462 | "type": "git", 2463 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2464 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" 2465 | }, 2466 | "dist": { 2467 | "type": "zip", 2468 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", 2469 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", 2470 | "shasum": "" 2471 | }, 2472 | "require": { 2473 | "php": ">=8.1", 2474 | "sebastian/object-reflector": "^3.0", 2475 | "sebastian/recursion-context": "^5.0" 2476 | }, 2477 | "require-dev": { 2478 | "phpunit/phpunit": "^10.0" 2479 | }, 2480 | "type": "library", 2481 | "extra": { 2482 | "branch-alias": { 2483 | "dev-main": "5.0-dev" 2484 | } 2485 | }, 2486 | "autoload": { 2487 | "classmap": [ 2488 | "src/" 2489 | ] 2490 | }, 2491 | "notification-url": "https://packagist.org/downloads/", 2492 | "license": [ 2493 | "BSD-3-Clause" 2494 | ], 2495 | "authors": [ 2496 | { 2497 | "name": "Sebastian Bergmann", 2498 | "email": "sebastian@phpunit.de" 2499 | } 2500 | ], 2501 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2502 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2503 | "support": { 2504 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2505 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" 2506 | }, 2507 | "funding": [ 2508 | { 2509 | "url": "https://github.com/sebastianbergmann", 2510 | "type": "github" 2511 | } 2512 | ], 2513 | "time": "2023-02-03T07:08:32+00:00" 2514 | }, 2515 | { 2516 | "name": "sebastian/object-reflector", 2517 | "version": "3.0.0", 2518 | "source": { 2519 | "type": "git", 2520 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2521 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" 2522 | }, 2523 | "dist": { 2524 | "type": "zip", 2525 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", 2526 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", 2527 | "shasum": "" 2528 | }, 2529 | "require": { 2530 | "php": ">=8.1" 2531 | }, 2532 | "require-dev": { 2533 | "phpunit/phpunit": "^10.0" 2534 | }, 2535 | "type": "library", 2536 | "extra": { 2537 | "branch-alias": { 2538 | "dev-main": "3.0-dev" 2539 | } 2540 | }, 2541 | "autoload": { 2542 | "classmap": [ 2543 | "src/" 2544 | ] 2545 | }, 2546 | "notification-url": "https://packagist.org/downloads/", 2547 | "license": [ 2548 | "BSD-3-Clause" 2549 | ], 2550 | "authors": [ 2551 | { 2552 | "name": "Sebastian Bergmann", 2553 | "email": "sebastian@phpunit.de" 2554 | } 2555 | ], 2556 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2557 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2558 | "support": { 2559 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2560 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" 2561 | }, 2562 | "funding": [ 2563 | { 2564 | "url": "https://github.com/sebastianbergmann", 2565 | "type": "github" 2566 | } 2567 | ], 2568 | "time": "2023-02-03T07:06:18+00:00" 2569 | }, 2570 | { 2571 | "name": "sebastian/recursion-context", 2572 | "version": "5.0.1", 2573 | "source": { 2574 | "type": "git", 2575 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2576 | "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" 2577 | }, 2578 | "dist": { 2579 | "type": "zip", 2580 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", 2581 | "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", 2582 | "shasum": "" 2583 | }, 2584 | "require": { 2585 | "php": ">=8.1" 2586 | }, 2587 | "require-dev": { 2588 | "phpunit/phpunit": "^10.5" 2589 | }, 2590 | "type": "library", 2591 | "extra": { 2592 | "branch-alias": { 2593 | "dev-main": "5.0-dev" 2594 | } 2595 | }, 2596 | "autoload": { 2597 | "classmap": [ 2598 | "src/" 2599 | ] 2600 | }, 2601 | "notification-url": "https://packagist.org/downloads/", 2602 | "license": [ 2603 | "BSD-3-Clause" 2604 | ], 2605 | "authors": [ 2606 | { 2607 | "name": "Sebastian Bergmann", 2608 | "email": "sebastian@phpunit.de" 2609 | }, 2610 | { 2611 | "name": "Jeff Welch", 2612 | "email": "whatthejeff@gmail.com" 2613 | }, 2614 | { 2615 | "name": "Adam Harvey", 2616 | "email": "aharvey@php.net" 2617 | } 2618 | ], 2619 | "description": "Provides functionality to recursively process PHP variables", 2620 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2621 | "support": { 2622 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2623 | "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", 2624 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" 2625 | }, 2626 | "funding": [ 2627 | { 2628 | "url": "https://github.com/sebastianbergmann", 2629 | "type": "github" 2630 | }, 2631 | { 2632 | "url": "https://liberapay.com/sebastianbergmann", 2633 | "type": "liberapay" 2634 | }, 2635 | { 2636 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 2637 | "type": "thanks_dev" 2638 | }, 2639 | { 2640 | "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", 2641 | "type": "tidelift" 2642 | } 2643 | ], 2644 | "time": "2025-08-10T07:50:56+00:00" 2645 | }, 2646 | { 2647 | "name": "sebastian/type", 2648 | "version": "4.0.0", 2649 | "source": { 2650 | "type": "git", 2651 | "url": "https://github.com/sebastianbergmann/type.git", 2652 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" 2653 | }, 2654 | "dist": { 2655 | "type": "zip", 2656 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", 2657 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", 2658 | "shasum": "" 2659 | }, 2660 | "require": { 2661 | "php": ">=8.1" 2662 | }, 2663 | "require-dev": { 2664 | "phpunit/phpunit": "^10.0" 2665 | }, 2666 | "type": "library", 2667 | "extra": { 2668 | "branch-alias": { 2669 | "dev-main": "4.0-dev" 2670 | } 2671 | }, 2672 | "autoload": { 2673 | "classmap": [ 2674 | "src/" 2675 | ] 2676 | }, 2677 | "notification-url": "https://packagist.org/downloads/", 2678 | "license": [ 2679 | "BSD-3-Clause" 2680 | ], 2681 | "authors": [ 2682 | { 2683 | "name": "Sebastian Bergmann", 2684 | "email": "sebastian@phpunit.de", 2685 | "role": "lead" 2686 | } 2687 | ], 2688 | "description": "Collection of value objects that represent the types of the PHP type system", 2689 | "homepage": "https://github.com/sebastianbergmann/type", 2690 | "support": { 2691 | "issues": "https://github.com/sebastianbergmann/type/issues", 2692 | "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" 2693 | }, 2694 | "funding": [ 2695 | { 2696 | "url": "https://github.com/sebastianbergmann", 2697 | "type": "github" 2698 | } 2699 | ], 2700 | "time": "2023-02-03T07:10:45+00:00" 2701 | }, 2702 | { 2703 | "name": "sebastian/version", 2704 | "version": "4.0.1", 2705 | "source": { 2706 | "type": "git", 2707 | "url": "https://github.com/sebastianbergmann/version.git", 2708 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" 2709 | }, 2710 | "dist": { 2711 | "type": "zip", 2712 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", 2713 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", 2714 | "shasum": "" 2715 | }, 2716 | "require": { 2717 | "php": ">=8.1" 2718 | }, 2719 | "type": "library", 2720 | "extra": { 2721 | "branch-alias": { 2722 | "dev-main": "4.0-dev" 2723 | } 2724 | }, 2725 | "autoload": { 2726 | "classmap": [ 2727 | "src/" 2728 | ] 2729 | }, 2730 | "notification-url": "https://packagist.org/downloads/", 2731 | "license": [ 2732 | "BSD-3-Clause" 2733 | ], 2734 | "authors": [ 2735 | { 2736 | "name": "Sebastian Bergmann", 2737 | "email": "sebastian@phpunit.de", 2738 | "role": "lead" 2739 | } 2740 | ], 2741 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2742 | "homepage": "https://github.com/sebastianbergmann/version", 2743 | "support": { 2744 | "issues": "https://github.com/sebastianbergmann/version/issues", 2745 | "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" 2746 | }, 2747 | "funding": [ 2748 | { 2749 | "url": "https://github.com/sebastianbergmann", 2750 | "type": "github" 2751 | } 2752 | ], 2753 | "time": "2023-02-07T11:34:05+00:00" 2754 | }, 2755 | { 2756 | "name": "spatie/array-to-xml", 2757 | "version": "3.4.4", 2758 | "source": { 2759 | "type": "git", 2760 | "url": "https://github.com/spatie/array-to-xml.git", 2761 | "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" 2762 | }, 2763 | "dist": { 2764 | "type": "zip", 2765 | "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", 2766 | "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", 2767 | "shasum": "" 2768 | }, 2769 | "require": { 2770 | "ext-dom": "*", 2771 | "php": "^8.0" 2772 | }, 2773 | "require-dev": { 2774 | "mockery/mockery": "^1.2", 2775 | "pestphp/pest": "^1.21", 2776 | "spatie/pest-plugin-snapshots": "^1.1" 2777 | }, 2778 | "type": "library", 2779 | "extra": { 2780 | "branch-alias": { 2781 | "dev-main": "3.x-dev" 2782 | } 2783 | }, 2784 | "autoload": { 2785 | "psr-4": { 2786 | "Spatie\\ArrayToXml\\": "src" 2787 | } 2788 | }, 2789 | "notification-url": "https://packagist.org/downloads/", 2790 | "license": [ 2791 | "MIT" 2792 | ], 2793 | "authors": [ 2794 | { 2795 | "name": "Freek Van der Herten", 2796 | "email": "freek@spatie.be", 2797 | "homepage": "https://freek.dev", 2798 | "role": "Developer" 2799 | } 2800 | ], 2801 | "description": "Convert an array to xml", 2802 | "homepage": "https://github.com/spatie/array-to-xml", 2803 | "keywords": [ 2804 | "array", 2805 | "convert", 2806 | "xml" 2807 | ], 2808 | "support": { 2809 | "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" 2810 | }, 2811 | "funding": [ 2812 | { 2813 | "url": "https://spatie.be/open-source/support-us", 2814 | "type": "custom" 2815 | }, 2816 | { 2817 | "url": "https://github.com/spatie", 2818 | "type": "github" 2819 | } 2820 | ], 2821 | "time": "2025-12-15T09:00:41+00:00" 2822 | }, 2823 | { 2824 | "name": "squizlabs/php_codesniffer", 2825 | "version": "3.13.5", 2826 | "source": { 2827 | "type": "git", 2828 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 2829 | "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" 2830 | }, 2831 | "dist": { 2832 | "type": "zip", 2833 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", 2834 | "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", 2835 | "shasum": "" 2836 | }, 2837 | "require": { 2838 | "ext-simplexml": "*", 2839 | "ext-tokenizer": "*", 2840 | "ext-xmlwriter": "*", 2841 | "php": ">=5.4.0" 2842 | }, 2843 | "require-dev": { 2844 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 2845 | }, 2846 | "bin": [ 2847 | "bin/phpcbf", 2848 | "bin/phpcs" 2849 | ], 2850 | "type": "library", 2851 | "notification-url": "https://packagist.org/downloads/", 2852 | "license": [ 2853 | "BSD-3-Clause" 2854 | ], 2855 | "authors": [ 2856 | { 2857 | "name": "Greg Sherwood", 2858 | "role": "Former lead" 2859 | }, 2860 | { 2861 | "name": "Juliette Reinders Folmer", 2862 | "role": "Current lead" 2863 | }, 2864 | { 2865 | "name": "Contributors", 2866 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 2867 | } 2868 | ], 2869 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2870 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2871 | "keywords": [ 2872 | "phpcs", 2873 | "standards", 2874 | "static analysis" 2875 | ], 2876 | "support": { 2877 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 2878 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 2879 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2880 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 2881 | }, 2882 | "funding": [ 2883 | { 2884 | "url": "https://github.com/PHPCSStandards", 2885 | "type": "github" 2886 | }, 2887 | { 2888 | "url": "https://github.com/jrfnl", 2889 | "type": "github" 2890 | }, 2891 | { 2892 | "url": "https://opencollective.com/php_codesniffer", 2893 | "type": "open_collective" 2894 | }, 2895 | { 2896 | "url": "https://thanks.dev/u/gh/phpcsstandards", 2897 | "type": "thanks_dev" 2898 | } 2899 | ], 2900 | "time": "2025-11-04T16:30:35+00:00" 2901 | }, 2902 | { 2903 | "name": "symfony/console", 2904 | "version": "v6.4.30", 2905 | "source": { 2906 | "type": "git", 2907 | "url": "https://github.com/symfony/console.git", 2908 | "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e" 2909 | }, 2910 | "dist": { 2911 | "type": "zip", 2912 | "url": "https://api.github.com/repos/symfony/console/zipball/1b2813049506b39eb3d7e64aff033fd5ca26c97e", 2913 | "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e", 2914 | "shasum": "" 2915 | }, 2916 | "require": { 2917 | "php": ">=8.1", 2918 | "symfony/deprecation-contracts": "^2.5|^3", 2919 | "symfony/polyfill-mbstring": "~1.0", 2920 | "symfony/service-contracts": "^2.5|^3", 2921 | "symfony/string": "^5.4|^6.0|^7.0" 2922 | }, 2923 | "conflict": { 2924 | "symfony/dependency-injection": "<5.4", 2925 | "symfony/dotenv": "<5.4", 2926 | "symfony/event-dispatcher": "<5.4", 2927 | "symfony/lock": "<5.4", 2928 | "symfony/process": "<5.4" 2929 | }, 2930 | "provide": { 2931 | "psr/log-implementation": "1.0|2.0|3.0" 2932 | }, 2933 | "require-dev": { 2934 | "psr/log": "^1|^2|^3", 2935 | "symfony/config": "^5.4|^6.0|^7.0", 2936 | "symfony/dependency-injection": "^5.4|^6.0|^7.0", 2937 | "symfony/event-dispatcher": "^5.4|^6.0|^7.0", 2938 | "symfony/http-foundation": "^6.4|^7.0", 2939 | "symfony/http-kernel": "^6.4|^7.0", 2940 | "symfony/lock": "^5.4|^6.0|^7.0", 2941 | "symfony/messenger": "^5.4|^6.0|^7.0", 2942 | "symfony/process": "^5.4|^6.0|^7.0", 2943 | "symfony/stopwatch": "^5.4|^6.0|^7.0", 2944 | "symfony/var-dumper": "^5.4|^6.0|^7.0" 2945 | }, 2946 | "type": "library", 2947 | "autoload": { 2948 | "psr-4": { 2949 | "Symfony\\Component\\Console\\": "" 2950 | }, 2951 | "exclude-from-classmap": [ 2952 | "/Tests/" 2953 | ] 2954 | }, 2955 | "notification-url": "https://packagist.org/downloads/", 2956 | "license": [ 2957 | "MIT" 2958 | ], 2959 | "authors": [ 2960 | { 2961 | "name": "Fabien Potencier", 2962 | "email": "fabien@symfony.com" 2963 | }, 2964 | { 2965 | "name": "Symfony Community", 2966 | "homepage": "https://symfony.com/contributors" 2967 | } 2968 | ], 2969 | "description": "Eases the creation of beautiful and testable command line interfaces", 2970 | "homepage": "https://symfony.com", 2971 | "keywords": [ 2972 | "cli", 2973 | "command-line", 2974 | "console", 2975 | "terminal" 2976 | ], 2977 | "support": { 2978 | "source": "https://github.com/symfony/console/tree/v6.4.30" 2979 | }, 2980 | "funding": [ 2981 | { 2982 | "url": "https://symfony.com/sponsor", 2983 | "type": "custom" 2984 | }, 2985 | { 2986 | "url": "https://github.com/fabpot", 2987 | "type": "github" 2988 | }, 2989 | { 2990 | "url": "https://github.com/nicolas-grekas", 2991 | "type": "github" 2992 | }, 2993 | { 2994 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2995 | "type": "tidelift" 2996 | } 2997 | ], 2998 | "time": "2025-12-05T13:47:41+00:00" 2999 | }, 3000 | { 3001 | "name": "symfony/deprecation-contracts", 3002 | "version": "v3.6.0", 3003 | "source": { 3004 | "type": "git", 3005 | "url": "https://github.com/symfony/deprecation-contracts.git", 3006 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" 3007 | }, 3008 | "dist": { 3009 | "type": "zip", 3010 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", 3011 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", 3012 | "shasum": "" 3013 | }, 3014 | "require": { 3015 | "php": ">=8.1" 3016 | }, 3017 | "type": "library", 3018 | "extra": { 3019 | "thanks": { 3020 | "url": "https://github.com/symfony/contracts", 3021 | "name": "symfony/contracts" 3022 | }, 3023 | "branch-alias": { 3024 | "dev-main": "3.6-dev" 3025 | } 3026 | }, 3027 | "autoload": { 3028 | "files": [ 3029 | "function.php" 3030 | ] 3031 | }, 3032 | "notification-url": "https://packagist.org/downloads/", 3033 | "license": [ 3034 | "MIT" 3035 | ], 3036 | "authors": [ 3037 | { 3038 | "name": "Nicolas Grekas", 3039 | "email": "p@tchwork.com" 3040 | }, 3041 | { 3042 | "name": "Symfony Community", 3043 | "homepage": "https://symfony.com/contributors" 3044 | } 3045 | ], 3046 | "description": "A generic function and convention to trigger deprecation notices", 3047 | "homepage": "https://symfony.com", 3048 | "support": { 3049 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" 3050 | }, 3051 | "funding": [ 3052 | { 3053 | "url": "https://symfony.com/sponsor", 3054 | "type": "custom" 3055 | }, 3056 | { 3057 | "url": "https://github.com/fabpot", 3058 | "type": "github" 3059 | }, 3060 | { 3061 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3062 | "type": "tidelift" 3063 | } 3064 | ], 3065 | "time": "2024-09-25T14:21:43+00:00" 3066 | }, 3067 | { 3068 | "name": "symfony/filesystem", 3069 | "version": "v6.4.30", 3070 | "source": { 3071 | "type": "git", 3072 | "url": "https://github.com/symfony/filesystem.git", 3073 | "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" 3074 | }, 3075 | "dist": { 3076 | "type": "zip", 3077 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", 3078 | "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", 3079 | "shasum": "" 3080 | }, 3081 | "require": { 3082 | "php": ">=8.1", 3083 | "symfony/polyfill-ctype": "~1.8", 3084 | "symfony/polyfill-mbstring": "~1.8" 3085 | }, 3086 | "require-dev": { 3087 | "symfony/process": "^5.4|^6.4|^7.0" 3088 | }, 3089 | "type": "library", 3090 | "autoload": { 3091 | "psr-4": { 3092 | "Symfony\\Component\\Filesystem\\": "" 3093 | }, 3094 | "exclude-from-classmap": [ 3095 | "/Tests/" 3096 | ] 3097 | }, 3098 | "notification-url": "https://packagist.org/downloads/", 3099 | "license": [ 3100 | "MIT" 3101 | ], 3102 | "authors": [ 3103 | { 3104 | "name": "Fabien Potencier", 3105 | "email": "fabien@symfony.com" 3106 | }, 3107 | { 3108 | "name": "Symfony Community", 3109 | "homepage": "https://symfony.com/contributors" 3110 | } 3111 | ], 3112 | "description": "Provides basic utilities for the filesystem", 3113 | "homepage": "https://symfony.com", 3114 | "support": { 3115 | "source": "https://github.com/symfony/filesystem/tree/v6.4.30" 3116 | }, 3117 | "funding": [ 3118 | { 3119 | "url": "https://symfony.com/sponsor", 3120 | "type": "custom" 3121 | }, 3122 | { 3123 | "url": "https://github.com/fabpot", 3124 | "type": "github" 3125 | }, 3126 | { 3127 | "url": "https://github.com/nicolas-grekas", 3128 | "type": "github" 3129 | }, 3130 | { 3131 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3132 | "type": "tidelift" 3133 | } 3134 | ], 3135 | "time": "2025-11-26T14:43:45+00:00" 3136 | }, 3137 | { 3138 | "name": "symfony/polyfill-ctype", 3139 | "version": "v1.33.0", 3140 | "source": { 3141 | "type": "git", 3142 | "url": "https://github.com/symfony/polyfill-ctype.git", 3143 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" 3144 | }, 3145 | "dist": { 3146 | "type": "zip", 3147 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", 3148 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", 3149 | "shasum": "" 3150 | }, 3151 | "require": { 3152 | "php": ">=7.2" 3153 | }, 3154 | "provide": { 3155 | "ext-ctype": "*" 3156 | }, 3157 | "suggest": { 3158 | "ext-ctype": "For best performance" 3159 | }, 3160 | "type": "library", 3161 | "extra": { 3162 | "thanks": { 3163 | "url": "https://github.com/symfony/polyfill", 3164 | "name": "symfony/polyfill" 3165 | } 3166 | }, 3167 | "autoload": { 3168 | "files": [ 3169 | "bootstrap.php" 3170 | ], 3171 | "psr-4": { 3172 | "Symfony\\Polyfill\\Ctype\\": "" 3173 | } 3174 | }, 3175 | "notification-url": "https://packagist.org/downloads/", 3176 | "license": [ 3177 | "MIT" 3178 | ], 3179 | "authors": [ 3180 | { 3181 | "name": "Gert de Pagter", 3182 | "email": "BackEndTea@gmail.com" 3183 | }, 3184 | { 3185 | "name": "Symfony Community", 3186 | "homepage": "https://symfony.com/contributors" 3187 | } 3188 | ], 3189 | "description": "Symfony polyfill for ctype functions", 3190 | "homepage": "https://symfony.com", 3191 | "keywords": [ 3192 | "compatibility", 3193 | "ctype", 3194 | "polyfill", 3195 | "portable" 3196 | ], 3197 | "support": { 3198 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" 3199 | }, 3200 | "funding": [ 3201 | { 3202 | "url": "https://symfony.com/sponsor", 3203 | "type": "custom" 3204 | }, 3205 | { 3206 | "url": "https://github.com/fabpot", 3207 | "type": "github" 3208 | }, 3209 | { 3210 | "url": "https://github.com/nicolas-grekas", 3211 | "type": "github" 3212 | }, 3213 | { 3214 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3215 | "type": "tidelift" 3216 | } 3217 | ], 3218 | "time": "2024-09-09T11:45:10+00:00" 3219 | }, 3220 | { 3221 | "name": "symfony/polyfill-intl-grapheme", 3222 | "version": "v1.33.0", 3223 | "source": { 3224 | "type": "git", 3225 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 3226 | "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" 3227 | }, 3228 | "dist": { 3229 | "type": "zip", 3230 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", 3231 | "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", 3232 | "shasum": "" 3233 | }, 3234 | "require": { 3235 | "php": ">=7.2" 3236 | }, 3237 | "suggest": { 3238 | "ext-intl": "For best performance" 3239 | }, 3240 | "type": "library", 3241 | "extra": { 3242 | "thanks": { 3243 | "url": "https://github.com/symfony/polyfill", 3244 | "name": "symfony/polyfill" 3245 | } 3246 | }, 3247 | "autoload": { 3248 | "files": [ 3249 | "bootstrap.php" 3250 | ], 3251 | "psr-4": { 3252 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 3253 | } 3254 | }, 3255 | "notification-url": "https://packagist.org/downloads/", 3256 | "license": [ 3257 | "MIT" 3258 | ], 3259 | "authors": [ 3260 | { 3261 | "name": "Nicolas Grekas", 3262 | "email": "p@tchwork.com" 3263 | }, 3264 | { 3265 | "name": "Symfony Community", 3266 | "homepage": "https://symfony.com/contributors" 3267 | } 3268 | ], 3269 | "description": "Symfony polyfill for intl's grapheme_* functions", 3270 | "homepage": "https://symfony.com", 3271 | "keywords": [ 3272 | "compatibility", 3273 | "grapheme", 3274 | "intl", 3275 | "polyfill", 3276 | "portable", 3277 | "shim" 3278 | ], 3279 | "support": { 3280 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" 3281 | }, 3282 | "funding": [ 3283 | { 3284 | "url": "https://symfony.com/sponsor", 3285 | "type": "custom" 3286 | }, 3287 | { 3288 | "url": "https://github.com/fabpot", 3289 | "type": "github" 3290 | }, 3291 | { 3292 | "url": "https://github.com/nicolas-grekas", 3293 | "type": "github" 3294 | }, 3295 | { 3296 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3297 | "type": "tidelift" 3298 | } 3299 | ], 3300 | "time": "2025-06-27T09:58:17+00:00" 3301 | }, 3302 | { 3303 | "name": "symfony/polyfill-intl-normalizer", 3304 | "version": "v1.33.0", 3305 | "source": { 3306 | "type": "git", 3307 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 3308 | "reference": "3833d7255cc303546435cb650316bff708a1c75c" 3309 | }, 3310 | "dist": { 3311 | "type": "zip", 3312 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", 3313 | "reference": "3833d7255cc303546435cb650316bff708a1c75c", 3314 | "shasum": "" 3315 | }, 3316 | "require": { 3317 | "php": ">=7.2" 3318 | }, 3319 | "suggest": { 3320 | "ext-intl": "For best performance" 3321 | }, 3322 | "type": "library", 3323 | "extra": { 3324 | "thanks": { 3325 | "url": "https://github.com/symfony/polyfill", 3326 | "name": "symfony/polyfill" 3327 | } 3328 | }, 3329 | "autoload": { 3330 | "files": [ 3331 | "bootstrap.php" 3332 | ], 3333 | "psr-4": { 3334 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 3335 | }, 3336 | "classmap": [ 3337 | "Resources/stubs" 3338 | ] 3339 | }, 3340 | "notification-url": "https://packagist.org/downloads/", 3341 | "license": [ 3342 | "MIT" 3343 | ], 3344 | "authors": [ 3345 | { 3346 | "name": "Nicolas Grekas", 3347 | "email": "p@tchwork.com" 3348 | }, 3349 | { 3350 | "name": "Symfony Community", 3351 | "homepage": "https://symfony.com/contributors" 3352 | } 3353 | ], 3354 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 3355 | "homepage": "https://symfony.com", 3356 | "keywords": [ 3357 | "compatibility", 3358 | "intl", 3359 | "normalizer", 3360 | "polyfill", 3361 | "portable", 3362 | "shim" 3363 | ], 3364 | "support": { 3365 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" 3366 | }, 3367 | "funding": [ 3368 | { 3369 | "url": "https://symfony.com/sponsor", 3370 | "type": "custom" 3371 | }, 3372 | { 3373 | "url": "https://github.com/fabpot", 3374 | "type": "github" 3375 | }, 3376 | { 3377 | "url": "https://github.com/nicolas-grekas", 3378 | "type": "github" 3379 | }, 3380 | { 3381 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3382 | "type": "tidelift" 3383 | } 3384 | ], 3385 | "time": "2024-09-09T11:45:10+00:00" 3386 | }, 3387 | { 3388 | "name": "symfony/polyfill-mbstring", 3389 | "version": "v1.33.0", 3390 | "source": { 3391 | "type": "git", 3392 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3393 | "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" 3394 | }, 3395 | "dist": { 3396 | "type": "zip", 3397 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", 3398 | "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", 3399 | "shasum": "" 3400 | }, 3401 | "require": { 3402 | "ext-iconv": "*", 3403 | "php": ">=7.2" 3404 | }, 3405 | "provide": { 3406 | "ext-mbstring": "*" 3407 | }, 3408 | "suggest": { 3409 | "ext-mbstring": "For best performance" 3410 | }, 3411 | "type": "library", 3412 | "extra": { 3413 | "thanks": { 3414 | "url": "https://github.com/symfony/polyfill", 3415 | "name": "symfony/polyfill" 3416 | } 3417 | }, 3418 | "autoload": { 3419 | "files": [ 3420 | "bootstrap.php" 3421 | ], 3422 | "psr-4": { 3423 | "Symfony\\Polyfill\\Mbstring\\": "" 3424 | } 3425 | }, 3426 | "notification-url": "https://packagist.org/downloads/", 3427 | "license": [ 3428 | "MIT" 3429 | ], 3430 | "authors": [ 3431 | { 3432 | "name": "Nicolas Grekas", 3433 | "email": "p@tchwork.com" 3434 | }, 3435 | { 3436 | "name": "Symfony Community", 3437 | "homepage": "https://symfony.com/contributors" 3438 | } 3439 | ], 3440 | "description": "Symfony polyfill for the Mbstring extension", 3441 | "homepage": "https://symfony.com", 3442 | "keywords": [ 3443 | "compatibility", 3444 | "mbstring", 3445 | "polyfill", 3446 | "portable", 3447 | "shim" 3448 | ], 3449 | "support": { 3450 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" 3451 | }, 3452 | "funding": [ 3453 | { 3454 | "url": "https://symfony.com/sponsor", 3455 | "type": "custom" 3456 | }, 3457 | { 3458 | "url": "https://github.com/fabpot", 3459 | "type": "github" 3460 | }, 3461 | { 3462 | "url": "https://github.com/nicolas-grekas", 3463 | "type": "github" 3464 | }, 3465 | { 3466 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3467 | "type": "tidelift" 3468 | } 3469 | ], 3470 | "time": "2024-12-23T08:48:59+00:00" 3471 | }, 3472 | { 3473 | "name": "symfony/service-contracts", 3474 | "version": "v3.6.1", 3475 | "source": { 3476 | "type": "git", 3477 | "url": "https://github.com/symfony/service-contracts.git", 3478 | "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" 3479 | }, 3480 | "dist": { 3481 | "type": "zip", 3482 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", 3483 | "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", 3484 | "shasum": "" 3485 | }, 3486 | "require": { 3487 | "php": ">=8.1", 3488 | "psr/container": "^1.1|^2.0", 3489 | "symfony/deprecation-contracts": "^2.5|^3" 3490 | }, 3491 | "conflict": { 3492 | "ext-psr": "<1.1|>=2" 3493 | }, 3494 | "type": "library", 3495 | "extra": { 3496 | "thanks": { 3497 | "url": "https://github.com/symfony/contracts", 3498 | "name": "symfony/contracts" 3499 | }, 3500 | "branch-alias": { 3501 | "dev-main": "3.6-dev" 3502 | } 3503 | }, 3504 | "autoload": { 3505 | "psr-4": { 3506 | "Symfony\\Contracts\\Service\\": "" 3507 | }, 3508 | "exclude-from-classmap": [ 3509 | "/Test/" 3510 | ] 3511 | }, 3512 | "notification-url": "https://packagist.org/downloads/", 3513 | "license": [ 3514 | "MIT" 3515 | ], 3516 | "authors": [ 3517 | { 3518 | "name": "Nicolas Grekas", 3519 | "email": "p@tchwork.com" 3520 | }, 3521 | { 3522 | "name": "Symfony Community", 3523 | "homepage": "https://symfony.com/contributors" 3524 | } 3525 | ], 3526 | "description": "Generic abstractions related to writing services", 3527 | "homepage": "https://symfony.com", 3528 | "keywords": [ 3529 | "abstractions", 3530 | "contracts", 3531 | "decoupling", 3532 | "interfaces", 3533 | "interoperability", 3534 | "standards" 3535 | ], 3536 | "support": { 3537 | "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" 3538 | }, 3539 | "funding": [ 3540 | { 3541 | "url": "https://symfony.com/sponsor", 3542 | "type": "custom" 3543 | }, 3544 | { 3545 | "url": "https://github.com/fabpot", 3546 | "type": "github" 3547 | }, 3548 | { 3549 | "url": "https://github.com/nicolas-grekas", 3550 | "type": "github" 3551 | }, 3552 | { 3553 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3554 | "type": "tidelift" 3555 | } 3556 | ], 3557 | "time": "2025-07-15T11:30:57+00:00" 3558 | }, 3559 | { 3560 | "name": "symfony/string", 3561 | "version": "v6.4.30", 3562 | "source": { 3563 | "type": "git", 3564 | "url": "https://github.com/symfony/string.git", 3565 | "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" 3566 | }, 3567 | "dist": { 3568 | "type": "zip", 3569 | "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", 3570 | "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", 3571 | "shasum": "" 3572 | }, 3573 | "require": { 3574 | "php": ">=8.1", 3575 | "symfony/polyfill-ctype": "~1.8", 3576 | "symfony/polyfill-intl-grapheme": "~1.0", 3577 | "symfony/polyfill-intl-normalizer": "~1.0", 3578 | "symfony/polyfill-mbstring": "~1.0" 3579 | }, 3580 | "conflict": { 3581 | "symfony/translation-contracts": "<2.5" 3582 | }, 3583 | "require-dev": { 3584 | "symfony/http-client": "^5.4|^6.0|^7.0", 3585 | "symfony/intl": "^6.2|^7.0", 3586 | "symfony/translation-contracts": "^2.5|^3.0", 3587 | "symfony/var-exporter": "^5.4|^6.0|^7.0" 3588 | }, 3589 | "type": "library", 3590 | "autoload": { 3591 | "files": [ 3592 | "Resources/functions.php" 3593 | ], 3594 | "psr-4": { 3595 | "Symfony\\Component\\String\\": "" 3596 | }, 3597 | "exclude-from-classmap": [ 3598 | "/Tests/" 3599 | ] 3600 | }, 3601 | "notification-url": "https://packagist.org/downloads/", 3602 | "license": [ 3603 | "MIT" 3604 | ], 3605 | "authors": [ 3606 | { 3607 | "name": "Nicolas Grekas", 3608 | "email": "p@tchwork.com" 3609 | }, 3610 | { 3611 | "name": "Symfony Community", 3612 | "homepage": "https://symfony.com/contributors" 3613 | } 3614 | ], 3615 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 3616 | "homepage": "https://symfony.com", 3617 | "keywords": [ 3618 | "grapheme", 3619 | "i18n", 3620 | "string", 3621 | "unicode", 3622 | "utf-8", 3623 | "utf8" 3624 | ], 3625 | "support": { 3626 | "source": "https://github.com/symfony/string/tree/v6.4.30" 3627 | }, 3628 | "funding": [ 3629 | { 3630 | "url": "https://symfony.com/sponsor", 3631 | "type": "custom" 3632 | }, 3633 | { 3634 | "url": "https://github.com/fabpot", 3635 | "type": "github" 3636 | }, 3637 | { 3638 | "url": "https://github.com/nicolas-grekas", 3639 | "type": "github" 3640 | }, 3641 | { 3642 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3643 | "type": "tidelift" 3644 | } 3645 | ], 3646 | "time": "2025-11-21T18:03:05+00:00" 3647 | }, 3648 | { 3649 | "name": "theseer/tokenizer", 3650 | "version": "1.3.1", 3651 | "source": { 3652 | "type": "git", 3653 | "url": "https://github.com/theseer/tokenizer.git", 3654 | "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" 3655 | }, 3656 | "dist": { 3657 | "type": "zip", 3658 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", 3659 | "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", 3660 | "shasum": "" 3661 | }, 3662 | "require": { 3663 | "ext-dom": "*", 3664 | "ext-tokenizer": "*", 3665 | "ext-xmlwriter": "*", 3666 | "php": "^7.2 || ^8.0" 3667 | }, 3668 | "type": "library", 3669 | "autoload": { 3670 | "classmap": [ 3671 | "src/" 3672 | ] 3673 | }, 3674 | "notification-url": "https://packagist.org/downloads/", 3675 | "license": [ 3676 | "BSD-3-Clause" 3677 | ], 3678 | "authors": [ 3679 | { 3680 | "name": "Arne Blankerts", 3681 | "email": "arne@blankerts.de", 3682 | "role": "Developer" 3683 | } 3684 | ], 3685 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3686 | "support": { 3687 | "issues": "https://github.com/theseer/tokenizer/issues", 3688 | "source": "https://github.com/theseer/tokenizer/tree/1.3.1" 3689 | }, 3690 | "funding": [ 3691 | { 3692 | "url": "https://github.com/theseer", 3693 | "type": "github" 3694 | } 3695 | ], 3696 | "time": "2025-11-17T20:03:58+00:00" 3697 | }, 3698 | { 3699 | "name": "vimeo/psalm", 3700 | "version": "5.26.1", 3701 | "source": { 3702 | "type": "git", 3703 | "url": "https://github.com/vimeo/psalm.git", 3704 | "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0" 3705 | }, 3706 | "dist": { 3707 | "type": "zip", 3708 | "url": "https://api.github.com/repos/vimeo/psalm/zipball/d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", 3709 | "reference": "d747f6500b38ac4f7dfc5edbcae6e4b637d7add0", 3710 | "shasum": "" 3711 | }, 3712 | "require": { 3713 | "amphp/amp": "^2.4.2", 3714 | "amphp/byte-stream": "^1.5", 3715 | "composer-runtime-api": "^2", 3716 | "composer/semver": "^1.4 || ^2.0 || ^3.0", 3717 | "composer/xdebug-handler": "^2.0 || ^3.0", 3718 | "dnoegel/php-xdg-base-dir": "^0.1.1", 3719 | "ext-ctype": "*", 3720 | "ext-dom": "*", 3721 | "ext-json": "*", 3722 | "ext-libxml": "*", 3723 | "ext-mbstring": "*", 3724 | "ext-simplexml": "*", 3725 | "ext-tokenizer": "*", 3726 | "felixfbecker/advanced-json-rpc": "^3.1", 3727 | "felixfbecker/language-server-protocol": "^1.5.2", 3728 | "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", 3729 | "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", 3730 | "nikic/php-parser": "^4.17", 3731 | "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", 3732 | "sebastian/diff": "^4.0 || ^5.0 || ^6.0", 3733 | "spatie/array-to-xml": "^2.17.0 || ^3.0", 3734 | "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", 3735 | "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" 3736 | }, 3737 | "conflict": { 3738 | "nikic/php-parser": "4.17.0" 3739 | }, 3740 | "provide": { 3741 | "psalm/psalm": "self.version" 3742 | }, 3743 | "require-dev": { 3744 | "amphp/phpunit-util": "^2.0", 3745 | "bamarni/composer-bin-plugin": "^1.4", 3746 | "brianium/paratest": "^6.9", 3747 | "ext-curl": "*", 3748 | "mockery/mockery": "^1.5", 3749 | "nunomaduro/mock-final-classes": "^1.1", 3750 | "php-parallel-lint/php-parallel-lint": "^1.2", 3751 | "phpstan/phpdoc-parser": "^1.6", 3752 | "phpunit/phpunit": "^9.6", 3753 | "psalm/plugin-mockery": "^1.1", 3754 | "psalm/plugin-phpunit": "^0.18", 3755 | "slevomat/coding-standard": "^8.4", 3756 | "squizlabs/php_codesniffer": "^3.6", 3757 | "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" 3758 | }, 3759 | "suggest": { 3760 | "ext-curl": "In order to send data to shepherd", 3761 | "ext-igbinary": "^2.0.5 is required, used to serialize caching data" 3762 | }, 3763 | "bin": [ 3764 | "psalm", 3765 | "psalm-language-server", 3766 | "psalm-plugin", 3767 | "psalm-refactor", 3768 | "psalter" 3769 | ], 3770 | "type": "project", 3771 | "extra": { 3772 | "branch-alias": { 3773 | "dev-1.x": "1.x-dev", 3774 | "dev-2.x": "2.x-dev", 3775 | "dev-3.x": "3.x-dev", 3776 | "dev-4.x": "4.x-dev", 3777 | "dev-master": "5.x-dev" 3778 | } 3779 | }, 3780 | "autoload": { 3781 | "psr-4": { 3782 | "Psalm\\": "src/Psalm/" 3783 | } 3784 | }, 3785 | "notification-url": "https://packagist.org/downloads/", 3786 | "license": [ 3787 | "MIT" 3788 | ], 3789 | "authors": [ 3790 | { 3791 | "name": "Matthew Brown" 3792 | } 3793 | ], 3794 | "description": "A static analysis tool for finding errors in PHP applications", 3795 | "keywords": [ 3796 | "code", 3797 | "inspection", 3798 | "php", 3799 | "static analysis" 3800 | ], 3801 | "support": { 3802 | "docs": "https://psalm.dev/docs", 3803 | "issues": "https://github.com/vimeo/psalm/issues", 3804 | "source": "https://github.com/vimeo/psalm" 3805 | }, 3806 | "time": "2024-09-08T18:53:08+00:00" 3807 | }, 3808 | { 3809 | "name": "webmozart/assert", 3810 | "version": "1.12.1", 3811 | "source": { 3812 | "type": "git", 3813 | "url": "https://github.com/webmozarts/assert.git", 3814 | "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" 3815 | }, 3816 | "dist": { 3817 | "type": "zip", 3818 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", 3819 | "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", 3820 | "shasum": "" 3821 | }, 3822 | "require": { 3823 | "ext-ctype": "*", 3824 | "ext-date": "*", 3825 | "ext-filter": "*", 3826 | "php": "^7.2 || ^8.0" 3827 | }, 3828 | "suggest": { 3829 | "ext-intl": "", 3830 | "ext-simplexml": "", 3831 | "ext-spl": "" 3832 | }, 3833 | "type": "library", 3834 | "extra": { 3835 | "branch-alias": { 3836 | "dev-master": "1.10-dev" 3837 | } 3838 | }, 3839 | "autoload": { 3840 | "psr-4": { 3841 | "Webmozart\\Assert\\": "src/" 3842 | } 3843 | }, 3844 | "notification-url": "https://packagist.org/downloads/", 3845 | "license": [ 3846 | "MIT" 3847 | ], 3848 | "authors": [ 3849 | { 3850 | "name": "Bernhard Schussek", 3851 | "email": "bschussek@gmail.com" 3852 | } 3853 | ], 3854 | "description": "Assertions to validate method input/output with nice error messages.", 3855 | "keywords": [ 3856 | "assert", 3857 | "check", 3858 | "validate" 3859 | ], 3860 | "support": { 3861 | "issues": "https://github.com/webmozarts/assert/issues", 3862 | "source": "https://github.com/webmozarts/assert/tree/1.12.1" 3863 | }, 3864 | "time": "2025-10-29T15:56:20+00:00" 3865 | } 3866 | ], 3867 | "aliases": [], 3868 | "minimum-stability": "stable", 3869 | "stability-flags": {}, 3870 | "prefer-stable": false, 3871 | "prefer-lowest": false, 3872 | "platform": { 3873 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0" 3874 | }, 3875 | "platform-dev": {}, 3876 | "platform-overrides": { 3877 | "php": "8.1.99" 3878 | }, 3879 | "plugin-api-version": "2.9.0" 3880 | } 3881 | --------------------------------------------------------------------------------