function JsOptimizer::optimize

Same name in other branches
  1. 9 core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer::optimize()
  2. 8.9.x core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer::optimize()
  3. 10 core/lib/Drupal/Core/Asset/JsOptimizer.php \Drupal\Core\Asset\JsOptimizer::optimize()

Overrides AssetOptimizerInterface::optimize

File

core/lib/Drupal/Core/Asset/JsOptimizer.php, line 29

Class

JsOptimizer
Optimizes a JavaScript asset.

Namespace

Drupal\Core\Asset

Code

public function optimize(array $js_asset) {
    if ($js_asset['type'] !== 'file') {
        throw new \Exception('Only file JavaScript assets can be optimized.');
    }
    if (!$js_asset['preprocess']) {
        throw new \Exception('Only file JavaScript assets with preprocessing enabled can be optimized.');
    }
    // If a BOM is found, convert the file to UTF-8, then use substr() to
    // remove the BOM from the result.
    $data = file_get_contents($js_asset['data']);
    if ($encoding = Unicode::encodingFromBOM($data)) {
        $data = mb_substr(Unicode::convertToUtf8($data, $encoding), 1);
    }
    elseif (isset($js_asset['attributes']['charset'])) {
        $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;
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.