From 33a80329a989ab826d2a3463e4863936d33a5376 Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 18:28:06 -0300 Subject: [PATCH 1/6] Adds a importmap:update command --- src/Commands/PinCommand.php | 2 ++ src/Commands/UpdateCommand.php | 32 +++++++++++++++++++++++++ src/ImportmapLaravelServiceProvider.php | 3 ++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/Commands/UpdateCommand.php diff --git a/src/Commands/PinCommand.php b/src/Commands/PinCommand.php index 624be23..b23c026 100644 --- a/src/Commands/PinCommand.php +++ b/src/Commands/PinCommand.php @@ -6,8 +6,10 @@ use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Facades\File; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Packager; +#[AsCommand('importmap:pin')] class PinCommand extends Command { /** diff --git a/src/Commands/UpdateCommand.php b/src/Commands/UpdateCommand.php new file mode 100644 index 0000000..8f38f34 --- /dev/null +++ b/src/Commands/UpdateCommand.php @@ -0,0 +1,32 @@ +call('importmap:pin', [ + 'packages' => $npm->outdatedPackages()->pluck('name')->all(), + ]); + } +} diff --git a/src/ImportmapLaravelServiceProvider.php b/src/ImportmapLaravelServiceProvider.php index 3c679e2..4f1f079 100644 --- a/src/ImportmapLaravelServiceProvider.php +++ b/src/ImportmapLaravelServiceProvider.php @@ -27,7 +27,8 @@ public function configurePackage(Package $package): void ->hasCommand(Commands\UnpinCommand::class) ->hasCommand(Commands\OutdatedCommand::class) ->hasCommand(Commands\AuditCommand::class) - ->hasCommand(Commands\PackagesCommand::class); + ->hasCommand(Commands\PackagesCommand::class) + ->hasCommand(Commands\UpdateCommand::class); } public function packageRegistered() From 0728029365cf7894442351db6f528a33265717b2 Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 18:30:18 -0300 Subject: [PATCH 2/6] Adds AsCommand attribute to all commands --- src/Commands/AuditCommand.php | 2 ++ src/Commands/ClearCacheCommand.php | 2 ++ src/Commands/InstallCommand.php | 2 ++ src/Commands/JsonCommand.php | 2 ++ src/Commands/OptimizeCommand.php | 2 ++ src/Commands/OutdatedCommand.php | 2 ++ src/Commands/PackagesCommand.php | 2 ++ src/Commands/UnpinCommand.php | 2 ++ 8 files changed, 16 insertions(+) diff --git a/src/Commands/AuditCommand.php b/src/Commands/AuditCommand.php index c1a4038..235bb92 100644 --- a/src/Commands/AuditCommand.php +++ b/src/Commands/AuditCommand.php @@ -4,9 +4,11 @@ use Illuminate\Console\Command; use Illuminate\Support\Str; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Npm; use Tonysm\ImportmapLaravel\VulnerablePackage; +#[AsCommand('importmap:audit')] class AuditCommand extends Command { public $signature = 'importmap:audit'; diff --git a/src/Commands/ClearCacheCommand.php b/src/Commands/ClearCacheCommand.php index 5e0eafb..36baac2 100644 --- a/src/Commands/ClearCacheCommand.php +++ b/src/Commands/ClearCacheCommand.php @@ -4,9 +4,11 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\File; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Importmap; use Tonysm\ImportmapLaravel\Manifest; +#[AsCommand('importmap:clear')] class ClearCacheCommand extends Command { public $signature = 'importmap:clear'; diff --git a/src/Commands/InstallCommand.php b/src/Commands/InstallCommand.php index 4ffc98c..d869188 100644 --- a/src/Commands/InstallCommand.php +++ b/src/Commands/InstallCommand.php @@ -7,10 +7,12 @@ use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\File; use Illuminate\Support\Str; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Terminal; use Tonysm\ImportmapLaravel\Actions\FixJsImportPaths; use Tonysm\ImportmapLaravel\Events\FailedToFixImportStatement; +#[AsCommand('importmap:install')] class InstallCommand extends Command { public $signature = 'importmap:install'; diff --git a/src/Commands/JsonCommand.php b/src/Commands/JsonCommand.php index 2dd420b..8c4722a 100644 --- a/src/Commands/JsonCommand.php +++ b/src/Commands/JsonCommand.php @@ -3,9 +3,11 @@ namespace Tonysm\ImportmapLaravel\Commands; use Illuminate\Console\Command; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\AssetResolver; use Tonysm\ImportmapLaravel\Importmap; +#[AsCommand('importmap:json')] class JsonCommand extends Command { public $signature = 'importmap:json'; diff --git a/src/Commands/OptimizeCommand.php b/src/Commands/OptimizeCommand.php index 1b1fe06..8992298 100644 --- a/src/Commands/OptimizeCommand.php +++ b/src/Commands/OptimizeCommand.php @@ -5,10 +5,12 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\File; use Illuminate\Support\Str; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\FileDigest; use Tonysm\ImportmapLaravel\Importmap; use Tonysm\ImportmapLaravel\Manifest; +#[AsCommand('importmap:optimize')] class OptimizeCommand extends Command { public $signature = 'importmap:optimize'; diff --git a/src/Commands/OutdatedCommand.php b/src/Commands/OutdatedCommand.php index 6d9fbc6..6369b03 100644 --- a/src/Commands/OutdatedCommand.php +++ b/src/Commands/OutdatedCommand.php @@ -4,9 +4,11 @@ use Illuminate\Console\Command; use Illuminate\Support\Str; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Npm; use Tonysm\ImportmapLaravel\OutdatedPackage; +#[AsCommand('importmap:outdated')] class OutdatedCommand extends Command { public $signature = 'importmap:outdated'; diff --git a/src/Commands/PackagesCommand.php b/src/Commands/PackagesCommand.php index 2ec6bab..2ce56c9 100644 --- a/src/Commands/PackagesCommand.php +++ b/src/Commands/PackagesCommand.php @@ -3,9 +3,11 @@ namespace Tonysm\ImportmapLaravel\Commands; use Illuminate\Console\Command; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Npm; use Tonysm\ImportmapLaravel\PackageVersion; +#[AsCommand('importmap:packages')] class PackagesCommand extends Command { public $signature = 'importmap:packages'; diff --git a/src/Commands/UnpinCommand.php b/src/Commands/UnpinCommand.php index bad6883..d9618aa 100644 --- a/src/Commands/UnpinCommand.php +++ b/src/Commands/UnpinCommand.php @@ -4,8 +4,10 @@ use Illuminate\Console\Command; use Illuminate\Support\Arr; +use Symfony\Component\Console\Attribute\AsCommand; use Tonysm\ImportmapLaravel\Packager; +#[AsCommand('importmap:unpin')] class UnpinCommand extends Command { /** From 2cb7fbdd694e812958a34fa0b4345cb46a7e2c62 Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 18:35:00 -0300 Subject: [PATCH 3/6] Only run update command when there are outdated packages --- src/Commands/UpdateCommand.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Commands/UpdateCommand.php b/src/Commands/UpdateCommand.php index 8f38f34..21ae0b2 100644 --- a/src/Commands/UpdateCommand.php +++ b/src/Commands/UpdateCommand.php @@ -25,8 +25,12 @@ class UpdateCommand extends Command public function handle(Npm $npm) { - $this->call('importmap:pin', [ - 'packages' => $npm->outdatedPackages()->pluck('name')->all(), - ]); + if (count($outdatedPackages = $npm->outdatedPackages()) > 0) { + $this->call('importmap:pin', [ + 'packages' => $outdatedPackages->pluck('name')->all(), + ]); + } else { + $this->components->info('No oudated packages found.'); + } } } From afef3601f8eb065c60810c801f9b2a70c7940e38 Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 19:17:24 -0300 Subject: [PATCH 4/6] Store the package name, version, and URL (with CDN) of the vendored files --- src/Commands/PinCommand.php | 2 +- src/Npm.php | 2 +- src/Packager.php | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Commands/PinCommand.php b/src/Commands/PinCommand.php index b23c026..2c9fde0 100644 --- a/src/Commands/PinCommand.php +++ b/src/Commands/PinCommand.php @@ -84,7 +84,7 @@ private function importPackages(Packager $packager, Collection $imports): void private function pattern(string $package): string { return sprintf( - '#^Importmap::pin\("%s".*$#', + '#Importmap::pin\([\'\"]%s[\'\"].*$#', preg_quote($package), ); } diff --git a/src/Npm.php b/src/Npm.php index bea82cc..3de19f1 100644 --- a/src/Npm.php +++ b/src/Npm.php @@ -95,7 +95,7 @@ private function findPackagesFromCdnMatches(string $content) private function findPackagesFromLocalMatches(string $content) { - preg_match_all('/^Importmap::pin\(["\']([^"\']*)["\'].*\)\; \/\/.*@(\d+\.\d+\.\d+(?:[^\s]*)).*\r?$/m', $content, $matches); + preg_match_all('/^Importmap::pin\(.+\)\;\s*\/\/\s*(.+?)@(.+?)\s+.*\r?$/m', $content, $matches); if (count($matches) !== 3) { return collect(); diff --git a/src/Packager.php b/src/Packager.php index 08c040f..ea4f1e3 100644 --- a/src/Packager.php +++ b/src/Packager.php @@ -55,10 +55,12 @@ public function vendoredPinFor(string $package, string $url): string $version = $this->extractPackageVersionFrom($url); return sprintf( - 'Importmap::pin("%s", to: "%s"); // %s', + 'Importmap::pin("%s", to: "%s"); // %s%s downloaded from %s', $package, Str::after($this->vendoredPackageName($package), 'resources'), + $package, $version, + $url, ); } From 8ddc1ed05901c3a6b793ce5a8070cabd1974798d Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 19:19:45 -0300 Subject: [PATCH 5/6] Update provider to add .io on jspm (following the importmap-rails) --- src/Packager.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Packager.php b/src/Packager.php index ea4f1e3..d292e54 100644 --- a/src/Packager.php +++ b/src/Packager.php @@ -28,7 +28,7 @@ public function import(array $packages, string $env, string $from) 'install' => $packages, 'flattenScope' => true, 'env' => ['browser', 'module', $env], - 'provider' => $from, + 'provider' => $this->normalizeProvider($from), ]); return match ($response->status()) { @@ -140,4 +140,12 @@ private function handleFailureResponse(Response $response) throw Exceptions\ImportmapException::withUnexpectedResponseCode($response->status()); } + + private function normalizeProvider(string $provider): string + { + return match ($provider) { + 'jspm' => 'jspm.io', + default => $provider, + }; + } } From b700aae28cfccb0d566fc3b089aef76b3a524538 Mon Sep 17 00:00:00 2001 From: Tony Messias Date: Sat, 3 Feb 2024 19:25:29 -0300 Subject: [PATCH 6/6] Fix tests --- tests/fixtures/npm/audit-importmap.php | 2 +- tests/fixtures/npm/outdated-importmap.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/npm/audit-importmap.php b/tests/fixtures/npm/audit-importmap.php index 5485d89..0ca7d4d 100644 --- a/tests/fixtures/npm/audit-importmap.php +++ b/tests/fixtures/npm/audit-importmap.php @@ -3,4 +3,4 @@ use Tonysm\ImportmapLaravel\Facades\Importmap; Importmap::pin('is-svg', to: 'https://cdn.skypack.dev/is-svg@3.0.0', preload: true); -Importmap::pin('lodash', to: '/js/vendor/lodash.js'); // @4.17.12 +Importmap::pin('lodash', to: '/js/vendor/lodash.js'); // lodash@4.17.12 diff --git a/tests/fixtures/npm/outdated-importmap.php b/tests/fixtures/npm/outdated-importmap.php index 694ba55..0c207ce 100644 --- a/tests/fixtures/npm/outdated-importmap.php +++ b/tests/fixtures/npm/outdated-importmap.php @@ -3,4 +3,4 @@ use Tonysm\ImportmapLaravel\Facades\Importmap; Importmap::pin('is-svg', to: 'https://cdn.skypack.dev/is-svg@3.0.0', preload: true); -Importmap::pin('lodash', to: '/js/vendor/lodash.js'); // @4.0.0 +Importmap::pin('lodash', to: '/js/vendor/lodash.js'); // lodash@4.0.0