Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Asset;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * Resolves the dependencies of asset (CSS/JavaScript) libraries.
|
Chris@0
|
7 */
|
Chris@0
|
8 class LibraryDependencyResolver implements LibraryDependencyResolverInterface {
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * The library discovery service.
|
Chris@0
|
12 *
|
Chris@0
|
13 * @var \Drupal\Core\Asset\LibraryDiscoveryInterface
|
Chris@0
|
14 */
|
Chris@0
|
15 protected $libraryDiscovery;
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Constructs a new LibraryDependencyResolver instance.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @param \Drupal\Core\Asset\LibraryDiscoveryInterface $library_discovery
|
Chris@0
|
21 * The library discovery service.
|
Chris@0
|
22 */
|
Chris@0
|
23 public function __construct(LibraryDiscoveryInterface $library_discovery) {
|
Chris@0
|
24 $this->libraryDiscovery = $library_discovery;
|
Chris@0
|
25 }
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * {@inheritdoc}
|
Chris@0
|
29 */
|
Chris@0
|
30 public function getLibrariesWithDependencies(array $libraries) {
|
Chris@0
|
31 return $this->doGetDependencies($libraries);
|
Chris@0
|
32 }
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * Gets the given libraries with its dependencies.
|
Chris@0
|
36 *
|
Chris@0
|
37 * Helper method for ::getLibrariesWithDependencies().
|
Chris@0
|
38 *
|
Chris@0
|
39 * @param string[] $libraries_with_unresolved_dependencies
|
Chris@0
|
40 * A list of libraries, with unresolved dependencies, in the order they
|
Chris@0
|
41 * should be loaded.
|
Chris@0
|
42 * @param string[] $final_libraries
|
Chris@0
|
43 * The final list of libraries (the return value) that is being built
|
Chris@0
|
44 * recursively.
|
Chris@0
|
45 *
|
Chris@0
|
46 * @return string[]
|
Chris@0
|
47 * A list of libraries, in the order they should be loaded, including their
|
Chris@0
|
48 * dependencies.
|
Chris@0
|
49 */
|
Chris@0
|
50 protected function doGetDependencies(array $libraries_with_unresolved_dependencies, array $final_libraries = []) {
|
Chris@0
|
51 foreach ($libraries_with_unresolved_dependencies as $library) {
|
Chris@0
|
52 if (!in_array($library, $final_libraries)) {
|
Chris@0
|
53 list($extension, $name) = explode('/', $library, 2);
|
Chris@0
|
54 $definition = $this->libraryDiscovery->getLibraryByName($extension, $name);
|
Chris@0
|
55 if (!empty($definition['dependencies'])) {
|
Chris@0
|
56 $final_libraries = $this->doGetDependencies($definition['dependencies'], $final_libraries);
|
Chris@0
|
57 }
|
Chris@0
|
58 $final_libraries[] = $library;
|
Chris@0
|
59 }
|
Chris@0
|
60 }
|
Chris@0
|
61 return $final_libraries;
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * {@inheritdoc}
|
Chris@0
|
66 */
|
Chris@0
|
67 public function getMinimalRepresentativeSubset(array $libraries) {
|
Chris@17
|
68 assert(count($libraries) === count(array_unique($libraries)), '$libraries can\'t contain duplicate items.');
|
Chris@17
|
69
|
Chris@0
|
70 $minimal = [];
|
Chris@0
|
71
|
Chris@0
|
72 // Determine each library's dependencies.
|
Chris@0
|
73 $with_deps = [];
|
Chris@0
|
74 foreach ($libraries as $library) {
|
Chris@0
|
75 $with_deps[$library] = $this->getLibrariesWithDependencies([$library]);
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 foreach ($libraries as $library) {
|
Chris@0
|
79 $exists = FALSE;
|
Chris@0
|
80 foreach ($with_deps as $other_library => $dependencies) {
|
Chris@0
|
81 if ($library == $other_library) {
|
Chris@0
|
82 continue;
|
Chris@0
|
83 }
|
Chris@0
|
84 if (in_array($library, $dependencies)) {
|
Chris@0
|
85 $exists = TRUE;
|
Chris@0
|
86 break;
|
Chris@0
|
87 }
|
Chris@0
|
88 }
|
Chris@0
|
89 if (!$exists) {
|
Chris@0
|
90 $minimal[] = $library;
|
Chris@0
|
91 }
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 return $minimal;
|
Chris@0
|
95 }
|
Chris@0
|
96
|
Chris@0
|
97 }
|