uploadcare-widget
Version:
Uploadcare Widget: file uploader.
1,418 lines (1,379 loc) • 185 kB
JavaScript
/**
* @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 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', 'multipartConcurrency', 'multipartMaxAttempts', 'retryAttempts', 'retryThrottledAttempts', 'retryBaseTimeout', 'retryFactor', 'parallelDirect