8000 [AssetMapper] Always downloading vendor files by weaverryan · Pull Request #51786 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[AssetMapper] Always downloading vendor files #51786

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ CHANGELOG
* Deprecate `framework.validation.enable_annotations`, use `framework.validation.enable_attributes` instead
* Deprecate `framework.serializer.enable_annotations`, use `framework.serializer.enable_attributes` instead
* Add `array $tokenAttributes = []` optional parameter to `KernelBrowser::loginUser()`
* Add support for relative URLs in BrowserKit's redirect assertion.
* Add support for relative URLs in BrowserKit's redirect assertion
* Change BrowserKitAssertionsTrait::getClient() to be protected
* Deprecate the `framework.asset_mapper.provider` config option

6.3
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ class UnusedTagsPass implements CompilerPassInterface
'annotations.cached_reader',
'assets.package',
'asset_mapper.compiler',
'asset_mapper.importmap.resolver',
'auto_alias',
'cache.pool',
'cache.pool.clearer',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
use Symfony\Bundle\FullStack;
use Symfony\Component\Asset\Package;
use Symfony\Component\AssetMapper\AssetMapper;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\C 67E6 omponent\Cache\Adapter\DoctrineAdapter;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
Expand Down Expand Up @@ -940,8 +939,7 @@ private function addAssetMapperSection(ArrayNodeDefinition $rootNode, callable $
->defaultValue('%kernel.project_dir%/assets/vendor')
->end()
->scalarNode('provider')
->info('The provider (CDN) to use'.(class_exists(ImportMapManager::class) ? sprintf(' (e.g.: "%s").', implode('", "', ImportMapManager::PROVIDERS)) : '.'))
->defaultValue('jsdelivr.esm')
->setDeprecated('symfony/framework-bundle', '6.4', 'Option "%node%" at "%path%" is deprecated and does nothing. Remove it.')
->end()
->end()
->end()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
use Symfony\Component\AssetMapper\AssetMapper;
use Symfony\Component\AssetMapper\Compiler\AssetCompilerInterface;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\Resolver\PackageResolverInterface;
use Symfony\Component\BrowserKit\AbstractBrowser;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
Expand Down Expand Up @@ -1364,28 +1363,24 @@ private function registerAssetMapperConfiguration(array $config, ContainerBuilde
->setArgument(1, $config['missing_import_mode']);

$container
->getDefinition('asset_mapper.importmap.manager')
->replaceArgument(3, $config['vendor_dir'])
->getDefinition('asset_mapper.importmap.remote_package_downloader')
->replaceArgument(2, $config['vendor_dir'])
;

$container
->getDefinition('asset_mapper.importmap.config_reader')
->replaceArgument(0, $config['importmap_path'])
->getDefinition('asset_mapper.mapped_asset_factory')
->replaceArgument(2, $config['vendor_dir'])
;

$container
->getDefinition('asset_mapper.importmap.resolver')
->replaceArgument(0, $config['provider'])
->getDefinition('asset_mapper.importmap.config_reader')
->replaceArgument(0, $config['importmap_path'])
;

$container
->getDefinition('asset_mapper.importmap.renderer')
->replaceArgument(3, $config['importmap_polyfill'] ?? ImportMapManager::POLYFILL_URL)
->replaceArgument(4, $config['importmap_script_attributes'])
;

$container->registerForAutoconfiguration(PackageResolverInterface::class)
->addTag('asset_mapper.importmap.resolver');
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@
use Symfony\Component\AssetMapper\ImportMap\ImportMapConfigReader;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\ImportMapRenderer;
use Symfony\Component\AssetMapper\ImportMap\RemotePackageDownloader;
use Symfony\Component\AssetMapper\ImportMap\Resolver\JsDelivrEsmResolver;
use Symfony\Component\AssetMapper\ImportMap\Resolver\JspmResolver;
use Symfony\Component\AssetMapper\ImportMap\Resolver\PackageResolver;
use Symfony\Component\AssetMapper\MapperAwareAssetPackage;
use Symfony\Component\AssetMapper\Path\PublicAssetsPathResolver;
use Symfony\Component\HttpKernel\Event\RequestEvent;
Expand All @@ -53,6 +52,7 @@
->args([
service('asset_mapper.public_assets_path_resolver'),
service('asset_mapper_compiler'),
abstract_arg('vendor directory'),
])

->set('asset_mapper.cached_mapped_asset_factory', CachedMappedAssetFactory::class)
Expand Down Expand Up @@ -150,41 +150,20 @@
service('asset_mapper'),
service('asset_mapper.public_assets_path_resolver'),
service('asset_mapper.importmap.config_reader'),
abstract_arg('vendor directory'),
service('asset_mapper.importmap.remote_package_downloader'),
service('asset_mapper.importmap.resolver'),
service('http_client'),
])
->alias(ImportMapManager::class, 'asset_mapper.importmap.manager')

->set('asset_mapper.importmap.resolver', PackageResolver::class)
->set('asset_mapper.importmap.remote_package_downloader', RemotePackageDownloader::class)
->args([
abstract_arg('provider'),
tagged_locator('asset_mapper.importmap.resolver'),
service('asset_mapper.importmap.config_reader'),
service('asset_mapper.importmap.resolver'),
abstract_arg('vendor directory'),
])

->set('asset_mapper.importmap.resolver.jsdelivr_esm', JsDelivrEsmResolver::class)
->set('asset_mapper.importmap.resolver', JsDelivrEsmResolver::class)
->args([service('http_client')])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_JSDELIVR_ESM])

->set('asset_mapper.importmap.resolver.jspm', JspmResolver::class)
->args([service('http_client'), ImportMapManager::PROVIDER_JSPM])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_JSPM])

->set('asset_mapper.importmap.resolver.jspm_system', JspmResolver::class)
->args([service('http_client'), ImportMapManager::PROVIDER_JSPM_SYSTEM])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_JSPM_SYSTEM])

->set('asset_mapper.importmap.resolver.skypack', JspmResolver::class)
->args([service('http_client'), ImportMapManager::PROVIDER_SKYPACK])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_SKYPACK])

->set('asset_mapper.importmap.resolver.jsdelivr', JspmResolver::class)
->args([service('http_client'), ImportMapManager::PROVIDER_JSDELIVR])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_JSDELIVR])

->set('asset_mapper.importmap.resolver.unpkg', JspmResolver::class)
->args([service('http_client'), ImportMapManager::PROVIDER_UNPKG])
->tag('asset_mapper.importmap.resolver', ['resolver' => ImportMapManager::PROVIDER_UNPKG])

->set('asset_mapper.importmap.renderer', ImportMapRenderer::class)
->args([
Expand All @@ -198,14 +177,12 @@
->set('asset_mapper.importmap.auditor', ImportMapAuditor::class)
->args([
service('asset_mapper.importmap.config_reader'),
service('asset_mapper.importmap.resolver'),
service('http_client'),
])

->set('asset_mapper.importmap.command.require', ImportMapRequireCommand::class)
->args([
service('asset_mapper.importmap.manager'),
service('asset_mapper'),
param('kernel.project_dir'),
])
->tag('console.command')
Expand All @@ -219,7 +196,10 @@
->tag('console.command')

->set('asset_mapper.importmap.command.install', ImportMapInstallCommand::class)
->args([service('asset_mapper.importmap.manager')])
->args([
service('asset_mapper.importmap.remote_package_downloader'),
param('kernel.project_dir'),
])
->tag('console.command')

->set('asset_mapper.importmap.command.audit', ImportMapAuditCommand::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ public function testAssetMapperCanBeEnabled()
'importmap_path' => '%kernel.project_dir%/importmap.php',
'importmap_polyfill' => null,
'vendor_dir' => '%kernel.project_dir%/assets/vendor',
'provider' => 'jsdelivr.esm',
'importmap_script_attributes' => [],
];

Expand Down Expand Up @@ -671,7 +670,6 @@ protected static function getBundleDefaultConfig()
'importmap_path' => '%kernel.project_dir%/importmap.php',
'importmap_polyfill' => null,
'vendor_dir' => '%kernel.project_dir%/assets/vendor',
'provider' => 'jsdelivr.esm',
'importmap_script_attributes' => [],
],
'cache' => [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
importmap-path="%kernel.project_dir%/importmap.php"
importmap-polyfill="https://cdn.example.com/polyfill.js"
vendor-dir="%kernel.project_dir%/assets/vendor"
provider="jspm"
>
<framework:path>assets/</framework:path>
<framework:path namespace="my_namespace">assets2/</framework:path>
Expand Down
6 changes: 6 additions & 0 deletions src/Symfony/Component/AssetMapper/AssetMapperRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ public function all(): array
foreach ($this->getDirectories() as $path => $namespace) {
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
foreach ($iterator as $file) {
/** @var \SplFileInfo $file */
if (!$file->isFile()) {
continue;
}
Expand All @@ -111,6 +112,11 @@ public function all(): array
continue;
}

// avoid potentially exposing PHP files
if ('php' === $file->getExtension()) {
continue;
}

/** @var RecursiveDirectoryIterator $innerIterator */
$innerIterator = $iterator->getInnerIterator();
$logicalPath = ($namespace ? rtrim($namespace, '/').'/' : '').$innerIterator->getSubPathName();
Expand Down
1 change: 1 addition & 0 deletions src/Symfony/Component/AssetMapper/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ CHANGELOG
* Mark the component as non experimental
* Add CSS support to the importmap
* Add "entrypoints" concept to the importmap
* Always download packages locally instead of using a CDN
* Allow relative path strings in the importmap
* Add `PreAssetsCompileEvent` event when running `asset-map:compile`
* Add support for importmap paths to use the Asset component (for subdirectories)
Expand Down
39 changes: 35 additions & 4 deletions src/Symfony/Component/AssetMapper/Command/ImportMapInstallCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\RemotePackageDownloader;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Contracts\HttpClient\ResponseInterface;

/**
* Downloads all assets that should be downloaded.
Expand All @@ -27,7 +29,8 @@
final class ImportMapInstallCommand extends Command
{
public function __construct(
private readonly ImportMapManager $importMapManager,
private readonly RemotePackageDownloader $packageDownloader,
private readonly string $projectDir,
) {
parent::__construct();
}
Expand All @@ -36,8 +39,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);

$downloadedPackages = $this->importMapManager->downloadMissingPackages();
$io->success(sprintf('Downloaded %d assets.', \count($downloadedPackages)));
$finishedCount = 0;
$progressBar = new ProgressBar($output);
$progressBar->setFormat('<info>%current%/%max%</info> %bar% %url%');
$downloadedPackages = $this->packageDownloader->downloadPackages(function (string $package, string $event, ResponseInterface $response, int $totalPackages) use (&$finishedCount, $progressBar) {
$progressBar->setMessage($response->getInfo('url'), 'url');
if (0 === $progressBar->getMaxSteps()) {
$progressBar->setMaxSteps($totalPackages);
$progressBar->start();
}

if ('finished' === $event) {
++$finishedCount;
$progressBar->advance();
}
});
$progressBar->finish();
$progressBar->clear();

if (!$downloadedPackages) {
$io->success('No assets to install.');

return Command::SUCCESS;
}

$io->success(sprintf(
'Downloaded %d asset%s into %s.',
\count($downloadedPackages),
1 === \count($downloadedPackages) ? '' : 's',
str_replace($this->projectDir.'/', '', $this->packageDownloader->getVendorDir()),
));

return Command::SUCCESS;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\ImportMap\ImportMapEntry;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\PackageRequireOptions;
Expand All @@ -32,7 +30,6 @@ final class ImportMapRequireCommand extends Command
{
public function __construct(
private readonly ImportMapManager $importMapManager,
private readonly AssetMapperInterface $assetMapper,
private readonly string $projectDir,
) {
parent::__construct();
Expand All @@ -42,7 +39,7 @@ protected function configure(): void
{
$this
->addArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'The packages to add')
->addOption('download', 'd', InputOption::VALUE_NONE, 'Download packages locally')
->addOption('entrypoint', null, InputOption::VALUE_NONE, 'Make the package(s) an entrypoint?')
->addOption('path', null, InputOption::VALUE_REQUIRED, 'The local path where the package lives relative to the project root')
->setHelp(<<<'EOT'
The <info>%command.name%</info> command adds packages to <comment>importmap.php</comment> usually
Expand Down Expand Up @@ -113,10 +110,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$packages[] = new PackageRequireOptions(
$parts['package'],
$parts['version'] ?? null,
$input->getOption('download'),
$parts['alias'] ?? $parts['package'],
isset($parts['registry']) && $parts['registry'] ? $parts['registry'] : null,
$path,
$input->getOption('entrypoint'),
);
}

Expand All @@ -125,19 +121,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$newPackage = $newPackages[0];
$message = sprintf('Package "%s" added to importmap.php', $newPackage->importName);

if ($newPackage->isDownloaded && null !== $downloadedAsset = $this->assetMapper->getAsset($newPackage->path)) {
$application = $this->getApplication();
if ($application instanceof Application) {
$projectDir = $application->getKernel()->getProjectDir();
$downloadedPath = $downloadedAsset->sourcePath;
if (str_starts_with($downloadedPath, $projectDir)) {
$downloadedPath = substr($downloadedPath, \strlen($projectDir) + 1);
}

$message .= sprintf(' and downloaded locally to "%s"', $downloadedPath);
}
}

$message .= '.';
} else {
$names = array_map(fn (ImportMapEntry $package) => $package->importName, $newPackages);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ private function findAssetForBareImport(string $importedModule, AssetMapperInter
}

// remote entries have no MappedAsset
if ($importMapEntry->isRemote()) {
if ($importMapEntry->isRemotePackage()) {
return null;
}

Expand All @@ -158,7 +158,10 @@ private function findAssetForRelativeImport(string $importedModule, MappedAsset
try {
$resolvedPath = $this->resolvePath(\dirname($asset->logicalPath), $importedModule);
} catch (RuntimeException $e) {
$this->handleMissingImport(sprintf('Error processing import in "%s": ', $asset->sourcePath).$e->getMessage(), $e);
// avoid warning about vendor imports - these are often comments
if (!$asset->isVendor) {
$this->handleMissingImport(sprintf('Error processing import in "%s": ', $asset->sourcePath).$e->getMessage(), $e);
}

return null;
}
Expand All @@ -179,7 +182,10 @@ private function findAssetForRelativeImport(string $importedModule, MappedAsset
// avoid circular error if there is self-referencing import comments
}

$this->handleMissingImport($message);
// avoid warning about vendor imports - these are often comments
if (!$asset->isVendor) {
$this->handleMissingImport($message);
}

return null;
}
Expand Down
Loading
0