@ -48,6 +48,28 @@ class InstalledVersions
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list< string >
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) & & $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
@ -61,7 +83,7 @@ class InstalledVersions
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev- requirement']);
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_ requirement']);
}
}
@ -187,9 +209,26 @@ class InstalledVersions
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool}
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string }
*/
public static function getRootPackage()
{
@ -203,12 +242,16 @@ 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, pretty_version: string, aliases: string[], dev: bool}, versions: array< string , array { dev - requirement: bool , pretty_version ? : string , version ? : string , aliases ? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] } > }
* @psalm-return 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 } > }
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
self::$installed = include __DIR__ . '/installed.php';
}
return self::$installed;
}
@ -216,7 +259,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 [ ] }, versions: array < string , array { pretty_version ? : string , version ? : string , aliases ? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] } > }>
* @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 } > }>
*/
public static function getAllRawData()
{
@ -239,7 +282,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, pretty_version: string, aliases: string[], dev: bool}, versions: array< string , array { dev - requirement: bool , pretty_version ? : string , version ? : string , aliases ? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] } > } $data
* @psalm-param 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 } > } $data
*/
public static function reload($data)
{
@ -249,7 +292,7 @@ class InstalledVersions
/**
* @return array[]
* @psalm-return list< array { root: array { name: string , version: string , reference: string , pretty_version: string , aliases: string [ ] , dev: bool }, versions: array < string , array { dev - requirement: bool , pretty_version ? : string , version ? : string , aliases ? : string [ ] , reference ? : string , replaced ? : string [ ] , provided ? : string [ ] } > }>
* @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 } > }>
*/
private static function getInstalled()
{
@ -265,10 +308,16 @@ class InstalledVersions
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
if (null === self::$installed & & strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
self::$installed = require __DIR__ . '/installed.php';
}
$installed[] = self::$installed;
return $installed;