From 9ac91b842e9f3ff211034d1f705ee1540627b5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 9 Nov 2024 23:32:39 +0100 Subject: [PATCH] [Icons] Support aliases in LockIconsCommand --- src/Icons/src/Command/LockIconsCommand.php | 16 ++++++++++++---- .../src/DependencyInjection/UXIconsExtension.php | 5 +++++ src/Icons/tests/Fixtures/TestKernel.php | 4 ++++ .../Integration/Command/LockIconsCommandTest.php | 14 +++++++++++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Icons/src/Command/LockIconsCommand.php b/src/Icons/src/Command/LockIconsCommand.php index c3b3d2fa65a..69fab8e971b 100644 --- a/src/Icons/src/Command/LockIconsCommand.php +++ b/src/Icons/src/Command/LockIconsCommand.php @@ -37,6 +37,8 @@ public function __construct( private Iconify $iconify, private LocalSvgIconRegistry $registry, private IconFinder $iconFinder, + private readonly array $iconAliases = [], + private readonly array $iconSetAliases = [], ) { parent::__construct(); } @@ -59,19 +61,25 @@ protected function execute(InputInterface $input, OutputInterface $output): int $count = 0; $io->comment('Scanning project for icons...'); + $finderIcons = $this->iconFinder->icons(); - foreach ($this->iconFinder->icons() as $icon) { + if ($this->iconAliases) { + $io->comment('Adding icons aliases...'); + } + + foreach ([...array_values($this->iconAliases), ...array_values($finderIcons)] as $icon) { if (2 !== \count($parts = explode(':', $icon))) { continue; } - if (!$force && $this->registry->has($icon)) { + [$prefix, $name] = $parts; + $prefix = $this->iconSetAliases[$prefix] ?? $prefix; + + if (!$force && $this->registry->has($prefix.':'.$name)) { // icon already imported continue; } - [$prefix, $name] = $parts; - if (!$this->iconify->hasIconSet($prefix)) { // not an icon set? example: "og:twitter" if ($io->isVeryVerbose()) { diff --git a/src/Icons/src/DependencyInjection/UXIconsExtension.php b/src/Icons/src/DependencyInjection/UXIconsExtension.php index 618749ee701..81042277976 100644 --- a/src/Icons/src/DependencyInjection/UXIconsExtension.php +++ b/src/Icons/src/DependencyInjection/UXIconsExtension.php @@ -178,6 +178,11 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container } } + $container->getDefinition('.ux_icons.command.lock') + ->setArgument(3, $mergedConfig['aliases']) + ->setArgument(4, $iconSetAliases) + ; + if (!$container->getParameter('kernel.debug')) { $container->removeDefinition('.ux_icons.command.import'); } diff --git a/src/Icons/tests/Fixtures/TestKernel.php b/src/Icons/tests/Fixtures/TestKernel.php index 6a9d0f0bdb0..2f573439dd4 100644 --- a/src/Icons/tests/Fixtures/TestKernel.php +++ b/src/Icons/tests/Fixtures/TestKernel.php @@ -60,6 +60,10 @@ protected function configureContainer(ContainerConfigurator $container): void $container->extension('ux_icons', [ 'icon_dir' => '%kernel.project_dir%/tests/Fixtures/icons', + 'aliases' => [ + 'foo' => 'lucide:circle', + 'bar' => 'lu:circle-off', + ], 'icon_sets' => [ 'fla' => [ 'path' => '%kernel.project_dir%/tests/Fixtures/images/flags', diff --git a/src/Icons/tests/Integration/Command/LockIconsCommandTest.php b/src/Icons/tests/Integration/Command/LockIconsCommandTest.php index f6b2e11f2d4..abcfc45fdf6 100644 --- a/src/Icons/tests/Integration/Command/LockIconsCommandTest.php +++ b/src/Icons/tests/Integration/Command/LockIconsCommandTest.php @@ -25,6 +25,8 @@ final class LockIconsCommandTest extends KernelTestCase private const ICONS = [ __DIR__.'/../../Fixtures/icons/iconamoon/3d-duotone.svg', __DIR__.'/../../Fixtures/icons/flag/eu-4x3.svg', + __DIR__.'/../../Fixtures/icons/lucide/circle.svg', + __DIR__.'/../../Fixtures/icons/lucide/circle-off.svg', ]; /** @@ -50,9 +52,11 @@ public function testImportFoundIcons(): void $this->executeConsoleCommand('ux:icons:lock') ->assertSuccessful() ->assertOutputContains('Scanning project for icons...') + ->assertOutputContains('Imported lucide:circle') + ->assertOutputContains('Imported lucide:circle-off') ->assertOutputContains('Imported flag:eu-4x3') ->assertOutputContains('Imported iconamoon:3d-duotone') - ->assertOutputContains('Imported 2 icons') + ->assertOutputContains('Imported 4 icons') ; foreach (self::ICONS as $icon) { @@ -70,17 +74,21 @@ public function testForceImportFoundIcons(): void $this->executeConsoleCommand('ux:icons:lock') ->assertSuccessful() ->assertOutputContains('Scanning project for icons...') + ->assertOutputContains('Imported lucide:circle') + ->assertOutputContains('Imported lucide:circle-off') ->assertOutputContains('Imported flag:eu-4x3') ->assertOutputContains('Imported iconamoon:3d-duotone') - ->assertOutputContains('Imported 2 icons') + ->assertOutputContains('Imported 4 icons') ; $this->executeConsoleCommand('ux:icons:lock --force') ->assertSuccessful() ->assertOutputContains('Scanning project for icons...') + ->assertOutputContains('Imported lucide:circle') + ->assertOutputContains('Imported lucide:circle-off') ->assertOutputContains('Imported flag:eu-4x3') ->assertOutputContains('Imported iconamoon:3d-duotone') - ->assertOutputContains('Imported 2 icons') + ->assertOutputContains('Imported 4 icons') ; } }