Commit f5af5797 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

DEV : Intégration de Vite pour la compilation/gestion des fichiers JS

parent 9eb14198
Loading
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -12,6 +12,14 @@ return array(
        // Par défaut, pas de socket
        'socket' => false,

        'vite' => [
            'mode' => 'prod',
            'src' => __DIR__ . '/../../ui',
            'dest' => __DIR__ . '/../../public/js/oscar/vite/dist',
            'base_url_dev' => 'http://127.0.0.1:5173',
            'base_url_prod' => '/js/oscar/vite/dist',
        ],

        // Rapports de synchronisation
        'repport_directory' => __DIR__ .'/../../data/repports/',

+1 −0
Original line number Diff line number Diff line
@@ -1027,6 +1027,7 @@ return array(
        'factories' => [
            'activityTypeHlp' => \Oscar\View\Helpers\ActivityTypeHelperFactory::class,
            'Grant' => \Oscar\View\Helpers\GrantFactory::class,
            'Vite' => \Oscar\View\Helpers\ViteFactory::class,
            'hasRole' => \Oscar\View\Helpers\HasRoleFactory::class,
            'link' => \Oscar\View\Helpers\LinksFactory::class,
            'options' => \Oscar\View\Helpers\OptionsFactory::class,
+82 −0
Original line number Diff line number Diff line
<?php
/**
 * @author Stéphane Bouvry<stephane.bouvry@unicaen.fr>
 * @date: 06/02/2023
 * @copyright Certic (c) 2023
 */

namespace Oscar\Utils;


class ViteUtils
{
    /** Configuration */
    private $manifest;

    private $basePath;

    private $buildedJs;

    private $buildedCss;

    private $mode;

    public function __construct(string $mode = 'dev', string $pathRoot = 'dist/', string $baseUrl = '/dist/')
    {
        $this->mode = $mode;
        $this->basePath = $pathRoot;
        $this->baseUrl = $baseUrl;
        $this->buildedJs = [];
        $this->buildedCss = [];

        $this->initManifest();
    }

    private function initManifest()
    {
        if ($this->mode == 'prod') {
            $this->manifest = json_decode(file_get_contents($this->basePath . '/manifest.json'), true);
        }
    }

    public function build($script)
    {
        if (in_array($script, $this->buildedJs)) {
            return;
        }

        $css_import = [];

        if ($this->mode != 'prod') {
            $jsFile = $script;
        } else {
            if (!array_key_exists($script, $this->manifest)) {
                throw new \Exception("Script $script");
            }

            $conf = $this->manifest[$script];

            if (array_key_exists('imports', $conf)) {
                foreach ($conf['imports'] as $import) {
                    $this->build($import);
                }
            }
            if (array_key_exists('css', $conf)) {
                foreach ($conf['css'] as $css) {
                    if (in_array($css, $this->buildedCss)) {
                        continue;
                    }
                    $this->buildedCss[] = $css;
                    $css_import[] = $css;
                }
            }

            $jsFile = $conf['file'];
        }
        $url = $this->baseUrl . '/' . $jsFile;
        foreach ($css_import as $css) {
            echo '<link rel="stylesheet" href="' . $this->baseUrl . '/' . $css . '" />';
        }
        echo '<script type="module" src="' . $url . '"></script>';
    }
}
 No newline at end of file
+65 −0
Original line number Diff line number Diff line
<?php
/**
 * Created by PhpStorm.
 * User: stephane
 * Date: 02/03/16
 * Time: 16:18
 */

namespace Oscar\View\Helpers;


use Oscar\Service\ConfigurationParser;
use Oscar\Service\OscarConfigurationService;
use Oscar\Traits\UseOscarConfigurationService;
use Oscar\Traits\UseOscarConfigurationServiceTrait;
use Oscar\Utils\ViteUtils;
use UnicaenApp\ServiceManager\ServiceLocatorAwareInterface;
use UnicaenApp\ServiceManager\ServiceLocatorAwareTrait;
use Zend\View\Helper\AbstractHtmlElement;

class Vite extends AbstractHtmlElement implements UseOscarConfigurationService
{
    use UseOscarConfigurationServiceTrait;

    private $viteutils;

    /**
     * Vite constructor.
     * @param ViteUtils $viteutils
     */
    public function __construct()
    {

    }


    /**
     * @return OscarConfigurationService
     */
    private function getConfiguration()
    {
        return $this->getOscarConfigurationService();
    }

    /**
     * @return ViteUtils
     */
    private function getViteUtils() :ViteUtils
    {
        if( $this->viteutils === null ){
            $config = $this->getOscarConfigurationService()->getConfiguration('vite');
            $mode = $config['mode'];
            $pathRoot = $config['dest'];
            $baseUrl = $mode == 'dev' ? $config['base_url_dev'] : $config['base_url_prod'];
            $this->viteutils = new ViteUtils($mode, $pathRoot, $baseUrl);
        }
        return $this->viteutils;
    }

    public function addJs( $file ) :void
    {
        $this->getViteUtils()->build($file);
    }

}
+29 −0
Original line number Diff line number Diff line
<?php
/**
 * Created by PhpStorm.
 * User: bouvry
 * Date: 19/09/19
 * Time: 18:36
 */

namespace Oscar\View\Helpers;


use Interop\Container\ContainerInterface;
use Interop\Container\Exception\ContainerException;
use Oscar\Service\OscarConfigurationService;
use Oscar\Service\OscarUserContext;
use Oscar\Utils\ViteUtils;
use Zend\ServiceManager\Exception\ServiceNotCreatedException;
use Zend\ServiceManager\Exception\ServiceNotFoundException;
use Zend\ServiceManager\Factory\FactoryInterface;

class ViteFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $s = new Vite();
        $s->setOscarConfigurationService($container->get(OscarConfigurationService::class));
        return $s;
    }
}
 No newline at end of file
Loading