src/utils.ts
export function joinUrl (baseUrl, url) {
if (/^(?:[a-z]+:)?\/\//i.test(url)) {
return url;
}
let joined = [baseUrl, url].join('/');
let normalize = function (str) {
return str
.replace(/[\/]+/g, '/')
.replace(/\/\?/g, '?')
.replace(/\/\#/g, '#')
.replace(/\:\//g, '://');
};
return normalize(joined);
}
export function getFullUrlPath (location) {
const isHttps = location.protocol === 'https:';
return location.protocol + '//' + location.hostname +
':' + (location.port || (isHttps ? '443' : '80')) +
(/^\//.test(location.pathname) ? location.pathname : '/' + location.pathname);
}
export function parseQueryString (str) {
let obj = {};
let key;
let value;
angular.forEach((str || '').split('&'), (keyValue) => {
if (keyValue) {
value = keyValue.split('=');
key = decodeURIComponent(value[0]);
obj[key] = angular.isDefined(value[1]) ? decodeURIComponent(value[1]) : true;
}
});
return obj;
}
export function decodeBase64 (str) {
let buffer;
if (typeof module !== 'undefined' && module.exports) {
try {
buffer = require('buffer').Buffer;
} catch (err) {
// noop
}
}
let fromCharCode = String.fromCharCode;
let re_btou = new RegExp([
'[\xC0-\xDF][\x80-\xBF]',
'[\xE0-\xEF][\x80-\xBF]{2}',
'[\xF0-\xF7][\x80-\xBF]{3}'
].join('|'), 'g');
let cb_btou = function (cccc) {
switch (cccc.length) {
case 4:
let cp = ((0x07 & cccc.charCodeAt(0)) << 18)
| ((0x3f & cccc.charCodeAt(1)) << 12)
| ((0x3f & cccc.charCodeAt(2)) << 6)
| (0x3f & cccc.charCodeAt(3));
let offset = cp - 0x10000;
return (fromCharCode((offset >>> 10) + 0xD800)
+ fromCharCode((offset & 0x3FF) + 0xDC00));
case 3:
return fromCharCode(
((0x0f & cccc.charCodeAt(0)) << 12)
| ((0x3f & cccc.charCodeAt(1)) << 6)
| (0x3f & cccc.charCodeAt(2))
);
default:
return fromCharCode(
((0x1f & cccc.charCodeAt(0)) << 6)
| (0x3f & cccc.charCodeAt(1))
);
}
};
let btou = function (b) {
return b.replace(re_btou, cb_btou);
};
let _decode = buffer ? function (a) {
return (a.constructor === buffer.constructor
? a : new buffer(a, 'base64')).toString();
}
: function (a) {
return btou(atob(a));
};
return _decode(
String(str).replace(/[-_]/g, function (m0) {
return m0 === '-' ? '+' : '/';
})
.replace(/[^A-Za-z0-9\+\/]/g, '')
);
}