--- /dev/null
+'use strict';
+
+var Path = require('path');
+var slice = Array.prototype.slice;
+
+function join(/* globs */) {
+ var args;
+
+ args = slice.call(arguments, 0);
+ return args.reduce(function (result, globs) {
+ return _apply(result, function (path) {
+ return _apply(globs, function (glob) {
+ return _join(path, glob);
+ });
+ });
+ }, '');
+}
+
+function _apply(values, fn) {
+ if (Array.isArray(values)) {
+ return values.reduce(function (result, value) {
+ return result.concat(fn(value));
+ }, []);
+ }
+ return fn(values);
+}
+
+function _join(path, glob) {
+ var negative, positive;
+
+ if (glob[0] === '!') {
+ positive = glob.substr(1);
+ if (path[0] === '!') {
+ negative = '';
+ } else {
+ negative = '!';
+ }
+ return negative + Path.join(path, positive);
+ }
+ return Path.join(path, glob);
+}
+
+module.exports = join;