phpv8 / v8js

V8 Javascript Engine for PHP — This PHP extension embeds the Google V8 Javascript Engine
http://pecl.php.net/package/v8js
MIT License
1.83k stars 200 forks source link

Normalising bug #349

Closed chenos closed 6 years ago

chenos commented 6 years ago
--TEST--
Test V8Js::setModuleNormaliser : Custom normalisation #005
--SKIPIF--
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
--FILE--
<?php

$v8 = new V8Js();

$v8->setModuleNormaliser(function ($base, $moduleName) {
    var_dump($base, $moduleName);
    if ($base == '' && $moduleName == './tags') {
        return ['./tags', 'index.js'];
    }
    if ($base == './tags' && $moduleName == './if.js') {
        return ['./tags', 'if.js'];
    }
    return [$base, $moduleName];
});

$v8->setModuleLoader(function ($moduleName) {
    print("setModuleLoader called for ".$moduleName."\n");
    switch ($moduleName) {
        case './app.js':
            return "require('./tags')";
        case './tags/index.js':
            return "require('./if.js')";
    }
});

$v8->executeString("require('./app.js')");

echo "------------------------------------------------\n";

$v8 = new V8Js();

$v8->setModuleNormaliser(function ($base, $moduleName) {
    var_dump($base, $moduleName);
    if ($base == '' && $moduleName == './tags') {
        return ['./tags', 'index.js'];
    }
    if ($base == './tags' && $moduleName == './if.js') {
        return ['./tags', 'if.js'];
    }
    return [$base, $moduleName];
});

$v8->setModuleLoader(function ($moduleName) {
    print("setModuleLoader called for ".$moduleName."\n");
    switch ($moduleName) {
        case './app.js':
            return "require('./tags')()"; // different
        case './tags/index.js':
            return "module.exports = function() {require('./if.js')}"; // different
    }
});

$v8->executeString("require('./app.js')");

?>
===EOF===
--EXPECT--
string(0) ""
string(8) "./app.js"
setModuleLoader called for ./app.js
string(0) ""
string(6) "./tags"
setModuleLoader called for ./tags/index.js
string(6) "./tags"
string(7) "./if.js"
setModuleLoader called for ./tags/if.js
------------------------------------------------
string(0) ""
string(8) "./app.js"
setModuleLoader called for ./app.js
string(0) ""
string(6) "./tags"
setModuleLoader called for ./tags/index.js
string(6) "./tags"
string(7) "./if.js"
setModuleLoader called for ./tags/if.js
===EOF===

Two tests should be the same. But the second result is:

string(0) ""
string(7) "./if.js"
setModuleLoader called for ./if.js

./app.js

require('./tags')()

./tags/index.js require inside functions

module.exports = function() {
  require('./if.js')
}
stesie commented 6 years ago

Nice catch, that's there for ages :-)

Thanks for reporting.