Loading core/core.services.yml +1 −0 Original line number Diff line number Diff line Loading @@ -1676,6 +1676,7 @@ services: arguments: [ '@asset.js.collection_grouper', '@asset.js.optimizer', '@theme.manager', '@library.dependency_resolver', '@request_stack', '@file_system', '@config.factory', '@file_url_generator', '@datetime.time', '@language_manager', '@state'] asset.js.optimizer: class: Drupal\Core\Asset\JsOptimizer arguments: ['@logger.channel.default'] asset.js.collection_grouper: class: Drupal\Core\Asset\JsCollectionGrouper asset.js.dumper: Loading core/lib/Drupal/Core/Asset/JsOptimizer.php +32 −4 Original line number Diff line number Diff line Loading @@ -3,15 +3,26 @@ namespace Drupal\Core\Asset; use Drupal\Component\Utility\Unicode; use Drupal\Core\Utility\Error; use Peast\Formatter\Compact as CompactFormatter; use Peast\Peast; use Peast\Renderer; use Peast\Syntax\Exception as PeastSyntaxException; use Psr\Log\LoggerInterface; /** * Optimizes a JavaScript asset. */ class JsOptimizer implements AssetOptimizerInterface { /** * Constructs a new JsOptimizer object. * * @param \Psr\Log\LoggerInterface $logger * The logger. */ public function __construct(protected readonly LoggerInterface $logger) {} /** * {@inheritdoc} */ Loading @@ -34,11 +45,28 @@ public function optimize(array $js_asset) { $data = Unicode::convertToUtf8($data, $js_asset['attributes']['charset']); } // Remove comments, whitespace, and optional braces. try { $ast = Peast::latest($data)->parse(); $renderer = new Renderer(); $renderer->setFormatter(new CompactFormatter()); return $renderer->render($ast); } catch (\Exception $exception) { if ($exception instanceof PeastSyntaxException) { $position = $exception->getPosition(); Error::logException($this->logger, $exception, 'Syntax error: @message, File: @asset_file, Line: @asset_line, Column: @asset_column, Index: @asset_index', [ '@asset_file' => $js_asset['data'], '@asset_line' => $position->getLine(), '@asset_column' => $position->getColumn(), '@asset_index' => $position->getIndex(), ]); } else { Error::logException($this->logger, $exception); } return $data; } } /** * Processes the contents of a javascript asset for cleanup. Loading core/tests/Drupal/Tests/Core/Asset/JsOptimizerUnitTest.php +12 −2 Original line number Diff line number Diff line Loading @@ -24,8 +24,8 @@ class JsOptimizerUnitTest extends UnitTestCase { */ protected function setUp(): void { parent::setUp(); $this->optimizer = new JsOptimizer(); $logger = $this->createMock('\Psr\Log\LoggerInterface'); $this->optimizer = new JsOptimizer($logger); } /** Loading Loading @@ -119,6 +119,16 @@ public function providerTestOptimize() { ], file_get_contents($path . 'to_be_minified.js.optimized.js'), ], 4 => [ [ 'type' => 'file', 'preprocess' => TRUE, 'data' => $path . 'syntax_error.js', ], // When there is a syntax error, the 'optimized' contents are the // contents of the original file. file_get_contents($path . 'syntax_error.js'), ], ]; } Loading core/tests/Drupal/Tests/Core/Asset/js_test_files/syntax_error.js 0 → 100644 +13 −0 Original line number Diff line number Diff line /** * Some comments. */ (function foo() { // Missing closing parenthesis. if (true { 'print 1'; } else { 'print 2'; } }) Loading
core/core.services.yml +1 −0 Original line number Diff line number Diff line Loading @@ -1676,6 +1676,7 @@ services: arguments: [ '@asset.js.collection_grouper', '@asset.js.optimizer', '@theme.manager', '@library.dependency_resolver', '@request_stack', '@file_system', '@config.factory', '@file_url_generator', '@datetime.time', '@language_manager', '@state'] asset.js.optimizer: class: Drupal\Core\Asset\JsOptimizer arguments: ['@logger.channel.default'] asset.js.collection_grouper: class: Drupal\Core\Asset\JsCollectionGrouper asset.js.dumper: Loading
core/lib/Drupal/Core/Asset/JsOptimizer.php +32 −4 Original line number Diff line number Diff line Loading @@ -3,15 +3,26 @@ namespace Drupal\Core\Asset; use Drupal\Component\Utility\Unicode; use Drupal\Core\Utility\Error; use Peast\Formatter\Compact as CompactFormatter; use Peast\Peast; use Peast\Renderer; use Peast\Syntax\Exception as PeastSyntaxException; use Psr\Log\LoggerInterface; /** * Optimizes a JavaScript asset. */ class JsOptimizer implements AssetOptimizerInterface { /** * Constructs a new JsOptimizer object. * * @param \Psr\Log\LoggerInterface $logger * The logger. */ public function __construct(protected readonly LoggerInterface $logger) {} /** * {@inheritdoc} */ Loading @@ -34,11 +45,28 @@ public function optimize(array $js_asset) { $data = Unicode::convertToUtf8($data, $js_asset['attributes']['charset']); } // Remove comments, whitespace, and optional braces. try { $ast = Peast::latest($data)->parse(); $renderer = new Renderer(); $renderer->setFormatter(new CompactFormatter()); return $renderer->render($ast); } catch (\Exception $exception) { if ($exception instanceof PeastSyntaxException) { $position = $exception->getPosition(); Error::logException($this->logger, $exception, 'Syntax error: @message, File: @asset_file, Line: @asset_line, Column: @asset_column, Index: @asset_index', [ '@asset_file' => $js_asset['data'], '@asset_line' => $position->getLine(), '@asset_column' => $position->getColumn(), '@asset_index' => $position->getIndex(), ]); } else { Error::logException($this->logger, $exception); } return $data; } } /** * Processes the contents of a javascript asset for cleanup. Loading
core/tests/Drupal/Tests/Core/Asset/JsOptimizerUnitTest.php +12 −2 Original line number Diff line number Diff line Loading @@ -24,8 +24,8 @@ class JsOptimizerUnitTest extends UnitTestCase { */ protected function setUp(): void { parent::setUp(); $this->optimizer = new JsOptimizer(); $logger = $this->createMock('\Psr\Log\LoggerInterface'); $this->optimizer = new JsOptimizer($logger); } /** Loading Loading @@ -119,6 +119,16 @@ public function providerTestOptimize() { ], file_get_contents($path . 'to_be_minified.js.optimized.js'), ], 4 => [ [ 'type' => 'file', 'preprocess' => TRUE, 'data' => $path . 'syntax_error.js', ], // When there is a syntax error, the 'optimized' contents are the // contents of the original file. file_get_contents($path . 'syntax_error.js'), ], ]; } Loading
core/tests/Drupal/Tests/Core/Asset/js_test_files/syntax_error.js 0 → 100644 +13 −0 Original line number Diff line number Diff line /** * Some comments. */ (function foo() { // Missing closing parenthesis. if (true { 'print 1'; } else { 'print 2'; } })