2025-04-02 06:50:39 -04:00

161 lines
3.6 KiB
JavaScript

'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;