diff --git a/Build/sites/main/config.yaml b/Build/sites/main/config.yaml new file mode 100644 index 0000000..f1cfaaa --- /dev/null +++ b/Build/sites/main/config.yaml @@ -0,0 +1,20 @@ +base: 'http://localhost/' +baseVariants: { } +errorHandling: { } +languages: + - + title: english + enabled: true + base: / + typo3Language: default + locale: en_US.UTF-8 + iso-639-1: en + navigationTitle: '' + hreflang: '' + direction: '' + flag: global + languageId: '0' + websiteTitle: '' +rootPageId: 1 +routes: { } +websiteTitle: 'Testing' diff --git a/Classes/AssetCollector.php b/Classes/AssetCollector.php index 0cc3857..448d953 100644 --- a/Classes/AssetCollector.php +++ b/Classes/AssetCollector.php @@ -1,5 +1,6 @@ cssFiles[] = GeneralUtility::getFileAbsFileName($cssFile); } - /** - * @param string $fileName - * @param string $mediaType - */ public function addExternalCssFile(string $fileName, string $mediaType = 'all'): void { // Only add external css file if not added already. @@ -94,7 +63,7 @@ public function addJavaScriptFile(string $fileName, array $additionalAttributes } $this->jsFiles[] = [ 'fileName' => $fileName, - 'additionalAttributes' => $additionalAttributes + 'additionalAttributes' => $additionalAttributes, ]; } @@ -161,9 +130,8 @@ public function buildInlineCssTag(): string if (trim($inlineCss) !== '') { $compressor = GeneralUtility::makeInstance(ResourceCompressor::class); return ''; - } else { - return ''; } + return ''; } public function buildJavaScriptIncludes(): string @@ -196,7 +164,6 @@ public function buildInlineXmlTag(): string $xmlFiles = $this->getUniqueXmlFiles(); foreach ($xmlFiles as $xmlFile) { if (file_exists($xmlFile)) { - $iconIdentifier = $this->getIconIdentifierFromFileName($xmlFile); $svgInline = ''; $xmlContent = new \DOMDocument(); @@ -214,7 +181,6 @@ public function buildInlineXmlTag(): string $inlineXml .= '' . $svgInline . ''; - } } if (trim($inlineXml) !== '') { @@ -223,9 +189,8 @@ public function buildInlineXmlTag(): string . '' . $inlineXml . ''; - } else { - return ''; } + return ''; } protected function removeUtf8Bom(string $text): string @@ -254,23 +219,18 @@ public function getTypoScriptValue(string $name): string protected function loadTypoScript(): void { - $this->typoScriptConfiguration = $this->getExtbaseFrameworkConfiguration() ?? []; + $this->typoScriptConfiguration = []; + $frontendController = $this->getTypoScriptFrontendController(); + if ($frontendController !== null) { + $this->typoScriptConfiguration = $frontendController->tmpl->setup['plugin.']['tx_assetcollector.']['icons.'] ?? []; + } } - protected function getExtbaseFrameworkConfiguration(): ?array + protected function getTypoScriptFrontendController(): ?TypoScriptFrontendController { - $objectManager = GeneralUtility::makeInstance(ObjectManager::class); - $configurationManager = $objectManager->get(ConfigurationManager::class); - try { - $extbaseFrameworkConfiguration = $configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); - if (is_array($extbaseFrameworkConfiguration['plugin.']['tx_assetcollector.']['icons.'])) { - return $extbaseFrameworkConfiguration['plugin.']['tx_assetcollector.']['icons.']; - } - } catch (\TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException $e) { - + if (($GLOBALS['TSFE'] ?? null) instanceof TypoScriptFrontendController) { + return $GLOBALS['TSFE']; } return null; - } - } diff --git a/Classes/Hooks/AssetRenderer.php b/Classes/Hooks/AssetRenderer.php index c280319..96b7d60 100644 --- a/Classes/Hooks/AssetRenderer.php +++ b/Classes/Hooks/AssetRenderer.php @@ -1,5 +1,6 @@ render-postProcess(). Get this: * @@ -134,7 +134,7 @@ public function collectInlineAssets($params, TypoScriptFrontendController $front 'jsFiles' => $assetCollector->getJavaScriptFiles(), 'cssFiles' => $assetCollector->getUniqueCssFiles(), 'inlineCss' => $assetCollector->getUniqueInlineCss(), - 'xmlFiles' => $assetCollector->getUniqueXmlFiles() + 'xmlFiles' => $assetCollector->getUniqueXmlFiles(), ]; $frontendController->config['b13/assetcollector'] = $cached; } @@ -158,8 +158,7 @@ protected function getTypoScriptFrontendController(): ?TypoScriptFrontendControl { if (($GLOBALS['TSFE'] ?? null) instanceof TypoScriptFrontendController) { return $GLOBALS['TSFE']; - } else { - return null; } + return null; } } diff --git a/Classes/Listener/AfterCacheableContentIsGenerated.php b/Classes/Listener/AfterCacheableContentIsGenerated.php new file mode 100644 index 0000000..3524af4 --- /dev/null +++ b/Classes/Listener/AfterCacheableContentIsGenerated.php @@ -0,0 +1,32 @@ +assetRenderer = $assetRenderer; + } + + public function __invoke(AfterCacheableContentIsGeneratedEvent $event) + { + $frontendController = $event->getController(); + $this->assetRenderer->collectInlineAssets([], $frontendController); + } +} diff --git a/Classes/Middleware/InlineSvgInjector.php b/Classes/Middleware/InlineSvgInjector.php index d93344d..36da02c 100644 --- a/Classes/Middleware/InlineSvgInjector.php +++ b/Classes/Middleware/InlineSvgInjector.php @@ -1,5 +1,6 @@ tag. @@ -47,7 +48,6 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $body->write($content); $response = $response->withBody($body); } - } return $response; } @@ -82,5 +82,4 @@ protected function getTypoScriptFrontendController(): ?TypoScriptFrontendControl { return $GLOBALS['TSFE'] ?? null; } - } diff --git a/Classes/Resource/ResourceCompressor.php b/Classes/Resource/ResourceCompressor.php index 38bb3db..7be6119 100644 --- a/Classes/Resource/ResourceCompressor.php +++ b/Classes/Resource/ResourceCompressor.php @@ -1,5 +1,6 @@ compressCssString($content); diff --git a/Classes/ViewHelpers/CssViewHelper.php b/Classes/ViewHelpers/CssViewHelper.php index 4291553..8946ace 100644 --- a/Classes/ViewHelpers/CssViewHelper.php +++ b/Classes/ViewHelpers/CssViewHelper.php @@ -1,5 +1,6 @@ assetCollector = $assetCollector; } @@ -44,7 +39,6 @@ public function initializeArguments(): void 'external', 'boolean', 'Specifies if the given CSS file should be loaded within link tag.' - ); $this->registerArgument( 'media', diff --git a/Classes/ViewHelpers/JsViewHelper.php b/Classes/ViewHelpers/JsViewHelper.php index 214a7c0..a473647 100644 --- a/Classes/ViewHelpers/JsViewHelper.php +++ b/Classes/ViewHelpers/JsViewHelper.php @@ -1,5 +1,6 @@ assetCollector = $assetCollector; } - /** - * @return void - * @api - */ public function initializeArguments(): void { parent::initializeArguments(); @@ -51,16 +41,12 @@ public function initializeArguments(): void ); } - /** - * @return void - */ public function render(): void { if (!empty($this->arguments['file'])) { $this->assetCollector->addJavaScriptFile($this->arguments['file'], $this->arguments['additionalAttributes']); - } else { - // @todo - // $this->assetCollector->addInlineJavaScript($this->renderChildren()); } + // @todo + // $this->assetCollector->addInlineJavaScript($this->renderChildren()); } } diff --git a/Classes/ViewHelpers/SvgViewHelper.php b/Classes/ViewHelpers/SvgViewHelper.php index 2ce0f37..f1130c1 100644 --- a/Classes/ViewHelpers/SvgViewHelper.php +++ b/Classes/ViewHelpers/SvgViewHelper.php @@ -1,5 +1,6 @@ assetCollector = $assetCollector; } - /** - * @return void - * @api - */ public function initializeArguments(): void { parent::initializeArguments(); @@ -59,9 +49,6 @@ public function initializeArguments(): void ); } - /** - * @return String rendered tag - */ public function render(): string { $file = ''; @@ -83,6 +70,5 @@ public function render(): string $this->tag->setContent($content); return $this->tag->render(); - } } diff --git a/Configuration/RequestMiddlewares.php b/Configuration/RequestMiddlewares.php index d93046b..dcce005 100644 --- a/Configuration/RequestMiddlewares.php +++ b/Configuration/RequestMiddlewares.php @@ -1,11 +1,12 @@ [ 'b13/assetcollector' => [ 'target' => \B13\Assetcollector\Middleware\InlineSvgInjector::class, 'after' => [ - 'typo3/cms-frontend/content-length-headers' - ] - ] - ] + 'typo3/cms-frontend/content-length-headers', + ], + ], + ], ]; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml new file mode 100644 index 0000000..2414f95 --- /dev/null +++ b/Configuration/Services.yaml @@ -0,0 +1,13 @@ +services: + _defaults: + autowire: true + autoconfigure: true + public: false + + B13\Assetcollector\: + resource: '../Classes/*' + + B13\Assetcollector\Listener\AfterCacheableContentIsGenerated: + tags: + - name: event.listener + identifier: 'b13-assetcollector-after-cacheable-content-is-generated' \ No newline at end of file diff --git a/Tests/Functional/Frontend/AbstractFrontendTest.php b/Tests/Functional/Frontend/AbstractFrontendTest.php new file mode 100644 index 0000000..f130ff9 --- /dev/null +++ b/Tests/Functional/Frontend/AbstractFrontendTest.php @@ -0,0 +1,33 @@ + 'typo3conf/sites']; + + protected function executeFrontendRequestWrapper(InternalRequest $request, InternalRequestContext $context = null, bool $followRedirects = false): ResponseInterface + { + if ((GeneralUtility::makeInstance(Typo3Version::class))->getMajorVersion() < 11) { + return $this->executeFrontendRequest($request, $context, $followRedirects); + } + return $this->executeFrontendSubRequest($request, $context, $followRedirects); + } +} diff --git a/Tests/Functional/Frontend/Fixtures/Templates/InlineCss.html b/Tests/Functional/Frontend/Fixtures/Templates/InlineCss.html new file mode 100644 index 0000000..be3577d --- /dev/null +++ b/Tests/Functional/Frontend/Fixtures/Templates/InlineCss.html @@ -0,0 +1,9 @@ + + + h1 { color: red; } + + diff --git a/Tests/Functional/Frontend/Fixtures/inline_css.csv b/Tests/Functional/Frontend/Fixtures/inline_css.csv new file mode 100644 index 0000000..854fe5c --- /dev/null +++ b/Tests/Functional/Frontend/Fixtures/inline_css.csv @@ -0,0 +1,10 @@ +"pages" +,"uid","pid","title","slug" +,1,0,"root","/" +"sys_template" +,"uid","pid","root","config" +,1,1,1,"page = PAGE +page.10 = FLUIDTEMPLATE +page.10.templateRootPaths.10 = EXT:assetcollector/Tests/Functional/Frontend/Fixtures/Templates +page.10.templateName = InlineCss.html +" diff --git a/Tests/Functional/Frontend/InlineCssTest.php b/Tests/Functional/Frontend/InlineCssTest.php new file mode 100644 index 0000000..812ba32 --- /dev/null +++ b/Tests/Functional/Frontend/InlineCssTest.php @@ -0,0 +1,28 @@ +importCSVDataSet(ORIGINAL_ROOT . 'typo3conf/ext/assetcollector/Tests/Functional/Frontend/Fixtures/inline_css.csv'); + $response = $this->executeFrontendRequestWrapper(new InternalRequest('http://localhost/')); + $expected = '