files = $files; $this->basePath = $basePath; $this->manifestPath = $manifestPath; $this->vendorPath = $basePath.'/vendor'; } /** * Get all of the service provider class names for all packages. * * @return array */ public function providers() { return collect($this->getManifest())->flatMap(function ($configuration) { return (array) ($configuration['providers'] ?? []); })->filter()->all(); } /** * Get all of the aliases for all packages. * * @return array */ public function aliases() { return collect($this->getManifest())->flatMap(function ($configuration) { return (array) ($configuration['aliases'] ?? []); })->filter()->all(); } /** * Get the current package manifest. * * @return array */ protected function getManifest() { if (! is_null($this->manifest)) { return $this->manifest; } if (! file_exists($this->manifestPath)) { $this->build(); } return $this->manifest = file_exists($this->manifestPath) ? $this->files->getRequire($this->manifestPath) : []; } /** * Build the manifest and write it to disk. * * @return void */ public function build() { $packages = []; if ($this->files->exists($path = $this->vendorPath.'/composer/installed.json')) { $packages = json_decode($this->files->get($path), true); } $ignoreAll = in_array('*', $ignore = $this->packagesToIgnore()); $this->write(collect($packages)->mapWithKeys(function ($package) { return [$this->format($package['name']) => $package['extra']['laravel'] ?? []]; })->each(function ($configuration) use (&$ignore) { $ignore = array_merge($ignore, $configuration['dont-discover'] ?? []); })->reject(function ($configuration, $package) use ($ignore, $ignoreAll) { return $ignoreAll || in_array($package, $ignore); })->filter()->all()); } /** * Format the given package name. * * @param string $package * @return string */ protected function format($package) { return str_replace($this->vendorPath.'/', '', $package); } /** * Get all of the package names that should be ignored. * * @return array */ protected function packagesToIgnore() { if (! file_exists($this->basePath.'/composer.json')) { return []; } return json_decode(file_get_contents( $this->basePath.'/composer.json' ), true)['extra']['laravel']['dont-discover'] ?? []; } /** * Write the given manifest array to disk. * * @param array $manifest * @return void * @throws \Exception */ protected function write(array $manifest) { if (! is_writable(dirname($this->manifestPath))) { throw new Exception('The '.dirname($this->manifestPath).' directory must be present and writable.'); } $this->files->put( $this->manifestPath, '