From 370f6dc145815e3bb5e42eb5b6a95ecabb40c469 Mon Sep 17 00:00:00 2001 From: Ryan Weaver Date: Tue, 17 Oct 2023 15:48:27 -0400 Subject: [PATCH] [AssetMapper] Using ?specifier=* does not match unstable packages on jsdelivr --- .../Resolver/JsDelivrEsmResolver.php | 20 +++++++++++-------- .../Resolver/JsDelivrEsmResolverTest.php | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php b/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php index 38f4e0f5e88f9..d89c29d92c9a9 100644 --- a/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php +++ b/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php @@ -21,7 +21,7 @@ final class JsDelivrEsmResolver implements PackageResolverInterface { - public const URL_PATTERN_VERSION = 'https://data.jsdelivr.com/v1/packages/npm/%s/resolved?specifier=%s'; + public const URL_PATTERN_VERSION = 'https://data.jsdelivr.com/v1/packages/npm/%s/resolved'; public const URL_PATTERN_DIST_CSS = 'https://cdn.jsdelivr.net/npm/%s@%s%s'; public const URL_PATTERN_DIST = self::URL_PATTERN_DIST_CSS.'/+esm'; public const URL_PATTERN_ENTRYPOINT = 'https://data.jsdelivr.com/v1/packages/npm/%s@%s/entrypoints'; @@ -32,9 +32,6 @@ final class JsDelivrEsmResolver implements PackageResolverInterface public function __construct( HttpClientInterface $httpClient = null, - private readonly string $versionUrlPattern = self::URL_PATTERN_VERSION, - private readonly string $distUrlPattern = self::URL_PATTERN_DIST, - private readonly string $distUrlCssPattern = self::URL_PATTERN_DIST_CSS ) { $this->httpClient = $httpClient ?? HttpClient::create(); } @@ -49,7 +46,6 @@ public function resolvePackages(array $packagesToRequire): array $requiredPackages = []; foreach ($packagesToRequire as $options) { $packageSpecifier = trim($options->packageModuleSpecifier, '/'); - $constraint = $options->versionConstraint ?? '*'; // avoid resolving the same package twice if (isset($resolvedPackages[$packageSpecifier])) { @@ -58,7 +54,11 @@ public function resolvePackages(array $packagesToRequire): array [$packageName, $filePath] = ImportMapEntry::splitPackageNameAndFilePath($packageSpecifier); - $response = $this->httpClient->request('GET', sprintf($this->versionUrlPattern, $packageName, urlencode($constraint))); + $versionUrl = sprintf(self::URL_PATTERN_VERSION, $packageName); + if (null !== $options->versionConstraint) { + $versionUrl .= '?specifier='.urlencode($options->versionConstraint); + } + $response = $this->httpClient->request('GET', $versionUrl); $requiredPackages[] = [$options, $response, $packageName, $filePath, /* resolved version */ null]; } @@ -72,7 +72,11 @@ public function resolvePackages(array $packagesToRequire): array } $version = $response->toArray()['version']; - $pattern = str_ends_with($filePath, '.css') ? $this->distUrlCssPattern : $this->distUrlPattern; + if (null === $version) { + throw new RuntimeException(sprintf('Unable to find the latest version for package "%s" - try specifying the version manually.', $packageName)); + } + + $pattern = str_ends_with($filePath, '.css') ? self::URL_PATTERN_DIST_CSS : self::URL_PATTERN_DIST; $requiredPackages[$i][1] = $this->httpClient->request('GET', sprintf($pattern, $packageName, $version, $filePath)); $requiredPackages[$i][4] = $version; @@ -163,7 +167,7 @@ public function downloadPackages(array $importMapEntries, callable $progressCall throw new \InvalidArgumentException(sprintf('The entry "%s" is not a remote package.', $entry->importName)); } - $pattern = ImportMapType::CSS === $entry->type ? $this->distUrlCssPattern : $this->distUrlPattern; + $pattern = ImportMapType::CSS === $entry->type ? self::URL_PATTERN_DIST_CSS : self::URL_PATTERN_DIST; $url = sprintf($pattern, $entry->getPackageName(), $entry->version, $entry->getPackagePathString()); $responses[$package] = $this->httpClient->request('GET', $url); diff --git a/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php b/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php index 75035ec56c8dc..1c8eff0f64d9f 100644 --- a/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php @@ -61,7 +61,7 @@ public static function provideResolvePackagesTests(): iterable 'packages' => [new PackageRequireOptions('lodash')], 'expectedRequests' => [ [ - 'url' => '/v1/packages/npm/lodash/resolved?specifier=%2A', + 'url' => '/v1/packages/npm/lodash/resolved', 'response' => ['body' => ['version' => '1.2.3']], ], [ @@ -196,7 +196,7 @@ public static function provideResolvePackagesTests(): iterable 'packages' => [new PackageRequireOptions('bootstrap/dist/css/bootstrap.min.css')], 'expectedRequests' => [ [ - 'url' => '/v1/packages/npm/bootstrap/resolved?specifier=%2A', + 'url' => '/v1/packages/npm/bootstrap/resolved', 'response' => ['body' => ['version' => '3.3.0']], ], [