ResourceLoader: Fix require('../foo.js') from top of module directory

Bug: T373065
Depends-On: I00dc9b1d44b52cddc4c443752a441e614d86c1d8
Depends-On: I6ff80615afa91220cc3502ec1861c926b0756ab0
Change-Id: I8378294582590c4af44d4b7680988412890b179d
This commit is contained in:
Timo Tijhof 2024-08-22 01:00:30 +01:00
parent f794e7d382
commit 657872dee5
2 changed files with 49 additions and 2 deletions

View file

@ -587,7 +587,11 @@
var prefix;
while ( ( prefix = prefixes.pop() ) !== undefined ) {
if ( prefix === '..' ) {
if ( baseDirParts.length ) {
baseDirParts.pop();
} else {
baseDirParts.push( prefix );
}
}
}

View file

@ -477,7 +477,7 @@
} );
} );
QUnit.test( '.implement( package files )', ( assert ) => {
QUnit.test( '.implement() [packageFiles long paths]', ( assert ) => {
var done = assert.async(),
initJsRan = false,
counter = 41;
@ -519,6 +519,49 @@
} );
} );
QUnit.test( '.implement() [packageFiles with parent files]', ( assert ) => {
var done = assert.async();
var initJsRan = false;
var counter = 41;
mw.loader.implement(
'test.implement.packageWithParentFiles',
{
main: 'init.js',
files: {
'data/hello.json': { hello: 'world' },
'foo.js': function ( require, module ) {
counter++;
module.exports = { answer: counter };
},
'../bar/bar.js': function ( require, module ) {
var core = require( './core.js' );
module.exports = { data: core.sayHello( 'Alice' ) };
},
'../bar/core.js': function ( require, module ) {
module.exports = { sayHello: function ( name ) {
return 'Hello ' + name;
} };
},
'init.js': function ( require ) {
initJsRan = true;
assert.deepEqual( require( './data/hello.json' ), { hello: 'world' }, 'require() .json' );
assert.deepEqual( require( './foo.js' ), { answer: 42 }, 'require() .js in same dir' );
assert.deepEqual( require( '../bar/bar.js' ), { data: 'Hello Alice' }, 'require() with ../ ' );
assert.deepEqual( require( './foo.js' ), { answer: 42 }, 'require() same script twice' );
}
}
},
{},
{},
{}
);
return mw.loader.using( 'test.implement.packageWithParentFiles' ).done( () => {
assert.true( initJsRan, 'main JS file is executed' );
done();
} );
} );
QUnit.test( '.implement( name with @ )', ( assert ) => {
var done = assert.async();
// Calling implement() without a version number works if the '@' is the first character