-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathPackage.php
More file actions
81 lines (66 loc) · 2.3 KB
/
Package.php
File metadata and controls
81 lines (66 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
declare(strict_types=1);
namespace RoadRunner\VersionChecker\Composer;
use Composer\InstalledVersions;
use Composer\Semver\VersionParser;
final class Package implements PackageInterface
{
/**
* @param non-empty-string $packageName
*
* @return string[]
*
* @psalm-return list<non-empty-string>
*/
#[\Override]
public function getRequiredVersions(string $packageName): array
{
$versions = [];
foreach (InstalledVersions::getInstalledPackages() as $package) {
$path = InstalledVersions::getInstallPath($package);
if ($path !== null && \file_exists($path . '/composer.json')) {
/** @var array{require?: array<non-empty-string, non-empty-string>} $composerJson */
$fileContent = \file_get_contents($path . '/composer.json');
/** @var array<string, mixed>|null $composerJson */
$composerJson = $fileContent === false ? null : \json_decode($fileContent, true);
if (isset($composerJson['require'][$packageName])) {
/** @var mixed $rawPackage */
$rawPackage = $composerJson['require'][$packageName];
if (is_string($rawPackage) && strlen($rawPackage) > 0) {
assert($rawPackage !== '');
if ($this->isSupportedVersion($rawPackage)) {
$versions[] = $this->getMinVersion($rawPackage);
}
}
}
}
}
return $versions;
}
/**
* @param non-empty-string $version
*/
private function isSupportedVersion(string $version): bool
{
$parser = new VersionParser();
try {
$parser->parseConstraints($version);
} catch (\Throwable) {
return false;
}
return !\str_starts_with($version, 'dev-');
}
/**
* @param non-empty-string $version
*
* @return non-empty-string
*/
private function getMinVersion(string $version): string
{
$parser = new VersionParser();
$constraint = $parser->parseConstraints($version);
/** @var non-empty-string $min */
$min = $constraint->getLowerBound()->getVersion();
return $min;
}
}