79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
|
||
|
/**
|
||
|
* Parses string form of URL into an object
|
||
|
* // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
|
||
|
* // intentionally using regex and not <a/> href parsing trick because React Native and other
|
||
|
* // environments where DOM might not be available
|
||
|
* @returns parsed URL object
|
||
|
*/
|
||
|
function parseUrl(url) {
|
||
|
if (!url) {
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
const match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
|
||
|
|
||
|
if (!match) {
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
// coerce to undefined values to empty string so we don't get 'undefined'
|
||
|
const query = match[6] || '';
|
||
|
const fragment = match[8] || '';
|
||
|
return {
|
||
|
host: match[4],
|
||
|
path: match[5],
|
||
|
protocol: match[2],
|
||
|
search: query,
|
||
|
hash: fragment,
|
||
|
relative: match[5] + query + fragment, // everything minus origin
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Strip the query string and fragment off of a given URL or path (if present)
|
||
|
*
|
||
|
* @param urlPath Full URL or path, including possible query string and/or fragment
|
||
|
* @returns URL or path without query string or fragment
|
||
|
*/
|
||
|
function stripUrlQueryAndFragment(urlPath) {
|
||
|
// eslint-disable-next-line no-useless-escape
|
||
|
return urlPath.split(/[\?#]/, 1)[0];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns number of URL segments of a passed string URL.
|
||
|
*/
|
||
|
function getNumberOfUrlSegments(url) {
|
||
|
// split at '/' or at '\/' to split regex urls correctly
|
||
|
return url.split(/\\?\//).filter(s => s.length > 0 && s !== ',').length;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Takes a URL object and returns a sanitized string which is safe to use as span description
|
||
|
* see: https://develop.sentry.dev/sdk/data-handling/#structuring-data
|
||
|
*/
|
||
|
function getSanitizedUrlString(url) {
|
||
|
const { protocol, host, path } = url;
|
||
|
|
||
|
const filteredHost =
|
||
|
(host &&
|
||
|
host
|
||
|
// Always filter out authority
|
||
|
.replace(/^.*@/, '[filtered]:[filtered]@')
|
||
|
// Don't show standard :80 (http) and :443 (https) ports to reduce the noise
|
||
|
// TODO: Use new URL global if it exists
|
||
|
.replace(/(:80)$/, '')
|
||
|
.replace(/(:443)$/, '')) ||
|
||
|
'';
|
||
|
|
||
|
return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;
|
||
|
}
|
||
|
|
||
|
exports.getNumberOfUrlSegments = getNumberOfUrlSegments;
|
||
|
exports.getSanitizedUrlString = getSanitizedUrlString;
|
||
|
exports.parseUrl = parseUrl;
|
||
|
exports.stripUrlQueryAndFragment = stripUrlQueryAndFragment;
|
||
|
//# sourceMappingURL=url.js.map
|