JavaScript: Enhance dependency optimization

This commit is contained in:
Johannes Meyer 2024-09-12 16:46:29 +02:00
parent e12574f328
commit e2c6b39acc
5 changed files with 132 additions and 6 deletions

View File

@ -243,14 +243,26 @@ class JavaScript
continue;
}
if (preg_match('~^((?:\.\.?/)+)*(.*)~', $dependencyName, $natch)) {
$fileExtension = '.js';
$dirname = dirname($filePath);
if (preg_match('~^((?:\.\.?/)+)*.*?(\.\w+)?$~', $dependencyName, $natch)) {
if (! empty($natch[1])) {
$dependencyName = substr($dependencyName, strlen($natch[1]));
$dirname = realpath(join(DIRECTORY_SEPARATOR, [$dirname, $natch[1]]));
}
if (! empty($natch[2])) {
$dependencyName = substr($dependencyName, 0, -strlen($natch[2]));
$fileExtension = $natch[2];
}
}
$dependencyPath = join(DIRECTORY_SEPARATOR, [$dirname, $dependencyName . $fileExtension]);
if (file_exists($dependencyPath)) {
$dependencyName = join(DIRECTORY_SEPARATOR, array_filter([
$packageName,
ltrim(substr(
realpath(join(DIRECTORY_SEPARATOR, [dirname($filePath), $natch[1]])),
strlen(realpath($basePath))
), DIRECTORY_SEPARATOR),
$natch[2]
trim(substr($dirname, strlen(realpath($basePath))), DIRECTORY_SEPARATOR . ' '),
$dependencyName
]));
}
}

View File

@ -0,0 +1,4 @@
/* No requirements */
define(function () {
});

View File

@ -0,0 +1,4 @@
/* Relative path, No extension */
define(["someThing/Else"], function (Else) {
});

View File

@ -0,0 +1,4 @@
/* Relative path outside the current directory, With extension */
define(["../someOther.js"], function (someOther) {
});

View File

@ -0,0 +1,102 @@
<?php
namespace Tests\Icinga\Web;
use Icinga\Application\Icinga;
use Icinga\Test\BaseTestCase;
use Icinga\Web\JavaScript;
use SplFileObject;
class JavaScriptTest extends BaseTestCase
{
protected $fileRoot;
public function setUp(): void
{
parent::setUp();
$this->fileRoot = Icinga::app()->getBaseDir('test/config/JavaScriptTest');
}
public function testLocalDefineOptimizations()
{
$expected = <<<'JS'
/* Relative path, No extension */
define("JavaScriptTest/someThing", ["JavaScriptTest/someThing/Else"], function (Else) {
});
JS;
$someThing = $this->getFile('someThing.js');
$this->assertSame($expected, $this->optimizeFile($someThing));
$expected = <<<'JS'
/* Relative path outside the current directory, With extension */
define("JavaScriptTest/someThing/Else", ["JavaScriptTest/someOther"], function (someOther) {
});
JS;
$someThingElse = $this->getFile('someThing/Else.js');
$this->assertSame($expected, $this->optimizeFile($someThingElse));
}
public function testNoRequirementsOptimization()
{
$expected = <<<'JS'
define("JavaScriptTest/noRequirements", [], function () {
});
JS;
$source = <<<'JS'
define(function () {
});
JS;
$this->assertSame($expected, JavaScript::optimizeDefine(
$source,
'JavaScriptTest/noRequirements',
'JavaScriptTest',
'JavaScriptTest'
));
}
public function testGlobalRequirementsOptimization()
{
$expected = <<<'JS'
define("JavaScriptTest/globalRequirements", ["SomeOtherTest/Anything"], function (Anything) {
});
JS;
$source = <<<'JS'
define(["SomeOtherTest/Anything"], function (Anything) {
});
JS;
$this->assertSame($expected, JavaScript::optimizeDefine(
$source,
'JavaScriptTest/globalRequirements',
'JavaScriptTest',
'JavaScriptTest'
));
}
protected function optimizeFile(SplFileObject $file): string
{
return JavaScript::optimizeDefine(
$file->fread($file->getSize()),
$file->getRealPath(),
$this->fileRoot,
'JavaScriptTest'
);
}
protected function getFile(string $file): SplFileObject
{
return new SplFileObject(join(DIRECTORY_SEPARATOR, [$this->fileRoot, $file]));
}
}