Commit 06264047 authored by catch's avatar catch
Browse files

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

(cherry picked from commit cb606a0c)
parent 05e95eb4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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:
+32 −4
Original line number Diff line number Diff line
@@ -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}
   */
@@ -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.
+12 −2
Original line number Diff line number Diff line
@@ -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);
  }

  /**
@@ -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'),
      ],
    ];
  }

+13 −0
Original line number Diff line number Diff line
/**
 * Some comments.
 */

(function foo() {
  // Missing closing parenthesis.
  if (true {
    'print 1';
  }
  else {
    'print 2';
  }
})