code: function merge() {
    let i = 1
      , key
      , val
      , obj
      , target
      ;
  
    // make sure we don't modify source element and it's properties
    // objects are passed by reference
    target = clone( arguments[0] );
    while (obj = arguments[i++]) {
      for (key in obj) {
        if ( !hasOwn(obj, key) ) {
            continue;
        }
  
        val = obj[key];
        if ( isObject(val) && isObject(target[key]) ){
          // inception, deep merge objects
          target[key] = merge(target[key], val);
        } else {
          let is_url = val && val.type == url;
          let is_path = val && val.type == path;
  
          // make sure arrays, regexp, date, objects are cloned
          target[key] = clone(val);
          if( is_url ){
            target[key].type = url;
          }
  
          if( is_path ){
            target[key].type = path;
          }
        }
      }
    }
    return target;
  }
docs: Deep merge objects. except for path & url
  this breaks nopt as it is comparing to those module objects