* @internal */ const VERSIONS = array ( 'ahand/mobileesp' => 'dev-master@c02055dbe9baee63aab11438f4d7b5d25075d347', 'apereo/phpcas' => '1.6.1@c129708154852656aabb13d8606cd5b12dbbabac', 'bacon/bacon-qr-code' => 'v3.0.0@510de6eca6248d77d31b339d62437cc995e2fb41', 'brick/varexporter' => '0.5.0@84b2a7a91f69aa5d079aec5a0a7256ebf2dceb6b', 'browscap/browscap-php' => '7.2.0@a033f938b136ecbd5f2e5818d186b4c3b0afb9dd', 'cap60552/php-sip2' => 'v1.0.0@9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1', 'colinmollenhour/credis' => 'v1.16.1@f11a89fd068d3e5db0c2b5a9ba8663bc36162e95', 'composer/package-versions-deprecated' => '1.11.99.5@b4f54f74ef3453349c24a845d22392cd31e65f1d', 'composer/semver' => '3.4.2@c51258e759afdb17f1fd1fe83bc12baaef6309d6', 'dasprid/enum' => '1.0.6@8dfd07c6d2cf31c8da90c53b83c026c7696dda90', 'defuse/php-encryption' => 'v2.4.0@f53396c2d34225064647a05ca76c1da9d99e5828', 'dflydev/dot-access-data' => 'v3.0.3@a23a2bf4f31d3518f3ecb38660c95715dfead60f', 'doctrine/event-manager' => '2.0.1@b680156fa328f1dfd874fd48c7026c41570b9c6e', 'doctrine/persistence' => '3.3.3@b337726451f5d530df338fc7f68dee8781b49779', 'endroid/qr-code' => '5.0.9@3dcdfab4c9122874f3915d8bf80a43b9df11852d', 'filp/whoops' => '2.15.4@a139776fa3f5985a50b509f2a02ff0f709d2a546', 'guzzlehttp/guzzle' => '7.9.2@d281ed313b989f213357e3be1a179f02196ac99b', 'guzzlehttp/promises' => '2.0.3@6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8', 'guzzlehttp/psr7' => '2.7.0@a70f5c95fb43bc83f07c9c948baa0dc1829bf201', 'jaybizzle/crawler-detect' => 'v1.2.119@275002e22b0333c15a7c6792fdae5d5deefc9ef0', 'laminas/laminas-cache' => '3.12.2@f99d10dd1f13d5163a924f8561e9dca3d27d8ad2', 'laminas/laminas-cache-storage-adapter-blackhole' => '2.4.0@8b64e61f91d6e06a8f6e8e86d5c6ea14042ae983', 'laminas/laminas-cache-storage-adapter-filesystem' => '2.4.1@6b017c485bb93a0c33e865e1d713ae28055ee8d5', 'laminas/laminas-cache-storage-adapter-memcached' => '2.5.0@320f73d3f0fbf733ac4d504950a7bd5bc7e72fd8', 'laminas/laminas-cache-storage-adapter-memory' => '2.3.0@d2c357a8b839ceb0e0781d5e9aebe46642dbf0b2', 'laminas/laminas-captcha' => '2.17.0@981b3d1e287653b1fc5b71859964508ac0a2d7cb', 'laminas/laminas-code' => '4.14.0@562e02b7d85cb9142b5116cc76c4c7c162a11a1c', 'laminas/laminas-config' => '3.9.0@e53717277f6c22b1c697a46473b9a5ec9a438efa', 'laminas/laminas-crypt' => '3.11.0@098fc61a895d1ff5d1c2b861525b4428bf6c3240', 'laminas/laminas-db' => '2.20.0@207b9ee70a8b518913c1fad688d7a64fe89a8b91', 'laminas/laminas-diactoros' => '3.3.1@74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45', 'laminas/laminas-dom' => '2.14.0@25a062132573f8e812e298ad046b75fb9eb90461', 'laminas/laminas-escaper' => '2.13.0@af459883f4018d0f8a0c69c7a209daef3bf973ba', 'laminas/laminas-eventmanager' => '3.13.1@933d1b5cf03fa4cf3016cebfd0555fa2ba3f2024', 'laminas/laminas-feed' => '2.22.0@669792b819fca7274698147ad7a2ecc1b0a9b141', 'laminas/laminas-filter' => '2.37.0@27dda1e60547bc000b876e24808f47932df2f4ac', 'laminas/laminas-form' => '3.20.1@91ac71bd4862abf9c5e2ccc8f063f83b4999660b', 'laminas/laminas-http' => '2.19.0@26dd6d1177e25d970058863c2afed12bb9dbff4d', 'laminas/laminas-hydrator' => '4.15.0@43ccca88313fdcceca37865109dffc69ecd2cf8f', 'laminas/laminas-i18n' => '2.28.0@e1e312650232e5ef26c28ea08f3c4c18633f48c3', 'laminas/laminas-inputfilter' => '2.30.1@f07a908df1052f28b18904d3745cdd5b183938c9', 'laminas/laminas-json' => '3.6.0@53ff787b20b77197f38680c737e8dfffa846b85b', 'laminas/laminas-loader' => '2.10.0@e6fe952304ef40ce45cd814751ab35d42afdad12', 'laminas/laminas-log' => '2.17.0@f24c4c78d3024bb59610845328d7876d6c797065', 'laminas/laminas-mail' => '2.25.1@110e04497395123998220e244cceecb167cc6dda', 'laminas/laminas-math' => '3.7.0@3e90445828fd64308de2a600b48c3df051b3b17a', 'laminas/laminas-mime' => '2.12.0@08cc544778829b7d68d27a097885bd6e7130135e', 'laminas/laminas-modulemanager' => '2.16.0@8df7b237d75c04a1bc17b8f7d01eeb601cd7b7e3', 'laminas/laminas-mvc' => '3.7.0@3f65447addf487189000e54dc1525cd952951da4', 'laminas/laminas-mvc-i18n' => '1.8.0@669a00f36dd9fba8ec95516fe4afde7c4d8b8faa', 'laminas/laminas-mvc-plugin-flashmessenger' => '1.10.1@852d8c661dfb6492d4ea6d4ab238e72180e82387', 'laminas/laminas-paginator' => '2.18.1@6a03499a899fb8ba650594ddf4b4338d4235252a', 'laminas/laminas-paginator-adapter-laminasdb' => '1.4.0@d2963320f4ea854a7486636ee2633b3b5d7fc4c1', 'laminas/laminas-psr7bridge' => '1.11.0@7e2f47596288c490f4888be96d1431acccbe06b8', 'laminas/laminas-recaptcha' => '3.7.0@9cb3a9e3ca7af64205590adc649e107bc6ce2bfc', 'laminas/laminas-router' => '3.13.0@04e14e757303787c83f79298dbd4483eebacfeb9', 'laminas/laminas-serializer' => '2.17.0@9641dee4208078ff8dfbcdd74048adb0b3ee517e', 'laminas/laminas-servicemanager' => '3.22.1@de98d297d4743956a0558a6d71616979ff779328', 'laminas/laminas-session' => '2.21.0@b8cd890f7682a255b335c2ca45df9a7cbc58873d', 'laminas/laminas-stdlib' => '3.19.0@6a192dd0882b514e45506f533b833b623b78fff3', 'laminas/laminas-text' => '2.11.0@d799f3ccb3547e9e6ab313447138bae7009c7cc7', 'laminas/laminas-translator' => '1.0.0@86d176c01a96b0ef205192b776cb69e8d4ca06b1', 'laminas/laminas-uri' => '2.12.0@95a41a7592bacf4c648648a88b7c94b0c5c22b9e', 'laminas/laminas-validator' => '2.55.0@dc3f2609d41b1e21bc24e3e147d7dd284e8a1556', 'laminas/laminas-view' => '2.27.0@b7e66e148ccd55c815b9626ee0cfd358dbb28be4', 'lcobucci/clock' => '3.0.0@039ef98c6b57b101d10bd11d8fdfda12cbd996dc', 'lcobucci/jwt' => '5.3.0@08071d8d2c7f4b00222cc4b1fb6aa46990a80f83', 'league/commonmark' => '2.5.3@b650144166dfa7703e62a22e493b853b58d874b0', 'league/config' => 'v1.2.0@754b3604fb2984c71f4af4a9cbe7b57f346ec1f3', 'league/event' => '2.2.0@d2cc124cf9a3fab2bb4ff963307f60361ce4d119', 'league/flysystem' => '3.28.0@e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c', 'league/flysystem-local' => '3.28.0@13f22ea8be526ea58c2ddff9e158ef7c296e4f40', 'league/mime-type-detection' => '1.15.0@ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301', 'league/oauth2-server' => '8.5.4@ab7714d073844497fd222d5d0a217629089936bc', 'league/uri' => '7.4.1@bedb6e55eff0c933668addaa7efa1e1f2c417cc4', 'league/uri-interfaces' => '7.4.1@8d43ef5c841032c87e2de015972c06f3865ef718', 'lm-commons/lmc-rbac-mvc' => 'v3.4.0@3e63c2d70b37f0b9aa36d253052787bdf28a2356', 'lm-commons/rbac' => 'v1.2.1@fcf69dbc10c1d54595cc837b1525ea1e3252dc95', 'matthiasmullie/minify' => '1.3.73@cb7a9297b4ab070909cefade30ee95054d4ae87a', 'matthiasmullie/path-converter' => '1.1.3@e7d13b2c7e2f2268e1424aaed02085518afa02d9', 'matthiasmullie/scrapbook' => '1.4.9@da4178c1882136a8931ffd791df2b84a5aa74219', 'monolog/monolog' => '2.9.3@a30bfe2e142720dfa990d0a7e573997f5d884215', 'nette/schema' => 'v1.3.0@a6d3a6d1f545f01ef38e60f375d1cf1f4de98188', 'nette/utils' => 'v4.0.5@736c567e257dbe0fcf6ce81b4d6dbe05c6899f96', 'nikic/php-parser' => 'v5.1.0@683130c2ff8c2739f4822ff7ac5c873ec529abd1', 'opis/json-schema' => '2.3.0@c48df6d7089a45f01e1c82432348f2d5976f9bfb', 'opis/string' => '2.0.1@9ebf1a1f873f502f6859d11210b25a4bf5d141e7', 'opis/uri' => '1.1.0@0f3ca49ab1a5e4a6681c286e0b2cc081b93a7d5a', 'paragonie/random_compat' => 'v9.99.100@996434e5492cb4c3edcb9168db6fbb1359ef965a', 'pcrov/jsonreader' => '1.0.3@339b8891ec01d2394f4de18818658a0f84abffa5', 'pcrov/unicode' => '0.1.1@28cef671af310806afe98abada5e12774bd0ac64', 'pear/archive_tar' => '1.5.0@b439c859564f5cbb0f64ad6002d0afe84a889602', 'pear/console_getopt' => 'v1.4.3@a41f8d3e668987609178c7c4a9fe48fecac53fa0', 'pear/http_request2' => 'v2.6.0@f010a16ccddd1ee7d2ee085e8006ee712c00f706', 'pear/net_url2' => 'v2.2.2@07fd055820dbf466ee3990abe96d0e40a8791f9d', 'pear/pear-core-minimal' => 'v1.10.15@ce0adade8b97561656ace07cdaac4751c271ea8c', 'pear/pear_exception' => 'v1.0.2@b14fbe2ddb0b9f94f5b24cf08783d599f776fff0', 'phing/phing' => '3.0.0@52a1dffa3c8f1fb7c4106d6645fe18407112b31c', 'ppito/laminas-whoops' => '2.2.0@1507b42caeefc56511ab591ebd87c6700d111409', 'psr/cache' => '1.0.1@d11b50ad223250cf17b86e38383413f5a6764bf8', 'psr/clock' => '1.0.0@e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'psr/container' => '1.1.2@513e0666f7216c7459170d56df27dfcefe1689ea', 'psr/event-dispatcher' => '1.0.0@dbefd12671e8a14ec7f180cab83036ed26714bb0', 'psr/http-client' => '1.0.3@bb5906edc1c324c9a05aa0873d40117941e5fa90', 'psr/http-factory' => '1.1.0@2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'psr/http-message' => '2.0@402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'psr/log' => '1.1.4@d49695b909c3b7628b6289db5479a1c204601f11', 'psr/simple-cache' => '1.0.1@408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', 'ralouphie/getallheaders' => '3.0.3@120b605dfeb996808c31b6477290a714d356e822', 'scssphp/scssphp' => 'v1.13.0@63d1157457e5554edf00b0c1fabab4c1511d2520', 'sebastian/version' => '4.0.1@c51fa83a5d8f43f1402e3f32a005e6262244ef17', 'serialssolutions/summon' => 'v1.3.1@78ef74123c7c15fe3ddc92c9c1368c5dae9e590d', 'slm/locale' => '1.1.0@42783f68a34d8afc3fdb048f40f3575559f5963e', 'steverhoades/oauth2-openid-connect-server' => 'v2.6.1@269c4dc071519e8220e249cbdee9b0723e95215e', 'swagger-api/swagger-ui' => 'v5.17.14@74ed0adebfc9c8dd0de2bf8e81495b022a66c083', 'symfony/console' => 'v6.4.11@42686880adaacdad1835ee8fc2a9ec5b7bd63998', 'symfony/deprecation-contracts' => 'v3.5.0@0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1', 'symfony/filesystem' => 'v6.4.9@b51ef8059159330b74a4d52f68e671033c0fe463', 'symfony/options-resolver' => 'v6.4.8@22ab9e9101ab18de37839074f8a1197f55590c1b', 'symfony/polyfill-ctype' => 'v1.31.0@a3cc8b044a6ea513310cbd48ef7333b384945638', 'symfony/polyfill-intl-grapheme' => 'v1.31.0@b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe', 'symfony/polyfill-intl-idn' => 'v1.31.0@c36586dcf89a12315939e00ec9b4474adcb1d773', 'symfony/polyfill-intl-normalizer' => 'v1.31.0@3833d7255cc303546435cb650316bff708a1c75c', 'symfony/polyfill-mbstring' => 'v1.31.0@85181ba99b2345b0ef10ce42ecac37612d9fd341', 'symfony/polyfill-php72' => 'v1.31.0@fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce', 'symfony/polyfill-php80' => 'v1.31.0@60328e362d4c2c802a54fcbf04f9d3fb892b4cf8', 'symfony/rate-limiter' => 'v6.4.8@d96117211cf6740080827ee8c9eaf7e370243b50', 'symfony/service-contracts' => 'v3.5.0@bd1d9e59a81d8fa4acdcea3f617c581f7475a80f', 'symfony/string' => 'v6.4.11@5bc3eb632cf9c8dbfd6529d89be9950d1518883b', 'symfony/var-dumper' => 'v6.4.11@ee14c8254a480913268b1e3b1cba8045ed122694', 'symfony/yaml' => 'v6.4.11@be37e7f13195e05ab84ca5269365591edd240335', 'vstelmakh/url-highlight' => 'v3.1.0@354d04fe0239143cd3b64aa9131fc985f17460d6', 'vufind-org/vufind-marc' => 'v1.1.0@399800edbd29fe9e985a8d06c1de2f0479de391b', 'vufind-org/vufindcode' => 'v1.2@df7f4d2188c9f2c654dfee69774b80b9d03b1ab4', 'vufind-org/vufinddate' => 'v1.2.0@319b862c5a8a1352ff6cb93095fface6b40bc2e1', 'vufind-org/vufindharvest' => 'v5.3.0@4111bf57d372ae382c02f6ba83e749862b972940', 'vufind-org/vufindhttp' => 'v3.3.0@9e1c52164afef48ffc1b6e42859c710b365f0a61', 'webfontkit/open-sans' => '1.0.0@00ab31e690edfd0d88f9ffbcd998cf298b9687e9', 'webimpress/safe-writer' => '2.2.0@9d37cc8bee20f7cb2f58f6e23e05097eab5072e6', 'webmozart/assert' => '1.11.0@11cb2199493b2f8a3b53e7f19068fc6aac760991', 'webmozart/glob' => '4.7.0@8a2842112d6916e61e0e15e316465b611f3abc17', 'wikimedia/composer-merge-plugin' => 'v2.1.0@a03d426c8e9fb2c9c569d9deeb31a083292788bc', 'yajra/laravel-pdo-via-oci8' => 'v3.4.4@65c72f8098fb236e84c636a8f1c295e643484b49', 'behat/mink' => 'v1.11.0@d8527fdf8785aad38455fb426af457ab9937aece', 'behat/mink-selenium2-driver' => 'v1.7.0@4ca4083f305de7dff4434ac402dc4e3f39c0866a', 'clue/ndjson-react' => 'v1.3.0@392dc165fce93b5bb5c637b67e59619223c931b0', 'composer/pcre' => '3.3.1@63aaeac21d7e775ff9bc9d45021e1745c97521c4', 'composer/xdebug-handler' => '3.0.5@6c1925561632e83d60a44492e0b344cf48ab85ef', 'dmore/chrome-mink-driver' => '2.9.3@4dc18d3b4668e749ab7bef5a6796c13711c93e61', 'evenement/evenement' => 'v3.0.2@0a16b0d71ab13284339abb99d9d2bd813640efbc', 'fidry/cpu-core-counter' => '1.2.0@8520451a140d3f46ac33042715115e290cf5785f', 'firebase/php-jwt' => 'v6.10.1@500501c2ce893c824c801da135d02661199f60c5', 'friendsofphp/php-cs-fixer' => 'v3.64.0@58dd9c931c785a79739310aef5178928305ffa67', 'instaclick/php-webdriver' => '1.4.19@3b2a2ddc4e0a690cc691d7e5952964cc4b9538b1', 'myclabs/deep-copy' => '1.12.0@3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c', 'pdepend/pdepend' => '2.16.2@f942b208dc2a0868454d01b29f0c75bbcfc6ed58', 'phar-io/manifest' => '2.0.4@54750ef60c58e43759730615a392c31c80e23176', 'phar-io/version' => '3.2.1@4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'phpmd/phpmd' => '2.15.0@74a1f56e33afad4128b886e334093e98e1b5e7c0', 'phpstan/phpstan' => '1.12.2@0ca1c7bb55fca8fe6448f16fff0f311ccec960a1', 'phpunit/php-code-coverage' => '10.1.16@7e308268858ed6baedc8704a304727d20bc07c77', 'phpunit/php-file-iterator' => '4.1.0@a95037b6d9e608ba092da1b23931e537cadc3c3c', 'phpunit/php-invoker' => '4.0.0@f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7', 'phpunit/php-text-template' => '3.0.1@0c7b06ff49e3d5072f057eb1fa59258bf287a748', 'phpunit/php-timer' => '6.0.0@e2a2d67966e740530f4a3343fe2e030ffdc1161d', 'phpunit/phpcov' => '9.0.2@05307478b8f4b2a50c508d6f4eca15704cf7c1fd', 'phpunit/phpunit' => '10.5.34@3c69d315bdf79080c8e115b69d1961c6905b0e18', 'phrity/net-stream' => '1.3.0@9105931b65ad90c75f4885a40b268b0f65802e3e', 'phrity/net-uri' => '1.3.0@3f458e0c4d1ddc0e218d7a5b9420127c63925f43', 'phrity/util-errorhandler' => '1.1.0@4016d9f9615a4c602f525b0542e4835e316a42e4', 'phrity/websocket' => '1.7.3@8a525da4457b599ab1960f24183f25626c96ce3c', 'pietercolpaert/hardf' => '0.5.0@8dbfb3104ab70e7d43f36016b8ed35e3666ff18c', 'react/cache' => 'v1.2.0@d47c472b64aa5608225f47965a484b75c7817d5b', 'react/child-process' => 'v0.6.5@e71eb1aa55f057c7a4a0d08d06b0b0a484bead43', 'react/dns' => 'v1.13.0@eb8ae001b5a455665c89c1df97f6fb682f8fb0f5', 'react/event-loop' => 'v1.5.0@bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354', 'react/promise' => 'v3.2.0@8a164643313c71354582dc850b42b33fa12a4b63', 'react/socket' => 'v1.16.0@23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1', 'react/stream' => 'v1.4.0@1e5b0acb8fe55143b5b426817155190eb6f5b18d', 'sebastian/cli-parser' => '2.0.1@c34583b87e7b7a8055bf6c450c2c77ce32a24084', 'sebastian/code-unit' => '2.0.0@a81fee9eef0b7a76af11d121767abc44c104e503', 'sebastian/code-unit-reverse-lookup' => '3.0.0@5e3a687f7d8ae33fb362c5c0743794bbb2420a1d', 'sebastian/comparator' => '5.0.2@2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53', 'sebastian/complexity' => '3.2.0@68ff824baeae169ec9f2137158ee529584553799', 'sebastian/diff' => '5.1.1@c41e007b4b62af48218231d6c2275e4c9b975b2e', 'sebastian/environment' => '6.1.0@8074dbcd93529b357029f5cc5058fd3e43666984', 'sebastian/exporter' => '5.1.2@955288482d97c19a372d3f31006ab3f37da47adf', 'sebastian/global-state' => '6.0.2@987bafff24ecc4c9ac418cab1145b96dd6e9cbd9', 'sebastian/lines-of-code' => '2.0.2@856e7f6a75a84e339195d48c556f23be2ebf75d0', 'sebastian/object-enumerator' => '5.0.0@202d0e344a580d7f7d04b3fafce6933e59dae906', 'sebastian/object-reflector' => '3.0.0@24ed13d98130f0e7122df55d06c5c4942a577957', 'sebastian/recursion-context' => '5.0.0@05909fb5bc7df4c52992396d0116aed689f93712', 'sebastian/type' => '4.0.0@462699a16464c3944eefc02ebdd77882bd3925bf', 'squizlabs/php_codesniffer' => '3.10.2@86e5f5dd9a840c46810ebe5ff1885581c42a3017', 'symfony/config' => 'v6.4.8@12e7e52515ce37191b193cf3365903c4f3951e35', 'symfony/css-selector' => 'v6.4.8@4b61b02fe15db48e3687ce1c45ea385d1780fe08', 'symfony/dependency-injection' => 'v6.4.11@e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e', 'symfony/event-dispatcher' => 'v6.4.8@8d7507f02b06e06815e56bb39aa0128e3806208b', 'symfony/event-dispatcher-contracts' => 'v3.5.0@8f93aec25d41b72493c6ddff14e916177c9efc50', 'symfony/finder' => 'v6.4.11@d7eb6daf8cd7e9ac4976e9576b32042ef7253453', 'symfony/polyfill-php81' => 'v1.31.0@4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c', 'symfony/process' => 'v6.4.8@8d92dd79149f29e89ee0f480254db595f6a6a2c5', 'symfony/stopwatch' => 'v6.4.8@63e069eb616049632cde9674c46957819454b8aa', 'symfony/var-exporter' => 'v6.4.9@f9a060622e0d93777b7f8687ec4860191e16802e', 'theseer/tokenizer' => '1.2.3@737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2', 'vufind/vufind' => 'dev-5e939de286278dd8519238edaf05d5f54c9e945e@5e939de286278dd8519238edaf05d5f54c9e945e', ); private function __construct() { } /** * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function rootPackageName() : string { if (!self::composer2ApiUsable()) { return self::ROOT_PACKAGE_NAME; } return InstalledVersions::getRootPackage()['name']; } /** * @throws OutOfBoundsException If a version cannot be located. * * @psalm-param key-of $packageName * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function getVersion(string $packageName): string { if (self::composer2ApiUsable()) { return InstalledVersions::getPrettyVersion($packageName) . '@' . InstalledVersions::getReference($packageName); } if (isset(self::VERSIONS[$packageName])) { return self::VERSIONS[$packageName]; } throw new OutOfBoundsException( 'Required package "' . $packageName . '" is not installed: check your ./vendor/composer/installed.json and/or ./composer.lock files' ); } private static function composer2ApiUsable(): bool { if (!class_exists(InstalledVersions::class, false)) { return false; } if (method_exists(InstalledVersions::class, 'getAllRawData')) { $rawData = InstalledVersions::getAllRawData(); if (count($rawData) === 1 && count($rawData[0]) === 0) { return false; } } else { $rawData = InstalledVersions::getRawData(); if ($rawData === null || $rawData === []) { return false; } } return true; } }