UNPKG

advanced-cropper

Version:

The core of the advanced cropper libraries family

280 lines (278 loc) 8.83 kB
function getDirectionNames(hDirection, vDirection) { var camelCase, snakeCase; if (hDirection && vDirection) { camelCase = "" + hDirection + vDirection[0].toUpperCase() + vDirection.slice(1); snakeCase = hDirection + "-" + vDirection; } else { camelCase = hDirection || vDirection; snakeCase = hDirection || vDirection; } return { camelCase: camelCase, snakeCase: snakeCase }; } function isBlob(url) { return /^blob:/.test(url); } function isDataUrl(url) { return /^data:/.test(url); } function isLocal(url) { return isBlob(url) || isDataUrl(url); } function isCrossOriginURL(url) { if (isLocal(url)) { return false; } var pageLocation = window.location; var URL_HOST_PATTERN = /(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/; var urlMatch = URL_HOST_PATTERN.exec(url) || []; var urlparts = { protocol: urlMatch[1] || '', host: urlMatch[2] || '', port: urlMatch[3] || '', }; var defaultPort = function (protocol) { if (protocol === 'http') { return 80; } else { return 433; } }; var portOf = function (location) { return location.port || defaultPort((location.protocol || pageLocation.protocol)); }; return !((!urlparts.protocol && !urlparts.host && !urlparts.port) || Boolean(urlparts.protocol && urlparts.protocol == pageLocation.protocol && urlparts.host && urlparts.host == pageLocation.host && urlparts.host && portOf(urlparts) == portOf(pageLocation))); } function isArray(value) { return Array.isArray(value); } function isFunction(value) { return typeof value === 'function'; } function isUndefined(obj) { return obj === undefined; } var isObject = function (term) { return term !== null && typeof term === 'object'; }; // TODO: add the typing function getOptions(options, defaultScheme, falseScheme) { if (falseScheme === void 0) { falseScheme = {}; } var result = {}; if (isObject(options)) { Object.keys(defaultScheme).forEach(function (key) { if (isUndefined(options[key])) { result[key] = defaultScheme[key]; } else if (isObject(defaultScheme[key])) { if (isObject(options[key])) { result[key] = getOptions(options[key], defaultScheme[key], falseScheme[key]); } else { result[key] = options[key] ? defaultScheme[key] : falseScheme[key]; } } else if (defaultScheme[key] === true || defaultScheme[key] === false) { result[key] = Boolean(options[key]); } else { result[key] = options[key]; } }); return result; } else { if (options) { return defaultScheme; } else { return falseScheme; } } } function parseNumber(number) { var parsedNumber = Number(number); if (Number.isNaN(parsedNumber)) { return number; } else { return parsedNumber; } } function isBoolean(value) { return value === true || value === false; } function isNumber(value) { return typeof value === 'number'; } function isString(value) { return typeof value === 'string'; } function isNaN(value) { return value !== value; } function isNumeric(value) { return ((isNumber(value) && !isNaN(value)) || (isString(value) && !Number.isNaN(parseFloat(value)) && isFinite(parseFloat(value)))); } function distance(firstPoint, secondPoint) { return Math.sqrt(Math.pow(firstPoint.left - secondPoint.left, 2) + Math.pow(firstPoint.top - secondPoint.top, 2)); } function isRoughlyEqual(a, b, tolerance) { if (tolerance === void 0) { tolerance = 1e-3; } return Math.abs(b - a) < tolerance; } function isGreater(a, b, tolerance) { return isRoughlyEqual(a, b, tolerance) ? false : a > b; } function isLower(a, b, tolerance) { return isRoughlyEqual(a, b, tolerance) ? false : a < b; } function isArrayBufferLike(value) { return value instanceof ArrayBuffer; } function getCloserAngle(reference, angle) { var turnsCount = Math.floor(reference / 360); var firstCandidate = turnsCount * 360 + angle; var secondCandidate = (turnsCount + 1) * 360 + angle; if (Math.abs(firstCandidate - reference) < Math.abs(secondCandidate - reference)) { return firstCandidate; } else { return secondCandidate; } } function sign(value) { var number = +value; if (number === 0 || isNaN(number)) { return number; } return number > 0 ? 1 : -1; } function promiseTimeout(timeout) { return new Promise(function (resolve) { setTimeout(function () { resolve(); }, timeout); }); } // Not performant, small function to reduce the code amount function deepClone(obj) { if (!isObject(obj)) { return obj; } var result = {}; if (Array.isArray(obj)) { result = obj.map(function (item) { return deepClone(item); }); } else { Object.keys(obj).forEach(function (key) { return (result[key] = deepClone(obj[key])); }); } return result; } function deepCompare(a, b, tolerance) { if (tolerance === void 0) { tolerance = 1e-3; } if (isNumber(a) && isNumber(b) && isRoughlyEqual(a, b, tolerance)) return true; if (a === b) return true; if (a && b && typeof a == 'object' && typeof b == 'object') { if (a.constructor !== b.constructor) return false; var length_1, i = void 0; if (Array.isArray(a)) { length_1 = a.length; if (length_1 != b.length) return false; for (i = length_1; i-- !== 0;) if (!deepCompare(a[i], b[i], tolerance)) return false; return true; } if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); var keys = Object.keys(a); length_1 = keys.length; if (length_1 !== Object.keys(b).length) return false; for (i = length_1; i-- !== 0;) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; for (i = length_1; i-- !== 0;) { var key = keys[i]; if (!deepCompare(a[key], b[key], tolerance)) return false; } return true; } return a !== a && b !== b; } function isWheelEvent(event) { return 'deltaX' in event; } function isTouchEvent(event) { return 'touches' in event; } function isMouseEvent(event) { return 'buttons' in event; } function emptyCoordinates() { return { left: 0, top: 0, width: 0, height: 0, }; } function isCardinalDirection(value) { return value === 'west' || value === 'south' || value === 'north' || value === 'east'; } function isOrdinalDirection(value) { return (isCardinalDirection(value) || value === 'westNorth' || value === 'westSouth' || value === 'eastNorth' || value === 'eastSouth'); } function debounce(callback, delay) { var timestamp; var timeout; function later() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var last = Date.now() - timestamp; var delayValue = isFunction(delay) ? delay() : delay || 0; if (last < delayValue && last >= 0) { timeout = setTimeout(function () { return later.apply(void 0, args); }, delayValue - last); } else { callback.apply(void 0, args); } } function result() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } timestamp = Date.now(); timeout = setTimeout(function () { return later.apply(void 0, args); }, isFunction(delay) ? delay() : delay || 0); } result.clear = function () { clearTimeout(timeout); }; return result; } export { debounce, deepClone, deepCompare, distance, emptyCoordinates, getCloserAngle, getDirectionNames, getOptions, isArray, isArrayBufferLike, isBlob, isBoolean, isCardinalDirection, isCrossOriginURL, isDataUrl, isFunction, isGreater, isLocal, isLower, isMouseEvent, isNaN, isNumber, isNumeric, isObject, isOrdinalDirection, isRoughlyEqual, isString, isTouchEvent, isUndefined, isWheelEvent, parseNumber, promiseTimeout, sign };