LibraryDiscoveryParser::buildByExtension

public LibraryDiscoveryParser::buildByExtension($extension)

Parses and builds up all the libraries information of an extension.

Parameters

string $extension: The name of the extension that registered a library.

Return value

array All library definitions of the passed extension.

Throws

\Drupal\Core\Asset\Exception\IncompleteLibraryDefinitionException Thrown when a library has no js/css/setting.

\UnexpectedValueException Thrown when a js file defines a positive weight.

File

core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php, line 71

Class

LibraryDiscoveryParser
Parses library files to get extension data.

Namespace

Drupal\Core\Asset

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
public function buildByExtension($extension) {
  $libraries = array();
 
  if ($extension === 'core') {
    $path = 'core';
    $extension_type = 'core';
  }
  else {
    if ($this->moduleHandler->moduleExists($extension)) {
      $extension_type = 'module';
    }
    else {
      $extension_type = 'theme';
    }
    $path = $this->drupalGetPath($extension_type, $extension);
  }
 
  $libraries = $this->parseLibraryInfo($extension, $path);
  $libraries = $this->applyLibrariesOverride($libraries, $extension);
 
  foreach ($libraries as $id => &$library) {
    if (!isset($library['js']) && !isset($library['css']) && !isset($library['drupalSettings'])) {
      throw new IncompleteLibraryDefinitionException(sprintf("Incomplete library definition for definition '%s' in extension '%s'", $id, $extension));
    }
    $library += array('dependencies' => array(), 'js' => array(), 'css' => array());
 
    if (isset($library['header']) && !is_bool($library['header'])) {
      throw new \LogicException(sprintf("The 'header' key in the library definition '%s' in extension '%s' is invalid: it must be a boolean.", $id, $extension));
    }
 
    if (isset($library['version'])) {
      // @todo Retrieve version of a non-core extension.
      if ($library['version'] === 'VERSION') {
        $library['version'] = \Drupal::VERSION;
      }
      // Remove 'v' prefix from external library versions.
      elseif ($library['version'][0] === 'v') {
        $library['version'] = substr($library['version'], 1);
      }
    }
 
    // If this is a 3rd party library, the license info is required.
    if (isset($library['remote']) && !isset($library['license'])) {
      throw new LibraryDefinitionMissingLicenseException(sprintf("Missing license information in library definition for definition '%s' extension '%s': it has a remote, but no license.", $id, $extension));
    }
 
    // Assign Drupal's license to libraries that don't have license info.
    if (!isset($library['license'])) {
      $library['license'] = array(
        'name' => 'GNU-GPL-2.0-or-later',
        'url' => 'https://www.drupal.org/licensing/faq',
        'gpl-compatible' => TRUE,
      );
    }
 
    foreach (array('js', 'css') as $type) {
      // Prepare (flatten) the SMACSS-categorized definitions.
      // @todo After Asset(ic) changes, retain the definitions as-is and
      //   properly resolve dependencies for all (css) libraries per category,
      //   and only once prior to rendering out an HTML page.
      if ($type == 'css' && !empty($library[$type])) {
        foreach ($library[$type] as $category => $files) {
          foreach ($files as $source => $options) {
            if (!isset($options['weight'])) {
              $options['weight'] = 0;
            }
            // Apply the corresponding weight defined by CSS_* constants.
            $options['weight'] += constant('CSS_' . strtoupper($category));
            $library[$type][$source] = $options;
          }
          unset($library[$type][$category]);
        }
      }
      foreach ($library[$type] as $source => $options) {
        unset($library[$type][$source]);
        // Allow to omit the options hashmap in YAML declarations.
        if (!is_array($options)) {
          $options = array();
        }
        if ($type == 'js' && isset($options['weight']) && $options['weight'] > 0) {
          throw new \UnexpectedValueException("The $extension/$id library defines a positive weight for '$source'. Only negative weights are allowed (but should be avoided). Instead of a positive weight, specify accurate dependencies for this library.");
        }
        // Unconditionally apply default groups for the defined asset files.
        // The library system is a dependency management system. Each library
        // properly specifies its dependencies instead of relying on a custom
        // processing order.
        if ($type == 'js') {
          $options['group'] = JS_LIBRARY;
        }
        elseif ($type == 'css') {
          $options['group'] = $extension_type == 'theme' ? CSS_AGGREGATE_THEME : CSS_AGGREGATE_DEFAULT;
        }
        // By default, all library assets are files.
        if (!isset($options['type'])) {
          $options['type'] = 'file';
        }
        if ($options['type'] == 'external') {
          $options['data'] = $source;
        }
        // Determine the file asset URI.
        else {
          if ($source[0] === '/') {
            // An absolute path maps to DRUPAL_ROOT / base_path().
            if ($source[1] !== '/') {
              $options['data'] = substr($source, 1);
            }
            // A protocol-free URI (e.g., //cdn.com/example.js) is external.
            else {
              $options['type'] = 'external';
              $options['data'] = $source;
            }
          }
          // A stream wrapper URI (e.g., public://generated_js/example.js).
          elseif ($this->fileValidUri($source)) {
            $options['data'] = $source;
          }
          // A regular URI (e.g., http://example.com/example.js) without
          // 'external' explicitly specified, which may happen if, e.g.
          // libraries-override is used.
          elseif ($this->isValidUri($source)) {
            $options['type'] = 'external';
            $options['data'] = $source;
          }
          // By default, file paths are relative to the registering extension.
          else {
            $options['data'] = $path . '/' . $source;
          }
        }
 
        if (!isset($library['version'])) {
          // @todo Get the information from the extension.
          $options['version'] = -1;
        }
        else {
          $options['version'] = $library['version'];
        }
 
        // Set the 'minified' flag on JS file assets, default to FALSE.
        if ($type == 'js' && $options['type'] == 'file') {
          $options['minified'] = isset($options['minified']) ? $options['minified'] : FALSE;
        }
 
        $library[$type][] = $options;
      }
    }
  }
 
  return $libraries;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.