public function AssetResolver::getJsAssets in Drupal 10
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Asset/AssetResolver.php \Drupal\Core\Asset\AssetResolver::getJsAssets()
- 9 core/lib/Drupal/Core/Asset/AssetResolver.php \Drupal\Core\Asset\AssetResolver::getJsAssets()
File
- core/lib/Drupal/Core/Asset/AssetResolver.php, line 197
Class
- AssetResolver
- The default asset resolver.
Namespace
Drupal\Core\Asset
Code
public function getJsAssets(AttachedAssetsInterface $assets, $optimize) {
$theme_info = $this->themeManager
->getActiveTheme();
$libraries_to_load = $this
->getLibrariesToLoad($assets);
$cid = 'js:' . $theme_info
->getName() . ':' . $this->languageManager
->getCurrentLanguage()
->getId() . ':' . Crypt::hashBase64(serialize($libraries_to_load)) . (int) (count($assets
->getSettings()) > 0) . (int) $optimize;
if ($cached = $this->cache
->get($cid)) {
[
$js_assets_header,
$js_assets_footer,
$settings,
$settings_in_header,
] = $cached->data;
}
else {
$javascript = [];
$default_options = [
'type' => 'file',
'group' => JS_DEFAULT,
'weight' => 0,
'cache' => TRUE,
'preprocess' => TRUE,
'attributes' => [],
'version' => NULL,
];
$header_js_libraries = [];
foreach ($libraries_to_load as $library) {
[
$extension,
$name,
] = explode('/', $library, 2);
$definition = $this->libraryDiscovery
->getLibraryByName($extension, $name);
if (isset($definition['js']) && !empty($definition['header'])) {
$header_js_libraries[] = $library;
}
}
$header_js_libraries = $this->libraryDependencyResolver
->getLibrariesWithDependencies($header_js_libraries);
foreach ($libraries_to_load as $library) {
[
$extension,
$name,
] = explode('/', $library, 2);
$definition = $this->libraryDiscovery
->getLibraryByName($extension, $name);
if (isset($definition['js'])) {
foreach ($definition['js'] as $options) {
$options += $default_options;
$options['scope'] = in_array($library, $header_js_libraries) ? 'header' : 'footer';
$options['preprocess'] = $options['cache'] && empty($options['attributes']) ? $options['preprocess'] : FALSE;
$options['weight'] += count($javascript) / 1000;
$javascript[$options['data']] = $options;
}
}
}
$this->moduleHandler
->alter('js', $javascript, $assets);
$this->themeManager
->alter('js', $javascript, $assets);
uasort($javascript, [
static::class,
'sort',
]);
$js_assets_header = [];
$js_assets_footer = [];
foreach ($javascript as $key => $item) {
if ($item['scope'] == 'header') {
$js_assets_header[$key] = $item;
}
elseif ($item['scope'] == 'footer') {
$js_assets_footer[$key] = $item;
}
}
if ($optimize) {
$collection_optimizer = \Drupal::service('asset.js.collection_optimizer');
$js_assets_header = $collection_optimizer
->optimize($js_assets_header);
$js_assets_footer = $collection_optimizer
->optimize($js_assets_footer);
}
$libraries_to_load = $this
->getLibrariesToLoad($assets);
$settings_required = in_array('core/drupalSettings', $libraries_to_load) || in_array('core/drupalSettings', $this->libraryDependencyResolver
->getLibrariesWithDependencies($assets
->getAlreadyLoadedLibraries()));
$settings_have_changed = count($libraries_to_load) > 0 || count($assets
->getSettings()) > 0;
$settings = FALSE;
if ($settings_required && $settings_have_changed) {
$settings = $this
->getJsSettingsAssets($assets);
$this->moduleHandler
->invokeAllWith('js_settings_build', function (callable $hook, string $module) use (&$settings, $assets) {
$hook($settings, $assets);
});
}
$settings_in_header = in_array('core/drupalSettings', $header_js_libraries);
$this->cache
->set($cid, [
$js_assets_header,
$js_assets_footer,
$settings,
$settings_in_header,
], CacheBackendInterface::CACHE_PERMANENT, [
'library_info',
]);
}
if ($settings !== FALSE) {
$settings = NestedArray::mergeDeepArray([
$settings,
$assets
->getSettings(),
], TRUE);
$this->moduleHandler
->alter('js_settings', $settings, $assets);
$this->themeManager
->alter('js_settings', $settings, $assets);
$assets
->setSettings($settings);
$settings_as_inline_javascript = [
'type' => 'setting',
'group' => JS_SETTING,
'weight' => 0,
'data' => $settings,
];
$settings_js_asset = [
'drupalSettings' => $settings_as_inline_javascript,
];
if ($settings_in_header) {
$js_assets_header = $settings_js_asset + $js_assets_header;
}
else {
$js_assets_footer = $settings_js_asset + $js_assets_footer;
}
}
return [
$js_assets_header,
$js_assets_footer,
];
}