namespace TypistTech\Imposter;
class ConfigCollectionFactory
public static function forProject(
ProjectConfigInterface $projectConfig,
): ConfigCollectionInterface {
return static::addRequiredPackageConfigsRecursively(
private static function addRequiredPackageConfigsRecursively(
ConfigCollectionInterface $configCollection,
ProjectConfigInterface $projectConfig,
): ConfigCollectionInterface {
$filteredRequires = static::getFilteredPackages($projectConfig, $config);
foreach ($filteredRequires as $package) {
$packageConfig = ConfigFactory::build(
$projectConfig->getVendorDir() . $package . '/composer.json',
$configCollection->add($packageConfig);
static::addRequiredPackageConfigsRecursively(
return $configCollection;
* @param ProjectConfigInterface $projectConfig
* @param ConfigInterface $config
private static function getFilteredPackages(ProjectConfigInterface $projectConfig, ConfigInterface $config): array
$requiredPackages = array_filter($config->getRequires(), function (string $package) {
return (false !== strpos($package, '/'));
$nonComposerPackages = array_filter($requiredPackages, function (string $package) {
return (false === strpos($package, 'composer/'));
return array_filter($nonComposerPackages, function (string $package) use ($projectConfig) {
return ! in_array($package, $projectConfig->getExcludes(), true);