PluginProbe
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF / 2.3.1
Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF v2.3.1
2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.9 2.2.8 trunk 1.10 1.3.3 1.3.4 1.3.5 1.3.5.1 1.3.5.2 1.3.6 1.3.6.1 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.5 All 103 releases
imagify / vendor / composer / installers / src / Composer / Installers / BaseInstaller.php

BaseInstaller.php in Imagify Image Optimization: Optimize Images | Compress & Convert to WebP/AVIF 2.3.1, at vendor/composer/installers/src/Composer/Installers/BaseInstaller.php

138 lines 4.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Composer\Installers;
4
5 use Composer\IO\IOInterface;
6 use Composer\Composer;
7 use Composer\Package\PackageInterface;
8
9 abstract class BaseInstaller
10 {
11 /** @var array<string, string> */
12 protected $locations = array();
13 /** @var Composer */
14 protected $composer;
15 /** @var PackageInterface */
16 protected $package;
17 /** @var IOInterface */
18 protected $io;
19
20 /**
21 * Initializes base installer.
22 */
23 public function __construct(PackageInterface $package, Composer $composer, IOInterface $io)
24 {
25 $this->composer = $composer;
26 $this->package = $package;
27 $this->io = $io;
28 }
29
30 /**
31 * Return the install path based on package type.
32 */
33 public function getInstallPath(PackageInterface $package, string $frameworkType = ''): string
34 {
35 $type = $this->package->getType();
36
37 $prettyName = $this->package->getPrettyName();
38 if (strpos($prettyName, '/') !== false) {
39 list($vendor, $name) = explode('/', $prettyName);
40 } else {
41 $vendor = '';
42 $name = $prettyName;
43 }
44
45 $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type'));
46
47 $extra = $package->getExtra();
48 if (!empty($extra['installer-name'])) {
49 $availableVars['name'] = $extra['installer-name'];
50 }
51
52 $extra = $this->composer->getPackage()->getExtra();
53 if (!empty($extra['installer-paths'])) {
54 $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor);
55 if ($customPath !== false) {
56 return $this->templatePath($customPath, $availableVars);
57 }
58 }
59
60 $packageType = substr($type, strlen($frameworkType) + 1);
61 $locations = $this->getLocations($frameworkType);
62 if (!isset($locations[$packageType])) {
63 throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type));
64 }
65
66 return $this->templatePath($locations[$packageType], $availableVars);
67 }
68
69 /**
70 * For an installer to override to modify the vars per installer.
71 *
72 * @param array<string, string> $vars This will normally receive array{name: string, vendor: string, type: string}
73 * @return array<string, string>
74 */
75 public function inflectPackageVars(array $vars): array
76 {
77 return $vars;
78 }
79
80 /**
81 * Gets the installer's locations
82 *
83 * @return array<string, string> map of package types => install path
84 */
85 public function getLocations(string $frameworkType)
86 {
87 return $this->locations;
88 }
89
90 /**
91 * Replace vars in a path
92 *
93 * @param array<string, string> $vars
94 */
95 protected function templatePath(string $path, array $vars = array()): string
96 {
97 if (strpos($path, '{') !== false) {
98 extract($vars);
99 preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches);
100 if (!empty($matches[1])) {
101 foreach ($matches[1] as $var) {
102 $path = str_replace('{$' . $var . '}', $$var, $path);
103 }
104 }
105 }
106
107 return $path;
108 }
109
110 /**
111 * Search through a passed paths array for a custom install path.
112 *
113 * @param array<string, string[]|string> $paths
114 * @return string|false
115 */
116 protected function mapCustomInstallPaths(array $paths, string $name, string $type, ?string $vendor = null)
117 {
118 foreach ($paths as $path => $names) {
119 $names = (array) $names;
120 if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) {
121 return $path;
122 }
123 }
124
125 return false;
126 }
127
128 protected function pregReplace(string $pattern, string $replacement, string $subject): string
129 {
130 $result = preg_replace($pattern, $replacement, $subject);
131 if (null === $result) {
132 throw new \RuntimeException('Failed to run preg_replace with '.$pattern.': '.preg_last_error());
133 }
134
135 return $result;
136 }
137 }
138