Your IP : 3.135.244.36


Current Path : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/modules/mobileapp/lib/janative/entity/
Upload File :
Current File : /var/www/admin_ftp_12/data/www/httpdocs/bitrix/modules/mobileapp/lib/janative/entity/base.php

<?php

namespace Bitrix\MobileApp\Janative\Entity;

use Bitrix\Main\Application;
use Bitrix\Main\IO\Directory;
use Bitrix\Main\IO\File;
use Bitrix\Main\IO\FileEntry;
use Bitrix\Main\IO\FileNotFoundException;
use Bitrix\Main\IO\Path;
use Bitrix\Main\Localization;
use Bitrix\MobileApp\Janative\Manager;
use Bitrix\MobileApp\Janative\Utils;

abstract class Base
{
	protected static array $modificationDates = [];
	protected static array $dependencies = [];
	protected static array $expandedDependencies = [];
	protected $path;
	protected $namespace;
	protected $baseFileName;
	public $name;
	private $config;


	protected function getConfig(): ?array {
		if ($this->config == null) {
			$this->config = [];
			$file = new File("$this->path/deps.php");
			$result = [];
			if ($file->isExists())
			{
				$this->config = include($file->getPath());
				if (!is_array($this->config)) {
					$this->config = [];
				}
			}
		}

		return $this->config;
	}

	public function getModificationMarker()
	{
		if (defined("JN_DEV_RELOAD")) {
			return "1.0";
		}

		$fullyQualifiedName = $this->getFullyQualifiedName();

		if (!empty(static::$modificationDates[$fullyQualifiedName]))
		{
			return static::$modificationDates[$fullyQualifiedName];
		}

		$file = new File("{$this->path}/{$this->baseFileName}.js");
		$marks = [Utils::getFileHash($file)];
		$langDirectory = new Directory("{$this->path}/lang/");
		if ($langDirectory->isExists())
		{
			$langs = $langDirectory->getChildren();
			foreach ($langs as $lang)
			{
				if ($lang->isDirectory())
				{
					$langFile = new File($lang->getPath()."/{$this->baseFileName}.php");
					$marks[] = Utils::getFileHash($langFile);
				}
			}
		}

		$this->onBeforeModificationMarkerSave($marks);
		if (count($marks) == 1)
		{
			$value = $marks[0];
		}
		else
		{
			$value = md5(implode("/", $marks));
		}

		static::$modificationDates[$fullyQualifiedName] = $value;

		return $value;
	}

	public function getFullyQualifiedName(): string {
		return  "$this->namespace:$this->name";
	}

	public function getDependencies()
	{
		if (!isset(static::$dependencies[$this->name]))
		{
			static::$dependencies[$this->name] = array_values($this->resolveDependencies());
		}

		return static::$dependencies[$this->name];
	}

	public function getPath()
	{
		$relativePath = str_replace(Application::getDocumentRoot(), "", "{$this->path}/");
		return Path::normalize($relativePath);
	}

	public function getRelativePathToFile()
	{
		$relativePath = $this->getPath() . "/{$this->baseFileName}.js";
		return Path::normalize($relativePath);
	}

	public function getLangMessages()
	{
		$langPhrases = Localization\Loc::loadLanguageFile("{$this->path}/{$this->baseFileName}.php");
		return $langPhrases ?: [];
	}

	public function getDependencyList()
	{
		$config = $this->getConfig();
		$list = [];
		$result = [];
		if (is_array($config))
		{
			if (array_keys($config) !== range(0, count($config) - 1))
			{
				if(array_key_exists('extensions', $config)) {
					$list = $config['extensions'];
				}
			}
			else
			{
				$list = $config;
			}
		}
		if (!empty($list)) {
			foreach ($list as $ext) {
				$result[] = Base::expandDependency($ext);
			}

			if (!empty($result))
			{
				$result = array_merge(...$result);
			}
		}

		return $result;
	}

	public function getBundleFiles(): array {
		$config = $this->getConfig();
		$list = [];
		if (isset($config["bundle"])) {
			$list = array_map(function ($file) {
				$path = Path::normalize($this->path."/$file");
				if (Path::getExtension($path) !== "js") {
					$path .= ".js";
				}
				return $path;
			}, $config["bundle"]);
		}

		return $list;
	}

	public function getComponentDependencies(): ?array
	{
		$config = $this->getConfig();
		$result = [];
		if (is_array($config))
		{
			if (array_keys($config) !== range(0, count($config) - 1)) {
				if (isset($config['components'])) {
					if (is_array($config['components'])) {
						return $config['components'];
					}
				}
			}
			else
			{
				$result = null;
			}

		}

		return $result;
	}

	/**
	 * @param $ext
	 * @return array
	 * @throws FileNotFoundException
	 */
	private static function expandDependency($ext): array
	{

		$result = [];

		if (!is_string($ext))
		{
			return [];
		}

		if ( isset(self::$expandedDependencies[$ext]))
		{
			return self::$expandedDependencies[$ext];
		}

		$findChildren = false;
		$relativeExtDir = $ext;


		if(mb_strpos($ext, "*") === (mb_strlen($ext) - 1))
		{
			$relativeExtDir = str_replace(["/*", "*"], "", $ext);
			$findChildren = true;
		}

		$absolutePath = Manager::getExtensionPath($relativeExtDir);
		if($findChildren && $absolutePath != null)
		{
			$dir = new Directory($absolutePath);
			$items = $dir->getChildren();
			for ($i = 0, $l = count($items); $i < $l; $i++)
			{
				/** @var Directory $entry **/
				$entry = $items[$i];
				if ($entry->isDirectory())
				{
					$toAdd = $entry->getChildren();
					$extensionFile = new File($entry->getPath(). '/extension.js');
					if($extensionFile->isExists())
					{
						$result[] = $extensionFile->getPath();
					}

					$l += count($toAdd);
					$items = array_merge($items, $toAdd);
				}
			}

			$result = array_map(function($path) use ($absolutePath, $relativeExtDir) {
				return str_replace([$absolutePath, "/extension.js"],[$relativeExtDir, ""], $path);
			}, $result);
		}

		$rootExtension = new File($absolutePath . '/extension.js');
		if($rootExtension->isExists())
		{
			$result[] = $relativeExtDir;
		}

		self::$expandedDependencies[$ext] = $result;
		return $result;
	}

	public function getLangDefinitionExpression()
	{
		$langPhrases = $this->getLangMessages();
		if (!empty($langPhrases))
		{
			$jsonLangMessages = Utils::jsonEncode($langPhrases, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_UNESCAPED_UNICODE);
			return <<<JS
BX.message($jsonLangMessages);
JS;
		}

		return "";
	}

	abstract protected function onBeforeModificationMarkerSave(array &$value);
	abstract protected function resolveDependencies();


}