]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(OC/Template): Allow `.mjs` files within custom app paths
authorFerdinand Thiessen <rpm@fthiessen.de>
Tue, 10 Jan 2023 02:04:58 +0000 (03:04 +0100)
committerFerdinand Thiessen <rpm@fthiessen.de>
Wed, 22 Feb 2023 20:19:37 +0000 (21:19 +0100)
If apps are installed in non standard app paths, we need
to check `$app_path/$script` instead of only doing so for translations.
Without this it would fallback to `.js` extension even if a `.mjs` file exists.

Also tried make the code more selfe explaining.

Signed-off-by: Ferdinand Thiessen <rpm@fthiessen.de>
lib/private/Template/JSResourceLocator.php

index 4b41e51ae146423a5bf9bc3bc00b05f2bbe5c09a..120234146e10ca22d13b42152ae6b1af2d6cfb95 100644 (file)
 namespace OC\Template;
 
 use OCP\App\AppPathNotFoundException;
+use OCP\App\IAppManager;
 use Psr\Log\LoggerInterface;
-use \OCP\App\IAppManager;
 
 class JSResourceLocator extends ResourceLocator {
-       /** @var JSCombiner */
-       protected $jsCombiner;
-
-       /** @var IAppManager */
-       protected $appManager;
+       protected JSCombiner $jsCombiner;
+       protected IAppManager $appManager;
 
        public function __construct(LoggerInterface $logger, JSCombiner $JSCombiner, IAppManager $appManager) {
                parent::__construct($logger);
@@ -86,41 +83,36 @@ class JSResourceLocator extends ResourceLocator {
                }
 
                $script = substr($script, strpos($script, '/') + 1);
-               $app_path = false;
-               $app_url = false;
+               $app_url = null;
 
                try {
-                       $app_path = $this->appManager->getAppPath($app);
-                       // Account for the possibility of having symlinks in app path. Only
-                       // do this if $app_path is set, because an empty argument to realpath
-                       // gets turned into cwd.
-                       $app_path = realpath($app_path);
+                       $app_url = $this->appManager->getAppWebPath($app);
                } catch (AppPathNotFoundException) {
                        // pass
                }
 
                try {
-                       $app_url = $this->appManager->getAppWebPath($app);
-               } catch (AppPathNotFoundException) {
-                       // pass
-               }
+                       $app_path = $this->appManager->getAppPath($app);
 
-               // missing translations files fill be ignored
-               if (strpos($script, 'l10n/') === 0) {
-                       $this->appendScriptIfExist($app_path, $script, $app_url);
-                       return;
-               }
+                       // Account for the possibility of having symlinks in app path. Only
+                       // do this if $app_path is set, because an empty argument to realpath
+                       // gets turned into cwd.
+                       $app_path = realpath($app_path);
 
-               if ($app_path === false && $app_url === false) {
+                       // missing translations files will be ignored
+                       if (strpos($script, 'l10n/') === 0) {
+                               $this->appendScriptIfExist($app_path, $script, $app_url);
+                               return;
+                       }
+
+                       if (!$this->cacheAndAppendCombineJsonIfExist($app_path, $script.'.json', $app)) {
+                               $this->appendScriptIfExist($app_path, $script, $app_url);
+                       }
+               } catch (AppPathNotFoundException) {
                        $this->logger->error('Could not find resource {resource} to load', [
                                'resource' => $app . '/' . $script . '.js',
                                'app' => 'jsresourceloader',
                        ]);
-                       return;
-               }
-
-               if (!$this->cacheAndAppendCombineJsonIfExist($app_path, $script.'.json', $app)) {
-                       $this->append($app_path, $script . '.js', $app_url);
                }
        }
 
@@ -134,7 +126,7 @@ class JSResourceLocator extends ResourceLocator {
         * Try to find ES6 script file (`.mjs`) with fallback to plain javascript (`.js`)
         * @see appendIfExist()
         */
-       protected function appendScriptIfExist($root, $file, $webRoot = null) {
+       protected function appendScriptIfExist(string $root, string $file, string $webRoot = null) {
                if (!$this->appendIfExist($root, $file . '.mjs', $webRoot)) {
                        return $this->appendIfExist($root, $file . '.js', $webRoot);
                }