(function (name, context, definition) { if (typeof module !== 'undefined' && module.exports) module.exports = definition(); else if (typeof define === 'function' && define.amd) define(definition); else context[name] = definition(); })('urljoin', this, function () { function normalize (str, options) { // make sure protocol is followed by two slashes str = str.replace(/:\//g, '://'); // remove consecutive slashes str = str.replace(/([^:\s])\/+/g, '$1/'); // remove trailing slash before parameters or hash str = str.replace(/\/(\?|&|#[^!])/g, '$1'); // replace ? in parameters with & str = str.replace(/(\?.+)\?/g, '$1&'); return str; } return function () { var input = arguments; var options = {}; if (typeof arguments[0] === 'object') { // new syntax with array and options input = arguments[0]; options = arguments[1] || {}; } var joined = [].slice.call(input, 0).join('/'); return normalize(joined, options); }; });