'use strict'; var constants = require('./constants'); function formatAuth(urlObj, options) { if ( urlObj.auth && !options.removeAuth && (urlObj.extra.relation.maximumHost || options.output === constants.ABSOLUTE) ) { return urlObj.auth + '@'; } return ''; } function formatHash(urlObj, options) { return urlObj.hash ? urlObj.hash : ''; } function formatHost(urlObj, options) { if ( urlObj.host.full && (urlObj.extra.relation.maximumAuth || options.output === constants.ABSOLUTE) ) { return urlObj.host.full; } return ''; } function formatPath(urlObj, options) { var str = ''; var absolutePath = urlObj.path.absolute.string; var relativePath = urlObj.path.relative.string; var resource = showResource(urlObj, options); if ( urlObj.extra.relation.maximumHost || options.output === constants.ABSOLUTE || options.output === constants.ROOT_RELATIVE ) { str = absolutePath; } else if ( (relativePath.length <= absolutePath.length && options.output === constants.SHORTEST) || options.output === constants.PATH_RELATIVE ) { str = relativePath; if (str === '') { var query = showQuery(urlObj, options) && !!getQuery(urlObj, options); if (urlObj.extra.relation.maximumPath && !resource) { str = './'; } else if (urlObj.extra.relation.overridesQuery && !resource && !query) { str = './'; } } } else { str = absolutePath; } if ( str === '/' && !resource && options.removeRootTrailingSlash && (!urlObj.extra.relation.minimumPort || options.output === constants.ABSOLUTE) ) { str = ''; } return str; } function formatPort(urlObj, options) { if ( urlObj.port && !urlObj.extra.portIsDefault && urlObj.extra.relation.maximumHost ) { return ':' + urlObj.port; } return ''; } function formatQuery(urlObj, options) { return showQuery(urlObj, options) ? getQuery(urlObj, options) : ''; } function formatResource(urlObj, options) { return showResource(urlObj, options) ? urlObj.resource : ''; } function formatScheme(urlObj, options) { var str = ''; if ( urlObj.extra.relation.maximumHost || options.output === constants.ABSOLUTE ) { if ( !urlObj.extra.relation.minimumScheme || !options.schemeRelative || options.output === constants.ABSOLUTE ) { str += urlObj.scheme + '://'; } else { str += '//'; } } return str; } function formatUrl(urlObj, options) { var url = ''; url += formatScheme(urlObj, options); url += formatAuth(urlObj, options); url += formatHost(urlObj, options); url += formatPort(urlObj, options); url += formatPath(urlObj, options); url += formatResource(urlObj, options); url += formatQuery(urlObj, options); url += formatHash(urlObj, options); return url; } function getQuery(urlObj, options) { var stripQuery = options.removeEmptyQueries && urlObj.extra.relation.minimumPort; return urlObj.query.string[stripQuery ? 'stripped' : 'full']; } function showQuery(urlObj, options) { return ( !urlObj.extra.relation.minimumQuery || options.output === constants.ABSOLUTE || options.output === constants.ROOT_RELATIVE ); } function showResource(urlObj, options) { var removeIndex = options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex; var removeMatchingResource = urlObj.extra.relation.minimumResource && options.output !== constants.ABSOLUTE && options.output !== constants.ROOT_RELATIVE; return !!urlObj.resource && !removeMatchingResource && !removeIndex; } module.exports = formatUrl;