diff --git a/lib/path.js b/lib/path.js new file mode 100644 index 0000000000..c7bfa7e967 --- /dev/null +++ b/lib/path.js @@ -0,0 +1,64 @@ + +exports.join = function () { + return exports.normalize(Array.prototype.join.call(arguments, "/")); +}; + +exports.normalizeArray = function (parts, keepBlanks) { + var directories = [], prev; + for (var i = 0, l = parts.length - 1; i <= l; i++) { + var directory = parts[i]; + + // if it's blank, but it's not the first thing, and not the last thing, skip it. + if (directory === "" && i !== 0 && i !== l && !keepBlanks) continue; + + // if it's a dot, and there was some previous dir already, then skip it. + if (directory === "." && prev !== undefined) continue; + + if ( + directory === ".." + && directories.length + && prev !== ".." + && prev !== "." + && prev !== undefined + && (prev !== "" || keepBlanks) + ) { + directories.pop(); + prev = directories.slice(-1)[0] + } else { + if (prev === ".") directories.pop(); + directories.push(directory); + prev = directory; + } + } + return directories; +}; + +exports.normalize = function (path, keepBlanks) { + return exports.normalizeArray(path.split("/"), keepBlanks).join("/"); +}; + +exports.dirname = function (path) { + return path && path.substr(0, path.lastIndexOf("/")) || "."; +}; + +exports.filename = function () { + throw new Error("path.filename is deprecated. Please use path.basename instead."); +}; +exports.basename = function (path, ext) { + var f = path.substr(path.lastIndexOf("/") + 1); + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + +exports.extname = function (path) { + var index = path.lastIndexOf('.'); + return index < 0 ? '' : path.substring(index); +}; + +exports.exists = function (path, callback) { + process.binding('fs').stat(path, function (err, stats) { + if (callback) callback(err ? false : true); + }); +}; diff --git a/src/node.cc b/src/node.cc index a184c93281..9daf50c7c3 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1308,6 +1308,7 @@ static Handle Binding(const Arguments& args) { exports->Set(String::New("url"), String::New(native_url)); exports->Set(String::New("utils"), String::New(native_utils)); exports->Set(String::New("events"), String::New(native_events)); + exports->Set(String::New("path"), String::New(native_path)); binding_cache->Set(module, exports); } diff --git a/src/node.js b/src/node.js index 7c6b11b7e3..f2b4854815 100644 --- a/src/node.js +++ b/src/node.js @@ -196,72 +196,13 @@ function debug (x) { } } - -var pathModule = createInternalModule("path", function (exports) { - exports.join = function () { - return exports.normalize(Array.prototype.join.call(arguments, "/")); - }; - - exports.normalizeArray = function (parts, keepBlanks) { - var directories = [], prev; - for (var i = 0, l = parts.length - 1; i <= l; i++) { - var directory = parts[i]; - - // if it's blank, but it's not the first thing, and not the last thing, skip it. - if (directory === "" && i !== 0 && i !== l && !keepBlanks) continue; - - // if it's a dot, and there was some previous dir already, then skip it. - if (directory === "." && prev !== undefined) continue; - - if ( - directory === ".." - && directories.length - && prev !== ".." - && prev !== "." - && prev !== undefined - && (prev !== "" || keepBlanks) - ) { - directories.pop(); - prev = directories.slice(-1)[0] - } else { - if (prev === ".") directories.pop(); - directories.push(directory); - prev = directory; - } - } - return directories; - }; - - exports.normalize = function (path, keepBlanks) { - return exports.normalizeArray(path.split("/"), keepBlanks).join("/"); - }; - - exports.dirname = function (path) { - return path.substr(0, path.lastIndexOf("/")) || "."; - }; - - exports.filename = function () { - throw new Error("path.filename is deprecated. Please use path.basename instead."); - }; - exports.basename = function (path, ext) { - var f = path.substr(path.lastIndexOf("/") + 1); - if (ext && f.substr(-1 * ext.length) === ext) { - f = f.substr(0, f.length - ext.length); - } - return f; - }; - - exports.extname = function (path) { - var index = path.lastIndexOf('.'); - return index < 0 ? '' : path.substring(index); - }; - - exports.exists = function (path, callback) { - requireNative('fs').stat(path, function (err, stats) { - if (callback) callback(err ? false : true); - }); - }; -}); +var pathModule = createInternalModule + ( 'path' + , process.compile + ( "(function (exports) {" + natives.path + "})" + , "path" + ) + ); var path = pathModule.exports;