2121use function count ;
2222use function dirname ;
2323use function glob ;
24+ use function is_array ;
2425use function is_dir ;
2526use function is_file ;
27+ use function is_string ;
2628use function str_contains ;
2729use const GLOB_ONLYDIR ;
2830
@@ -175,7 +177,19 @@ public function create(string $projectInstallationPath): ?SourceLocator
175177 */
176178 private function packageToPsr4AutoloadNamespaces (array $ package , string $ autoloadSection = 'autoload ' ): array
177179 {
178- return array_map (static fn ($ namespacePaths ): array => (array ) $ namespacePaths , $ package [$ autoloadSection ]['psr-4 ' ] ?? []);
180+ $ psr4 = $ package [$ autoloadSection ]['psr-4 ' ] ?? [];
181+ if (!is_array ($ psr4 )) {
182+ return []; // skip on invalid data
183+ }
184+ foreach ($ psr4 as $ key => $ namespacePaths ) {
185+ $ stringArray = $ this ->toStringArray ($ namespacePaths );
186+ if (!is_string ($ key ) || $ stringArray === null ) {
187+ return []; // skip on invalid data
188+ }
189+
190+ $ psr4 [$ key ] = $ stringArray ;
191+ }
192+ return $ psr4 ;
179193 }
180194
181195 /**
@@ -185,7 +199,19 @@ private function packageToPsr4AutoloadNamespaces(array $package, string $autoloa
185199 */
186200 private function packageToPsr0AutoloadNamespaces (array $ package , string $ autoloadSection = 'autoload ' ): array
187201 {
188- return array_map (static fn ($ namespacePaths ): array => (array ) $ namespacePaths , $ package [$ autoloadSection ]['psr-0 ' ] ?? []);
202+ $ psr0 = $ package [$ autoloadSection ]['psr-0 ' ] ?? [];
203+ if (!is_array ($ psr0 )) {
204+ return []; // skip on invalid data
205+ }
206+ foreach ($ psr0 as $ key => $ namespacePaths ) {
207+ $ stringArray = $ this ->toStringArray ($ namespacePaths );
208+ if (!is_string ($ key ) || $ stringArray === null ) {
209+ return []; // skip on invalid data
210+ }
211+
212+ $ psr0 [$ key ] = $ stringArray ;
213+ }
214+ return $ psr0 ;
189215 }
190216
191217 /**
@@ -195,7 +221,7 @@ private function packageToPsr0AutoloadNamespaces(array $package, string $autoloa
195221 */
196222 private function packageToClassMapPaths (array $ package , string $ autoloadSection = 'autoload ' ): array
197223 {
198- return $ package [$ autoloadSection ]['classmap ' ] ?? [];
224+ return $ this -> toStringArray ( $ package [$ autoloadSection ]['classmap ' ] ?? []) ?? [];
199225 }
200226
201227 /**
@@ -205,7 +231,7 @@ private function packageToClassMapPaths(array $package, string $autoloadSection
205231 */
206232 private function packageToFilePaths (array $ package , string $ autoloadSection = 'autoload ' ): array
207233 {
208- return $ package [$ autoloadSection ]['files ' ] ?? [];
234+ return $ this -> toStringArray ( $ package [$ autoloadSection ]['files ' ] ?? []) ?? [];
209235 }
210236
211237 /**
@@ -257,4 +283,22 @@ private function prefixPaths(array $paths, string $prefix): array
257283 return array_map (static fn (string $ path ): string => $ prefix . $ path , $ paths );
258284 }
259285
286+ /**
287+ * @param array<mixed>|string $stringOrArray
288+ * @return array<string>|null
289+ */
290+ private function toStringArray (array |string $ stringOrArray ): ?array
291+ {
292+ if (is_string ($ stringOrArray )) {
293+ return (array ) $ stringOrArray ;
294+ }
295+
296+ foreach ($ stringOrArray as $ stringOrArrayItem ) {
297+ if (!is_string ($ stringOrArrayItem )) {
298+ return null ;
299+ }
300+ }
301+ return $ stringOrArray ;
302+ }
303+
260304}
0 commit comments