PluginProbe
Code Snippets / 4.0.0-beta.2
Code Snippets v4.0.0-beta.2
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / vendor / composer / installers / src / Composer / Installers / BaseInstaller.php

BaseInstaller.php in Code Snippets 4.0.0-beta.2, 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