Patch node module loader to handle multiple extensions - fixes #2928 & #2855

This commit is contained in:
Sam Gentle
2013-05-25 23:01:41 +10:00
parent 9b1bdd4b36
commit d46a44ac48
2 changed files with 61 additions and 0 deletions

View File

@@ -185,6 +185,36 @@
ext = _ref[_i];
require.extensions[ext] = loadFile;
}
(function(module) {
var NATIVELOAD, findExtension;
NATIVELOAD = "function(filename){debug('load'+JSON.stringify(filename)+'formodule'+JSON.stringify(this.id));assert(!this.loaded);this.filename=filename;this.paths=Module._nodeModulePaths(path.dirname(filename));varextension=path.extname(filename)||'.js';if(!Module._extensions[extension])extension='.js';Module._extensions[extension](this,filename);this.loaded=true;}";
if (module.prototype.load.toString().replace(/\s+/g, "") === NATIVELOAD) {
findExtension = function(filename) {
var extension, extensions, thisExtension;
extension = null;
extensions = path.basename(filename).split('.');
if (extensions[0] === '') {
extensions.shift();
}
while (extensions.shift()) {
thisExtension = '.' + extensions.join('.');
if (module._extensions[thisExtension]) {
extension = thisExtension;
break;
}
}
return extension || '.js';
};
return module.prototype.load = function(filename) {
var extension;
this.filename = filename;
this.paths = module._nodeModulePaths(path.dirname(filename));
extension = findExtension(filename);
module._extensions[extension](this, filename);
return this.loaded = true;
};
}
})(require('module'));
}
if (child_process) {

View File

@@ -154,6 +154,37 @@ if require.extensions
for ext in ['.coffee', '.litcoffee', '.coffee.md']
require.extensions[ext] = loadFile
# Patch Node's module loader to be able to handle .coffee.md in require.extensions
do (module = require 'module') ->
NATIVELOAD = "function(filename){debug('load'+JSON.stringify(filename)+'formodule'+JSON.stringify(this.id));assert(!this.loaded);this.filename=filename;this.paths=Module._nodeModulePaths(path.dirname(filename));varextension=path.extname(filename)||'.js';if(!Module._extensions[extension])extension='.js';Module._extensions[extension](this,filename);this.loaded=true;}"
# Only keep going if we're sure module.prototype.load is what we expect
if module.prototype.load.toString().replace(/\s+/g,"") == NATIVELOAD
findExtension = (filename) ->
extension = null
extensions = path.basename(filename).split '.'
# Remove initial dot from dotfiles
extensions.shift() if extensions[0] is ''
# Start with the longest extension and work our way shortwards
while extensions.shift()
thisExtension = '.' + extensions.join '.'
if module._extensions[thisExtension]
extension = thisExtension
break
return extension || '.js'
module.prototype.load = (filename) ->
@filename = filename
@paths = module._nodeModulePaths(path.dirname(filename))
extension = findExtension(filename)
module._extensions[extension](this, filename)
@loaded = true
# If we're on Node, patch `child_process.fork` so that Coffee scripts are able
# to fork both CoffeeScript files, and JavaScript files, directly.
if child_process