@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
207 lines • 8.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseHash = exports.parseQueryString = exports.encodeURIComponentEX = exports.removeUrlKeyValue = exports.setUrlKeyValue = exports.isDataUrl = exports.getURLExtension = exports.normalizeUrl = exports.makeServerRelativeUrl = exports.navigateOrReload = exports.makeFullUrl = exports.getParameterValue = exports.getHashParameter = exports.getQueryStringParameter = void 0;
const collections_base_1 = require("./collections.base");
const typecheckers_1 = require("./typecheckers");
const urlhelper_1 = require("./urlhelper");
/**
* Get query string parameter by name
* @param name name of parameter
* @param url optional, url. if not sent - current window.location.href will be used
*/
function getQueryStringParameter(param, url, caseInSensitive = true) {
let search = window.location.search;
if (!(0, typecheckers_1.isNullOrEmptyString)(url)) {
let tmp = url.split('#')[0].split('?');
search = tmp.length > 1 ? tmp[1] : '';
}
return getParameterValue(param, search, caseInSensitive);
}
exports.getQueryStringParameter = getQueryStringParameter;
/**
* Get url hash parameter by name
* @param name name of parameter
* @param url optional, url. if not sent - current window.location.href will be used
*/
function getHashParameter(param, url, caseInSensitive = true) {
let hash = window.location.hash;
if (!(0, typecheckers_1.isNullOrEmptyString)(url)) {
let tmp = url.split('#');
hash = tmp.length > 1 ? tmp[1] : '';
}
return getParameterValue(param, hash, caseInSensitive);
}
exports.getHashParameter = getHashParameter;
/** return a value of a parameter from a key/value string like: key=value&key2=value2 */
function getParameterValue(param, keyValueString, caseInSensitive = true) {
let _keyValueString = keyValueString.startsWith("#") || keyValueString.startsWith("?") ? keyValueString.substring(1) : keyValueString;
let parsed = _keyValueString.split('&');
for (var i = 0; i < parsed.length; i++) {
let values = parsed[i].split('=');
if (caseInSensitive ? values[0].toLowerCase() === param.toLowerCase() : values[0] === param) {
let v = (values.length > 1 ? values[1] : param);
return decodeURIComponent(v.replace(/\+/g, " "));
}
//ISSUE: 1301 - the query string parameter name was encoded in window.location.href/window.location.search even though in the
//url bar the paramter name was not encoded
if (caseInSensitive ? decodeURIComponent(values[0]).toLowerCase() === param.toLowerCase() : decodeURIComponent(values[0]) === param) {
let v = (values.length > 1 ? values[1] : param);
return decodeURIComponent(v.replace(/\+/g, " "));
}
}
return "";
}
exports.getParameterValue = getParameterValue;
/**
* Make full url relative to current page location
* @param url
*/
function makeFullUrl(url, baseUrl) {
if ((0, typecheckers_1.isNullOrEmptyString)(url))
url = baseUrl || window.location.href;
if (url.indexOf('://') > 0)
return url;
else {
if (url.startsWith('/') || url.startsWith('#')) {
//server relative
if ((0, typecheckers_1.isNullOrEmptyString)(baseUrl)) { //no override base
let xxx = document.createElement("a");
xxx.href = url;
return xxx.href;
}
else //have override base
{
if (url.startsWith('#'))
return `${baseUrl.split('#')[0]}${url}`;
return `${baseUrl.split('/').slice(0, 3).join("/")}${url}`;
}
}
else //folder relative URL, and we have a different baseURL to base it on
{
return makeFullUrl(makeServerRelativeUrl(url, baseUrl), baseUrl);
}
}
}
exports.makeFullUrl = makeFullUrl;
/** if the url is the same, only different hash parameter - reload the page. otherwise - navigate to the page */
function navigateOrReload(urlWithHash) {
if (makeServerRelativeUrl(urlWithHash).split('#')[0].toLowerCase() === makeServerRelativeUrl(window.location.href).split('#')[0].toLowerCase())
window.location.reload(); //can't change hash - it won't refresh page
else
window.location.href = urlWithHash;
}
exports.navigateOrReload = navigateOrReload;
/** baseUrl is optional full or server relative URL to build folder relative urls from. */
function makeServerRelativeUrl(url, baseUrl) {
if ((0, typecheckers_1.isNullOrEmptyString)(url))
url = baseUrl || window.location.href.split('?')[0];
let index = url.indexOf("//");
if (index > 0) //this is a full URL, just trim it from // until the first / and return.
{
index = url.indexOf("/", index + 2); //find next / after the ://domain.name
if (index < 0)
return "/"; //not found - return "/" for the root.
else
return url.slice(index); //found - return from that "/" onwards.
}
else if (url.startsWith('/')) //server relative url already
return url;
else //folder relative url
{
let baseRelativeUrl = makeServerRelativeUrl(baseUrl || window.location.href);
baseRelativeUrl = baseRelativeUrl.split('?')[0];
//if ends with file name - strip it
if ((0, collections_base_1.lastOrNull)(baseRelativeUrl.split('/')).indexOf('.') >= 0)
baseRelativeUrl = baseRelativeUrl.substr(0, baseRelativeUrl.lastIndexOf('/'));
return normalizeUrl(baseRelativeUrl, true) + url;
}
}
exports.makeServerRelativeUrl = makeServerRelativeUrl;
/** Normalizes URL ending, end with or without slash */
function normalizeUrl(url, endWithSlash = false) {
let tmp = url;
if (endWithSlash) {
if ((0, typecheckers_1.isNullOrEmptyString)(tmp))
tmp = "/";
else if (tmp.substr(-1) !== "/")
tmp += "/";
}
else {
if (!(0, typecheckers_1.isNullOrEmptyString)(tmp) && tmp.endsWith('/'))
tmp = tmp.slice(0, url.length - 1);
}
return tmp;
}
exports.normalizeUrl = normalizeUrl;
/**
* Returns the extension for a specified url string. Requires the URL polyfill for IE.
*/
function getURLExtension(url) {
if (!(0, typecheckers_1.isString)(url)) {
return "";
}
//if (!isString(baseUri)) {
// baseUri = document.baseURI || window.location.protocol + "://" + window.location.hostname + window.location.pathname;
//}
let urlObj = new URL(url, "https://example.com");
url = urlObj.href.replace(urlObj.host, "").replace(urlObj.hash, "").replace(urlObj.search, "");
return url.substring(url.lastIndexOf("/") + 1).split(/#|\?/)[0].split(".").pop().trim();
}
exports.getURLExtension = getURLExtension;
function isDataUrl(url) {
let REGEXP_DATA_URL = /^data:(?:.+?\/.+?)?(?:;.+?=.+?)*(?:;base64)?,.*$/;
return REGEXP_DATA_URL.test(url);
}
exports.isDataUrl = isDataUrl;
function setUrlKeyValue(keyName, keyValue, bEncode, url) {
if (!(0, typecheckers_1.isString)(url)) {
url = window.location.href + "";
}
let urlParams = new urlhelper_1.URLHelper(url);
return urlParams.setQueryStringParam(keyName, keyValue, bEncode);
}
exports.setUrlKeyValue = setUrlKeyValue;
function removeUrlKeyValue(keyName, url, bCaseInsensitive) {
if (!(0, typecheckers_1.isString)(url)) {
url = window.location.href + "";
}
let urlParams = new urlhelper_1.URLHelper(url);
return urlParams.removeQueryStringParam(keyName, bCaseInsensitive);
}
exports.removeUrlKeyValue = removeUrlKeyValue;
/**
* Returns encoded string from encodeURIComponent with single quote replaced with %27 or %27%27
*/
function encodeURIComponentEX(str, options) {
return encodeURIComponent(str).replace(/'/g, (s) => {
return options && options.singleQuoteMultiplier > 1
? (0, collections_base_1.ArrayFill)(new Array(options.singleQuoteMultiplier), "%27").join('')
: `%27`;
});
}
exports.encodeURIComponentEX = encodeURIComponentEX;
function parseQueryString(url) {
if ((0, typecheckers_1.isNullOrEmptyString)(url) || url.indexOf('?') < 0)
return {};
let strParams = url.split('?')[1].split('#')[0].split('&');
let params = {};
strParams.forEach(p => {
let keyValue = p.split("=");
params[keyValue[0]] = decodeURIComponent(keyValue[1] || "");
});
return params;
}
exports.parseQueryString = parseQueryString;
function parseHash(url) {
if ((0, typecheckers_1.isNullOrEmptyString)(url) || url.indexOf('#') < 0)
return {};
let strParams = url.split('#')[1].split('&');
let params = {};
strParams.forEach(p => {
let keyValue = p.split("=");
params[keyValue[0]] = decodeURIComponent(keyValue[1] || "");
});
return params;
}
exports.parseHash = parseHash;
//# sourceMappingURL=url.js.map