master

laravel/framework

Last updated at: 29/12/2023 09:23

Mix.php

TLDR

This file contains the Illuminate\Foundation\Mix class, which provides a method to get the path of a versioned Mix file.

Methods

__invoke

This method is used to get the path to a versioned Mix file. It takes two parameters:

  • $path (string): The path of the Mix file.
  • $manifestDirectory (string): The directory where the Mix manifest is located (optional).

The method first checks if the Mix file is hot (using the /hot path). If it is, it retrieves the URL from the hot file and returns it.

If the Mix file is not hot, the method checks for a Mix manifest file (mix-manifest.json). If the manifest file is not found, an exception is thrown.

If the manifest file is found, the method retrieves the manifest data. If the Mix file path is not found in the manifest, an exception is thrown.

Finally, the method returns the HTML string of the Mix file URL.

Classes

No classes found.

<?php

namespace Illuminate\Foundation;

use Exception;
use Illuminate\Support\HtmlString;
use Illuminate\Support\Str;

class Mix
{
    /**
     * Get the path to a versioned Mix file.
     *
     * @param  string  $path
     * @param  string  $manifestDirectory
     * @return \Illuminate\Support\HtmlString|string
     *
     * @throws \Exception
     */
    public function __invoke($path, $manifestDirectory = '')
    {
        static $manifests = [];

        if (! str_starts_with($path, '/')) {
            $path = "/{$path}";
        }

        if ($manifestDirectory && ! str_starts_with($manifestDirectory, '/')) {
            $manifestDirectory = "/{$manifestDirectory}";
        }

        if (is_file(public_path($manifestDirectory.'/hot'))) {
            $url = rtrim(file_get_contents(public_path($manifestDirectory.'/hot')));

            $customUrl = app('config')->get('app.mix_hot_proxy_url');

            if (! empty($customUrl)) {
                return new HtmlString("{$customUrl}{$path}");
            }

            if (Str::startsWith($url, ['http://', 'https://'])) {
                return new HtmlString(Str::after($url, ':').$path);
            }

            return new HtmlString("//localhost:8080{$path}");
        }

        $manifestPath = public_path($manifestDirectory.'/mix-manifest.json');

        if (! isset($manifests[$manifestPath])) {
            if (! is_file($manifestPath)) {
                throw new Exception("Mix manifest not found at: {$manifestPath}");
            }

            $manifests[$manifestPath] = json_decode(file_get_contents($manifestPath), true);
        }

        $manifest = $manifests[$manifestPath];

        if (! isset($manifest[$path])) {
            $exception = new Exception("Unable to locate Mix file: {$path}.");

            if (! app('config')->get('app.debug')) {
                report($exception);

                return $path;
            } else {
                throw $exception;
            }
        }

        return new HtmlString(app('config')->get('app.mix_url').$manifestDirectory.$manifest[$path]);
    }
}