@ -20,12 +20,27 @@ use Composer\Semver\VersionParser;
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require it's presence, you can require `composer-runtime-api ^2.0`
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array< string , array { pretty_version ? : string , version ? : string , reference ? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > }|array{}|null
*/
private static $installed;
/**
* @var bool|null
*/
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array< string , array { root: array { name: string , pretty_version: string , version: string , reference: string | null , type: string , install_path: string , aliases: string [ ] , dev: bool } , versions: array < string , array { pretty_version ? : string , version ? : string , reference ? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > }>
*/
private static $installedByVendor = array();
/**
@ -83,7 +98,7 @@ class InstalledVersions
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || emp ty ($installed['versions'][$packageName]['dev_requirement']);
return $includeDevRequirements || !iss et($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false ;
}
}
@ -104,7 +119,7 @@ class InstalledVersions
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
@ -228,7 +243,7 @@ class InstalledVersions
/**
* @return array
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string }
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool }
*/
public static function getRootPackage()
{
@ -242,7 +257,7 @@ class InstalledVersions
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, version: string, reference: string, pr etty_ve rs io n: string, aliases: string[], dev: bool, install_path: string }, versions: array< string , array { dev_requirement: bool , pretty_version? : string , version ? : string , aliases? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] , install_path ? : string } > }
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null , ty pe: s tring, install_path : string, aliases: string[], dev: bool}, versions: array< string , array { pretty_version? : string , version ? : string , reference? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > }
*/
public static function getRawData()
{
@ -265,7 +280,7 @@ class InstalledVersions
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list< array { root: array { name: string , version: string , reference: string , pretty_version : string , aliases: string [ ] , dev: bool , install_path: string }, versions: array < string , array { dev_requirement: bool , pretty_version? : string , version ? : string , aliases? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] , install_path ? : string } > }>
* @psalm-return list< array { root: array { name: string , pretty_version: string , version: string , reference: string |null , type: string , install_path : string , aliases: string [ ] , dev: bool }, versions: array < string , array { pretty_version? : string , version ? : string , reference? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > }>
*/
public static function getAllRawData()
{
@ -288,7 +303,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, version: string, reference: string, pr etty_ve rs io n: string, aliases: string[], dev: bool, install_path: string }, versions: array< string , array { dev_requirement: bool , pretty_version? : string , version ? : string , aliases? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] , install_path ? : string } > } $data
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null , ty pe: s tring, install_path : string, aliases: string[], dev: bool}, versions: array< string , array { pretty_version? : string , version ? : string , reference? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > } $data
*/
public static function reload($data)
{
@ -298,7 +313,7 @@ class InstalledVersions
/**
* @return array[]
* @psalm-return list< array { root: array { name: string , version: string , reference: string , pretty_version : string , aliases: string [ ] , dev: bool , install_path: string }, versions: array < string , array { dev_requirement: bool , pretty_version? : string , version ? : string , aliases? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] , install_path ? : string } > }>
* @psalm-return list< array { root: array { name: string , pretty_version: string , version: string , reference: string |null , type: string , install_path : string , aliases: string [ ] , dev: bool }, versions: array < string , array { pretty_version? : string , version ? : string , reference? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > }>
*/
private static function getInstalled()
{
@ -313,7 +328,9 @@ class InstalledVersions
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array< string , array { pretty_version ? : string , version ? : string , reference ? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > } $required */
$required = require $vendorDir.'/composer/installed.php';
$installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed & & strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
@ -325,12 +342,17 @@ class InstalledVersions
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = require __DIR__ . '/installed.php';
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array< string , array { pretty_version ? : string , version ? : string , reference ? : string | null , type ? : string , install_path ? : string , aliases ? : string [ ] , dev_requirement: bool , replaced ? : string [ ] , provided ? : string [ ] } > } $required */
$required = require __DIR__ . '/installed.php';
self::$installed = $required;
} else {
self::$installed = array();
}
}
$installed[] = self::$installed;
if (self::$installed !== array()) {
$installed[] = self::$installed;
}
return $installed;
}