1
0
mirror of https://github.com/flarum/core.git synced 2025-07-24 02:01:19 +02:00

feat: split frontend asset generation into separate steps for more extensibility (#3446)

This commit is contained in:
David Wheatley
2022-06-19 22:58:05 +01:00
committed by GitHub
parent 79e0f44324
commit 1d949a3170

View File

@@ -18,7 +18,14 @@ use Psr\Http\Message\ServerRequestInterface as Request;
class Assets class Assets
{ {
/**
* @var Container
*/
protected $container; protected $container;
/**
* @var Config
*/
protected $config; protected $config;
/** /**
@@ -32,26 +39,56 @@ class Assets
$this->config = $config; $this->config = $config;
} }
public function forFrontend(string $name) /**
* Sets the frontend to generate assets for.
*
* @param string $name frontend name
* @return $this
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
public function forFrontend(string $name): Assets
{ {
$this->assets = $this->container->make('flarum.assets.'.$name); $this->assets = $this->container->make('flarum.assets.'.$name);
return $this; return $this;
} }
public function __invoke(Document $document, Request $request) public function __invoke(Document $document, Request $request): void
{ {
$locale = $request->getAttribute('locale'); $locale = $request->getAttribute('locale');
$compilers = [ $compilers = $this->assembleCompilers($locale);
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
];
if ($this->config->inDebugMode()) { if ($this->config->inDebugMode()) {
$this->forceCommit(Arr::flatten($compilers)); $this->forceCommit(Arr::flatten($compilers));
} }
$this->addAssetsToDocument($document, $compilers);
}
/**
* Assembles JS and CSS compilers to be used to generate frontend assets.
*
* @param string|null $locale
* @return array[]
*/
protected function assembleCompilers(?string $locale): array
{
return [
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
];
}
/**
* Adds URLs of frontend JS and CSS to the {@link Document} class.
*
* @param Document $document
* @param array $compilers
* @return void
*/
protected function addAssetsToDocument(Document $document, array $compilers): void
{
$document->js = array_merge($document->js, $this->getUrls($compilers['js'])); $document->js = array_merge($document->js, $this->getUrls($compilers['js']));
$document->css = array_merge($document->css, $this->getUrls($compilers['css'])); $document->css = array_merge($document->css, $this->getUrls($compilers['css']));
} }
@@ -61,7 +98,7 @@ class Assets
* *
* @param array $compilers * @param array $compilers
*/ */
private function forceCommit(array $compilers) protected function forceCommit(array $compilers): void
{ {
/** @var CompilerInterface $compiler */ /** @var CompilerInterface $compiler */
foreach ($compilers as $compiler) { foreach ($compilers as $compiler) {
@@ -70,10 +107,12 @@ class Assets
} }
/** /**
* Maps provided {@link CompilerInterface}s to their URLs.
*
* @param CompilerInterface[] $compilers * @param CompilerInterface[] $compilers
* @return string[] * @return string[]
*/ */
private function getUrls(array $compilers) protected function getUrls(array $compilers): array
{ {
return array_filter(array_map(function (CompilerInterface $compiler) { return array_filter(array_map(function (CompilerInterface $compiler) {
return $compiler->getUrl(); return $compiler->getUrl();