}|list|null $installedJson */ $installedJson = json_decode($jsonContent, true); if (! is_array($installedJson)) { throw FailedToParseJson::inFile($installedJsonPath); } /** @psalm-var list $installed */ $installed = $installedJson['packages'] ?? $installedJson; $classMapPaths = array_merge( [], ...array_map(fn (array $package): array => $this->prefixPaths( $this->packageToClassMapPaths($package), $this->packagePrefixPath($realInstallationPath, $package, $vendorDir), ), $installed), ); $classMapFiles = array_filter($classMapPaths, 'is_file'); $classMapDirectories = array_values(array_filter($classMapPaths, 'is_dir')); $filePaths = array_merge( [], ...array_map(fn (array $package): array => $this->prefixPaths( $this->packageToFilePaths($package), $this->packagePrefixPath($realInstallationPath, $package, $vendorDir), ), $installed), ); return new AggregateSourceLocator(array_merge( [ new PsrAutoloaderLocator( Psr4Mapping::fromArrayMappings(array_merge_recursive( [], ...array_map(fn (array $package): array => $this->prefixWithPackagePath( $this->packageToPsr4AutoloadNamespaces($package), $realInstallationPath, $package, $vendorDir, ), $installed), )), $astLocator, ), new PsrAutoloaderLocator( Psr0Mapping::fromArrayMappings(array_merge_recursive( [], ...array_map(fn (array $package): array => $this->prefixWithPackagePath( $this->packageToPsr0AutoloadNamespaces($package), $realInstallationPath, $package, $vendorDir, ), $installed), )), $astLocator, ), new DirectoriesSourceLocator($classMapDirectories, $astLocator), ], ...array_map( static function (string $file) use ($astLocator): array { assert($file !== ''); return [new SingleFileSourceLocator($file, $astLocator)]; }, array_merge($classMapFiles, $filePaths), ), )); } /** * @param ComposerPackage $package * * @return array> */ private function packageToPsr4AutoloadNamespaces(array $package): array { return array_map(static fn (string|array $namespacePaths): array => (array) $namespacePaths, $package['autoload']['psr-4'] ?? []); } /** * @param ComposerPackage $package * * @return array> */ private function packageToPsr0AutoloadNamespaces(array $package): array { return array_map(static fn (string|array $namespacePaths): array => (array) $namespacePaths, $package['autoload']['psr-0'] ?? []); } /** * @param ComposerPackage $package * * @return list */ private function packageToClassMapPaths(array $package): array { return $package['autoload']['classmap'] ?? []; } /** * @param ComposerPackage $package * * @return list */ private function packageToFilePaths(array $package): array { return $package['autoload']['files'] ?? []; } /** @param ComposerPackage $package */ private function packagePrefixPath(string $trimmedInstallationPath, array $package, string $vendorDir): string { return $trimmedInstallationPath . '/' . $vendorDir . '/' . $package['name'] . '/'; } /** * @param array> $paths * @param ComposerPackage $package * * @return array> */ private function prefixWithPackagePath(array $paths, string $trimmedInstallationPath, array $package, string $vendorDir): array { $prefix = $this->packagePrefixPath($trimmedInstallationPath, $package, $vendorDir); return array_map(fn (array $paths): array => $this->prefixPaths($paths, $prefix), $paths); } /** * @param array $paths * * @return array */ private function prefixPaths(array $paths, string $prefix): array { return array_map(static fn (string $path): string => $prefix . $path, $paths); } } __halt_compiler();----SIGNATURE:----xsyd0CxtRlQGt9jndz+Nz7qlgcpPKm72TOcuDoNTBZql9MsjzexIWi9jlu42XHvMvpoCS6VtacekunGIBbVHZ1pDkw/D19EnWcyy+n7ZzFR8mB4Nj9tx6jEUUDBSscekBUT7rGNPnbn0yz0xUwOQ8Z+WOPjabh3vkrB+iLexDJfTqZi67wppSH2O2gBYzGL/1npc6/nPKp9hbuSYYqJ+/M0L943gdseOFLA/HwpfSnRRXJhyWiSIhPvEVrFSGSNEO/VzsqZRxmphHQp+QzC/idBLNMxy1yYyCzXyhw6mBCx3GCE7iBxT3P39xxskkC0VBH+lExhSPA/BktnyoOcM9n54zgfns9sd+x5HFz9tGJmDmsdCRgjD+KCqOgXSsO3CzaH6ElpQ7ntiQe0JxAE0DQtkcPbLS1CDVGoZYg1y+2HT4YktE1r/7pY7pNR4Jfq/NaM2L20ApcXNXTlGcYIzOQRtt+pbJ4YBM49gSLEWOawWmsnHky9E+lXwQ2K7yxE4obqm2Ud3nPHJ2W34LAcb7C3/rMXq8/tqwNCqGf+6MJ6NSe7BlgXM9kjEAUOi6bXnPOD8s7Fl8hUj/wcxtmNSGZcIphse9ij0ztntXcVAfuo/DouE3SRZ4LyzLYqMTfw/q6EWHDFRiFGs9hvPD5IgZdod3Kjrr5WoyoOLz4pQl/w=----ATTACHMENT:----MTQ3ODM0Mzk2MDQwNTUyMCA1MzMwODg1MDc4NzI0MjAzIDM4NzUwNTAyMzgzMjM4NDc=