diff --git a/.travis.yml b/.travis.yml index 7f2ef5de8..90afc1edf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ language: node_js node_js: - - 0.6 \ No newline at end of file + - 0.6 + - 0.8 \ No newline at end of file diff --git a/package.json b/package.json index 97a314793..f694a8192 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "optimist": "0.2.x", "uglify-js": "1.2.x", "sprintf": "0.1.x", + "enhanced-require": "0.1.x", "raw-loader": "0.1.x", "json-loader": "0.1.x", "jade-loader": "0.1.x", diff --git a/require-polyfill.js b/require-polyfill.js index 4792a0d71..e79efacc9 100644 --- a/require-polyfill.js +++ b/require-polyfill.js @@ -1,157 +1 @@ -// Polyfill for node.js -// - adds require.ensure -// - adds require.context -// call it like this: -// require = require("webpack/require-polyfill")(require.valueOf()); -// This is only required when you want to use the special require.xxx methods -// in server-side code which should be so only in rar cases. -module.exports = function(req) { - if(!req.webpackPolyfill) { - var oldReq = req; - req = function(name) { - if(name.indexOf("!") !== -1) { - var items = name.replace(/^!|!$/g, "").replace(/!!/g, "!").split(/!/g); - var resource = oldReq.resolve(items.pop()); - var resolved = []; - items.forEach(function(item, index) { - var relative = false; - if(item.length > 2 && - item[0] === ".") { - if(item[1] === "/") - relative = true; - else if(item.length > 3 && - item[1] === "." && - item[2] === "/") - relative = true; - } - if(item.length > 3 && - item[1] === ":" && - item[2] === "\\") - relative = true; - var tries = []; - if(!relative) { - module.exports.options.resolve.loaderPostfixes.forEach(function(postfix) { - if(item.indexOf("/") !== -1) - tries.push(item.replace("/", postfix+"/")); - else - tries.push(item + postfix); - }); - } - tries.push(item); - var extensions = module.exports.options.resolve.loaderExtensions; - for(var i = 0; i < tries.length; i++) { - for(var ext = 0; ext < extensions.length; ext++) { - try { - var file = oldReq.resolve(tries[i] + extensions[ext]); - } catch(e) {} - if(file) { - resolved.push(file); - break; - } - } - if(ext !== extensions.length) - break; - } - if(i === tries.length) - throw new Error("Cannot find loader module '"+item+"'"); - }); - resolved = resolved.reverse(); - var cacheLine = resolved.join("!") + "!" + resource; - var cacheEntry = oldReq.cache[cacheLine]; - if(cacheEntry) - return cacheEntry; - var content = [require("fs").readFileSync(resource, "utf-8")]; - var values; - function exec(code, filename) { - var Module = require("module"); - var m = new Module("exec in " + cacheLine, module); - m.filename = resource; - m.paths = Module._nodeModulePaths(require("path").dirname(resource)); - m._compile("require = require(" + JSON.stringify(__filename) + ")(require.valueOf());" + code, filename); - return m.exports; - } - resolved.forEach(function(loader) { - var set = false, err = null; - var context = { - request: cacheLine, - filenames: [resource], - exec: exec, - resolve: function(context, path, cb) { - try { - var Module = require("module"); - var virtModule = new Module(".", null); - virtModule.filename = require("path").join(context, "resolve.js"); - virtModule.paths = Module._nodeModulePaths(context); - cb(null, Module._resolveFilename(path, virtModule)); - } catch(e) { cb(e); } - }, - async: function() { return false; }, - callback: function() { - set = true; - content = Array.prototype.slice.apply(arguments); - err = content.shift(); - values = context.values; - }, - options: module.exports.options, - minimize: module.exports.options.minimize, - debug: module.exports.options.debug, - web: false, - inputValues: values, - values: undefined - }; - var retVal = oldReq(loader).apply(context, content); - if(set) { - if(err) throw err; - } else { - content = [retVal]; - values = context.values; - } - }); - var ret; - if(values !== undefined) - ret = values[0]; - else - ret = exec(content[0], cacheLine); - oldReq.cache[cacheLine] = ret; - return ret; - } else { - var resolved = oldReq.resolve(name); - var match = false; - var loaders = module.exports.options.resolve.loaders; - for(var i = 0; i < loaders.length; i++) - if(loaders[i].test.test(resolved)) - return req(loaders[i].loader + "!" + name); - - return oldReq(name); - } - }; - req.__proto__ = oldReq; - req.webpackPolyfill = true; - } - if(!req.ensure) { - req.ensure = function(array, callback) { - callback(req); - }; - } - if(!req.context) { - req.context = function(contextName) { - return function(name) { - return req(contextName + "/" + name); - } - } - } - return req; -} -var options = module.exports.options = { - resolve: { - loaders: [ - {test: /\.coffee$/, loader: "coffee"}, - // {test: /\.json$/, loader: "json"}, // This works out of the box in node.js - {test: /\.jade$/, loader: "jade"}, - {test: /\.css$/, loader: "style!css"}, - {test: /\.less$/, loader: "style!css!val!less"} - ], - loaderExtensions: [".webpack-loader.js", ".loader.js", ".js", ""], - loaderPostfixes: ["-webpack-loader", "-loader", ""] - } -}; \ No newline at end of file +module.exports = require("enhanced-require") \ No newline at end of file diff --git a/require-polyfill.web.js b/require-polyfill.web.js deleted file mode 100644 index cc1118329..000000000 --- a/require-polyfill.web.js +++ /dev/null @@ -1,2 +0,0 @@ -// No polyfill needed when compiled with webpack -module.exports = function(r){return r} \ No newline at end of file