AppAhield=$AppAhield; } public function __invoke(\Psr\Container\ContainerInterface $container) : void{ $container->set( 'compile.dist_dir', 'dist'); $container->set( 'compile.dist_backup_dir', 'dist.backup.restore'); $container->set( 'compile.dist_backup_dir_prev', 'dist.backup.restore~'); $container->factory( 'stage.write.configs',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; $cusotm_templates_dir = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR .'custom' . \DIRECTORY_SEPARATOR .'templates'. \DIRECTORY_SEPARATOR; if(!is_dir($cusotm_templates_dir.'modules' . \DIRECTORY_SEPARATOR)){ mkdir($cusotm_templates_dir.'modules' . \DIRECTORY_SEPARATOR, 0755, true); } if(!is_dir($cusotm_templates_dir.'admin' . \DIRECTORY_SEPARATOR)){ mkdir($cusotm_templates_dir.'admin' . \DIRECTORY_SEPARATOR, 0755, true); } if(!is_dir($cusotm_templates_dir.'system' . \DIRECTORY_SEPARATOR)){ mkdir($cusotm_templates_dir.'system' . \DIRECTORY_SEPARATOR, 0755, true); } $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'frdl-extensions' . \DIRECTORY_SEPARATOR . '*'.\DIRECTORY_SEPARATOR. 'config.xml'; foreach(glob($glob) as $file){ $file2 = str_replace('config.xml', 'config.custom.xml', $file); $file3 = (file_exists($file2)) ? $file2 : $file; $f = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') .\DIRECTORY_SEPARATOR.'config'.\DIRECTORY_SEPARATOR.'extension-configs'.\DIRECTORY_SEPARATOR.basename(dirname($file)).\DIRECTORY_SEPARATOR.'preferences.json'; $file4 = dirname($f).\DIRECTORY_SEPARATOR.'config.custom.xml'; $file3 = (file_exists($file4)) ? $file4 : $file3; $WidgetConfig = new \webfan\hps\Widget\Config($file3); $cnf = []; $context = \frdl\Context::create($cnf); $preferences = $WidgetConfig->getPreferences(false); foreach($preferences as $k => $v){ $context->set($k, $v); } $all =json_encode( $context->all(), \JSON_PRETTY_PRINT); file_put_contents(dirname($file).\DIRECTORY_SEPARATOR.'preferences.json', $all); if(!is_dir(dirname($f))){ mkdir(dirname($f), 0755, true); } file_put_contents($f,$all); } $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $payload['frdl']->modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.xml'; foreach(glob($glob) as $file){ $file2 = str_replace('config.xml', 'config.custom.xml', $file); $file3 = (file_exists($file2)) ? $file2 : $file; $f = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') .\DIRECTORY_SEPARATOR.'config'.\DIRECTORY_SEPARATOR.'module-configs'.\DIRECTORY_SEPARATOR.basename(dirname($file)).\DIRECTORY_SEPARATOR.'preferences.json'; $file4 = dirname($f).\DIRECTORY_SEPARATOR.'config.custom.xml'; $file3 = (file_exists($file4)) ? $file4 : $file3; $WidgetConfig = new \webfan\hps\Widget\Config($file3); $cnf = []; $context = \frdl\Context::create($cnf); $preferences = $WidgetConfig->getPreferences(false); foreach($preferences as $k => $v){ $context->set($k, $v); } $all =json_encode( $context->all(), \JSON_PRETTY_PRINT); file_put_contents(dirname($file).\DIRECTORY_SEPARATOR.'preferences.json', $all); if(!is_dir(dirname($f))){ mkdir(dirname($f), 0755, true); } file_put_contents($f,$all); $_d = dirname($file).\DIRECTORY_SEPARATOR.'templates'.\DIRECTORY_SEPARATOR.'custom'.\DIRECTORY_SEPARATOR; if(!is_dir($_d)){ mkdir($_d, 0755, true); } } $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'themes' . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. '*' . \DIRECTORY_SEPARATOR. 'config.xml'; foreach(glob($glob) as $file){ $file2 = str_replace('config.xml', 'config.custom.xml', $file); $file3 = (file_exists($file2)) ? $file2 : $file; $f = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') .\DIRECTORY_SEPARATOR.'config'.\DIRECTORY_SEPARATOR.'theme-configs' .\DIRECTORY_SEPARATOR.basename(dirname(dirname($file))).\DIRECTORY_SEPARATOR.basename(dirname($file)) .\DIRECTORY_SEPARATOR.'preferences.json'; $file4 = dirname($f).\DIRECTORY_SEPARATOR.'config.custom.xml'; $file3 = (file_exists($file4)) ? $file4 : $file3; $WidgetConfig = new \webfan\hps\Widget\Config($file3); $cnf = []; $context = \frdl\Context::create($cnf); $preferences = $WidgetConfig->getPreferences(false); foreach($preferences as $k => $v){ $context->set($k, $v); } $all =json_encode( $context->all(), \JSON_PRETTY_PRINT); file_put_contents(dirname($file).\DIRECTORY_SEPARATOR.'preferences.json', $all); if(!is_dir(dirname($f))){ mkdir(dirname($f), 0755, true); } file_put_contents($f,$all); $_d = dirname($file).\DIRECTORY_SEPARATOR.'templates'.\DIRECTORY_SEPARATOR.'custom'.\DIRECTORY_SEPARATOR; if(!is_dir($_d)){ mkdir($_d, 0755, true); } } $event = new \webfan\hps\Event('generate.write.configs'); $event->setArgument('project_dir', $dir); $event->setArgument('payload', $payload); \Webfan\App\EventModule::action('build.config')->emit($event->getName(), $event); return $payload; }); }); $container->factory( 'stage.bundlejs:prepare',static function(\UMA\DIC\Container $c) { return (function($payload){ $c = $payload['container']; chdir($c->get('compile.deploy_path')); /* $f = get('deploy_path').get('dist_dir').'/app/js/index.html'; if(!file_exists($f) ) { $e = 'ERROR: '.$f. ' does not exist!'; writeln($e); throw new \Exception($e); } writeln(run('cd '.get('deploy_path').' && ' .'yarn')); */ /**/ if(is_dir( $c->get('compile.deploy_path'). $c->get('compile.dist_dir'))){ exec('rm -rf '.$c->get('compile.deploy_path'). $c->get('compile.dist_dir').'/' . " -vvv 2>&1", $payload['@out'], $exitcode ); } if(is_dir($c->get('compile.deploy_path').'/assets/')){ // writeln(run('cd '.get('deploy_path').' && ' .'rm -rf '.get('deploy_path').'/assets/')); } return $payload; }); }); $container->factory( 'stage.backup:dist',static function(\UMA\DIC\Container $c) { return (function($payload){ $c = $payload['container']; chdir($c->get('compile.deploy_path')); /* copy -rf ./dist/ ./dist.backup.restore/ || mkdir ./dist/ */ if(file_exists($c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').$payload['frdl']->jsbase.'index.html') ) { if(is_dir($c->get('compile.deploy_path').$c->get('compile.dist_backup_dir_prev'))){ exec('rm -r '.$c->get('compile.deploy_path').$c->get('compile.dist_backup_dir_prev').'/' . " -vvv 2>&1", $payload['@out'], $exitcode ); } exec('cp -rf '.$c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').'/ '. $c->get('compile.deploy_path').$c->get('compile.dist_backup_dir_prev') .'/ || mkdir '.$c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').'/' . " -vvv 2>&1", $payload['@out'], $exitcode ); } if(file_exists($c->get('compile.deploy_path'). $c->get('compile.dist_dir').$payload['frdl']->jsbase.'index.html') ) { if(is_dir($c->get('compile.deploy_path').$c->get('compile.dist_backup_dir'))){ exec('rm -r '.$c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').'/' . " -vvv 2>&1", $payload['@out'], $exitcode ); } exec('cp -rf '.$c->get('compile.deploy_path'). $c->get('compile.dist_dir').'/. '. $c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').'/' . " -vvv 2>&1", $payload['@out'], $exitcode ); } return $payload; }); }); $container->factory( 'stage.bundlejs:action',static function(\UMA\DIC\Container $c) { return (function($payload){ $c = $payload['container']; set_time_limit(300); chdir($c->get('compile.deploy_path')); $AppShield = $c->get('webfan.app.shield'); $config = $AppShield->config->export(); if(!is_dir($c->get('compile.deploy_path'). $c->get('compile.dist_dir'))){ mkdir($c->get('compile.deploy_path'). $c->get('compile.dist_dir'), 0755, true); } exec($config['NODE_PATH'].' ' . dirname($config['FRDLJS_PATH']).'/frdl-bundlejs' //. .\frdl\webfan\App::God(false)->{'hps.config.value'}('WEBSPACE_ROOT') . 'hello-world/js.frdl.de/bin/frdl' // getenv('FRDL_PATH') // .' bundlejs' .' index.js' .' '. sprintf('--base %s', $payload['frdl']->ce_baseUrl.ltrim($payload['frdl']->jsbase, '/ ')) .' '. sprintf('--workspace %s', $config['workspace']) // .' '. sprintf('--dist %s', 'www_root/app/js') .' '. sprintf('--dist %s', $c->get('compile.deploy_path'). $c->get('compile.dist_dir').rtrim($payload['frdl']->jsbase, '/ ')) .' '. sprintf('--name %s', $payload['frdl']->jsglobal) .' '. sprintf('--modules %s', $payload['frdl']->modules_dirname) .' -l' . " -vvv 2>&1", // . " 2>&1", $payload['@out'], $exitcode ); // $c->set( 'compile.@out', ['code' => $exitcode, 'out'=>$output]); // \webfan\hps\patch\WebfanJS::getLibUrl(); $payload['code'] = $exitcode; // $payload['@out'] += $output; if(0 !== intval($exitcode)){ return new \Exception(print_r($payload['@out'],true)); } $payload['@hash'] = $payload['@out'][count($payload['@out'])-1]; // \Webfan::i()->Site->getById($blog['id'], true); // $js = file_get_contents(\webfan\hps\patch\WebfanJS::getLibUrl()); $g = glob($c->get('compile.deploy_path'). $c->get('compile.dist_dir').$payload['frdl']->jsbase.$payload['frdl']->jsglobal.'~*.'. $payload['@hash'].'.bundle-webpack.js'); //frdlweb~493df0b3.1aec9432eb5260c38c89.bundle-webpack.js $js = (isset($g[0])) ? file_get_contents($g[0]) : false; if(!is_dir($payload['frdl']->ce_dir.'cdn/application/webfan/')) { mkdir($payload['frdl']->ce_dir.'cdn/application/webfan/', 0755, true); } if(!is_dir($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ '))) { mkdir($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ '), 0755, true); } if(false!==$js){ file_put_contents($payload['frdl']->ce_dir.'cdn/application/webfan/frdlweb.js', $js); file_put_contents($c->get('compile.deploy_path'). $c->get('compile.dist_dir').$payload['frdl']->jsbase.'frdlweb.js', $js); } $meta = [ 'hash' => $payload['@hash'], 'libUrl' => (false===$js || !isset($g[0])) ? false : $payload['frdl']->ce_baseUrl.trim($payload['frdl']->jsbase, '/ ').'/'.basename($g[0]), ]; file_put_contents($c->get('compile.deploy_path'). 'compiled/js.frdl.json', json_encode($meta, \JSON_PRETTY_PRINT)); return $payload; }); }); $container->factory( 'stage.deploy:frdlweb',static function(\UMA\DIC\Container $c) { return (function($payload){ $c = $payload['container']; // chdir($c->get('compile.deploy_path')); $f = $c->get('compile.deploy_path'). $c->get('compile.dist_dir').''.$payload['frdl']->jsbase.'index.html'; if(!file_exists($f) ) { $e = 'ERROR: '.$f. ' does not exist!'; $payload['@out'][]=$e; //return $payload; return new \Exception($e); } /* copy -rf ./dist/ ./dist.backup.restore/ || mkdir ./dist/ */ exec('cp -rf '.$c->get('compile.deploy_path'). $c->get('compile.dist_dir').$payload['frdl']->jsbase.'. ' .$payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ').' ' . " -vvv 2>&1", $payload['@out'], $exitcode ); return $payload; }); }); $container->factory( 'stage.clear:appJs',static function(\UMA\DIC\Container $c) { return (function($payload){ $c = $payload['container']; foreach(array_merge( // glob($c->get('compile.deploy_path')."assets/*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*.*.*.*.*"), glob($payload['frdl']->ce_dir.ltrim($payload['frdl']->jsbase, '/ ')."*.*.*.*.*.*.*.*.*.*.*")) as $i => $f){ if( file_exists($f) && 'index.html' !== basename($f) && !file_exists($c->get('compile.deploy_path'). $c->get('compile.dist_dir').$payload['frdl']->jsbase.basename($f)) && !file_exists($c->get('compile.deploy_path').$c->get('compile.dist_backup_dir').$payload['frdl']->jsbase.basename($f)) && !file_exists($c->get('compile.deploy_path').$c->get('compile.dist_backup_dir_prev').$payload['frdl']->jsbase.basename($f)) && filemtime($f) < time() - 60 * 60){ unlink($f); } } return $payload; }); }); $container->factory( 'pipeline.bundlejs',static function(\UMA\DIC\Container $c) :PipelineInterface{ $pipelineBuilder = (new PipelineBuilder) ->add(function(string $dir=null, \UMA\DIC\Container $c = null){ $cwd = getcwd(); if(null===$dir){ $dir = getcwd(); }else{ chdir($dir); } if(!file_exists('./composer.lock')){ return new \Exception('You have to install the composer dependencies first!'); } $payload = ['container' => (null===$c) ? \frdl\i::c() : $c, '@out'=>[], 'cwd'=>$cwd, 'dir' => $dir, 'frdl' => new \webfan\hps\patch\ngScope(json_decode(file_get_contents('frdl.project.json'))), 'composer' => json_decode(file_get_contents('composer.json')), 'errors' => [], ]; $payload['container']->set( 'compile.deploy_path', rtrim($dir, \DIRECTORY_SEPARATOR.'/ ').\DIRECTORY_SEPARATOR); return $payload; }) ->add($c->get('stage.write.configs')) ->add($c->get( 'stage.backup:dist')) ->add($c->get( 'stage.bundlejs:prepare')) ->add($c->get( 'stage.bundlejs:action')) ->add($c->get( 'stage.deploy:frdlweb')) ->add($c->get( 'stage.clear:appJs')) // ->add($c->get('stage.compile.frdl-module-scripts')) ->add(function($payload){ chdir($payload['cwd']); //return $payload['container']->get('compile.@out'); return ['code'=>$payload['code'], 'hash'=> $payload['@hash'], 'out'=>$payload['@out']]; }) ; // Build the pipeline $pipeline = $pipelineBuilder->build(new InterruptibleProcessor(function($payload){ if($payload instanceof \Exception){ return false; } set_time_limit(300); return true; })); return $pipeline; }); /* $container->factory( 'stage.autoload', function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); require_once $dir . \DIRECTORY_SEPARATOR. 'vendor' . \DIRECTORY_SEPARATOR .'autoload.php'; return $payload; }); }); */ $container->factory( 'stage.autoload',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; //chdir($dir); $c = $payload['container']; $AppShield = $c->get('webfan.app.shield'); $AppShield->emitter->emit('project.autoload.force', $dir); return $payload; }); }); $container->factory( 'stage.generate.index.web',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $webIndexFile = $payload['frdl']->ce_dir.'index.php'; if(file_exists($webIndexFile)){ $e = sprintf('One instance of your project is deployed already at `%s`, so you MUST use frdl:deploy command/or the UI-Buttons to `deploy` the project to %s and you green/blue stage!', $webIndexFile, $payload['frdl']->ce_dir); // $payload['errors'][] = $e; // $payload['@out'][] = $e; return $payload; } $indexFile = rtrim(getcwd(), \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled'. \DIRECTORY_SEPARATOR . 'index.php'; $indexFile01 = rtrim(\webfan\hps\patch\Fs::getRelativePath(realpath($payload['frdl']->ce_dir), dirname($indexFile)), \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'index.php'; $code = <<ce_dir.'index.php', $code); $code = << RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] RewriteRule ^.*\\.(restore|backup)\\$ - [F,L,NC] #ErrorDocument 404 /proxy.404.php Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods: "GET" Header set Access-Control-Allow-Headers: "X-Requested-With" # # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods: "GET" # # # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods: "GET" # # # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods: "GET" # # WEEK Header set Cache-Control "max-age=604800, public" Header set X-UA-Compatible "IE=edge" Header set X-UA-Compatible "IE=edge" ExpiresActive On ExpiresDefault "access plus 1 week" ExpiresByType image/jpg "access plus 1 week" ExpiresByType image/jpeg "access plus 1 week" ExpiresByType image/png "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" ExpiresByType text/javascript "access plus 1 week" ExpiresByType text/css "access plus 1 week" RewriteCond %{REQUEST_FILENAME} !-f #RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule ^.*\\.(jpg|jpeg|png|gif|js|css|swf)\\$ - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}] #RewriteRule ^.*\\.(jpg|jpeg|png|gif|js|css|swf)\\$ - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}] RewriteRule ^ index.php [L] PHPCODE; file_put_contents($payload['frdl']->ce_dir.'.htaccess', $code); chmod($payload['frdl']->ce_dir.'.htaccess', 0755); return $payload; }); }); $container->factory( 'stage.generate.index',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $indexFile02 = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled'. \DIRECTORY_SEPARATOR . 'index.php'; $time = time(); // $modules_dirname = $payload['frdl']->modules_dirname; /* require __DIR__ . \\DIRECTORY_SEPARATOR . '..' . \\DIRECTORY_SEPARATOR .'$modules_dirname'. \\DIRECTORY_SEPARATOR .'frdl.web'.\\DIRECTORY_SEPARATOR .'src'.\\DIRECTORY_SEPARATOR.'classes'.\\DIRECTORY_SEPARATOR.'App.php'; */ $code = <<handle(); PHPCODE; if(file_exists($indexFile02))chmod($indexFile02, 0755); file_put_contents($indexFile02, $code); if(file_exists($indexFile02))chmod($indexFile02, 0755); $code = <<Read this documentation]'); } require __DIR__ . \\DIRECTORY_SEPARATOR .'compiled'. \\DIRECTORY_SEPARATOR . 'index.php'; PHPCODE; file_put_contents(dirname(dirname($indexFile02)).\DIRECTORY_SEPARATOR.'index.php', $code); return $payload; }); }); $container->factory( 'stage.generate.container.build',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $proxiesDir = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled' . \DIRECTORY_SEPARATOR . 'proxies' ; if(!is_dir($proxiesDir)){ mkdir($proxiesDir, 0755, true); } $containerTempFile = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled' . \DIRECTORY_SEPARATOR .'RawCompiledContainer.php'; $containerTempFile_backup = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled' . \DIRECTORY_SEPARATOR .'RawCompiledContainer.backup.php'; $containerFile = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled' . \DIRECTORY_SEPARATOR .'CompiledContainer.php'; $containerFile_backup = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled' . \DIRECTORY_SEPARATOR .'CompiledContainer.backup.php'; $cDir = dirname($containerFile); foreach(glob($cDir. \DIRECTORY_SEPARATOR."*.*") as $f){ chmod($f, 0755); } if(file_exists($containerFile)){ file_put_contents($containerFile_backup, file_get_contents($containerFile)); chmod($containerFile_backup, 0755); chmod($containerFile, 0755); unlink($containerFile); } // clearstatcache(); if(file_exists($containerTempFile)){ file_put_contents($containerTempFile_backup, file_get_contents($containerTempFile)); chmod($containerTempFile_backup, 0755); chmod($containerTempFile, 0755); unlink($containerTempFile); } clearstatcache(); $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; $extensions_dirname = 'frdl-extensions'; $containerBuilder = new \DI\ContainerBuilder(); /** string $directory, string $containerClass = 'CompiledContainer', string $containerParentClass = CompiledContainer::class */ $containerBuilder->enableCompilation(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled', \RawCompiledContainer::class, \DI\CompiledContainer::class); $containerBuilder->writeProxiesToFile(true, $proxiesDir); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $extensions_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.core' . \DIRECTORY_SEPARATOR.'*.php'; foreach(glob($glob) as $file){ try{ $containerBuilder->addDefinitions($file); }catch(\Exception $e){ $payload['errors'][]=$e->getMessage(); } } $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.core' . \DIRECTORY_SEPARATOR.'*.php'; foreach(glob($glob) as $file){ try{ $containerBuilder->addDefinitions($file); }catch(\Exception $e){ $payload['errors'][]=$e->getMessage(); } } $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config' . \DIRECTORY_SEPARATOR.'*.php'; $glob2 = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'themes' . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. '*' . \DIRECTORY_SEPARATOR . 'config' . \DIRECTORY_SEPARATOR.'*.php'; foreach(array_merge(glob($glob), glob($glob2)) as $file){ try{ $containerBuilder->addDefinitions($file); }catch(\Exception $e){ $payload['errors'][]=$e->getMessage(); } } $event = new \webfan\hps\Event('build::before'); $event->setArgument('project_dir', $dir); $event->setArgument('modules_dirname', $modules_dirname); $event->setArgumentReference('containerBuilder', $containerBuilder); \Webfan\App\EventModule::action('compile-container')->emit($event->getName(), $event); $payload['compiled_container'] = $containerBuilder->build(); $payload['rawContainerFile'] = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled'. \DIRECTORY_SEPARATOR . 'RawCompiledContainer.php'; $payload['containerFile'] = $containerFile; return $payload; }); }); $container->factory( 'stage.generate.container.finalize',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $containerFile = $payload['containerFile']; $RawCompiledContainer = $payload['compiled_container']; $class = new \Nette\PhpGenerator\ClassType(\CompiledContainer::class); $class ->setFinal() ->setExtends(\RawCompiledContainer::class) // ->setType(\compiled\CompiledContainer::class) ; $file = new \Nette\PhpGenerator\PhpFile; $file->addComment("This file was auto-generated by frdl/webfan.\nYou should not edit this file manually!" ."\n" ." @time ".time() ."\n" ); $file->setStrictTypes(); // $namespace = $file->addNamespace('compiled'); $method = $class->addMethod('getProjectDirectory') ->setBody(<<setStatic(); $modules_dirname = $payload['frdl']->modules_dirname; $method = $class->addMethod('getModulesDirectory') ->setBody(<<setStatic(); $c = file_get_contents($payload['rawContainerFile']); $c = str_replace("'".realpath($dir). \DIRECTORY_SEPARATOR . $modules_dirname. \DIRECTORY_SEPARATOR, "\compiled\CompiledContainer::getModulesDirectory().'", $c); $c = str_replace("'".realpath($dir). \DIRECTORY_SEPARATOR, "\compiled\CompiledContainer::getProjectDirectory().'", $c); file_put_contents($payload['rawContainerFile'], $c); $event = new \webfan\hps\Event('build::final'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('classGenerator', $class); $event->setArgumentReference('container', $payload['compiled_container']); $event->setArgumentReference('rawContainerFile', $payload['rawContainerFile']); $event->setArgumentReference('containerFile', $containerFile); $event->setArgumentReference('file', $file); $event->setArgumentReference('namespace', $namespace); \Webfan\App\EventModule::action('compile-container')->emit($event->getName(), $event); $namespace->add($class); $code = (new \Nette\PhpGenerator\PsrPrinter)->printFile($file); file_put_contents($containerFile, $code); $payload['compiled_container'] = new \compiled\CompiledContainer(); return $payload; }); }); $container->factory( 'stage.generate.misc-autoloader',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); try{ $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; $loader = new \Nette\Loaders\RobotLoader; // Add directories for RobotLoader to index // $loader->addDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'vendor-software' . \DIRECTORY_SEPARATOR); // $loader->addDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'user-modules' . \DIRECTORY_SEPARATOR); // $loader->addDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'compiled' . \DIRECTORY_SEPARATOR.'classes' . \DIRECTORY_SEPARATOR); $cachedir = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'cache' . \DIRECTORY_SEPARATOR.'classes' . \DIRECTORY_SEPARATOR; if(!is_dir($cachedir)){ mkdir($cachedir, 0755, true); } chmod($cachedir, 0755); \webfan\hps\patch\Fs::pruneDir($cachedir, 0, true, true); // And set caching to the 'temp' directory $loader->setTempDirectory($cachedir); /* $loader->addDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR); $loader->excludeDirectory($cachedir); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'cache' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'vendor' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.$modules_dirname. \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'backup' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'backup.restore' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'themes' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'custom' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'config' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'data' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'dist' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'dist.backup.restore' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'dist.backup.restore~' . \DIRECTORY_SEPARATOR); // $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'compiled' . \DIRECTORY_SEPARATOR.'classes' . \DIRECTORY_SEPARATOR); $loader->excludeDirectory(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'compiled' . \DIRECTORY_SEPARATOR); */ foreach([ rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'lib' . \DIRECTORY_SEPARATOR, // rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'user-modules' . \DIRECTORY_SEPARATOR, // rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'vendor-software' . \DIRECTORY_SEPARATOR, rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'3p' . \DIRECTORY_SEPARATOR, rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'app' . \DIRECTORY_SEPARATOR.'Entities' . \DIRECTORY_SEPARATOR, rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'app' . \DIRECTORY_SEPARATOR.'Repositories' . \DIRECTORY_SEPARATOR, // rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'src' . \DIRECTORY_SEPARATOR, ] as $sourceDir){ if(!is_dir($sourceDir)){ mkdir($sourceDir, 0755, true); } chmod($sourceDir, 0755); $loader->addDirectory($sourceDir); } $event = new \webfan\hps\Event('generate.autoloader.classmaps'); $event->setArgument('project_dir', $dir); $event->setArgument('payload', $payload); $event->setArgumentReference('ClassMapsLoader', $loader); \Webfan\App\EventModule::action('build.autoloader')->emit($event->getName(), $event); $loader->refresh() ; $loader->rebuild() ; }catch(\Exception $e){ return $e; } return $payload; }); }); $container->factory( 'stage.generate.class.Webfan\App\Shield',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $AppShield = $payload['container']->get('webfan.app.shield'); $stub = $AppShield->getStub(); $class = get_class($AppShield); $ClassFile = $stub->get_file($stub->document, '$DIR_PSR4/'.str_replace('\\', '/', $class).'.php', 'class '.$class); $destFile = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR.'lib' . \DIRECTORY_SEPARATOR . str_replace('\\', \DIRECTORY_SEPARATOR, $class).'.php'; if(!is_dir(dirname($destFile))){ mkdir(dirname($destFile), 0755, true); } file_put_contents($destFile, $ClassFile->getBody()); return $payload; }); }); $container->factory( 'stage.generate.class.compiled\project',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $project = json_decode(file_get_contents('frdl.project.json')); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $payload['frdl']->modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.xml'; $modules = []; foreach(glob($glob) as $file){ $m = basename(dirname($file)); $modules[$m] = [ 'status' => 'unknown', ]; } $file = new \Nette\PhpGenerator\PhpFile; $file->addComment("This file was auto-generated by frdl/webfan.\nYou should not edit this file manually!" ."\n" ." @time ".time() ."\n" ); $file->setStrictTypes(); // adds declare(strict_types=1) $namespace = $file->addNamespace('compiled'); $class = $namespace->addClass('project'); $class->addComment("Frdlweb project"); $props = []; foreach($project as $k => $v){ if(is_object($v)){ $v=(array)$v; } if(is_array($v)){ foreach($v as $_k => $_v){ if(is_object($_v)){ $v[$_k]=(array)$_v; } } } $class->addProperty($k, $v) ->setVisibility('private') ; $props[] = $k; } $class->addProperty('dir', realpath($dir)) ->setVisibility('private') ; $props[] = 'dir'; $class->addProperty('modules', $modules) ->setVisibility('private') ; $props[] = 'modules'; $method = $class->addMethod('__get') ->setBody(<<ce_baseUrl; } return (isset(\$this->{\$name})) ? \$this->{\$name} : null; PHPCODE ) ; $method->addParameter('name') ->setTypeHint('string') ; $props[] = 'libUrl'; $props[] = 'baseUrl'; $class->addConstant('PROPERTIES', $props); $classfile = './compiled'.\DIRECTORY_SEPARATOR.'project.php'; $event = new \webfan\hps\Event('build::project.class'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('class', $class); $event->setArgument('payload', $payload); $event->setArgumentReference('PhpFile', $file); $event->setArgumentReference('namespace', $namespace); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); $code = (new \Nette\PhpGenerator\PsrPrinter)->printFile($file); $dirToken = realpath($dir); $tok = "private \$dir = '$dirToken';"; $code = str_replace($tok, "private \$dir = __DIR__ . \DIRECTORY_SEPARATOR .'..'. \DIRECTORY_SEPARATOR;", $code); file_put_contents($dir.\DIRECTORY_SEPARATOR.'compiled'.\DIRECTORY_SEPARATOR.'project.php', $code); return $payload; }); }); $container->factory( 'stage.write.project.json',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $time = time(); $configfile = $dir.\DIRECTORY_SEPARATOR.'frdl.project.json'; $project = json_decode(file_get_contents($configfile)); $project->config->lt->compiled[0] = $time; $project->config->online = 1; $project->config->lt->deployed = $time; $project->hash = sha1(json_encode($project->config, \JSON_PRETTY_PRINT)); $event = new \webfan\hps\Event('build::project.json'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('project', $project); $event->setArgument('payload', $payload); $event->setArgumentReference('configfile', $configfile); \Webfan\App\EventModule::action('build.config')->emit($event->getName(), $event); file_put_contents($configfile, json_encode($project)); return $payload; }); }); $container->factory( 'stage.prune.cache.templates',static function(\UMA\DIC\Container $c) { return (function($payload){ \webfan\hps\patch\Fs::pruneDir($payload['compiled_container']->get('twig.cache.dir'), 0, true); return $payload; }); }); $container->factory( 'stage.compile.events',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $compiledEventsDir = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR .'compiled'. \DIRECTORY_SEPARATOR .'~events'. \DIRECTORY_SEPARATOR; $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; // $containerBuilder->set('routes', []); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.events' . \DIRECTORY_SEPARATOR.'*.php'; $actions = []; \webfan\hps\patch\Fs::pruneDir( $compiledEventsDir, 0, true); foreach(glob($glob) as $file){ $events = require $file; foreach($events as $event){ if(!isset($event[3])){ $event[3] = null; } if(!isset($event[4])){ $event[4] = false; } try{ if(!isset($actions[$event[0]])){ $actions[$event[0]] = []; \Webfan\App\EventModule::unregister($event[0]); } // $indexFile01 = rtrim(\webfan\hps\patch\Fs::getRelativePath(realpath($payload['frdl']->ce_dir), dirname($indexFile)), \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'index.php'; if(!isset($event[1], $actions[$event[0]][$event[1]])){ $actions[$event[0]][$event[1]] = [ 'file' => \webfan\hps\patch\Fs::getRelativePath($dir, \Webfan\App\EventModule::action($event[0])->filepath()), 'dispatchers' => [], ]; } if(!isset($actions[$event[0]][$event[1]]['dispatchers'][$file])) { $actions[$event[0]][$event[1]]['dispatchers'][$file] = 0; } $actions[$event[0]][$event[1]]['dispatchers'][$file]++; \Webfan\App\EventModule::register($event[0], $event[1], $event[2], $event[3], $event[4]); }catch(\Exception $e){ $payload['errors'][]=$e->getMessage(); } } } $metafile = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'config' . \DIRECTORY_SEPARATOR . 'meta' . \DIRECTORY_SEPARATOR. 'lists' . \DIRECTORY_SEPARATOR.'compiled-events.json'; if(!is_dir(dirname($metafile))){ mkdir(dirname($metafile), 0755, true); } file_put_contents($metafile, json_encode($actions, \JSON_PRETTY_PRINT)); return $payload; }); }); $container->factory( 'stage.compile.frdl-module-scripts',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; // $containerBuilder->set('routes', []); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.javascripts'. \DIRECTORY_SEPARATOR. 'scripts.js'; $glob2 = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.javascripts'. \DIRECTORY_SEPARATOR. 'scripts.php'; $event = new \webfan\hps\Event('frdl-module-scripts::before'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); // $appJs = ''; // $scriptsJs = ''; $sHeader = file_get_contents( rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'scripts.header.js'); file_put_contents(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'scripts.js', \webfan\hps\patch\Fs::compress($sHeader)); foreach(array_merge(glob($glob), glob($glob2)) as $file){ $moduleDir =dirname( dirname($file)); $WidgetConfig = new \webfan\hps\Widget\Config($moduleDir.\DIRECTORY_SEPARATOR.'config.xml'); // $preferences = $WidgetConfig->getPreferences(false); $composerJson = json_decode(file_get_contents($moduleDir.\DIRECTORY_SEPARATOR.'composer.json')); $event = new \webfan\hps\Event('frdl-module-scripts:scripts'); $event->setArgument('name', $composerJson->name); $event->setArgument('module_dir', $moduleDir); $event->setArgument('project_dir', $dir); // $event->setArgumentReference('payload', $payload); // $event->setArgument('payload', $payload); // $event->setArgumentReference('WidgetConfig', $WidgetConfig); $event->setArgument('WidgetConfig', $WidgetConfig); // $event->setArgument('preferences', $preferences); $event->setArgument('container', $payload['compiled_container']); // $event->setArgument('AppShield', $payload['container']->get('webfan.app.shield')); if('scripts.php' === basename($file)){ $event->setResult(require($file)); }else{ $event->setResult(file_get_contents($file)); } $event->setArgument('composer', $composerJson); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); file_put_contents(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'scripts.js', \webfan\hps\patch\Fs::compress($event->getResult()), \FILE_APPEND); //$scriptsJs.=$event->getResult(); } $sHeader = file_get_contents( rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'app.header.js'); file_put_contents(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'app.js', \webfan\hps\patch\Fs::compress($sHeader)); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.javascripts'. \DIRECTORY_SEPARATOR. 'app.js'; $glob2 = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'config.javascripts'. \DIRECTORY_SEPARATOR. 'app.php'; foreach(array_merge(glob($glob), glob($glob2)) as $file){ $moduleDir =dirname( dirname($file)); $WidgetConfig = new \webfan\hps\Widget\Config($moduleDir.\DIRECTORY_SEPARATOR.'config.xml'); // $preferences = $WidgetConfig->getPreferences(false); $composerJson = json_decode(file_get_contents($moduleDir.\DIRECTORY_SEPARATOR.'composer.json')); $event = new \webfan\hps\Event('frdl-module-scripts:app'); $event->setArgument('name', $composerJson->name); $event->setArgument('module_dir', $moduleDir); $event->setArgument('project_dir', $dir); // $event->setArgumentReference('payload', $payload); // $event->setArgument('payload', $payload); // $event->setArgumentReference('WidgetConfig', $WidgetConfig); $event->setArgument('WidgetConfig', $WidgetConfig); // $event->setArgument('preferences', $preferences); $event->setArgument('container', $payload['compiled_container']); // $event->setArgument('AppShield', $payload['container']->get('webfan.app.shield')); if('app.php' === basename($file)){ $event->setResult(require($file)); }else{ $event->setResult(file_get_contents($file)); } $event->setArgument('composer', $composerJson); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); file_put_contents(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'app.js',\webfan\hps\patch\Fs::compress( $event->getResult() ), \FILE_APPEND); //$scriptsJs.=$event->getResult(); } $sFooter = file_get_contents( rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'app.footer.js'); file_put_contents(rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . 'frdl.web' . \DIRECTORY_SEPARATOR. 'public'. \DIRECTORY_SEPARATOR. 'app.js', \webfan\hps\patch\Fs::compress($sFooter), \FILE_APPEND); $event = new \webfan\hps\Event('frdl-module-scripts::after'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); return $payload; }); }); $container->factory( 'stage.compile.frdl-modules',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; // $containerBuilder->set('routes', []); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'composer.json'; $event = new \webfan\hps\Event('frdl-modules::before'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); foreach(glob($glob) as $file){ $moduleDir = dirname($file); $WidgetConfig = new \webfan\hps\Widget\Config($moduleDir.\DIRECTORY_SEPARATOR.'config.xml'); // $preferences = $WidgetConfig->getPreferences(false); $composerJson = json_decode(file_get_contents($moduleDir.\DIRECTORY_SEPARATOR.'composer.json')); $event = new \webfan\hps\Event('frdl-module'); $event->setArgument('name', $composerJson->name); $event->setArgument('module_dir', $moduleDir); $event->setArgument('project_dir', $dir); // $event->setArgumentReference('payload', $payload); // $event->setArgument('payload', $payload); // $event->setArgumentReference('WidgetConfig', $WidgetConfig); $event->setArgument('WidgetConfig', $WidgetConfig); // $event->setArgument('preferences', $preferences); $event->setArgument('container', $payload['compiled_container']); // $event->setArgument('AppShield', $payload['container']->get('webfan.app.shield')); $event->setArgument('composer', $composerJson); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); } $event = new \webfan\hps\Event('frdl-modules::after'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); return $payload; }); }); $container->factory( 'stage.compile.db.modules',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $modules_dirname = (is_string($payload)) ? 'modules' : $payload['frdl']->modules_dirname; // $containerBuilder->set('routes', []); $glob = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . $modules_dirname . \DIRECTORY_SEPARATOR . '*' . \DIRECTORY_SEPARATOR. 'composer.json'; foreach(glob($glob) as $file){ $moduleDir = dirname($file); $WidgetConfig = new \webfan\hps\Widget\Config($moduleDir.\DIRECTORY_SEPARATOR.'config.xml'); // $preferences = $WidgetConfig->getPreferences(false); // $composerJson = json_decode(file_get_contents($moduleDir.\DIRECTORY_SEPARATOR.'composer.json')); $composerJson = json_decode(file_get_contents($file)); if(!is_object($composerJson) && !is_array($composerJson) ){ throw new \Exception('Error reading '.$file.': \n'.gettype($composerJson)); } $event = new \webfan\hps\Event('db.module'); $event->setArgument('name', $composerJson->name); $event->setArgument('module_dir', $moduleDir); $event->setArgument('project_dir', $dir); $event->setArgument('WidgetConfig', $WidgetConfig); $event->setArgument('container', $payload['compiled_container']); $event->setArgument('composer', $composerJson); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); } return $payload; }); }); $container->factory( 'stage.compile.db',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $event = new \webfan\hps\Event('db'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); return $payload; }); }); $container->factory( 'stage.compile.after',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = $payload['dir']; // chdir($dir); $event = new \webfan\hps\Event('after'); $event->setArgument('project_dir', $dir); $event->setArgumentReference('container', $payload['compiled_container']); \Webfan\App\EventModule::action('compile')->emit($event->getName(), $event); return $payload; }); }); $container->set( PipelineBuilderInterface::class.'#pipeline.compile',static function(\UMA\DIC\Container $c):PipelineBuilderInterface { $pipelineBuilder = (new PipelineBuilder) ->add(function(string $dir=null, \UMA\DIC\Container $c = null, $params=null){ $cwd = getcwd(); if(null===$dir){ $dir = getcwd(); }else{ chdir($dir); } if(!file_exists('./composer.lock')){ return new \Exception('You have to install the composer dependencies first!'); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'cache')){ mkdir($dir.\DIRECTORY_SEPARATOR.'cache', 0755, true); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'cache'.\DIRECTORY_SEPARATOR.'templates')){ mkdir($dir.\DIRECTORY_SEPARATOR.'cache'.\DIRECTORY_SEPARATOR.'templates', 0755, true); } /* if(!is_dir($dir.\DIRECTORY_SEPARATOR.'vendor-software')){ mkdir($dir.\DIRECTORY_SEPARATOR.'vendor-software', 0755, true); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'user-modules')){ mkdir($dir.\DIRECTORY_SEPARATOR.'user-modules', 0755, true); } */ if(is_dir($dir.\DIRECTORY_SEPARATOR.'vendor-software')){ if(0===count(glob($dir.\DIRECTORY_SEPARATOR.'vendor-software'.\DIRECTORY_SEPARATOR."**")) ){ rmdir($dir.\DIRECTORY_SEPARATOR.'vendor-software'); } } if(is_dir($dir.\DIRECTORY_SEPARATOR.'user-modules')){ if(0===count(glob($dir.\DIRECTORY_SEPARATOR.'user-modules'.\DIRECTORY_SEPARATOR."**")) ){ rmdir($dir.\DIRECTORY_SEPARATOR.'user-modules'); } } $frdl = json_decode(file_get_contents('frdl.project.json')); $_host = (isset($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST']; $frdl->ce_baseUrl = str_replace('${HOST}', $_host, $frdl->ce_baseUrl); file_put_contents('frdl.project.json', json_encode($frdl, \JSON_PRETTY_PRINT)); $frdl = json_decode(file_get_contents('frdl.project.json')); return [ 'dir' => $dir, 'params'=>$params, 'cwd'=>$cwd, '@out'=>[], 'frdl' => json_decode(file_get_contents('frdl.project.json')), 'composer' => json_decode(file_get_contents('composer.json')), 'errors' => [], 'container' => (null===$c) ? \frdl\i::c() : $c, ]; }) ->add($c->get('stage.autoload')) ->add($c->get('stage.generate.class.Webfan\App\Shield')) ->add($c->get('stage.compile.events')) ->add($c->get('stage.write.configs')) ->add($c->get('stage.generate.container.build')) ->add($c->get('stage.generate.misc-autoloader')) ->add($c->get('stage.generate.index')) ->add($c->get('stage.write.project.json')) ->add($c->get('stage.generate.class.compiled\project')) ->add($c->get('stage.compile.db')) ->add($c->get('stage.compile.db.modules')) ->add($c->get('stage.compile.frdl-modules')) ->add($c->get('stage.compile.frdl-module-scripts')) ->add($c->get('stage.generate.index.web')) ->add($c->get('stage.generate.container.finalize')) ->add($c->get('stage.compile.after')) ->add($c->get('stage.prune.cache.templates')) ->add(function($payload){ chdir($payload['cwd']); return $payload; }) ; return $pipelineBuilder; }); $container->factory( 'pipeline.compile',static function(\UMA\DIC\Container $c):PipelineInterface { return $c->get(PipelineBuilderInterface::class.'#pipeline.compile') ->build($c->get(InterruptibleProcessor::class)); }); $container->factory( InterruptibleProcessor::class,static function(\UMA\DIC\Container $c):ProcessorInterface { return $c->get(InterruptibleProcessor::class.'#level-0'); }); $container->factory( InterruptibleProcessor::class.'#level-0',static function(\UMA\DIC\Container $c):ProcessorInterface { return new InterruptibleProcessor(function($payload):bool{ if($payload instanceof \Exception){ return false; } set_time_limit(300); return true; }); }); $container->factory( 'pipeline.compile#level-2',static function(\UMA\DIC\Container $c):PipelineInterface { throw new \Exception('This will be available in future versions...'); }); $container->factory( 'pipeline.compile#dev-experimental',static function(\UMA\DIC\Container $c):PipelineInterface { return $c->get(CompilePipelineBuilder::class) ->build($c->get(CompilePipelineProcessor::class)); }); $container->factory( CompilePipelineProcessor::class,static function(\UMA\DIC\Container $c):ProcessorInterface { return new CompilePipelineProcessor(function($payload):bool{ if($payload instanceof \Exception){ return false; } set_time_limit(300); return true; }); }); $container->factory( 'stage.generate.index#level-2',static function(\UMA\DIC\Container $c) { return (function($payload){ $dir = (is_string($payload)) ? $payload : $payload['dir']; chdir($dir); $indexFile02 = rtrim($dir, \DIRECTORY_SEPARATOR.'/ ') . \DIRECTORY_SEPARATOR . 'compiled'. \DIRECTORY_SEPARATOR . 'index.php'; $time = time(); // $modules_dirname = $payload['frdl']->modules_dirname; /* require __DIR__ . \\DIRECTORY_SEPARATOR . '..' . \\DIRECTORY_SEPARATOR .'$modules_dirname'. \\DIRECTORY_SEPARATOR .'frdl.web'.\\DIRECTORY_SEPARATOR .'src'.\\DIRECTORY_SEPARATOR.'classes'.\\DIRECTORY_SEPARATOR.'App.php'; */ $code = <<handle(); PHPCODE; if(!is_dir(dirname($indexFile02)))mkdir(dirname($indexFile02), 0755, true); if(file_exists($indexFile02))chmod($indexFile02, 0755); file_put_contents($indexFile02, $code); if(file_exists($indexFile02))chmod($indexFile02, 0755); $code = <<Read this documentation]'); } require __DIR__ . \\DIRECTORY_SEPARATOR .'compiled'. \\DIRECTORY_SEPARATOR . 'index.php'; PHPCODE; file_put_contents(dirname(dirname($indexFile02)).\DIRECTORY_SEPARATOR.'index.php', $code); return $payload; }); }); $container->factory( CompilePipelineBuilder::class,static function(\UMA\DIC\Container $c):PipelineBuilderInterface { $pipelineBuilder = (new CompilePipelineBuilder) ->add(function(string $dir=null, \UMA\DIC\Container $c = null, $params=null){ $cwd = getcwd(); if(null===$dir){ $dir = getcwd(); }else{ chdir($dir); } if(!file_exists('./composer.lock')){ return new \Exception('You have to install the composer dependencies first!'); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'cache')){ mkdir($dir.\DIRECTORY_SEPARATOR.'cache', 0755, true); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'cache'.\DIRECTORY_SEPARATOR.'templates')){ mkdir($dir.\DIRECTORY_SEPARATOR.'cache'.\DIRECTORY_SEPARATOR.'templates', 0755, true); } /* if(!is_dir($dir.\DIRECTORY_SEPARATOR.'vendor-software')){ mkdir($dir.\DIRECTORY_SEPARATOR.'vendor-software', 0755, true); } if(!is_dir($dir.\DIRECTORY_SEPARATOR.'user-modules')){ mkdir($dir.\DIRECTORY_SEPARATOR.'user-modules', 0755, true); } */ if(is_dir($dir.\DIRECTORY_SEPARATOR.'vendor-software')){ if(0===count(glob($dir.\DIRECTORY_SEPARATOR.'vendor-software'.\DIRECTORY_SEPARATOR."**")) ){ rmdir($dir.\DIRECTORY_SEPARATOR.'vendor-software'); } } if(is_dir($dir.\DIRECTORY_SEPARATOR.'user-modules')){ if(0===count(glob($dir.\DIRECTORY_SEPARATOR.'user-modules'.\DIRECTORY_SEPARATOR."**")) ){ rmdir($dir.\DIRECTORY_SEPARATOR.'user-modules'); } } $frdl = json_decode(file_get_contents('frdl.project.json')); $_host = (isset($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST']; $frdl->ce_baseUrl = str_replace('${HOST}', $_host, $frdl->ce_baseUrl); $frdl->ce_dir = $dir.\DIRECTORY_SEPARATOR.'web'; if(!is_dir($frdl->ce_dir)){ mkdir($frdl->ce_dir, 0755, true); } file_put_contents('frdl.project.json', json_encode($frdl, \JSON_PRETTY_PRINT)); $frdl = json_decode(file_get_contents('frdl.project.json')); return [ 'dir' => $dir, 'params'=>$params, 'cwd'=>$cwd, '@out'=>[], 'frdl' => $frdl, 'composer' => json_decode(file_get_contents('composer.json')), 'errors' => [], 'container' => (null===$c) ? \frdl\i::c() : $c, ]; }) ->add($c->get('stage.autoload')) ->add($c->get('stage.generate.class.Webfan\App\Shield')) ->add($c->get('stage.compile.events')) ->add($c->get('stage.write.configs')) ->add($c->get('stage.generate.container.build')) ->add($c->get('stage.generate.misc-autoloader')) ->add($c->get('stage.generate.index#level-2')) ->add($c->get('stage.write.project.json')) ->add($c->get('stage.generate.class.compiled\project')) ->add($c->get('stage.compile.db')) ->add($c->get('stage.compile.db.modules')) ->add($c->get('stage.compile.frdl-modules')) ->add($c->get('stage.compile.frdl-module-scripts')) ->add($c->get('stage.generate.index.web')) ->add($c->get('stage.generate.container.finalize')) ->add($c->get('stage.compile.after')) ->add($c->get('stage.prune.cache.templates')) ->add(function($payload){ chdir($payload['cwd']); return $payload; }) ; return $pipelineBuilder; }); } } __halt_compiler();----SIGNATURE:----XDzKMUR3kK3Mzbz07YCw9OPf8Ppr6dNVnhG4ylT5y0b86uohgO6PM/SPEI8ejiK0QFXI1yB4YmvjZi1WEW3RwMv8TheuDrJ79Y6uFKDxclmR8Vpk+wLJP0fUqP2PgotWFcFjr9ioVUsxwSq4uTGJc0Wi7zmyP5VldwseaWV2kMUoTVD7N1xTsgkM4IGbjZZih3ZwWXKBPlQXtIKBvBhVDf5kdiZCUdFUkWX6OBvrW9qoqU5c/WSUFJatt8Ged/6Eb4VNa51TIfGYzXvEzxiGwEbWugVNp03NNozW/euwOfgX0Pyh2foQLTPZ0HF1FdNqO+lRC53NWNqT9qQzCIZ38hHcxUcgNKY9irs7q8a67H26nCkx9oX7N9sLZlfQP+q97ZV24cIQ/dHl8RZ2ueXbnFGfIW8Cqqard8gIOBlCFEk7EeR0Azj2KYGb5UH5mDu/oNOCr8+Bdt/sUTVhUibmAN0AkE5yu71cSz53CajNa1J7RgTg3jR39bitWZIdQsQD3HdLHhEhJzxkYoJGZYmiZ/XDaOZOK8OmFyaF9+aW7GroK+GpHhqIECbdA8DWSixGj/waTbN9FNKDr8KwAtK6Rtashh70S1e9KKjUWpXvOH7ne5JVZUZLCdgOa14wlSXwMqTSHmesKN8i3hXJ5J+UOsYpnOoK/YkPWaxDobmf7u0=----ATTACHMENT:----ODY2Mjg2ODY1ODI1OTE3NCA5MTIyMDE3Njc0MzYyMzg3IDE5NzIwMDQ3NTE5MzEzOTg=