From 01bdfcca33ba5f8bd27dcb47ef8f3086c0856bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Klabbers?= Date: Tue, 26 Jul 2022 02:24:56 +0200 Subject: [PATCH] wip --- .../core/src/Admin/AdminServiceProvider.php | 42 +++++++-- framework/core/src/Extend/Frontend.php | 4 +- .../core/src/Forum/ForumServiceProvider.php | 35 ++++++- .../core/src/Frontend/AddLocaleAssets.php | 24 +++-- .../core/src/Frontend/AddTranslations.php | 16 ++-- .../src/Frontend/Asset/AssetCollection.php | 22 +++++ framework/core/src/Frontend/Asset/Css.php | 10 ++ framework/core/src/Frontend/Asset/Js.php | 10 ++ framework/core/src/Frontend/Asset/Type.php | 81 +++++++++++++++++ framework/core/src/Frontend/Assets.php | 91 ++++--------------- .../core/src/Frontend/Content/Assets.php | 19 +++- .../src/Frontend/FrontendServiceProvider.php | 12 ++- .../src/Frontend/RecompileFrontendAssets.php | 17 ++-- 13 files changed, 265 insertions(+), 118 deletions(-) create mode 100644 framework/core/src/Frontend/Asset/AssetCollection.php create mode 100644 framework/core/src/Frontend/Asset/Css.php create mode 100644 framework/core/src/Frontend/Asset/Js.php create mode 100644 framework/core/src/Frontend/Asset/Type.php diff --git a/framework/core/src/Admin/AdminServiceProvider.php b/framework/core/src/Admin/AdminServiceProvider.php index c5563aace..58139cb9e 100644 --- a/framework/core/src/Admin/AdminServiceProvider.php +++ b/framework/core/src/Admin/AdminServiceProvider.php @@ -19,6 +19,9 @@ use Flarum\Foundation\ErrorHandling\WhoopsFormatter; use Flarum\Foundation\Event\ClearingCache; use Flarum\Frontend\AddLocaleAssets; use Flarum\Frontend\AddTranslations; +use Flarum\Frontend\Asset\Css; +use Flarum\Frontend\Asset\Js; +use Flarum\Frontend\Asset\Type; use Flarum\Frontend\Compiler\Source\SourceCollector; use Flarum\Frontend\RecompileFrontendAssets; use Flarum\Http\Middleware as HttpMiddleware; @@ -94,16 +97,41 @@ class AdminServiceProvider extends AbstractServiceProvider /** @var \Flarum\Frontend\Assets $assets */ $assets = $container->make('flarum.assets.factory')('admin'); - $assets->js(function (SourceCollector $sources) { + $assets->addAsset((new Js('admin.js'))->addSource(function (SourceCollector $sources) { $sources->addFile(__DIR__.'/../../js/dist/admin.js'); - }); + })); - $assets->css(function (SourceCollector $sources) { - $sources->addFile(__DIR__.'/../../less/admin.less'); - }); + $assets->getAssets() + ->ofType('css') + ->first() + ->addSource(function (SourceCollector $sources) { + $sources->addFile(__DIR__ . '/../../less/admin.less'); + }); - $container->make(AddTranslations::class)->forFrontend('admin')->to($assets); - $container->make(AddLocaleAssets::class)->to($assets); + /** @var LocaleManager $locales */ + $locales = $container[LocaleManager::class]; + + /** @var AddLocaleAssets $addLocaleAssets */ + $addLocaleAssets = $container->make(AddLocaleAssets::class); + + foreach ($locales->getLocales() as $locale => $_) { + $localeJs = new Js("admin-$locale.js", $locale); + $localeJs + ->addSource([$container->make(AddTranslations::class)->forFrontend('admin'), 'getSources']) + ->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) { + $addLocaleAssets->getLocaleJs($collector, $locale); + }); + + $assets->addAsset($localeJs); + + $localeCss = new Css("admin-$locale.css", $locale); + $localeCss + ->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) { + $addLocaleAssets->getLocaleCss($collector, $locale); + }); + + $assets->addAsset($localeCss); + } return $assets; }); diff --git a/framework/core/src/Extend/Frontend.php b/framework/core/src/Extend/Frontend.php index f44d2ee43..4d59da3de 100644 --- a/framework/core/src/Extend/Frontend.php +++ b/framework/core/src/Extend/Frontend.php @@ -189,7 +189,7 @@ class Frontend implements ExtenderInterface $container->resolving($abstract, function (Assets $assets) use ($moduleName) { if ($this->js) { - $assets->js(function (SourceCollector $sources) use ($moduleName) { + $assets->getAssets()->ofType('js')->first()->addSource(function (SourceCollector $sources) use ($moduleName) { $sources->addString(function () { return 'var module={};'; }); @@ -201,7 +201,7 @@ class Frontend implements ExtenderInterface } if ($this->css) { - $assets->css(function (SourceCollector $sources) use ($moduleName) { + $assets->getAssets()->ofType('css')->first()->addSource(function (SourceCollector $sources) use ($moduleName) { foreach ($this->css as $path) { $sources->addFile($path, $moduleName); } diff --git a/framework/core/src/Forum/ForumServiceProvider.php b/framework/core/src/Forum/ForumServiceProvider.php index 57579e410..27cb41704 100644 --- a/framework/core/src/Forum/ForumServiceProvider.php +++ b/framework/core/src/Forum/ForumServiceProvider.php @@ -20,6 +20,9 @@ use Flarum\Foundation\ErrorHandling\WhoopsFormatter; use Flarum\Foundation\Event\ClearingCache; use Flarum\Frontend\AddLocaleAssets; use Flarum\Frontend\AddTranslations; +use Flarum\Frontend\Asset\Css; +use Flarum\Frontend\Asset\Js; +use Flarum\Frontend\Asset\Type; use Flarum\Frontend\Assets; use Flarum\Frontend\Compiler\Source\SourceCollector; use Flarum\Frontend\RecompileFrontendAssets; @@ -106,22 +109,44 @@ class ForumServiceProvider extends AbstractServiceProvider /** @var Assets $assets */ $assets = $container->make('flarum.assets.factory')('forum'); - $assets->js(function (SourceCollector $sources) use ($container) { + $assets->addAsset((new Js('forum.js'))->addSource(function (SourceCollector $sources) use ($container) { $sources->addFile(__DIR__.'/../../js/dist/forum.js'); $sources->addString(function () use ($container) { return $container->make(Formatter::class)->getJs(); }); - }); + })); - $assets->css(function (SourceCollector $sources) use ($container) { + $assets->getAssets()->ofType('css')->first()->addSource(function (SourceCollector $sources) use ($container) { $sources->addFile(__DIR__.'/../../less/forum.less'); $sources->addString(function () use ($container) { return $container->make(SettingsRepositoryInterface::class)->get('custom_less', ''); }); }); - $container->make(AddTranslations::class)->forFrontend('forum')->to($assets); - $container->make(AddLocaleAssets::class)->to($assets); + /** @var LocaleManager $locales */ + $locales = $container[LocaleManager::class]; + + /** @var AddLocaleAssets $addLocaleAssets */ + $addLocaleAssets = $container->make(AddLocaleAssets::class); + + foreach ($locales->getLocales() as $locale => $_) { + $localeJs = new Js("forum-$locale.js", $locale); + $localeJs + ->addSource([$container->make(AddTranslations::class)->forFrontend('forum'), 'getSources']) + ->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) { + $addLocaleAssets->getLocaleJs($collector, $locale); + }); + + $assets->addAsset($localeJs); + + $localeCss = new Css("forum-$locale.css", $locale); + $localeCss + ->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) { + $addLocaleAssets->getLocaleCss($collector, $locale); + }); + + $assets->addAsset($localeCss); + } return $assets; }); diff --git a/framework/core/src/Frontend/AddLocaleAssets.php b/framework/core/src/Frontend/AddLocaleAssets.php index 8dc089db4..e020ee064 100644 --- a/framework/core/src/Frontend/AddLocaleAssets.php +++ b/framework/core/src/Frontend/AddLocaleAssets.php @@ -32,16 +32,20 @@ class AddLocaleAssets public function to(Assets $assets) { - $assets->localeJs(function (SourceCollector $sources, string $locale) { - foreach ($this->locales->getJsFiles($locale) as $file) { - $sources->addFile($file); - } - }); + $assets->localeJs([$this, 'getLocaleJs']); - $assets->localeCss(function (SourceCollector $sources, string $locale) { - foreach ($this->locales->getCssFiles($locale) as $file) { - $sources->addFile($file); - } - }); + $assets->localeCss([$this, 'getLocaleCss']); + } + + public function getLocaleJs(SourceCollector $sources, string $locale) { + foreach ($this->locales->getJsFiles($locale) as $file) { + $sources->addFile($file); + } + } + + public function getLocaleCss(SourceCollector $sources, string $locale) { + foreach ($this->locales->getCssFiles($locale) as $file) { + $sources->addFile($file); + } } } diff --git a/framework/core/src/Frontend/AddTranslations.php b/framework/core/src/Frontend/AddTranslations.php index 139724e1d..d7b581a9a 100644 --- a/framework/core/src/Frontend/AddTranslations.php +++ b/framework/core/src/Frontend/AddTranslations.php @@ -43,15 +43,17 @@ class AddTranslations return $this; } + public function getSources(SourceCollector $sources, string $locale) { + $sources->addString(function () use ($locale) { + $translations = $this->getTranslations($locale); + + return 'flarum.core.app.translator.addTranslations('.json_encode($translations).')'; + }); + } + public function to(Assets $assets) { - $assets->localeJs(function (SourceCollector $sources, string $locale) { - $sources->addString(function () use ($locale) { - $translations = $this->getTranslations($locale); - - return 'flarum.core.app.translator.addTranslations('.json_encode($translations).')'; - }); - }); + $assets->localeJs([$this, 'getSources']); } private function getTranslations(string $locale) diff --git a/framework/core/src/Frontend/Asset/AssetCollection.php b/framework/core/src/Frontend/Asset/AssetCollection.php new file mode 100644 index 000000000..86e325cfa --- /dev/null +++ b/framework/core/src/Frontend/Asset/AssetCollection.php @@ -0,0 +1,22 @@ + Css::class, + 'js' => Js::class, + ]; + + public function ofType(string $type) + { + $type = $this->quickMap[$type] ?? $type; + + return $this->filter(function (Type $asset) use ($type) { + return $asset instanceof $type; + }); + } +} diff --git a/framework/core/src/Frontend/Asset/Css.php b/framework/core/src/Frontend/Asset/Css.php new file mode 100644 index 000000000..d4ee90745 --- /dev/null +++ b/framework/core/src/Frontend/Asset/Css.php @@ -0,0 +1,10 @@ +filename = $filename; + $this->locale = $locale; + } + + public function addSource(callable $source) + { + $this->sources[] = $source; + + return $this; + } + + public function getSources(): array + { + return $this->sources; + } + + public function setSources(array $sources): static + { + $this->sources = $sources; + + return $this; + } + + public function sources(): array + { + $collector = new SourceCollector; + + foreach ($this->sources as $source) { + $source($collector); + } + + return $collector->getSources(); + } + + public function getFilename(): string + { + return $this->filename; + } + + public function getCompilerClass(): string + { + return $this->compilerClass; + } + + public function setCompiler(CompilerInterface $compiler): static + { + $compiler->addSources(function (SourceCollector $sources) { + foreach ($this->sources as $callback) { + $callback($sources, $this->locale); + } + }); + + $this->compiler = $compiler; + + return $this; + } + + public function getCompiler(): CompilerInterface + { + return $this->compiler; + } +} diff --git a/framework/core/src/Frontend/Assets.php b/framework/core/src/Frontend/Assets.php index 95d91f2ea..e32091655 100644 --- a/framework/core/src/Frontend/Assets.php +++ b/framework/core/src/Frontend/Assets.php @@ -9,10 +9,10 @@ namespace Flarum\Frontend; -use Flarum\Frontend\Compiler\CompilerInterface; +use Flarum\Frontend\Asset\AssetCollection; +use Flarum\Frontend\Asset\Type; use Flarum\Frontend\Compiler\JsCompiler; use Flarum\Frontend\Compiler\LessCompiler; -use Flarum\Frontend\Compiler\Source\SourceCollector; use Illuminate\Contracts\Filesystem\Filesystem; /** @@ -66,6 +66,10 @@ class Assets * @var array */ protected $customFunctions = []; + /** + * @var array|Type[] + */ + protected array $assets = []; public function __construct(string $name, Filesystem $assetsDir, string $cacheDir = null, array $lessImportDirs = null, array $customFunctions = []) { @@ -76,85 +80,26 @@ class Assets $this->customFunctions = $customFunctions; } - public function js($sources) + public function addAsset(Type $asset): static { - $this->addSources('js', $sources); + $this->assets[$asset->getFilename()] = $asset; return $this; } - public function css($callback) + public function getAssets(): AssetCollection { - $this->addSources('css', $callback); - - return $this; + return AssetCollection::make($this->assets) + ->each(function (Type $asset) { + $asset->setCompiler( + $asset->getCompilerClass() === JsCompiler::class + ? $this->makeJsCompiler($asset->getFilename()) + : $this->makeLessCompiler($asset->getFilename()) + ); + }); } - public function localeJs($callback) - { - $this->addSources('localeJs', $callback); - - return $this; - } - - public function localeCss($callback) - { - $this->addSources('localeCss', $callback); - - return $this; - } - - private function addSources($type, $callback) - { - $this->sources[$type][] = $callback; - } - - private function populate(CompilerInterface $compiler, string $type, string $locale = null) - { - $compiler->addSources(function (SourceCollector $sources) use ($type, $locale) { - foreach ($this->sources[$type] as $callback) { - $callback($sources, $locale); - } - }); - } - - public function makeJs(): JsCompiler - { - $compiler = $this->makeJsCompiler($this->name.'.js'); - - $this->populate($compiler, 'js'); - - return $compiler; - } - - public function makeCss(): LessCompiler - { - $compiler = $this->makeLessCompiler($this->name.'.css'); - - $this->populate($compiler, 'css'); - - return $compiler; - } - - public function makeLocaleJs(string $locale): JsCompiler - { - $compiler = $this->makeJsCompiler($this->name.'-'.$locale.'.js'); - - $this->populate($compiler, 'localeJs', $locale); - - return $compiler; - } - - public function makeLocaleCss(string $locale): LessCompiler - { - $compiler = $this->makeLessCompiler($this->name.'-'.$locale.'.css'); - - $this->populate($compiler, 'localeCss', $locale); - - return $compiler; - } - - protected function makeJsCompiler(string $filename) + protected function makeJsCompiler(string $filename): JsCompiler { return new JsCompiler($this->assetsDir, $filename); } diff --git a/framework/core/src/Frontend/Content/Assets.php b/framework/core/src/Frontend/Content/Assets.php index b5f852415..920bf4629 100644 --- a/framework/core/src/Frontend/Content/Assets.php +++ b/framework/core/src/Frontend/Content/Assets.php @@ -10,6 +10,9 @@ namespace Flarum\Frontend\Content; use Flarum\Foundation\Config; +use Flarum\Frontend\Asset\Css; +use Flarum\Frontend\Asset\Js; +use Flarum\Frontend\Asset\Type; use Flarum\Frontend\Compiler\CompilerInterface; use Flarum\Frontend\Document; use Illuminate\Contracts\Container\Container; @@ -74,9 +77,21 @@ class Assets */ protected function assembleCompilers(?string $locale): array { + $assets = $this->assets->getAssets(); + return [ - 'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)], - 'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)] + 'js' => $assets + ->ofType('js') + ->map(function (Type $asset) { + return $asset->getCompiler(); + }) + ->toArray(), + 'css' => $assets + ->ofType('css') + ->map(function (Type $asset) { + return $asset->getCompiler(); + }) + ->toArray(), ]; } diff --git a/framework/core/src/Frontend/FrontendServiceProvider.php b/framework/core/src/Frontend/FrontendServiceProvider.php index bcb5a11bd..3a4d4a3ed 100644 --- a/framework/core/src/Frontend/FrontendServiceProvider.php +++ b/framework/core/src/Frontend/FrontendServiceProvider.php @@ -11,11 +11,13 @@ namespace Flarum\Frontend; use Flarum\Foundation\AbstractServiceProvider; use Flarum\Foundation\Paths; +use Flarum\Frontend\Asset\Css; use Flarum\Frontend\Compiler\Source\SourceCollector; use Flarum\Frontend\Driver\BasicTitleDriver; use Flarum\Frontend\Driver\TitleDriverInterface; use Flarum\Http\SlugManager; use Flarum\Http\UrlGenerator; +use Flarum\Locale\LocaleManager; use Flarum\Settings\SettingsRepositoryInterface; use Illuminate\Contracts\Container\Container; use Illuminate\Contracts\View\Factory as ViewFactory; @@ -40,8 +42,14 @@ class FrontendServiceProvider extends AbstractServiceProvider $paths->vendor.'/components/font-awesome/less' => '' ]); - $assets->css([$this, 'addBaseCss']); - $assets->localeCss([$this, 'addBaseCss']); + $assets->addAsset((new Css("$name.css", null))->addSource([$this, 'addBaseCss'])); + + /** @var LocaleManager $locales */ + $locales = $container[LocaleManager::class]; + + foreach ($locales->getLocales() as $locale => $_) { + $assets->addAsset((new Css("$name-$locale.css", $locale))->addSource([$this, 'addBaseCss'])); + } return $assets; }; diff --git a/framework/core/src/Frontend/RecompileFrontendAssets.php b/framework/core/src/Frontend/RecompileFrontendAssets.php index 0c4614957..4a79ef912 100644 --- a/framework/core/src/Frontend/RecompileFrontendAssets.php +++ b/framework/core/src/Frontend/RecompileFrontendAssets.php @@ -9,6 +9,7 @@ namespace Flarum\Frontend; +use Flarum\Frontend\Asset\Type; use Flarum\Locale\LocaleManager; use Flarum\Settings\Event\Saved; @@ -53,19 +54,15 @@ class RecompileFrontendAssets protected function flushCss() { - $this->assets->makeCss()->flush(); - - foreach ($this->locales->getLocales() as $locale => $name) { - $this->assets->makeLocaleCss($locale)->flush(); - } + $this->assets->getAssets()->ofType('css')->each(function (Type $asset) { + $asset->getCompiler()->commit(); + }); } protected function flushJs() { - $this->assets->makeJs()->flush(); - - foreach ($this->locales->getLocales() as $locale => $name) { - $this->assets->makeLocaleJs($locale)->flush(); - } + $this->assets->getAssets()->ofType('js')->each(function (Type $asset) { + $asset->getCompiler()->commit(); + }); } }