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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -18,7 +18,14 @@ use Psr\Http\Message\ServerRequestInterface as Request;
class Assets
{
/**
* @var Container
*/
protected $container;
/**
* @var Config
*/
protected $config;
/**
@ -32,26 +39,56 @@ class Assets
$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);
return $this;
}
public function __invoke(Document $document, Request $request)
public function __invoke(Document $document, Request $request): void
{
$locale = $request->getAttribute('locale');
$compilers = [
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
];
$compilers = $this->assembleCompilers($locale);
if ($this->config->inDebugMode()) {
$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->css = array_merge($document->css, $this->getUrls($compilers['css']));
}
@ -61,7 +98,7 @@ class Assets
*
* @param array $compilers
*/
private function forceCommit(array $compilers)
protected function forceCommit(array $compilers): void
{
/** @var CompilerInterface $compiler */
foreach ($compilers as $compiler) {
@ -70,10 +107,12 @@ class Assets
}
/**
* Maps provided {@link CompilerInterface}s to their URLs.
*
* @param CompilerInterface[] $compilers
* @return string[]
*/
private function getUrls(array $compilers)
protected function getUrls(array $compilers): array
{
return array_filter(array_map(function (CompilerInterface $compiler) {
return $compiler->getUrl();