From d6ff6c1817d0a554b5f673cc23e59ed457e370d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Mon, 23 Dec 2024 21:35:10 +0100 Subject: [PATCH] [AssetMapper] Fix JavaScript compiler create self-referencing imports --- .../Compiler/JavaScriptImportPathCompiler.php | 5 ++++ .../JavaScriptImportPathCompilerTest.php | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php b/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php index 3fab0e6f50118..e769cdeff5ca2 100644 --- a/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php +++ b/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php @@ -92,6 +92,11 @@ public function compile(string $content, MappedAsset $asset, AssetMapperInterfac return $fullImportString; } + // Ignore self-referencing import + if ($dependentAsset->logicalPath === $asset->logicalPath) { + return $fullImportString; + } + // List as a JavaScript import. // This will cause the asset to be included in the importmap (for relative imports) // and will be used to generate the preloads in the importmap. diff --git a/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php b/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php index a73c2a4f2cb10..1dcc673d02051 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php @@ -574,6 +574,34 @@ public function testCompileHandlesCircularBareImportAssets() $this->assertSame($popperAsset->logicalPath, $bootstrapAsset->getJavaScriptImports()[0]->assetLogicalPath); } + public function testCompileIgnoresSelfReferencingBareImportAssets() + { + $bootstrapAsset = new MappedAsset('foo.js', 'foo.js', 'foo.js'); + + $importMapConfigReader = $this->createMock(ImportMapConfigReader::class); + $importMapConfigReader->expects($this->once()) + ->method('findRootImportMapEntry') + ->with('foobar') + ->willReturn(ImportMapEntry::createRemote('foobar', ImportMapType::JS, 'foo.js', '1.2.3', 'foobar', false)); + $importMapConfigReader->expects($this->any()) + ->method('convertPathToFilesystemPath') + ->with('foo.js') + ->willReturn('foo.js'); + + $assetMapper = $this->createMock(AssetMapperInterface::class); + $assetMapper->expects($this->once()) + ->method('getAssetFromSourcePath') + ->with('foo.js') + ->willReturn($bootstrapAsset); + + $compiler = new JavaScriptImportPathCompiler($importMapConfigReader); + $input = 'import { foo } from "foobar";'; + $compiler->compile($input, $bootstrapAsset, $assetMapper); + $this->assertCount(0, $bootstrapAsset->getDependencies()); + $this->assertCount(0, $bootstrapAsset->getFileDependencies()); + $this->assertCount(0, $bootstrapAsset->getJavaScriptImports()); + } + /** * @dataProvider provideMissingImportModeTests */