Skip to content

Commit

Permalink
JavaScript: Enhance dependency optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
nilmerg committed Oct 7, 2024
1 parent c4b6e4b commit 9b18541
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 6 deletions.
24 changes: 18 additions & 6 deletions library/Icinga/Web/JavaScript.php
Original file line number Diff line number Diff line change
Expand Up @@ -243,14 +243,26 @@ public static function optimizeDefine($js, $filePath, $basePath, $packageName)
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
]));
}
}
Expand Down
4 changes: 4 additions & 0 deletions test/config/JavaScriptTest/someOther.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* No requirements */
define(function () {

});
4 changes: 4 additions & 0 deletions test/config/JavaScriptTest/someThing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* Relative path, No extension */
define(["someThing/Else"], function (Else) {

});
4 changes: 4 additions & 0 deletions test/config/JavaScriptTest/someThing/Else.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* Relative path outside the current directory, With extension */
define(["../someOther.js"], function (someOther) {

});
102 changes: 102 additions & 0 deletions test/php/library/Icinga/Web/JavaScriptTest.php
Original file line number Diff line number Diff line change
@@ -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()
{
$someThing = $this->getFile('someThing.js');
$this->assertSame(<<<'JS'
/* Relative path, No extension */
define("JavaScriptTest/someThing", ["JavaScriptTest/someThing/Else"], function (Else) {
});

JS,
$this->optimizeFile($someThing)
);

$someThingElse = $this->getFile('someThing/Else.js');
$this->assertSame(<<<'JS'
/* Relative path outside the current directory, With extension */
define("JavaScriptTest/someThing/Else", ["JavaScriptTest/someOther"], function (someOther) {
});

JS,
$this->optimizeFile($someThingElse)
);
}

public function testNoRequirementsOptimization()
{
$this->assertSame(<<<'JS'
define("JavaScriptTest/noRequirements", [], function () {
});

JS,
JavaScript::optimizeDefine(<<<'JS'
define(function () {
});

JS,
'JavaScriptTest/noRequirements',
'JavaScriptTest',
'JavaScriptTest'
)
);
}

public function testGlobalRequirementsOptimization()
{
$this->assertSame(<<<'JS'
define("JavaScriptTest/globalRequirements", ["SomeOtherTest/Anything"], function (Anything) {
});

JS,
JavaScript::optimizeDefine(<<<'JS'
define(["SomeOtherTest/Anything"], function (Anything) {
});

JS,
'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]));
}
}

0 comments on commit 9b18541

Please sign in to comment.