mirror of https://github.com/vitalif/phantomjs
Add require.paths support
Issues: https://github.com/n1k0/casperjs/issues/462 https://github.com/ariya/phantomjs/issues/113391.x
parent
7431cbf229
commit
b1e181176e
|
@ -45,7 +45,7 @@ phantom.__defineErrorSignalHandler__ = function(obj, page, handlers) {
|
|||
try { signal.disconnect(handlerObj.connector); }
|
||||
catch (e) {}
|
||||
}
|
||||
|
||||
|
||||
// Delete the previous handler
|
||||
delete handlers[handlerName];
|
||||
|
||||
|
@ -57,17 +57,17 @@ phantom.__defineErrorSignalHandler__ = function(obj, page, handlers) {
|
|||
|
||||
f(message, revisedStack);
|
||||
};
|
||||
|
||||
|
||||
// Store the new handler for reference
|
||||
handlers[handlerName] = {
|
||||
callback: f,
|
||||
connector: connector
|
||||
};
|
||||
|
||||
|
||||
signal.connect(connector);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
obj.__defineGetter__(handlerName, function() {
|
||||
var handlerObj = handlers[handlerName];
|
||||
return (!!handlerObj && typeof handlerObj.callback === "function" && typeof handlerObj.connector === "function") ?
|
||||
|
@ -111,6 +111,7 @@ phantom.callback = function(callback) {
|
|||
// fs is loaded at the end, when everything is ready
|
||||
var fs;
|
||||
var cache = {};
|
||||
var paths = [];
|
||||
// use getters to initialize lazily
|
||||
// (for future, now both fs and system are loaded anyway)
|
||||
var nativeExports = {
|
||||
|
@ -212,33 +213,41 @@ phantom.callback = function(callback) {
|
|||
}
|
||||
|
||||
Module.prototype._getPaths = function(request) {
|
||||
var paths = [], dir;
|
||||
var _paths = [], dir;
|
||||
|
||||
if (request[0] === '.') {
|
||||
paths.push(fs.absolute(joinPath(phantom.webdriverMode ? ":/ghostdriver" : this.dirname, request)));
|
||||
_paths.push(fs.absolute(joinPath(phantom.webdriverMode ? ":/ghostdriver" : this.dirname, request)));
|
||||
} else if (fs.isAbsolute(request)) {
|
||||
paths.push(fs.absolute(request));
|
||||
_paths.push(fs.absolute(request));
|
||||
} else {
|
||||
// first look in PhantomJS modules
|
||||
paths.push(joinPath(':/modules', request));
|
||||
_paths.push(joinPath(':/modules', request));
|
||||
// then look in node_modules directories
|
||||
if (!this._isNative()) {
|
||||
dir = this.dirname;
|
||||
while (dir) {
|
||||
paths.push(joinPath(dir, 'node_modules', request));
|
||||
_paths.push(joinPath(dir, 'node_modules', request));
|
||||
dir = dirname(dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return paths;
|
||||
for (var i=0; i<paths.length; ++i) {
|
||||
if(fs.isAbsolute(paths[i])) {
|
||||
_paths.push(fs.absolute(joinPath(paths[i], request)));
|
||||
} else {
|
||||
_paths.push(fs.absolute(joinPath(this.dirname, paths[i], request)));
|
||||
}
|
||||
}
|
||||
|
||||
return _paths;
|
||||
};
|
||||
|
||||
Module.prototype._getFilename = function(request) {
|
||||
var path, filename = null, paths = this._getPaths(request);
|
||||
var path, filename = null, _paths = this._getPaths(request);
|
||||
|
||||
for (var i=0; i<paths.length && !filename; ++i) {
|
||||
path = paths[i];
|
||||
for (var i=0; i<_paths.length && !filename; ++i) {
|
||||
path = _paths[i];
|
||||
filename = tryFile(path) || tryExtensions(path) || tryPackage(path) ||
|
||||
tryExtensions(joinPath(path, 'index'));
|
||||
}
|
||||
|
@ -254,6 +263,7 @@ phantom.callback = function(callback) {
|
|||
}
|
||||
require.cache = cache;
|
||||
require.extensions = extensions;
|
||||
require.paths = paths;
|
||||
require.stub = function(request, exports) {
|
||||
self.stubs[request] = { exports: exports };
|
||||
};
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
module.exports = 'require/subdir2/loader'
|
|
@ -154,10 +154,62 @@ describe("require()", function() {
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe("when path is absolute", function() {
|
||||
it("loads modules from the absolute path", function() {
|
||||
require(fs.absolute('dummy')).should.equal('spec/dummy');
|
||||
});
|
||||
});
|
||||
|
||||
describe("with require.paths", function() {
|
||||
describe("when require.paths.push(relative)", function() {
|
||||
it("add relative path to paths", function() {
|
||||
require.paths.push('./dir/subdir');
|
||||
});
|
||||
|
||||
it("loads 'loader' module in dir/subdir", function() {
|
||||
require('loader').dummyFile2.should.equal('spec/node_modules/dummy_file2');
|
||||
});
|
||||
|
||||
it("loads 'loader' module in dir/subdir2 relative to require.paths", function() {
|
||||
require('../subdir2/loader').should.equal('require/subdir2/loader');
|
||||
});
|
||||
|
||||
it("loads 'dummy' module from the path that takes precedence", function() {
|
||||
require('../dummy').should.equal('spec/dummy');
|
||||
});
|
||||
|
||||
it("doesn't load 'loader' module in dir/subdir after require.paths.pop()", function() {
|
||||
(function() {
|
||||
require.paths.pop();
|
||||
require('loader');
|
||||
}).should.Throw("Cannot find module 'loader'");
|
||||
});
|
||||
});
|
||||
|
||||
describe("when require.paths.push(absolute)", function() {
|
||||
it("adds absolute path to paths", function() {
|
||||
require.paths.push(fs.absolute('require/dir/subdir'));
|
||||
});
|
||||
|
||||
it("loads 'loader' module in dir/subdir", function() {
|
||||
require('loader').dummyFile2.should.equal('spec/node_modules/dummy_file2');
|
||||
});
|
||||
|
||||
it("loads 'loader' module in dir/subdir2 relative to require.paths", function() {
|
||||
require('../subdir2/loader').should.equal('require/subdir2/loader');
|
||||
});
|
||||
|
||||
it("loads 'dummy' module from the path that takes precedence", function() {
|
||||
require('../dummy').should.equal('spec/dummy');
|
||||
});
|
||||
|
||||
it("doesn't load 'loader' module in dir/subdir after require.paths.pop()", function() {
|
||||
(function() {
|
||||
require.paths.pop();
|
||||
require('loader');
|
||||
}).should.Throw("Cannot find module 'loader'");
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue