diff --git a/src/Scanner/Yarn/YarnLockParser.php b/src/Scanner/Yarn/YarnLockParser.php index a77a68e..5871c95 100644 --- a/src/Scanner/Yarn/YarnLockParser.php +++ b/src/Scanner/Yarn/YarnLockParser.php @@ -8,6 +8,7 @@ use Siketyan\Loxcan\Model\DependencyCollection; use Siketyan\Loxcan\Model\Package; use Siketyan\Loxcan\Versioning\SemVer\SemVerVersionParser; +use Siketyan\YarnLock\ConstraintInterface; use Siketyan\YarnLock\YarnLock; class YarnLockParser @@ -20,14 +21,15 @@ public function __construct( public function parse(?string $lock): DependencyCollection { - $packages = YarnLock::parse($lock ?? ''); + $packages = YarnLock::parsePackages(YarnLock::parse($lock ?? '')); $dependencies = []; - foreach ($packages as $names => $package) { - $version = $package['version']; + foreach ($packages as $package) { + $version = $package->getVersion(); - foreach (explode(',', $names) as $name) { - $name = substr($name, 0, strrpos($name, '@', -1)); + /** @var ConstraintInterface $constraint */ + foreach ($package->getConstraints()->all() as $constraint) { + $name = $constraint->getName(); $pkg = $this->packagePool->get($name); if (!$pkg instanceof Package) { diff --git a/tests/Scanner/Yarn/YarnLockParserTest.php b/tests/Scanner/Yarn/YarnLockParserTest.php index d716320..76c7ffc 100644 --- a/tests/Scanner/Yarn/YarnLockParserTest.php +++ b/tests/Scanner/Yarn/YarnLockParserTest.php @@ -18,11 +18,19 @@ class YarnLockParserTest extends TestCase use ProphecyTrait; private const CONTENTS = <<<'EOS' - @foo/bar@^1.2: - version "1.2.3-dev" + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 - baz@*: - version "3.2.1" + + "@types/node@^18": + version "18.16.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.16.tgz#3b64862856c7874ccf7439e6bab872d245c86d8e" + integrity sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g== + + typescript@^5: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== EOS; private ObjectProphecy $packagePool; @@ -46,12 +54,12 @@ public function test(): void $fooBarVersion = $this->prophesize(SemVerVersion::class)->reveal(); $barBazVersion = $this->prophesize(SemVerVersion::class)->reveal(); - $this->packagePool->get('@foo/bar')->willReturn(null); - $this->packagePool->get('baz')->willReturn($cache); + $this->packagePool->get('@types/node')->willReturn(null); + $this->packagePool->get('typescript')->willReturn($cache); $this->packagePool->add(Argument::type(Package::class))->shouldBeCalledOnce(); - $this->versionParser->parse('1.2.3-dev')->willReturn($fooBarVersion); - $this->versionParser->parse('3.2.1')->willReturn($barBazVersion); + $this->versionParser->parse('18.16.16')->willReturn($fooBarVersion); + $this->versionParser->parse('5.0.4')->willReturn($barBazVersion); $collection = $this->parser->parse(self::CONTENTS); $dependencies = $collection->getDependencies(); @@ -59,7 +67,7 @@ public function test(): void $this->assertCount(2, $dependencies); $this->assertContainsOnlyInstancesOf(Dependency::class, $dependencies); - $this->assertSame('@foo/bar', $dependencies[0]->getPackage()->getName()); + $this->assertSame('@types/node', $dependencies[0]->getPackage()->getName()); $this->assertSame($fooBarVersion, $dependencies[0]->getVersion()); $this->assertSame($cache, $dependencies[1]->getPackage());