Skip to content
Snippets Groups Projects
Commit cb606a0c authored by catch's avatar catch
Browse files

Issue #3381097 by catch, b_sharpe, TwoD: Need to catch Peast exceptions

parent bcaa369c
No related branches found
No related tags found
No related merge requests found
...@@ -1613,6 +1613,7 @@ services: ...@@ -1613,6 +1613,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'] 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']
asset.js.optimizer: asset.js.optimizer:
class: Drupal\Core\Asset\JsOptimizer class: Drupal\Core\Asset\JsOptimizer
arguments: ['@logger.channel.default']
asset.js.collection_grouper: asset.js.collection_grouper:
class: Drupal\Core\Asset\JsCollectionGrouper class: Drupal\Core\Asset\JsCollectionGrouper
asset.js.dumper: asset.js.dumper:
......
...@@ -3,15 +3,26 @@ ...@@ -3,15 +3,26 @@
namespace Drupal\Core\Asset; namespace Drupal\Core\Asset;
use Drupal\Component\Utility\Unicode; use Drupal\Component\Utility\Unicode;
use Drupal\Core\Utility\Error;
use Peast\Formatter\Compact as CompactFormatter; use Peast\Formatter\Compact as CompactFormatter;
use Peast\Peast; use Peast\Peast;
use Peast\Renderer; use Peast\Renderer;
use Peast\Syntax\Exception as PeastSyntaxException;
use Psr\Log\LoggerInterface;
/** /**
* Optimizes a JavaScript asset. * Optimizes a JavaScript asset.
*/ */
class JsOptimizer implements AssetOptimizerInterface { class JsOptimizer implements AssetOptimizerInterface {
/**
* Constructs a new JsOptimizer object.
*
* @param \Psr\Log\LoggerInterface $logger
* The logger.
*/
public function __construct(protected readonly LoggerInterface $logger) {}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
...@@ -34,10 +45,27 @@ public function optimize(array $js_asset) { ...@@ -34,10 +45,27 @@ public function optimize(array $js_asset) {
$data = Unicode::convertToUtf8($data, $js_asset['attributes']['charset']); $data = Unicode::convertToUtf8($data, $js_asset['attributes']['charset']);
} }
// Remove comments, whitespace, and optional braces. // Remove comments, whitespace, and optional braces.
$ast = Peast::latest($data)->parse(); try {
$renderer = new Renderer(); $ast = Peast::latest($data)->parse();
$renderer->setFormatter(new CompactFormatter()); $renderer = new Renderer();
return $renderer->render($ast); $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;
}
} }
/** /**
......
...@@ -24,8 +24,8 @@ class JsOptimizerUnitTest extends UnitTestCase { ...@@ -24,8 +24,8 @@ class JsOptimizerUnitTest extends UnitTestCase {
*/ */
protected function setUp(): void { protected function setUp(): void {
parent::setUp(); parent::setUp();
$logger = $this->createMock('\Psr\Log\LoggerInterface');
$this->optimizer = new JsOptimizer(); $this->optimizer = new JsOptimizer($logger);
} }
/** /**
...@@ -119,6 +119,16 @@ public function providerTestOptimize() { ...@@ -119,6 +119,16 @@ public function providerTestOptimize() {
], ],
file_get_contents($path . 'to_be_minified.js.optimized.js'), 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'),
],
]; ];
} }
......
/**
* Some comments.
*/
(function foo() {
// Missing closing parenthesis.
if (true {
'print 1';
}
else {
'print 2';
}
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment