viteHost = $serverConfig->host ?: $this->viteHost;
$this->viteHostProtocol = $serverConfig->protocol ?: $this->viteHostProtocol;
$this->vitePort = $serverConfig->port ?: $this->vitePort;
}
}
private static function getInstance(): Vite
{
if (static::$instance === null) {
static::$instance = new static();
if (!static::$instance->usingDevMode()) {
(static::$instance)->loadViteManifest();
}
}
return static::$instance;
}
/**
* @throws Exception
*/
private function loadViteManifest()
{
if (!empty($this->manifestData)) {
return;
}
$this->manifestData = App::config()->get('vite_config');
if (empty($this->manifestData)) {
$this->manifestData = [];
//throw new Exception('Vite Manifest Not Found. Run : npm run dev or npm run prod');
}
}
public static function enqueueScript($handle, $src, $dependency = [], $version = null, $inFooter = false): Vite
{
return static::getInstance()->enqueue_script(
$handle,
$src,
$dependency,
$version,
$inFooter
);
}
private function enqueue_script($handle, $src, $dependency = [], $version = null, $inFooter = false): Vite
{
// if (in_array($handle, $this->moduleScripts)) {
// if ($this->usingDevMode()) {
// $callerReference = (debug_backtrace(2)[1]);
// $fileName = explode('plugins', $callerReference['file']);
// $line = $callerReference['line'];
// throw new \Exception("This handel Has been used'. 'Filename: $fileName Line: $line");
// }
// }
$this->moduleScripts[] = $handle;
$this->lastJsHandel = $handle;
if (!$this->isScriptFilterAdded) {
add_filter('script_loader_tag', function ($tag, $handle, $src) {
return $this->addModuleToScript($tag, $handle, $src);
}, 10, 3);
$this->isScriptFilterAdded = true;
}
if (!$this->usingDevMode()) {
$assetFile = $this->getFileFromManifest($src);
$srcPath = $this->getProductionFilePath($assetFile);
} else {
$srcPath = $this->getVitePath() . $src;
}
if (empty($srcPath)) {
return $this;
}
$version = empty($version) ? FLUENTCART_VERSION : $version;
wp_enqueue_script(
$handle,
$srcPath,
$dependency,
$version,
$inFooter
);
return $this;
}
private function getFileFromManifest($src)
{
if (isset($this->manifestData[$this->resourceDirectory . $src])) {
return $this->manifestData[$this->resourceDirectory . $src];
}
if ($this->usingDevMode()) {
throw new \Exception(esc_html($src) . " file not found in vite manifest, Make sure it is in rollupOptions input and build again");
}
return '';
}
private function getProductionFilePath($file): string
{
if (!isset($file['file'])) {
return '';
}
$assetPath = static::getAssetPath();
$this->ensureChunkCssIsLoaded($file);
return ($assetPath . $file['file']);
}
private function ensureChunkCssIsLoaded($file)
{
$assetPath = static::getAssetPath();
if (isset($file['css']) && is_array($file['css'])) {
foreach ($file['css'] as $key => $path) {
wp_enqueue_style(
$file['file'] . '_' . $key . '_css',
$assetPath . $path,
[],
FLUENTCART_VERSION
);
}
}
}
public function with($params)
{
if (!is_array($params) || !Arr::isAssoc($params) || empty($this->lastJsHandel)) {
$this->lastJsHandel = null;
return;
}
foreach ($params as $key => $val) {
wp_localize_script($this->lastJsHandel, $key, $val);
}
$this->lastJsHandel = null;
}
public static function enqueueStyle($handle, $src, $dependency = [], $version = null, $media = 'all')
{
static::getInstance()->enqueue_style(
$handle,
$src,
$dependency,
$version,
$media
);
}
private function enqueue_style($handle, $src, $dependency = [], $version = null, $media = 'all')
{
if (!$this->usingDevMode()) {
$assetFile = (static::$instance)->getFileFromManifest($src);
$srcPath = $this->getProductionFilePath($assetFile);
} else {
$srcPath = $this->getVitePath() . $src;
}
if (empty($srcPath)) {
return;
}
$version = empty($version) ? FLUENTCART_VERSION : $version;
wp_enqueue_style(
$handle,
$srcPath,
$dependency,
$version,
$media
);
}
public static function enqueueStaticScript($handle, $src, $dependency = [], $version = null, $inFooter = false): Vite
{
$version = empty($version) ? FLUENTCART_VERSION : $version;
return static::getInstance()->enqueue_static_script(
$handle,
$src,
$dependency,
$version,
$inFooter
);
}
private function enqueue_static_script($handle, $src, $dependency = [], $version = null, $inFooter = false): Vite
{
$version = empty($version) ? FLUENTCART_VERSION : $version;
wp_enqueue_script(
$handle,
$this->getStaticEnqueuePath($src),
$dependency,
$version,
$inFooter
);
return $this;
}
private function getStaticEnqueuePath($path): string
{
if (!$this->usingDevMode()) {
$srcPath = $this->get_asset_url($path);
} else {
$srcPath = $this->getVitePath() . $path;
}
return $srcPath;
}
public static function enqueueStaticStyle($handle, $src, $dependency = [], $version = null, $media = 'all')
{
$version = empty($version) ? FLUENTCART_VERSION : $version;
static::getInstance()->enqueue_static_style(
$handle, $src, $dependency, $version, $media
);
}
private function enqueue_static_style($handle, $src, $dependency = [], $version = null, $media = 'all')
{
$version = empty($version) ? FLUENTCART_VERSION : $version;
wp_enqueue_style(
$handle,
$this->getStaticEnqueuePath($src),
$dependency,
$version,
$media
);
}
public static function underDevelopment(): bool
{
return static::getInstance()->usingDevMode();
}
public function usingDevMode(): bool
{
return App::config()->get('app.env') === 'dev';
}
public function getVitePath(): string
{
$protocol = rtrim($this->viteHostProtocol, ':/');
$host = rtrim($this->viteHost, '/');
$port = $this->vitePort;
$resource = ltrim($this->resourceDirectory, '/');
return sprintf('%s://%s:%s/%s', $protocol, $host, $port, $resource);
}
public static function getEnqueuePath($path = ''): string
{
$vite = static::getInstance();
if (!$vite->usingDevMode()) {
$assetFile = $vite->getFileFromManifest($path);
$srcPath = $vite->getProductionFilePath($assetFile);
} else {
$srcPath = $vite->getVitePath() . $path;
}
return $srcPath;
}
public static function getAssetUrl($path = ''): string
{
return esc_url(static::getInstance()->get_asset_url($path) ?? '');
}
private function get_asset_url($path = ''): string
{
if (!$this->usingDevMode()) {
return FLUENTCART_URL . 'assets' . '/' . $path;
} else {
return $this->getVitePath() . $path;
}
}
static function getAssetPath(): string
{
return App::getInstance()['url.assets'];
}
private function addModuleToScript($tag, $handle, $src)
{
if (in_array($handle, (static::$instance)->moduleScripts)) {
return wp_get_script_tag(
[
'src' => esc_url($src),
'type' => 'module',
'id' => $handle . '-js'
]
);
}
return $tag;
}
public static function enqueueAllScripts(array $scripts, string $handlePrefix, $localizeableData = [])
{
$loopCount = 0;
$isLocalized = false;
foreach ($scripts as $index => $script) {
$dependency = [];
$version = null;
$inFooter = false;
$isStatic = false;
$handle = false;
if (is_array($script)) {
$source = Arr::get($script, 'source');
$dependency = Arr::get($script, 'dependencies', []);
$version = Arr::get($script, 'version');
$inFooter = Arr::get($script, 'inFooter', false);
$isStatic = Arr::get($script, 'isStatic', false) === true;
$handle = Arr::get($script, 'handle', null);
} else {
$source = $script;
}
if (!$version) {
$version = FLUENTCART_VERSION;
}
if (!$handle) {
if ($loopCount < 1) {
$handle = $handlePrefix;
} else {
$handle = $handlePrefix . '_' . $index;
}
}
if ($isStatic) {
$vite = Vite::enqueueStaticScript(
$handle,
$source,
$dependency,
$version,
$inFooter
);
} else {
$vite = Vite::enqueueScript(
$handle,
$source,
$dependency,
$version,
$inFooter
);
}
// Localize the script only once during the first loop iteration,
// and only if it's not already localized and the script is not static.
if (($loopCount === 0 || !$isLocalized) && !$isStatic) {
$vite->with($localizeableData);
$isLocalized = true;
}
$loopCount++;
}
}
public static function enqueueAllStyles(array $styles, string $handlePrefix)
{
$loopCount = 0;
foreach ($styles as $index => $style) {
$dependency = [];
$version = null;
$media = 'all';
$isStatic = false;
$handle = false;
if (is_array($style)) {
$source = Arr::get($style, 'source');
$dependency = Arr::get($style, 'dependencies', []);
$version = Arr::get($style, 'version');
$media = Arr::get($style, 'media', false);
$isStatic = Arr::get($style, 'isStatic', false) === true;
$handle = Arr::get($style, 'handle', false);
} else {
$source = $style;
}
if (!$handle) {
if ($loopCount === 0) {
$handle = $handlePrefix;
} else {
$handle = $handlePrefix . '_' . $index;
}
}
$loopCount++;
if ($isStatic) {
Vite::enqueueStaticStyle(
$handle,
$source,
$dependency,
$version,
$media
);
} else {
Vite::enqueueStyle(
$handle,
$source,
$dependency,
$version,
$media
);
}
}
}
public static function printAllScripts(array $scripts, string $handlePrefix, $localizeableData = [])
{
$loopCount = 0;
$isLocalized = false;
foreach ($scripts as $index => $script) {
$dependency = [];
$version = null;
$inFooter = false;
$isStatic = false;
if (is_array($script)) {
$source = Arr::get($script, 'source');
$dependency = Arr::get($script, 'dependencies', []);
$version = Arr::get($script, 'version');
$inFooter = Arr::get($script, 'inFooter', false);
$isStatic = Arr::get($script, 'isStatic', false) === true;
} else {
$source = $script;
}
if ($loopCount < 1) {
$handle = $handlePrefix;
} else {
$handle = $handlePrefix . '_' . $index;
}
if (!$version) {
$version = FLUENTCART_VERSION;
}
$vite = static::getInstance();
if ($isStatic) {
$srcPath = $vite->getStaticEnqueuePath($source);
} else {
if (!$vite->usingDevMode()) {
$assetFile = $vite->getFileFromManifest($source);
$srcPath = $vite->getProductionFilePath($assetFile);
} else {
$srcPath = $vite->getVitePath() . $source;
}
}
if (!empty($srcPath)) {
$version = empty($version) ? FLUENTCART_VERSION : $version;
$type = !$isStatic && in_array($handle, $vite->moduleScripts) ? 'module' : 'text/javascript';
echo '' . "\n";
// Localize the script only once during the first loop iteration
if (($loopCount === 0 || !$isLocalized) && !$isStatic && !empty($localizeableData)) {
foreach ($localizeableData as $key => $val) {
echo '' . "\n";
}
$isLocalized = true;
}
}
$loopCount++;
}
}
public static function printAllStyles(array $styles, string $handlePrefix)
{
$loopCount = 0;
foreach ($styles as $index => $style) {
$dependency = [];
$version = null;
$media = 'all';
$isStatic = false;
if (is_array($style)) {
$source = Arr::get($style, 'source');
$dependency = Arr::get($style, 'dependencies', []);
$version = Arr::get($style, 'version');
$media = Arr::get($style, 'media', 'all');
$isStatic = Arr::get($style, 'isStatic', false) === true;
} else {
$source = $style;
}
if ($loopCount === 0) {
$handle = $handlePrefix;
} else {
$handle = $handlePrefix . '_' . $index;
}
$loopCount++;
$vite = static::getInstance();
if ($isStatic) {
$srcPath = $vite->getStaticEnqueuePath($source);
} else {
if (!$vite->usingDevMode()) {
$assetFile = $vite->getFileFromManifest($source);
$srcPath = $vite->getProductionFilePath($assetFile);
} else {
$srcPath = $vite->getVitePath() . $source;
}
}
if (!empty($srcPath)) {
$version = empty($version) ? FLUENTCART_VERSION : $version;
//phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet
echo '' . "\n";
}
}
}
}