'use strict'; var constants = require('./constants'); var formatUrl = require('./format'); var getOptions = require('./options'); var objUtils = require('./util/object'); var parseUrl = require('./parse'); var relateUrl = require('./relate'); function RelateUrl(from, options) { this.options = getOptions(options, { defaultPorts: { ftp: 21, http: 80, https: 443 }, directoryIndexes: ['index.html'], ignore_www: false, output: RelateUrl.SHORTEST, rejectedSchemes: ['data', 'javascript', 'mailto'], removeAuth: false, removeDirectoryIndexes: true, removeEmptyQueries: false, removeRootTrailingSlash: true, schemeRelative: true, site: undefined, slashesDenoteHost: true, }); this.from = parseUrl.from(from, this.options, null); } /* Usage: instance=new RelateUrl(); instance.relate(); */ RelateUrl.prototype.relate = function (from, to, options) { // relate(to,options) if (objUtils.isPlainObject(to)) { options = to; to = from; from = null; } // relate(to) else if (!to) { to = from; from = null; } options = getOptions(options, this.options); from = from || options.site; from = parseUrl.from(from, options, this.from); if (!from || !from.href) { throw new Error('from value not defined.'); } else if (from.extra.hrefInfo.minimumPathOnly) { throw new Error('from value supplied is not absolute: ' + from.href); } to = parseUrl.to(to, options); if (to.valid === false) return to.href; to = relateUrl(from, to, options); to = formatUrl(to, options); return to; }; /* Usage: RelateUrl.relate(); */ RelateUrl.relate = function (from, to, options) { return new RelateUrl().relate(from, to, options); }; // Make constants accessible from API objUtils.shallowMerge(RelateUrl, constants); module.exports = RelateUrl;