├── .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 | [](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 |
--------------------------------------------------------------------------------