}|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:----HWwk6HyJLNic15SWz2Enhr0K0c71NhDFeE/q330C3wH3UhDG6xk5FkCDATCOVYSPX3THu0PGF0Vwx3qULnX4M0ippxmkpxyixf0daGcwr+ZjGJqu7z3qgWkxdb79LJ/9/uwY9buZh0YDBSt92h24/ce5mdTKIWWvHdHRD5RBuu738jmhwCT/5/yokXxDYZKkcJCqXcpKA3qQB8esLFt4W0MqfFr+bV6qZUOL0yhrOObKbqZuDpXRsldiIiv6BZ/qT7xe7QuAnGHFUR5ZUeSNEjxsi6NSnjfeYTHUmoi9pzpGeRR25bxjz8W5kMZpeQptQ+t436UbxYbqn7VyyXgMh08uoojqOuWZ5cvsGEeiLyq20mNdefz65w71EIvqhgVa75LK5QFJNekzQef/708CHAeLYozAW00cULcIfJPKJPmtTfYktTSgXB0CexAtdwL6R+7tgmcCVZVIMbkS7Ze4keb9pStPr8KF1Obb0VJRLxdVJrNQjBP54azQnE/AdIoOiwuRj8dKYjeBZ94BjPCEnM+8PANjNbgco8gUd3OOT/OXe9l9DDquJYYGKvV9JT6+W9qIZ+SBc9m8dmQSA2M7vgTDzgof4tpDGchNPK0arNm4xbwQWqU+DMh/IAjO79jGtE0ES+CyU1J+5zyFV1j/5JPfoct1tLnJDnYPnBftRsg=----ATTACHMENT:----MjczMzU5OTAxODA5MzU5MyA2NzA4ODI2MzQ1Mzk3MTQ0IDg5NjMxMTEyMzAwMzI3OTE=