117 lines
2.6 KiB
JavaScript
117 lines
2.6 KiB
JavaScript
const escape = {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": ''',
|
|
'`': '`',
|
|
'=': '='
|
|
};
|
|
|
|
const badChars = /[&<>"'`=]/g,
|
|
possible = /[&<>"'`=]/;
|
|
|
|
function escapeChar(chr) {
|
|
return escape[chr];
|
|
}
|
|
|
|
export function extend(obj /* , ...source */) {
|
|
for (let i = 1; i < arguments.length; i++) {
|
|
for (let key in arguments[i]) {
|
|
if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
|
|
obj[key] = arguments[i][key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
export let toString = Object.prototype.toString;
|
|
|
|
// Sourced from lodash
|
|
// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
|
|
/* eslint-disable func-style */
|
|
let isFunction = function(value) {
|
|
return typeof value === 'function';
|
|
};
|
|
// fallback for older versions of Chrome and Safari
|
|
/* istanbul ignore next */
|
|
if (isFunction(/x/)) {
|
|
isFunction = function(value) {
|
|
return (
|
|
typeof value === 'function' &&
|
|
toString.call(value) === '[object Function]'
|
|
);
|
|
};
|
|
}
|
|
export { isFunction };
|
|
/* eslint-enable func-style */
|
|
|
|
/* istanbul ignore next */
|
|
export const isArray =
|
|
Array.isArray ||
|
|
function(value) {
|
|
return value && typeof value === 'object'
|
|
? toString.call(value) === '[object Array]'
|
|
: false;
|
|
};
|
|
|
|
// Older IE versions do not directly support indexOf so we must implement our own, sadly.
|
|
export function indexOf(array, value) {
|
|
for (let i = 0, len = array.length; i < len; i++) {
|
|
if (array[i] === value) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
export function escapeExpression(string) {
|
|
if (typeof string !== 'string') {
|
|
// don't escape SafeStrings, since they're already safe
|
|
if (string && string.toHTML) {
|
|
return string.toHTML();
|
|
} else if (string == null) {
|
|
return '';
|
|
} else if (!string) {
|
|
return string + '';
|
|
}
|
|
|
|
// Force a string conversion as this will be done by the append regardless and
|
|
// the regex test will do this transparently behind the scenes, causing issues if
|
|
// an object's to string has escaped characters in it.
|
|
string = '' + string;
|
|
}
|
|
|
|
if (!possible.test(string)) {
|
|
return string;
|
|
}
|
|
return string.replace(badChars, escapeChar);
|
|
}
|
|
|
|
export function isEmpty(value) {
|
|
if (!value && value !== 0) {
|
|
return true;
|
|
} else if (isArray(value) && value.length === 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function createFrame(object) {
|
|
let frame = extend({}, object);
|
|
frame._parent = object;
|
|
return frame;
|
|
}
|
|
|
|
export function blockParams(params, ids) {
|
|
params.path = ids;
|
|
return params;
|
|
}
|
|
|
|
export function appendContextPath(contextPath, id) {
|
|
return (contextPath ? contextPath + '.' : '') + id;
|
|
}
|