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

99 lines
3.6 KiB
JavaScript

'use strict';
function findRelation_upToPath(urlObj, siteUrlObj, options) {
// Path- or root-relative URL
var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly;
// Matching scheme, scheme-relative or path-only
var minimumScheme = urlObj.scheme === siteUrlObj.scheme || !urlObj.scheme;
// Matching auth, ignoring auth or path-only
var minimumAuth =
minimumScheme &&
(urlObj.auth === siteUrlObj.auth || options.removeAuth || pathOnly);
// Matching host or path-only
var www = options.ignore_www ? 'stripped' : 'full';
var minimumHost =
minimumAuth && (urlObj.host[www] === siteUrlObj.host[www] || pathOnly);
// Matching port or path-only
var minimumPort =
minimumHost && (urlObj.port === siteUrlObj.port || pathOnly);
urlObj.extra.relation.minimumScheme = minimumScheme;
urlObj.extra.relation.minimumAuth = minimumAuth;
urlObj.extra.relation.minimumHost = minimumHost;
urlObj.extra.relation.minimumPort = minimumPort;
urlObj.extra.relation.maximumScheme =
!minimumScheme || (minimumScheme && !minimumAuth);
urlObj.extra.relation.maximumAuth =
!minimumScheme || (minimumScheme && !minimumHost);
urlObj.extra.relation.maximumHost =
!minimumScheme || (minimumScheme && !minimumPort);
}
function findRelation_pathOn(urlObj, siteUrlObj, options) {
var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly;
var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly;
var empty = urlObj.extra.hrefInfo.empty; // not required, but self-documenting
// From upToPath()
var minimumPort = urlObj.extra.relation.minimumPort;
var minimumScheme = urlObj.extra.relation.minimumScheme;
// Matching port and path
var minimumPath =
minimumPort &&
urlObj.path.absolute.string === siteUrlObj.path.absolute.string;
// Matching resource or query/hash-only or empty
var matchingResource =
urlObj.resource === siteUrlObj.resource ||
(!urlObj.resource && siteUrlObj.extra.resourceIsIndex) ||
(options.removeDirectoryIndexes &&
urlObj.extra.resourceIsIndex &&
!siteUrlObj.resource);
var minimumResource =
minimumPath && (matchingResource || queryOnly || hashOnly || empty);
// Matching query or hash-only/empty
var query = options.removeEmptyQueries ? 'stripped' : 'full';
var urlQuery = urlObj.query.string[query];
var siteUrlQuery = siteUrlObj.query.string[query];
var minimumQuery =
(minimumResource && !!urlQuery && urlQuery === siteUrlQuery) ||
((hashOnly || empty) && !urlObj.extra.hrefInfo.separatorOnlyQuery);
var minimumHash = minimumQuery && urlObj.hash === siteUrlObj.hash;
urlObj.extra.relation.minimumPath = minimumPath;
urlObj.extra.relation.minimumResource = minimumResource;
urlObj.extra.relation.minimumQuery = minimumQuery;
urlObj.extra.relation.minimumHash = minimumHash;
urlObj.extra.relation.maximumPort =
!minimumScheme || (minimumScheme && !minimumPath);
urlObj.extra.relation.maximumPath =
!minimumScheme || (minimumScheme && !minimumResource);
urlObj.extra.relation.maximumResource =
!minimumScheme || (minimumScheme && !minimumQuery);
urlObj.extra.relation.maximumQuery =
!minimumScheme || (minimumScheme && !minimumHash);
urlObj.extra.relation.maximumHash =
!minimumScheme || (minimumScheme && !minimumHash); // there's nothing after hash, so it's the same as maximumQuery
// Matching path and/or resource with existing but non-matching site query
urlObj.extra.relation.overridesQuery =
minimumPath &&
urlObj.extra.relation.maximumResource &&
!minimumQuery &&
!!siteUrlQuery;
}
module.exports = {
pathOn: findRelation_pathOn,
upToPath: findRelation_upToPath,
};