moduleManager = $moduleManager; } /** * Load info of application. * * @param string $appPath Application path * * @return ApplicationInfo * * @since 1.0.0 */ private function loadInfo(string $appPath) : ApplicationInfo { $path = \realpath($appPath); if ($path === false) { throw new PathException($appPath); } $info = new ApplicationInfo($path); $info->load(); return $info; } /** * Install the application * * @param string $source Source of the application * @param string $destination Destination of the application * * @return void * * @since 1.0.0 */ public function install(string $source, string $destination) : void { if (!\file_exists($source) || \file_exists($destination)) { return; } $app = $this->loadInfo(\rtrim($source, '/\\') . '/info.json'); $this->applications[$app->getInternalName()] = $app; $this->installFiles($source, $destination); $this->installTheme($destination, 'Akebi'); $this->installFromModules($app); } /** * Install the files to the destination * * @param string $source Source path * @param string $destination Destination of the application * * @return void * * @since 1.0.0 */ private function installFiles(string $source, string $destination) : void { Directory::copy($source, $destination); } /** * Install the theme * * @param string $destination Destination of the application * @param string $theme Theme name * * @return void * * @since 1.0.0 */ private function installTheme(string $destination, string $theme) : void { if (\file_exists($destination . '/css')) { Directory::delete($destination . '/css'); } if (\file_exists($destination . '/Themes/' . $theme . '/css')) { Directory::copy( $destination . '/Themes/' . $theme . '/css', $destination . '/css', true ); } } /** * Install routes and hooks from modules for application * * @param ApplicationInfo $info Application info * * @return void * * @since 1.0.0 */ public function installFromModules(ApplicationInfo $info) : void { $installed = $this->moduleManager->getInstalledModules(); foreach ($installed as $module => $moduleInfo) { $this->moduleManager->reInit($module, $info); } } }