UNPKG

uploadcare-widget

Version:
1,421 lines (1,382 loc) 555 kB
/** * @license uploadcare-widget v3.21.8 * * Copyright (c) 2024 Uploadcare, Inc. * * This source code is licensed under the BSD 2-Clause License * found in the LICENSE file in the root directory of this source tree. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.uploadcare = factory(global.$)); })(this, (function ($) { 'use strict'; function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var $__default = /*#__PURE__*/_interopDefaultLegacy($); function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } // utils var log = function log() { var ref; try { var _ref; return (ref = window.console) != null ? typeof ref.log === 'function' ? (_ref = ref).log.apply(_ref, arguments) : undefined : undefined; } catch (error) {} }; var debug = function debug() { var ref; if ((ref = window.console) != null ? ref.debug : undefined) { try { var _window$console; return (_window$console = window.console).debug.apply(_window$console, arguments); } catch (error) {} } else { return log.apply(void 0, ['Debug:'].concat(Array.prototype.slice.call(arguments))); } }; var warn = function warn() { var ref; if ((ref = window.console) != null ? ref.warn : undefined) { try { var _window$console2; return (_window$console2 = window.console).warn.apply(_window$console2, arguments); } catch (error) {} } else { return log.apply(void 0, ['Warning:'].concat(Array.prototype.slice.call(arguments))); } }; var messages = {}; var warnOnce = function warnOnce(msg) { if (messages[msg] == null) { messages[msg] = true; return warn(msg); } }; var isWindowDefined = function isWindowDefined() { return (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object'; }; var isWindowDefined$1 = /*#__PURE__*/Object.freeze({ __proto__: null, isWindowDefined: isWindowDefined }); var REQUEST_WAS_THROTTLED_CODE = 'RequestThrottledError'; var DEFAULT_THROTTLED_TIMEOUT = 15000; /** * @typedef {object} RetryState * @property {number} [attempt] * @property {number} [timeoutId] * @property {JQuery.jqXHR} [jqXHR] */ /** * @typedef {object} RetryConfig * @property {number} baseTimeout * @property {number} attempts * @property {number} throttledAttempts * @property {number} factor * @property {boolean} debugUploads * @property {Function} [onAttemptFail] */ /** * @param {JQuery.jqXHR} jqXHR * @param {RetryConfig} config * @param {RetryState} state */ function getRetrySettings(jqXHR, config, state) { var _jqXHR$responseJSON; var isThrottled = (jqXHR === null || jqXHR === void 0 || (_jqXHR$responseJSON = jqXHR.responseJSON) === null || _jqXHR$responseJSON === void 0 || (_jqXHR$responseJSON = _jqXHR$responseJSON.error) === null || _jqXHR$responseJSON === void 0 ? void 0 : _jqXHR$responseJSON.error_code) === REQUEST_WAS_THROTTLED_CODE; if (isThrottled && state.attempt < config.throttledAttempts) { var retryAfter = Number.parseFloat(jqXHR.getResponseHeader('retry-after')); return { shouldRetry: true, retryTimeout: Number.isFinite(retryAfter) ? Math.ceil(retryAfter * 1000) : DEFAULT_THROTTLED_TIMEOUT }; } var isRequestFailed = ['error', 'timeout'].indexOf(jqXHR.statusText) !== -1; if (isRequestFailed && state.attempt < config.attempts) { var retryTimeout = Math.round(config.baseTimeout * Math.pow(config.factor, state.attempt)); return { shouldRetry: true, retryTimeout: retryTimeout }; } return { shouldRetry: false }; } /** * * @param {JQuery.jqXHR} jqXHR * @param {JQuery.AjaxSettings} ajaxSettings * @param {RetryConfig} config * @param {RetryState} state * @returns */ function createPipeFilter(jqXHR, ajaxSettings, config, state) { return function () { var df = $__default["default"].Deferred(); function nextRequest() { state.jqXHR = $__default["default"].ajax(ajaxSettings).retry(config, _objectSpread2(_objectSpread2({}, state), {}, { attempt: state.attempt + 1 })).done(df.resolve).fail(df.reject); } var _getRetrySettings = getRetrySettings(jqXHR, config, state), shouldRetry = _getRetrySettings.shouldRetry, retryTimeout = _getRetrySettings.retryTimeout; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (shouldRetry) { var _config$onAttemptFail; (_config$onAttemptFail = config.onAttemptFail) === null || _config$onAttemptFail === void 0 || _config$onAttemptFail.call(config, { attempt: state.attempt }); if (config.debugUploads) { log("Attempt failed. Retry #".concat(state.attempt + 1, " in ").concat(retryTimeout, "ms"), jqXHR); } state.timeoutId = setTimeout(nextRequest, retryTimeout); } else if (jqXHR.state() === 'resolved') { df.resolveWith(jqXHR, args); } else { df.rejectWith(jqXHR, args); } return df; }; } /** * * @param {JQuery.jqXHR} jqXHR * @param {JQuery.AjaxSettings} ajaxSettings * @param {RetryConfig} retryConfig * @param {RetryState} retryState * @returns {JQuery.PromiseBase} */ function ajaxRetry(jqXHR, ajaxSettings, retryConfig, retryState) { var missedOption = ['baseTimeout', 'attempts', 'factor'].find(function (key) { return typeof retryConfig[key] === 'undefined'; }); if (missedOption) { warn("Option key \"".concat(missedOption, "\" is missed in the retry config.")); return jqXHR; } retryState = { attempt: retryState.attempt || 0, timeoutId: null, jqXHR: null }; retryConfig = _objectSpread2({ baseTimeout: null, attempts: null, factor: null, onAttemptFail: null, debugUploads: false }, retryConfig); var pipeFilter = createPipeFilter(jqXHR, ajaxSettings, retryConfig, retryState); var df = jqXHR.then(pipeFilter, pipeFilter); df.abort = function () { var _retryState$jqXHR; clearTimeout(retryState.timeoutId); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } jqXHR.abort.apply(jqXHR, args); (_retryState$jqXHR = retryState.jqXHR) === null || _retryState$jqXHR === void 0 || _retryState$jqXHR.abort.apply(_retryState$jqXHR, args); }; return df; } isWindowDefined() && function () { $__default["default"].ajaxPrefilter(function (ajaxSettings, _, jqXHR) { jqXHR.retry = function (retryConfig) { var retryState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return ajaxRetry(jqXHR, ajaxSettings, retryConfig, retryState); }; }); }(); // from https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js if (isWindowDefined() && window.XDomainRequest) { $__default["default"].ajaxTransport(function (s) { if (s.crossDomain && s.async) { if (s.timeout) { s.xdrTimeout = s.timeout; delete s.timeout; } var xdr; return { send: function send(_, complete) { function callback(status, statusText, responses, responseHeaders) { xdr.onload = xdr.onerror = xdr.ontimeout = function () {}; xdr = undefined; complete(status, statusText, responses, responseHeaders); } xdr = new XDomainRequest(); xdr.onload = function () { callback(200, "OK", { text: xdr.responseText }, "Content-Type: " + xdr.contentType); }; xdr.onerror = function () { callback(404, "Not Found"); }; xdr.onprogress = function () {}; xdr.ontimeout = function () { callback(0, "timeout"); }; xdr.timeout = s.xdrTimeout || Number.MAX_VALUE; xdr.open(s.type, s.url.replace(/^https?:/, '')); xdr.send(s.hasContent && s.data || null); }, abort: function abort() { if (xdr) { xdr.onerror = function () {}; xdr.abort(); } } }; } }); } var version = "3.21.8"; // utils.abilities var fileAPI = isWindowDefined() && !!(window.File && window.FileList && window.FileReader); var sendFileAPI = isWindowDefined() && !!(window.FormData && fileAPI); // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/draganddrop.js var dragAndDrop = isWindowDefined() && function () { var el; el = document.createElement('div'); return 'draggable' in el || 'ondragstart' in el && 'ondrop' in el; }(); // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/canvas.js var canvas = isWindowDefined() && function () { var el; el = document.createElement('canvas'); return !!(el.getContext && el.getContext('2d')); }(); var fileDragAndDrop = fileAPI && dragAndDrop; var iOSVersion = null; // TODO: don't access to navigator in module scope (NODE don't have navigator) var ios = isWindowDefined() && /^[^(]+\(iP(?:hone|od|ad);\s*(.+?)\)/.exec(navigator.userAgent); if (ios) { var ver = /OS (\d*)_(\d*)/.exec(ios[1]); if (ver) { iOSVersion = +ver[1] + ver[2] / 10; } } // There is no a guaranteed way to detect iPadOs, cause it mimics the desktop safari. // So we're checkin for multitouch support and `navigator.platform` value. // Since no desktop macs with multitouch exists, this check will work. For now at least. // Workaround source: https://stackoverflow.com/questions/57776001/how-to-detect-ipad-pro-as-ipad-using-javascript var isIpadOs = isWindowDefined() && navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform); var Blob = false; try { if (isWindowDefined() && new window.Blob()) { Blob = window.Blob; } } catch (error) {} var url = isWindowDefined() && (window.URL || window.webkitURL || false); var URL = url && url.createObjectURL && url; var FileReader = isWindowDefined() && (window.FileReader != null ? window.FileReader.prototype.readAsArrayBuffer : undefined) && window.FileReader; var canUsePermissionsApi = function canUsePermissionsApi() { return typeof navigator.permissions !== 'undefined'; }; var indexOf$2 = [].indexOf; // utils var unique = function unique(arr) { var item, j, len, result; result = []; for (j = 0, len = arr.length; j < len; j++) { item = arr[j]; if (indexOf$2.call(result, item) < 0) { result.push(item); } } return result; }; var defer = function defer(fn) { return setTimeout(fn, 0); }; var gcd = function gcd(a, b) { var c; while (b) { c = a % b; a = b; b = c; } return a; }; var once = function once(fn) { var called, result; called = false; result = null; return function () { if (!called) { result = fn.apply(this, arguments); called = true; } return result; }; }; var wrapToPromise = function wrapToPromise(value) { return $__default["default"].Deferred().resolve(value).promise(); }; // same as promise.then(), but if filter returns promise // it will be just passed forward without any special behavior var then = function then(pr, doneFilter, failFilter, progressFilter) { var compose, df; df = $__default["default"].Deferred(); compose = function compose(fn1, fn2) { if (fn1 && fn2) { return function () { return fn2.call(this, fn1.apply(this, arguments)); }; } else { return fn1 || fn2; } }; pr.then(compose(doneFilter, df.resolve), compose(failFilter, df.reject), compose(progressFilter, df.notify)); return df.promise(); }; // Build copy of source with only specified methods. // Handles chaining correctly. var bindAll = function bindAll(source, methods) { var target; target = {}; $__default["default"].each(methods, function (i, method) { var fn = source[method]; if ($__default["default"].isFunction(fn)) { target[method] = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var result = fn.apply(source, args); // Fix chaining if (result === source) { return target; } else { return result; } }; } else { target[method] = fn; } }); return target; }; var upperCase = function upperCase(s) { return s.replace(/([A-Z])/g, '_$1').toUpperCase(); }; var publicCallbacks = function publicCallbacks(callbacks) { var result; result = callbacks.add; result.add = callbacks.add; result.remove = callbacks.remove; return result; }; var uuid = function uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : r & 3 | 8; return v.toString(16); }); }; // splitUrlRegex("url") => ["url", "scheme", "host", "path", "query", "fragment"] var splitUrlRegex = /^(?:([^:/?#]+):)?(?:\/\/([^/?#]*))?([^?#]*)\??([^#]*)#?(.*)$/; var uuidRegex = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/i; var groupIdRegex = new RegExp("".concat(uuidRegex.source, "~[0-9]+"), 'i'); var cdnUrlRegex = new RegExp("^/?(".concat(uuidRegex.source, ")(?:/(-/(?:[^/]+/)+)?([^/]*))?$"), 'i'); var splitCdnUrl = function splitCdnUrl(url) { return cdnUrlRegex.exec(splitUrlRegex.exec(url)[3]); }; var escapeRegExp = function escapeRegExp(str) { return str.replace(/[\\-\\[]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); }; var globRegexp = function globRegexp(str) { var flags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'i'; var parts; parts = $__default["default"].map(str.split('*'), escapeRegExp); return new RegExp('^' + parts.join('.+') + '$', flags); }; var normalizeUrl = function normalizeUrl(url) { var scheme; // google.com/ → google.com // /google.com/ → /google.com // //google.com/ → http://google.com // http://google.com/ → http://google.com scheme = document.location.protocol; if (scheme !== 'http:') { scheme = 'https:'; } return url.replace(/^\/\//, scheme + '//').replace(/\/+$/, ''); }; var fitText = function fitText(text, max) { if (text.length > max) { var head = Math.ceil((max - 3) / 2); var tail = Math.floor((max - 3) / 2); return text.slice(0, head) + '...' + text.slice(-tail); } else { return text; } }; var fitSizeInCdnLimit = function fitSizeInCdnLimit(objSize) { return fitSize(objSize, [2048, 2048]); }; var fitSize = function fitSize(objSize, boxSize, upscale) { var heightRation, widthRatio; if (objSize[0] > boxSize[0] || objSize[1] > boxSize[1] || upscale) { widthRatio = boxSize[0] / objSize[0]; heightRation = boxSize[1] / objSize[1]; if (!boxSize[0] || boxSize[1] && widthRatio > heightRation) { return [Math.round(heightRation * objSize[0]), boxSize[1]]; } else { return [boxSize[0], Math.round(widthRatio * objSize[1])]; } } else { return objSize.slice(); } }; var applyCropCoordsToInfo = function applyCropCoordsToInfo(info, crop, size, coords) { var downscale, h, modifiers, prefered, upscale, w, wholeImage; w = coords.width; h = coords.height; prefered = crop.preferedSize; modifiers = ''; wholeImage = w === size[0] && h === size[1]; if (!wholeImage) { modifiers += "-/crop/".concat(w, "x").concat(h, "/").concat(coords.left, ",").concat(coords.top, "/"); } downscale = crop.downscale && (w > prefered[0] || h > prefered[1]); upscale = crop.upscale && (w < prefered[0] || h < prefered[1]); if (downscale || upscale) { var _prefered = prefered; var _prefered2 = _slicedToArray(_prefered, 2); coords.sw = _prefered2[0]; coords.sh = _prefered2[1]; modifiers += "-/resize/".concat(prefered.join('x'), "/"); } else if (!wholeImage) { modifiers += '-/preview/'; } info = $__default["default"].extend({}, info); info.cdnUrlModifiers = modifiers; info.cdnUrl = "".concat(info.originalUrl).concat(modifiers || ''); info.crop = coords; return info; }; var imagesOnlyAcceptTypes = ['image/*', 'image/heif', 'image/heif-sequence', 'image/heic', 'image/heic-sequence', 'image/avif', 'image/avif-sequence', '.heif', '.heifs', '.heic', '.heics', '.avif', '.avifs'].join(','); var fileInput = function fileInput(container, settings, fn) { var accept, input, _run; input = null; accept = settings.inputAcceptTypes; if (accept === '') { accept = settings.imagesOnly ? imagesOnlyAcceptTypes : null; } (_run = function run() { input = (settings.multiple ? $__default["default"]('<input type="file" multiple>') : $__default["default"]('<input type="file">')).attr('accept', accept).css({ position: 'absolute', top: 0, opacity: 0, margin: 0, padding: 0, width: 'auto', height: 'auto', cursor: container.css('cursor') }).on('change', function () { fn(this); $__default["default"](this).hide(); return _run(); }); return container.append(input); })(); return container.css({ position: 'relative', overflow: 'hidden' // to make it posible to set `cursor:pointer` on button // http://stackoverflow.com/a/9182787/478603 }).mousemove(function (e) { var left, top, width; var _$$offset = $__default["default"](this).offset(); left = _$$offset.left; top = _$$offset.top; width = input.width(); return input.css({ left: e.pageX - left - width + 10, top: e.pageY - top - 10 }); }); }; var fileSelectDialog = function fileSelectDialog(container, settings, fn) { var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var accept; accept = settings.inputAcceptTypes; if (accept === '') { accept = settings.imagesOnly ? imagesOnlyAcceptTypes : null; } return $__default["default"](settings.multiple ? '<input type="file" multiple>' : '<input type="file">').attr('accept', accept).attr(attributes).css({ position: 'fixed', bottom: 0, opacity: 0 }).on('change', function () { fn(this); return $__default["default"](this).remove(); }).appendTo(container).focus().click().hide(); }; var fileSizeLabels = 'B KB MB GB TB PB EB ZB YB'.split(' '); var readableFileSize = function readableFileSize(value) { var onNaN = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var postfix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var digits, fixedTo, i, threshold; value = parseInt(value, 10); if (isNaN(value)) { return onNaN; } digits = 2; i = 0; threshold = 1000 - 5 * Math.pow(10, 2 - Math.max(digits, 3)); while (value > threshold && i < fileSizeLabels.length - 1) { i++; value /= 1024; } value += 0.000000000000001; fixedTo = Math.max(0, digits - Math.floor(value).toFixed(0).length); // fixed → number → string, to trim trailing zeroes value = Number(value.toFixed(fixedTo)); // eslint-disable-next-line no-irregular-whitespace return "".concat(prefix).concat(value, "\xA0").concat(fileSizeLabels[i]).concat(postfix); }; var ajaxDefaults = { dataType: 'json', crossDomain: true, cache: false }; var jsonp = function jsonp(url, type, data) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var jqXHR = $__default["default"].ajax($__default["default"].extend({ url: url, type: type, data: data }, options, ajaxDefaults)).retry(options.retryConfig).fail(function (_, textStatus, errorThrown) { var text = "".concat(textStatus, " (").concat(errorThrown, ")"); warn("JSONP unexpected error: ".concat(text, " while loading ").concat(url)); }); var df = jqXHR.then(function (data) { if (data.error) { var message, code; if (typeof data.error === 'string') { // /from_url/state/ case message = data.error; code = data.error_code; } else { // other cases (direct/multipart/group) message = data.error.content; code = data.error.error_code; } return $__default["default"].Deferred().reject({ message: message, code: code }); } return data; }); df.abort = jqXHR.abort.bind(jqXHR); return df; }; var canvasToBlob = function canvasToBlob(canvas, type, quality, callback) { var arr, binStr, dataURL, i, j, ref; if (window.HTMLCanvasElement.prototype.toBlob) { return canvas.toBlob(callback, type, quality); } dataURL = canvas.toDataURL(type, quality); dataURL = dataURL.split(','); binStr = window.atob(dataURL[1]); arr = new Uint8Array(binStr.length); for (i = j = 0, ref = binStr.length; j < ref; i = j += 1) { arr[i] = binStr.charCodeAt(i); } return callback(new window.Blob([arr], { type: /:(.+\/.+);/.exec(dataURL[0])[1] })); }; var taskRunner = function taskRunner(capacity) { var queue, _release, run, running; running = 0; queue = []; _release = function release() { var task; if (queue.length) { task = queue.shift(); return defer(function () { return task(_release); }); } else { running -= 1; return running; } }; run = function run(task) { if (!capacity || running < capacity) { running += 1; return defer(function () { return task(_release); }); } else { return queue.push(task); } }; return run; }; // This is work around bug in jquery https://github.com/jquery/jquery/issues/2013 // action, add listener, callbacks, // ... .then handlers, argument index, [final state] var pipeTuples = [['notify', 'progress', 2], ['resolve', 'done', 0], ['reject', 'fail', 1]]; var fixedPipe = function fixedPipe(promise) { for (var _len2 = arguments.length, fns = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { fns[_key2 - 1] = arguments[_key2]; } return $__default["default"].Deferred(function (newDefer) { return $__default["default"].each(pipeTuples, function (i, tuple) { var fn; // Map tuples (progress, done, fail) to arguments (done, fail, progress) fn = $__default["default"].isFunction(fns[tuple[2]]) && fns[tuple[2]]; return promise[tuple[1]](function () { var returned; returned = fn && fn.apply(this, arguments); if (returned && $__default["default"].isFunction(returned.promise)) { return returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); } else { return newDefer[tuple[0] + 'With'](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments); } }); }); }).promise(); }; var getMetadataObject = function getMetadataObject(settings) { var metadata; if (settings.metadataCallback) { metadata = settings.metadataCallback() || {}; } else { metadata = settings.metadata || {}; } metadata = _objectSpread2({}, metadata); $__default["default"].each(metadata, function (key, value) { metadata[key] = String(value); }); return metadata; }; var isObject = function isObject(input) { return Object.prototype.toString.call(input) === '[object Object]'; }; var TestPixel = { R: 55, G: 110, B: 165, A: 255 }; var FILL_STYLE = "rgba(".concat(TestPixel.R, ", ").concat(TestPixel.G, ", ").concat(TestPixel.B, ", ").concat(TestPixel.A / 255, ")"); function canvasTest(width, height) { // Wrapped into try/catch because memory alloction errors can be thrown due to insufficient RAM try { var fill = [width - 1, height - 1, 1, 1]; // x, y, width, height var cropCvs = document.createElement('canvas'); cropCvs.width = 1; cropCvs.height = 1; var testCvs = document.createElement('canvas'); testCvs.width = width; testCvs.height = height; var cropCtx = cropCvs.getContext('2d'); var testCtx = testCvs.getContext('2d'); if (testCtx) { testCtx.fillStyle = FILL_STYLE; testCtx.fillRect.apply(testCtx, fill); // Render the test pixel in the bottom-right corner of the // test canvas in the top-left of the 1x1 crop canvas. This // dramatically reducing the time for getImageData to complete. cropCtx.drawImage(testCvs, width - 1, height - 1, 1, 1, 0, 0, 1, 1); } var imageData = cropCtx && cropCtx.getImageData(0, 0, 1, 1).data; var isTestPass = false; if (imageData) { // On IE10, imageData have type CanvasPixelArray, not Uint8ClampedArray. // CanvasPixelArray supports index access operations only. // Array buffers can't be destructuredd and compared with JSON.stringify isTestPass = imageData[0] === TestPixel.R && imageData[1] === TestPixel.G && imageData[2] === TestPixel.B && imageData[3] === TestPixel.A; } testCvs.width = testCvs.height = 1; return isTestPass; } catch (e) { log("Failed to test for max canvas size of ".concat(width, "x").concat(height, "."), e); return false; } } function memoize(fn, serializer) { var cache = {}; return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var key = serializer(args, cache); return key in cache ? cache[key] : cache[key] = fn.apply(void 0, args); }; } var sizes = { squareSide: [ // Safari (iOS < 9, ram >= 256) // We are supported mobile safari < 9 since widget v2, by 5 Mpx limit // so it's better to continue support despite the absence of this browser in the support table Math.floor(Math.sqrt(5 * 1000 * 1000)), // IE Mobile (Windows Phone 8.x) // Safari (iOS >= 9) 4096, // IE 9 (Win) 8192, // Firefox 63 (Mac, Win) 11180, // Chrome 68 (Android 6) 10836, // Chrome 68 (Android 5) 11402, // Chrome 68 (Android 7.1-9) 14188, // Chrome 70 (Mac, Win) // Chrome 68 (Android 4.4) // Edge 17 (Win) // Safari 7-12 (Mac) 16384], dimension: [ // IE Mobile (Windows Phone 8.x) 4096, // IE 9 (Win) 8192, // Edge 17 (Win) // IE11 (Win) 16384, // Chrome 70 (Mac, Win) // Chrome 68 (Android 4.4-9) // Firefox 63 (Mac, Win) 32767, // Chrome 83 (Mac, Win) // Safari 7-12 (Mac) // Safari (iOS 9-12) // Actually Safari has a much bigger limits - 4194303 of width and 8388607 of height, // but we will not use them 65535] }; var MAX_SQUARE_SIDE = sizes.squareSide[sizes.squareSide.length - 1]; function wrapAsync(fn) { return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var df = $__default["default"].Deferred(); defer(function () { var passed = fn.apply(void 0, args); df.resolve(passed); }); return df.promise(); }; } /** * Memoization key serealizer, that prevents unnecessary canvas tests. * No need to make test if we know that: * - browser supports higher canvas size * - browser doesn't support lower canvas size */ function memoKeySerializer(args, cache) { var _args = _slicedToArray(args, 1), w = _args[0]; var cachedWidths = Object.keys(cache).map(function (val) { return parseInt(val, 10); }).sort(function (a, b) { return a - b; }); for (var i = 0; i < cachedWidths.length; i++) { var cachedWidth = cachedWidths[i]; var isSupported = !!cache[cachedWidth]; // higher supported canvas size, return it if (cachedWidth > w && isSupported) { return cachedWidth; } // lower unsupported canvas size, return it if (cachedWidth < w && !isSupported) { return cachedWidth; } } // use canvas width as the key, // because we're doing dimension test by width - [dimension, 1] return w; } // separate memoization for square and dimension tests var squareTest = wrapAsync(memoize(canvasTest, memoKeySerializer)); var dimensionTest = wrapAsync(memoize(canvasTest, memoKeySerializer)); function testCanvasSize(w, h) { var df = $__default["default"].Deferred(); var testSquareSide = sizes.squareSide.find(function (side) { return side * side >= w * h; }); var testDimension = sizes.dimension.find(function (side) { return side >= w && side >= h; }); if (!testSquareSide || !testDimension) { return df.reject(); } var tasks = [squareTest(testSquareSide, testSquareSide), dimensionTest(testDimension, 1)]; $__default["default"].when.apply($__default["default"], tasks).done(function (squareSupported, dimensionSupported) { if (squareSupported && dimensionSupported) { df.resolve(); } else { df.reject(); } }); return df.promise(); } var indexOf$1 = [].indexOf; // settings var arrayOptions, constrainOptions, constraints, defaultPreviewUrlCallback, defaults$1, initialSettings, flagOptions, intOptions, integration, integrationToUserAgent, buildRetryConfig, normalize, parseCrop, parseShrink, presets, script, str2arr, transformOptions, transforms, urlOptions, callbackOptions, objectOptions; defaults$1 = { // developer hooks live: true, manualStart: false, locale: null, localePluralize: null, localeTranslations: null, // widget & dialog settings systemDialog: false, crop: false, previewStep: false, imagesOnly: false, clearable: false, multiple: false, multipleMax: 1000, multipleMin: 1, multipleMaxStrict: false, imageShrink: false, pathValue: true, tabs: 'file camera url facebook gdrive gphotos dropbox instagram evernote flickr onedrive', preferredTypes: '', inputAcceptTypes: '', // '' means default, null means "disable accept" // upload settings doNotStore: false, publicKey: null, secureSignature: '', secureExpire: '', pusherKey: '79ae88bd931ea68464d9', cdnBase: 'https://ucarecdn.com', urlBase: 'https://upload.uploadcare.com', socialBase: 'https://social.uploadcare.com', previewProxy: null, previewUrlCallback: null, remoteTabSessionKey: null, metadata: null, metadataCallback: null, // fine tuning imagePreviewMaxSize: 25 * 1024 * 1024, multipartMinSize: 10 * 1024 * 1024, multipartPartSize: 5 * 1024 * 1024, multipartMinLastPartSize: 1024 * 1024, multipartConcurrency: 4, // `multipartMaxAttempts` is deprecated, value will be assigned to `retryAttempts` if set multipartMaxAttempts: null, retryAttempts: 3, retryThrottledAttempts: 10, retryBaseTimeout: 1000, retryFactor: 2, parallelDirectUploads: 10, passWindowOpen: false, // camera cameraMirrorDefault: true, // camera recording enableAudioRecording: true, enableVideoRecording: true, videoPreferredMimeTypes: null, audioBitsPerSecond: null, videoBitsPerSecond: null, // maintain settings scriptBase: "//ucarecdn.com/widget/".concat(version, "/uploadcare/"), debugUploads: false, integration: '' }; initialSettings = _objectSpread2({}, defaults$1); transforms = { multipleMax: { from: 0, to: 1000 } }; constraints = { multipleMax: { min: 1, max: 1000 } }; presets = { tabs: { all: 'file camera url facebook gdrive gphotos dropbox instagram evernote flickr onedrive box vk huddle', default: defaults$1.tabs } }; // integration setting from data attributes of script tag script = isWindowDefined() && (document.currentScript || function () { var scripts; scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }()); integration = isWindowDefined() && $__default["default"](script).data('integration'); if (integration && integration != null) { defaults$1 = $__default["default"].extend(defaults$1, { integration: integration }); } str2arr = function str2arr(value) { if (!$__default["default"].isArray(value)) { value = $__default["default"].trim(value); value = value ? value.split(' ') : []; } return value; }; arrayOptions = function arrayOptions(settings, keys) { var hasOwnProperty = Object.prototype.hasOwnProperty; var i, item, j, key, len, len1, source, value; for (i = 0, len = keys.length; i < len; i++) { key = keys[i]; value = source = str2arr(settings[key]); if (hasOwnProperty.apply(presets, [key])) { value = []; for (j = 0, len1 = source.length; j < len1; j++) { item = source[j]; if (hasOwnProperty.apply(presets[key], [item])) { value = value.concat(str2arr(presets[key][item])); } else { value.push(item); } } } settings[key] = unique(value); } return settings; }; urlOptions = function urlOptions(settings, keys) { var i, key, len; for (i = 0, len = keys.length; i < len; i++) { key = keys[i]; if (settings[key] != null) { settings[key] = normalizeUrl(settings[key]); } } return settings; }; flagOptions = function flagOptions(settings, keys) { var i, key, len, value; for (i = 0, len = keys.length; i < len; i++) { key = keys[i]; if (!(settings[key] != null)) { continue; } value = settings[key]; if (typeof value === 'string') { // "", "..." -> true // "false", "disabled" -> false value = $__default["default"].trim(value).toLowerCase(); settings[key] = !(value === 'false' || value === 'disabled'); } else { settings[key] = !!value; } } return settings; }; intOptions = function intOptions(settings, keys) { var i, key, len; for (i = 0, len = keys.length; i < len; i++) { key = keys[i]; if (settings[key] != null) { settings[key] = parseInt(settings[key]); } } return settings; }; integrationToUserAgent = function integrationToUserAgent(settings) { settings._userAgent = "UploadcareWidget/".concat(version, "/").concat(settings.publicKey, " (JavaScript").concat(settings.integration ? "; ".concat(settings.integration) : '', ")"); return settings; }; buildRetryConfig = function buildRetryConfig(settings) { if (settings.retryAttempts === initialSettings.retryAttempts && settings.multipartMaxAttempts !== null) { settings.retryAttempts = settings.multipartMaxAttempts; } settings.retryConfig = { baseTimeout: settings.retryBaseTimeout, factor: settings.retryFactor, attempts: settings.retryAttempts, debugUploads: settings.debugUploads, throttledAttempts: settings.retryThrottledAttempts }; }; transformOptions = function transformOptions(settings, transforms) { var key, transform; for (key in transforms) { transform = transforms[key]; if (settings[key] != null) { if (settings[key] === transform.from) { settings[key] = transform.to; } } } return settings; }; constrainOptions = function constrainOptions(settings, constraints) { var key, max, min; for (key in constraints) { var _constraints$key = constraints[key]; min = _constraints$key.min; max = _constraints$key.max; if (settings[key] != null) { settings[key] = Math.min(Math.max(settings[key], min), max); } } return settings; }; callbackOptions = function callbackOptions(settings, keys) { for (var i = 0, len = keys.length; i < len; i++) { var key = keys[i]; if (settings[key] && typeof settings[key] !== 'function') { warnOnce("Option \"".concat(key, "\" is expected to be a function. Instead got: ").concat(_typeof(settings[key]))); } } }; objectOptions = function objectOptions(settings, keys) { for (var i = 0, len = keys.length; i < len; i++) { var key = keys[i]; if (settings[key] && !isObject(settings[key])) { warnOnce("Option \"".concat(key, "\" is expected to be an object. Instead got: ").concat(_typeof(settings[key]))); } } }; parseCrop = function parseCrop(val) { var ratio, reRatio; reRatio = /^([0-9]+)([x:])([0-9]+)\s*(|upscale|minimum)$/i; ratio = reRatio.exec($__default["default"].trim(val.toLowerCase())) || []; return { downscale: ratio[2] === 'x', upscale: !!ratio[4], notLess: ratio[4] === 'minimum', preferedSize: ratio.length ? [+ratio[1], +ratio[3]] : undefined }; }; parseShrink = function parseShrink(val) { var reShrink = /^([0-9]+)x([0-9]+)(?:\s+(\d{1,2}|100)%)?$/i; var shrink = reShrink.exec($__default["default"].trim(val.toLowerCase())) || []; if (!shrink.length) { return false; } var size = shrink[1] * shrink[2]; var maxSize = MAX_SQUARE_SIDE * MAX_SQUARE_SIDE; if (size > maxSize) { warnOnce("Shrinked size can not be larger than ".concat(Math.floor(maxSize / 1000 / 1000), "MP. ") + "You have set ".concat(shrink[1], "x").concat(shrink[2], " (") + "".concat(Math.ceil(size / 1000 / 100) / 10, "MP).")); return false; } return { quality: shrink[3] ? shrink[3] / 100 : undefined, size: size }; }; defaultPreviewUrlCallback = function defaultPreviewUrlCallback(url, info) { var addAmpersand, addName, addQuery, queryPart; if (!this.previewProxy) { return url; } addQuery = !/\?/.test(this.previewProxy); addName = addQuery || !/=$/.test(this.previewProxy); addAmpersand = !addQuery && !/[&?=]$/.test(this.previewProxy); queryPart = encodeURIComponent(url); if (addName) { queryPart = 'url=' + queryPart; } if (addAmpersand) { queryPart = '&' + queryPart; } if (addQuery) { queryPart = '?' + queryPart; } return this.previewProxy + queryPart; }; normalize = function normalize(settings) { arrayOptions(settings, ['tabs', 'preferredTypes', 'videoPreferredMimeTypes']); urlOptions(settings, ['cdnBase', 'socialBase', 'urlBase', 'scriptBase']); flagOptions(settings, ['doNotStore', 'imagesOnly', 'multiple', 'clearable', 'pathValue', 'previewStep', 'systemDialog', 'debugUploads', 'multipleMaxStrict', 'cameraMirrorDefault']); intOptions(settings, ['multipleMax', 'multipleMin', 'multipartMinSize', 'multipartPartSize', 'multipartMinLastPartSize', 'multipartConcur