Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7ad072e

Browse files
committed
better assets management
1 parent 1aad46c commit 7ad072e

File tree

9 files changed

+74
-54
lines changed

9 files changed

+74
-54
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,25 +2386,17 @@ private function addImportMapsSection(ArrayNodeDefinition $rootNode, callable $e
23862386
->info('The path of the importmap.php file.')
23872387
->defaultValue('%kernel.project_dir%/importmap.php')
23882388
->end()
2389-
->scalarNode('vendor_dir')
2390-
->info('The directory where to store JavaScript vendors.')
2391-
->defaultValue('%kernel.project_dir%/public/vendor/')
2392-
->end()
2393-
->scalarNode('vendor_url')
2394-
->info('The base URL to access JavaScript vendors.')
2395-
->defaultValue('/vendor/')
2396-
->end()
2397-
->scalarNode('javascript_dir')
2389+
->scalarNode('assets_dir')
23982390
->info('The directory where to store local JavaScript modules.')
2399-
->defaultValue('%kernel.project_dir%/javascript/')
2391+
->defaultValue('%kernel.project_dir%/assets/')
24002392
->end()
2401-
->scalarNode('public_javascript_dir')
2393+
->scalarNode('public_assets_dir')
24022394
->info('The directory where to store the publicly exposed local JavaScript modules.')
2403-
->defaultValue('%kernel.project_dir%/public/javascript/')
2395+
->defaultValue('%kernel.project_dir%/public/assets/')
24042396
->end()
2405-
->scalarNode('javascript_url')
2397+
->scalarNode('assets_url')
24062398
->info('The base URL to access JavaScript modules.')
2407-
->defaultValue('/javascript/')
2399+
->defaultValue('/assets/')
24082400
->end()
24092401
->enumNode('provider')
24102402
->info('The provider (CDN) to use.')

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,18 +2983,16 @@ private function registerImportMapsConfiguration(array $config, ContainerBuilder
29832983

29842984
$container
29852985
->getDefinition(ImportmapController::class)
2986-
->replaceArgument(0, $config['javascript_dir']);
2986+
->replaceArgument(0, $config['assets_dir']);
29872987

29882988
$container
29892989
->getDefinition(ImportMapManager::class)
29902990
->replaceArgument(0, $config['path'])
2991-
->replaceArgument(1, $config['vendor_dir'])
2992-
->replaceArgument(2, $config['vendor_url'])
2993-
->replaceArgument(3, $config['javascript_dir'])
2994-
->replaceArgument(4, $config['public_javascript_dir'])
2995-
->replaceArgument(5, $config['javascript_url'])
2996-
->replaceArgument(6, Provider::from($config['provider']))
2997-
->replaceArgument(8, $config['api'])
2991+
->replaceArgument(1, $config['assets_dir'])
2992+
->replaceArgument(2, $config['public_assets_dir'])
2993+
->replaceArgument(3, $config['assets_url'])
2994+
->replaceArgument(4, Provider::from($config['provider']))
2995+
->replaceArgument(6, $config['api'])
29982996
;
29992997
}
30002998

src/Symfony/Bundle/FrameworkBundle/Resources/config/import_maps.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@
2828
->set(ImportMapManager::class)
2929
->args([
3030
abstract_arg('importmap.php path'),
31-
abstract_arg('vendor directory'),
32-
abstract_arg('vendor URL'),
33-
abstract_arg('javascript directory'),
34-
abstract_arg('public javascript directory'),
35-
abstract_arg('javascript URL'),
31+
abstract_arg('assets directory'),
32+
abstract_arg('public assets directory'),
33+
abstract_arg('assets URL'),
3634
abstract_arg('provider'),
3735
service('http_client')->nullOnInvalid(),
3836
abstract_arg('JSPM API URL'),

src/Symfony/Component/ImportMaps/ImportMapManager.php

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,9 @@ final class ImportMapManager
3838

3939
public function __construct(
4040
private readonly string $path = 'importmap.php',
41-
private readonly string $vendorDir = 'public/vendor/',
42-
private readonly string $vendorUrl = '/vendor/',
43-
private readonly string $javascriptDir = 'javascript/',
44-
private readonly string $publicJavascriptDir = 'public/javascript/',
45-
private readonly string $javascriptUrl = '/javascript/',
41+
private readonly string $assetsDir = 'assets/',
42+
private readonly string $publicAssetsDir = 'public/assets/',
43+
private readonly string $assetsUrl = '/assets/',
4644
private readonly Provider $provider = Provider::Jspm,
4745
private ?HttpClientInterface $httpClient = null,
4846
private readonly string $api = 'https://api.jspm.io',
@@ -66,15 +64,21 @@ public function getImportMap(): string
6664
$this->loadImportMap();
6765

6866
$importmap = ['imports' => []];
69-
foreach ($this->importMap as $package => $data) {
67+
foreach ($this->importMap as $packageName => $data) {
7068
if (isset($data['url'])) {
71-
$importmap['imports'][$package] = isset($data['digest']) ? $this->vendorUrl.$data['digest'] : $data['url'];
69+
if ($data['download'] ?? false) {
70+
$importmap['imports'][$packageName] = $this->vendorUrl($packageName);
71+
72+
continue;
73+
}
74+
75+
$importmap['imports'][$packageName] = $data['url'];
7276

7377
continue;
7478
}
7579

7680
if (isset($data['path'])) {
77-
$importmap['imports'][$package] = $this->javascriptUrl.$this->digestName($package, $data['path']);
81+
$importmap['imports'][$packageName] = $this->assetsUrl.$this->digestName($packageName, $data['path']);
7882
}
7983
}
8084

@@ -131,8 +135,8 @@ private function createImportMap(Env $env, ?Provider $provider, bool $update, ar
131135
$packages = [];
132136
foreach ($this->importMap ?? [] as $name => $data) {
133137
if (isset($data['path'])) {
134-
$this->filesystem->mkdir($this->publicJavascriptDir);
135-
$this->filesystem->copy($this->javascriptDir.$data['path'], $this->publicJavascriptDir.$this->digestName($name, $data['path']));
138+
$this->filesystem->mkdir($this->publicAssetsDir);
139+
$this->filesystem->copy($this->assetsDir.$data['path'], $this->publicAssetsDir.$this->digestName($name, $data['path']));
136140

137141
continue;
138142
}
@@ -141,7 +145,7 @@ private function createImportMap(Env $env, ?Provider $provider, bool $update, ar
141145
continue;
142146
}
143147

144-
$packages[$name] = new PackageOptions((bool) ($data['digest'] ?? false), $data['preload'] ?? false);
148+
$packages[$name] = new PackageOptions((bool) ($data['download'] ?? false), $data['preload'] ?? false);
145149

146150
if (preg_match(self::PACKAGE_PATTERN, $data['url'], $matches)) {
147151
$constraint = ($matches['registry'] ?? null) ? "{$matches['registry']}:{$matches['package']}" : $matches['package'];
@@ -178,7 +182,7 @@ private function removeFromImportMap(array $remove): void {
178182
continue;
179183
}
180184

181-
$this->removeIfExists($this->vendorDir.$this->importMap[$packageName]['digest']);
185+
$this->removeIfExists($this->assetsDir.$this->importMap[$packageName]['digest']);
182186
unset($this->importMap[$packageName]);
183187
}
184188
}
@@ -192,41 +196,59 @@ private function jspmGenerate(Env $env, ?Provider $provider, array $install, arr
192196
$json = [
193197
'install' => array_values($install),
194198
'flattenScope' => true,
195-
'provider' => $provider?->value ?? $this->provider->value,
196199
];
200+
$provider = $provider?->value ?? $this->provider->value;
201+
if ($provider !== Provider::Jspm) {
202+
$json['env'] = $provider;
203+
}
197204

198205
$json['env'] = ['browser', 'module', $env->value];
199206

200207
$response = $this->apiHttpClient->request('POST', '/generate', [
201208
'json' => $json,
202209
]);
203210

204-
$this->filesystem->mkdir($this->vendorDir);
205-
foreach ($response->toArray()['map']['imports'] as $packageName => $url) {
206-
$previousPackageData = $this->importMap[$packageName] ?? null;
207-
$this->importMap[$packageName] = ['url' => $url];
211+
if ($response->getStatusCode() !== 200) {
212+
$data = $response->toArray((false));
208213

214+
if ($data['error']) {
215+
throw new \RuntimeException($data['error']);
216+
}
217+
218+
$response->getHeaders();
219+
}
220+
221+
$this->filesystem->mkdir($this->assetsDir.'vendor/');
222+
foreach ($response->toArray()['map']['imports'] as $packageName => $url) {
209223
if ($packages[$packageName]->preload) {
210224
$this->importMap[$packageName]['preload'] = true;
225+
} else {
226+
unset($this->importMap[$packageName]['preload']);
211227
}
212228

229+
$relativePath = 'vendor/'.$packageName.'.js';
213230
if (!$packages[$packageName]->download) {
214-
continue;
215-
}
231+
if ($this->importMap[$packageName]['download'] ?? false) {
232+
$this->removeIfExists($this->assetsDir.$relativePath);
233+
// todo: remove parent dir if empty
234+
}
235+
unset($this->importMap[$packageName]['download']);
216236

217-
$this->importMap[$packageName]['digest'] = sprintf('%s.%s.js', $packageName, hash('xxh128', $url));
218-
if ($this->importMap[$packageName]['digest'] === ($previousPackageData['digest'] ?? null)) {
219237
continue;
220238
}
221239

222-
if (isset($previousPackageData['digest'])) {
223-
$this->removeIfExists($this->vendorDir.$previousPackageData['digest']);
240+
$this->importMap[$packageName]['download'] = true;
241+
if ($previousPackageData['url'] ?? null === $url) {
242+
continue;
224243
}
225244

245+
$this->importMap[$packageName]['url'] = $url;
226246
$this->filesystem->dumpFile(
227-
$this->vendorDir.$this->importMap[$packageName]['digest'],
247+
$this->assetsDir.$relativePath,
228248
$this->httpClient->request('GET', $url)->getContent(),
229249
);
250+
$this->filesystem->mkdir($this->publicAssetsDir);
251+
$this->filesystem->copy($this->assetsDir.$relativePath, $this->publicAssetsDir.'vendor/'.$this->digestName($packageName, $relativePath).'.js');
230252
}
231253
}
232254

@@ -237,8 +259,18 @@ private function removeIfExists(string $path): void
237259
}
238260
}
239261

240-
private function digestName(string $package, string $path): string
262+
private function digestName(string $packageName, string $path): string
263+
{
264+
return sprintf('%s.%s.js', $packageName, hash('xxh128', file_get_contents($this->assetsDir.$path)));
265+
}
266+
267+
private function vendorPath(string $packageName): string
268+
{
269+
return $this->assetsUrl.'vendor/'.$packageName.'.js';
270+
}
271+
272+
private function vendorUrl(string $packageName): string
241273
{
242-
return sprintf('%s.%s.js', $package, hash('xxh128', file_get_contents($this->javascriptDir.$path)));
274+
return $this->publicAssetsDir.'vendor/'.$this->digestName($packageName, $this->vendorPath($packageName));
243275
}
244276
}

src/Symfony/Component/ImportMaps/Tests/App/importmap.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
'path' => 'controllers/hello_controller.js',
99
],
1010
'@hotwired/stimulus' => [
11+
'download' => true,
1112
'url' => 'https://ga.jspm.io/npm:@hotwired/[email protected]/dist/stimulus.js',
12-
'digest' => '@hotwired/stimulus.997ad71d32657837726ccf3fe40b8b53.js',
1313
],
1414
];

0 commit comments

Comments
 (0)