mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-07-31 01:34:09 +02:00
JavaScript: Enhance dependency optimization
This commit is contained in:
parent
e12574f328
commit
e2c6b39acc
@ -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
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
4
test/config/JavaScriptTest/someOther.js
Normal file
4
test/config/JavaScriptTest/someOther.js
Normal file
@ -0,0 +1,4 @@
|
||||
/* No requirements */
|
||||
define(function () {
|
||||
|
||||
});
|
4
test/config/JavaScriptTest/someThing.js
Normal file
4
test/config/JavaScriptTest/someThing.js
Normal file
@ -0,0 +1,4 @@
|
||||
/* Relative path, No extension */
|
||||
define(["someThing/Else"], function (Else) {
|
||||
|
||||
});
|
4
test/config/JavaScriptTest/someThing/Else.js
Normal file
4
test/config/JavaScriptTest/someThing/Else.js
Normal file
@ -0,0 +1,4 @@
|
||||
/* Relative path outside the current directory, With extension */
|
||||
define(["../someOther.js"], function (someOther) {
|
||||
|
||||
});
|
102
test/php/library/Icinga/Web/JavaScriptTest.php
Normal file
102
test/php/library/Icinga/Web/JavaScriptTest.php
Normal 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]));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user