| 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; |
| } |