Merge branch 'develop' of github.com:sampotts/plyr into develop

# Conflicts:
#	package.json
#	yarn.lock
This commit is contained in:
Sam Potts 2020-03-29 12:02:59 +11:00
commit 09598f07bf
34 changed files with 2264 additions and 1929 deletions

6
.gitpod.yml Normal file
View File

@ -0,0 +1,6 @@
tasks:
- init: npm install && npm i gulp -g
command: gulp
ports:
- port: 3000
onOpen: open-preview

View File

@ -27,7 +27,13 @@ Please follow the instructions in our issue templates. Don't use github issues t
* Fork Plyr, and create a new branch in your fork, based on the **develop** branch * Fork Plyr, and create a new branch in your fork, based on the **develop** branch
* To test locally, you can use the demo. First make sure you have installed the dependencies with `npm install` or `yarn`. Run `gulp` to build while you are working, and run a local server from the repository root directory. If you have Python installed, this command should work: `python -m SimpleHTTPServer 8080`. Then go to `http://localhost:8080/demo/` * To test locally, you can use the demo site. First make sure you have installed the dependencies with `npm install` or `yarn`. Run `gulp` to build and it will run a local web server for development and watch for any changes.
### Online one-click setup
Alternatively can also use Gitpod, a free online Visual Studio Code-like IDE. With a single click it will automatically launch a ready-to-code workspace with all the dependencies pre-installed, gulp watching for changes and the web server running, so that you can start coding straightaway.
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/)
* Develop and test your modifications. * Develop and test your modifications.

2
demo/dist/demo.css vendored

File diff suppressed because one or more lines are too long

1004
demo/dist/demo.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/plyr.css vendored

File diff suppressed because one or more lines are too long

607
dist/plyr.js vendored
View File

@ -76,19 +76,15 @@ typeof navigator === "object" && (function (global, factory) {
} }
function _slicedToArray(arr, i) { function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
} }
function _toConsumableArray(arr) { function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
} }
function _arrayWithoutHoles(arr) { function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) { if (Array.isArray(arr)) return _arrayLikeToArray(arr);
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
}
} }
function _arrayWithHoles(arr) { function _arrayWithHoles(arr) {
@ -96,14 +92,11 @@ typeof navigator === "object" && (function (global, factory) {
} }
function _iterableToArray(iter) { function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
} }
function _iterableToArrayLimit(arr, i) { function _iterableToArrayLimit(arr, i) {
if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
return;
}
var _arr = []; var _arr = [];
var _n = true; var _n = true;
var _d = false; var _d = false;
@ -129,102 +122,142 @@ typeof navigator === "object" && (function (global, factory) {
return _arr; return _arr;
} }
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(n);
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() { function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance"); 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() { function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance"); 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 _classCallCheck$1(e, t) {
if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");
}
function _defineProperties$1(e, t) {
for (var n = 0; n < t.length; n++) {
var r = t[n];
r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);
}
}
function _createClass$1(e, t, n) {
return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;
}
function _defineProperty$1(e, t, n) {
return t in e ? Object.defineProperty(e, t, {
value: n,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[t] = n, e;
}
function ownKeys$1(e, t) {
var n = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var r = Object.getOwnPropertySymbols(e);
t && (r = r.filter(function (t) {
return Object.getOwnPropertyDescriptor(e, t).enumerable;
})), n.push.apply(n, r);
}
return n;
}
function _objectSpread2$1(e) {
for (var t = 1; t < arguments.length; t++) {
var n = null != arguments[t] ? arguments[t] : {};
t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {
_defineProperty$1(e, t, n[t]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));
});
}
return e;
} }
var defaults = { var defaults = {
addCSS: true, addCSS: !0,
// Add CSS to the element to improve usability (required here or in your CSS!)
thumbWidth: 15, thumbWidth: 15,
// The width of the thumb handle watch: !0
watch: true // Watch for new elements that match a string target
}; };
// Element matches a selector function matches(e, t) {
function matches(element, selector) { return function () {
return Array.from(document.querySelectorAll(t)).includes(this);
}.call(e, t);
}
function match() { function trigger(e, t) {
return Array.from(document.querySelectorAll(selector)).includes(this); if (e && t) {
var n = new Event(t, {
bubbles: !0
});
e.dispatchEvent(n);
} }
var matches = match;
return matches.call(element, selector);
} }
// Trigger event var getConstructor = function getConstructor(e) {
function trigger(element, type) { return null != e ? e.constructor : null;
if (!element || !type) { },
return; instanceOf = function instanceOf(e, t) {
} // Create and dispatch the event return !!(e && t && e instanceof t);
},
isNullOrUndefined = function isNullOrUndefined(e) {
var event = new Event(type); // Dispatch the event return null == e;
},
element.dispatchEvent(event); isObject = function isObject(e) {
} return getConstructor(e) === Object;
},
// ========================================================================== isNumber = function isNumber(e) {
// Type checking utils return getConstructor(e) === Number && !Number.isNaN(e);
// ========================================================================== },
var getConstructor = function getConstructor(input) { isString = function isString(e) {
return input !== null && typeof input !== 'undefined' ? input.constructor : null; return getConstructor(e) === String;
}; },
isBoolean = function isBoolean(e) {
var instanceOf = function instanceOf(input, constructor) { return getConstructor(e) === Boolean;
return Boolean(input && constructor && input instanceof constructor); },
}; isFunction = function isFunction(e) {
return getConstructor(e) === Function;
var isNullOrUndefined = function isNullOrUndefined(input) { },
return input === null || typeof input === 'undefined'; isArray = function isArray(e) {
}; return Array.isArray(e);
},
var isObject = function isObject(input) { isNodeList = function isNodeList(e) {
return getConstructor(input) === Object; return instanceOf(e, NodeList);
}; },
isElement = function isElement(e) {
var isNumber = function isNumber(input) { return instanceOf(e, Element);
return getConstructor(input) === Number && !Number.isNaN(input); },
}; isEvent = function isEvent(e) {
return instanceOf(e, Event);
var isString = function isString(input) { },
return getConstructor(input) === String; isEmpty = function isEmpty(e) {
}; return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;
},
var isBoolean = function isBoolean(input) { is = {
return getConstructor(input) === Boolean;
};
var isFunction = function isFunction(input) {
return getConstructor(input) === Function;
};
var isArray = function isArray(input) {
return Array.isArray(input);
};
var isNodeList = function isNodeList(input) {
return instanceOf(input, NodeList);
};
var isElement = function isElement(input) {
return instanceOf(input, Element);
};
var isEvent = function isEvent(input) {
return instanceOf(input, Event);
};
var isEmpty = function isEmpty(input) {
return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
};
var is = {
nullOrUndefined: isNullOrUndefined, nullOrUndefined: isNullOrUndefined,
object: isObject, object: isObject,
number: isNumber, number: isNumber,
@ -238,219 +271,98 @@ typeof navigator === "object" && (function (global, factory) {
empty: isEmpty empty: isEmpty
}; };
// Get the number of decimal places function getDecimalPlaces(e) {
function getDecimalPlaces(value) { var t = "".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;
if (!match) {
return 0;
}
return Math.max(0, // Number of digits right of decimal point.
(match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
match[2] ? +match[2] : 0));
} // Round to the nearest step
function round(number, step) {
if (step < 1) {
var places = getDecimalPlaces(step);
return parseFloat(number.toFixed(places));
}
return Math.round(number / step) * step;
} }
var RangeTouch = function round(e, t) {
/*#__PURE__*/ if (1 > t) {
function () { var n = getDecimalPlaces(t);
/** return parseFloat(e.toFixed(n));
* Setup a new instance
* @param {String|Element} target
* @param {Object} options
*/
function RangeTouch(target, options) {
_classCallCheck(this, RangeTouch);
if (is.element(target)) {
// An Element is passed, use it directly
this.element = target;
} else if (is.string(target)) {
// A CSS Selector is passed, fetch it from the DOM
this.element = document.querySelector(target);
}
if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
return;
}
this.config = Object.assign({}, defaults, options);
this.init();
} }
_createClass(RangeTouch, [{ return Math.round(e / t) * t;
}
var RangeTouch = function () {
function e(t, n) {
_classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());
}
return _createClass$1(e, [{
key: "init", key: "init",
value: function init() { value: function value() {
// Bail if not a touch enabled device e.enabled && (this.config.addCSS && (this.element.style.userSelect = "none", this.element.style.webKitUserSelect = "none", this.element.style.touchAction = "manipulation"), this.listeners(!0), this.element.rangeTouch = this);
if (!RangeTouch.enabled) {
return;
} // Add useful CSS
if (this.config.addCSS) {
// TODO: Restore original values on destroy
this.element.style.userSelect = 'none';
this.element.style.webKitUserSelect = 'none';
this.element.style.touchAction = 'manipulation';
}
this.listeners(true);
this.element.rangeTouch = this;
} }
}, { }, {
key: "destroy", key: "destroy",
value: function destroy() { value: function value() {
// Bail if not a touch enabled device e.enabled && (this.config.addCSS && (this.element.style.userSelect = "", this.element.style.webKitUserSelect = "", this.element.style.touchAction = ""), this.listeners(!1), this.element.rangeTouch = null);
if (!RangeTouch.enabled) {
return;
}
this.listeners(false);
this.element.rangeTouch = null;
} }
}, { }, {
key: "listeners", key: "listeners",
value: function listeners(toggle) { value: function value(e) {
var _this = this; var t = this,
n = e ? "addEventListener" : "removeEventListener";
var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events ["touchstart", "touchmove", "touchend"].forEach(function (e) {
t.element[n](e, function (e) {
['touchstart', 'touchmove', 'touchend'].forEach(function (type) { return t.set(e);
_this.element[method](type, function (event) { }, !1);
return _this.set(event);
}, false);
}); });
} }
/**
* Get the value based on touch position
* @param {Event} event
*/
}, { }, {
key: "get", key: "get",
value: function get(event) { value: function value(t) {
if (!RangeTouch.enabled || !is.event(event)) { if (!e.enabled || !is.event(t)) return null;
return null; var n,
} r = t.target,
i = t.changedTouches[0],
var input = event.target; o = parseFloat(r.getAttribute("min")) || 0,
var touch = event.changedTouches[0]; s = parseFloat(r.getAttribute("max")) || 100,
var min = parseFloat(input.getAttribute('min')) || 0; u = parseFloat(r.getAttribute("step")) || 1,
var max = parseFloat(input.getAttribute('max')) || 100; c = r.getBoundingClientRect(),
var step = parseFloat(input.getAttribute('step')) || 1; a = 100 / c.width * (this.config.thumbWidth / 2) / 100;
var delta = max - min; // Calculate percentage return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);
var percent;
var clientRect = input.getBoundingClientRect();
var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
if (percent < 0) {
percent = 0;
} else if (percent > 100) {
percent = 100;
} // Factor in the thumb offset
if (percent < 50) {
percent -= (100 - percent * 2) * thumbWidth;
} else if (percent > 50) {
percent += (percent - 50) * 2 * thumbWidth;
} // Find the closest step to the mouse position
return min + round(delta * (percent / 100), step);
} }
/**
* Update range value based on position
* @param {Event} event
*/
}, { }, {
key: "set", key: "set",
value: function set(event) { value: function value(t) {
if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) { e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, "touchend" === t.type ? "change" : "input"));
return;
} // Prevent text highlight on iOS
event.preventDefault(); // Set value
event.target.value = this.get(event); // Trigger event
trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
} }
}], [{ }], [{
key: "setup", key: "setup",
value: function value(t) {
var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
r = null;
if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type="range"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;
/** var i = _objectSpread2$1({}, defaults, {}, n);
* Setup multiple instances
* @param {String|Element|NodeList|Array} target
* @param {Object} options
*/
value: function setup(target) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var targets = null;
if (is.empty(target) || is.string(target)) { if (is.string(t) && i.watch) {
targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]')); var o = new MutationObserver(function (n) {
} else if (is.element(target)) { Array.from(n).forEach(function (n) {
targets = [target]; Array.from(n.addedNodes).forEach(function (n) {
} else if (is.nodeList(target)) { is.element(n) && matches(n, t) && new e(n, i);
targets = Array.from(target);
} else if (is.array(target)) {
targets = target.filter(is.element);
}
if (is.empty(targets)) {
return null;
}
var config = Object.assign({}, defaults, options);
if (is.string(target) && config.watch) {
// Create an observer instance
var observer = new MutationObserver(function (mutations) {
Array.from(mutations).forEach(function (mutation) {
Array.from(mutation.addedNodes).forEach(function (node) {
if (!is.element(node) || !matches(node, target)) {
return;
} // eslint-disable-next-line no-unused-vars
var range = new RangeTouch(node, config);
}); });
}); });
}); // Pass in the target node, as well as the observer options });
o.observe(document.body, {
observer.observe(document.body, { childList: !0,
childList: true, subtree: !0
subtree: true
}); });
} }
return targets.map(function (t) { return r.map(function (t) {
return new RangeTouch(t, options); return new e(t, n);
}); });
} }
}, { }, {
key: "enabled", key: "enabled",
get: function get() { get: function get() {
return 'ontouchstart' in document.documentElement; return "ontouchstart" in document.documentElement;
} }
}]); }]), e;
return RangeTouch;
}(); }();
// ========================================================================== // ==========================================================================
@ -525,7 +437,7 @@ typeof navigator === "object" && (function (global, factory) {
}; };
var isPromise = function isPromise(input) { var isPromise = function isPromise(input) {
return instanceOf$1(input, Promise); return instanceOf$1(input, Promise) && isFunction$1(input.then);
}; };
var isEmpty$1 = function isEmpty(input) { var isEmpty$1 = function isEmpty(input) {
@ -867,12 +779,14 @@ typeof navigator === "object" && (function (global, factory) {
} // Element matches selector } // Element matches selector
function matches$1(element, selector) { function matches$1(element, selector) {
var _Element = Element,
prototype = _Element.prototype;
function match() { function match() {
return Array.from(document.querySelectorAll(selector)).includes(this); return Array.from(document.querySelectorAll(selector)).includes(this);
} }
var method = match; var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
return method.call(element, selector); return method.call(element, selector);
} // Find all elements } // Find all elements
@ -1144,6 +1058,19 @@ typeof navigator === "object" && (function (global, factory) {
}).then(function () {}); }).then(function () {});
} }
/**
* Silence a Promise-like object.
* This is useful for avoiding non-harmful, but potentially confusing "uncaught
* play promise" rejection error messages.
* @param {Object} value An object that may or may not be `Promise`-like.
*/
function silencePromise(value) {
if (is$1.promise(value)) {
value.then(null, function () {});
}
}
function validateRatio(input) { function validateRatio(input) {
if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) { if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {
return false; return false;
@ -1320,7 +1247,7 @@ typeof navigator === "object" && (function (global, factory) {
player.currentTime = currentTime; // Resume playing player.currentTime = currentTime; // Resume playing
if (!paused) { if (!paused) {
player.play(); silencePromise(player.play());
} }
}); // Load new source }); // Load new source
@ -1498,9 +1425,7 @@ typeof navigator === "object" && (function (global, factory) {
} }
}; };
var Storage = var Storage = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Storage(player) { function Storage(player) {
_classCallCheck(this, Storage); _classCallCheck(this, Storage);
@ -1782,7 +1707,7 @@ typeof navigator === "object" && (function (global, factory) {
var icon = document.createElementNS(namespace, 'svg'); var icon = document.createElementNS(namespace, 'svg');
setAttributes(icon, extend(attributes, { setAttributes(icon, extend(attributes, {
role: 'presentation', 'aria-hidden': 'true',
focusable: 'false' focusable: 'false'
})); // Create the <use> to reference sprite })); // Create the <use> to reference sprite
@ -3372,7 +3297,7 @@ typeof navigator === "object" && (function (global, factory) {
toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
controls.setCaptionsMenu.call(this); controls.setCaptionsMenu.call(this);
} }
}, },
@ -4011,9 +3936,7 @@ typeof navigator === "object" && (function (global, factory) {
// ========================================================================== // ==========================================================================
var noop = function noop() {}; var noop = function noop() {};
var Console = var Console = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Console() { function Console() {
var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
@ -4049,9 +3972,7 @@ typeof navigator === "object" && (function (global, factory) {
return Console; return Console;
}(); }();
var Fullscreen = var Fullscreen = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Fullscreen(player) { function Fullscreen(player) {
var _this = this; var _this = this;
@ -4241,7 +4162,7 @@ typeof navigator === "object" && (function (global, factory) {
if (browser.isIos && this.player.config.fullscreen.iosNative) { if (browser.isIos && this.player.config.fullscreen.iosNative) {
this.target.webkitExitFullscreen(); this.target.webkitExitFullscreen();
this.player.play(); silencePromise(this.player.play());
} else if (!Fullscreen.native || this.forceFallback) { } else if (!Fullscreen.native || this.forceFallback) {
this.toggleFallback(false); this.toggleFallback(false);
} else if (!this.prefix) { } else if (!this.prefix) {
@ -4288,7 +4209,7 @@ typeof navigator === "object" && (function (global, factory) {
} }
var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
return element === this.target; return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;
} // Get target element } // Get target element
}, { }, {
@ -4575,9 +4496,7 @@ typeof navigator === "object" && (function (global, factory) {
} }
}; };
var Listeners = var Listeners = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Listeners(player) { function Listeners(player) {
_classCallCheck(this, Listeners); _classCallCheck(this, Listeners);
@ -4668,7 +4587,7 @@ typeof navigator === "object" && (function (global, factory) {
case 75: case 75:
// Space and K key // Space and K key
if (!repeat) { if (!repeat) {
player.togglePlay(); silencePromise(player.togglePlay());
} }
break; break;
@ -4986,9 +4905,13 @@ typeof navigator === "object" && (function (global, factory) {
if (player.ended) { if (player.ended) {
_this.proxy(event, player.restart, 'restart'); _this.proxy(event, player.restart, 'restart');
_this.proxy(event, player.play, 'play'); _this.proxy(event, function () {
silencePromise(player.play());
}, 'play');
} else { } else {
_this.proxy(event, player.togglePlay, 'play'); _this.proxy(event, function () {
silencePromise(player.togglePlay());
}, 'play');
} }
}); });
} // Disable right click } // Disable right click
@ -5086,7 +5009,9 @@ typeof navigator === "object" && (function (global, factory) {
if (elements.buttons.play) { if (elements.buttons.play) {
Array.from(elements.buttons.play).forEach(function (button) { Array.from(elements.buttons.play).forEach(function (button) {
_this3.bind(button, 'click', player.togglePlay, 'play'); _this3.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
}); });
} // Pause } // Pause
@ -5183,7 +5108,7 @@ typeof navigator === "object" && (function (global, factory) {
if (play && done) { if (play && done) {
seek.removeAttribute(attribute); seek.removeAttribute(attribute);
player.play(); silencePromise(player.play());
} else if (!done && player.playing) { } else if (!done && player.playing) {
seek.setAttribute(attribute, ''); seek.setAttribute(attribute, '');
player.pause(); player.pause();
@ -5818,6 +5743,9 @@ typeof navigator === "object" && (function (global, factory) {
player.embed.setPlaybackRate(input).then(function () { player.embed.setPlaybackRate(input).then(function () {
speed = input; speed = input;
triggerEvent.call(player, player.media, 'ratechange'); triggerEvent.call(player, player.media, 'ratechange');
}).catch(function () {
// Cannot set Playback Rate, Video is probably not on Pro account
player.options.speed = [1];
}); });
} }
}); // Volume }); // Volume
@ -6457,9 +6385,7 @@ typeof navigator === "object" && (function (global, factory) {
instance.elements.container.remove(); instance.elements.container.remove();
}; };
var Ads = var Ads = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
/** /**
* Ads constructor. * Ads constructor.
* @param {Object} player * @param {Object} player
@ -6559,6 +6485,8 @@ typeof navigator === "object" && (function (global, factory) {
* mobile devices, this initialization is done as the result of a user action. * mobile devices, this initialization is done as the result of a user action.
*/ */
value: function setupIMA() { value: function setupIMA() {
var _this4 = this;
// Create the container for our advertisements // Create the container for our advertisements
this.elements.container = createElement('div', { this.elements.container = createElement('div', {
class: this.player.config.classNames.ads class: this.player.config.classNames.ads
@ -6571,7 +6499,16 @@ typeof navigator === "object" && (function (global, factory) {
google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader
this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
return _this4.onAdsManagerLoaded(event);
}, false);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
return _this4.onAdError(error);
}, false); // Request video ads to be pre-loaded
this.requestAds(); this.requestAds();
} }
@ -6582,21 +6519,10 @@ typeof navigator === "object" && (function (global, factory) {
}, { }, {
key: "requestAds", key: "requestAds",
value: function requestAds() { value: function requestAds() {
var _this4 = this;
var container = this.player.elements.container; var container = this.player.elements.container;
try { try {
// Create ads loader // Request video ads
this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
return _this4.onAdsManagerLoaded(event);
}, false);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
return _this4.onAdError(error);
}, false); // Request video ads
var request = new google.ima.AdsRequest(); var request = new google.ima.AdsRequest();
request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
// to select the correct creative if multiple are returned // to select the correct creative if multiple are returned
@ -6775,7 +6701,13 @@ typeof navigator === "object" && (function (global, factory) {
// }; // };
// TODO: So there is still this thing where a video should only be allowed to start // TODO: So there is still this thing where a video should only be allowed to start
// playing when the IMA SDK is ready or has failed // playing when the IMA SDK is ready or has failed
this.loadAds(); if (this.player.ended) {
this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
this.loader.contentComplete();
}
break; break;
case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
@ -6911,7 +6843,7 @@ typeof navigator === "object" && (function (global, factory) {
this.playing = false; // Play video this.playing = false; // Play video
this.player.media.play(); silencePromise(this.player.media.play());
} }
/** /**
* Pause our video * Pause our video
@ -6968,7 +6900,9 @@ typeof navigator === "object" && (function (global, factory) {
_this11.on('loaded', resolve); _this11.on('loaded', resolve);
_this11.player.debug.log(_this11.manager); _this11.player.debug.log(_this11.manager);
}); // Now request some new advertisements }); // Now that the manager has been destroyed set it to also be un-initialized
_this11.initialized = false; // Now request some new advertisements
_this11.requestAds(); _this11.requestAds();
}).catch(function () {}); }).catch(function () {});
@ -7151,9 +7085,7 @@ typeof navigator === "object" && (function (global, factory) {
return result; return result;
}; };
var PreviewThumbnails = var PreviewThumbnails = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
/** /**
* PreviewThumbnails constructor. * PreviewThumbnails constructor.
* @param {Plyr} player * @param {Plyr} player
@ -7214,15 +7146,10 @@ typeof navigator === "object" && (function (global, factory) {
if (is$1.empty(src)) { if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute'); throw new Error('Missing previewThumbnails.src config attribute');
} // If string, convert into single-element list } // Resolve promise
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails var sortAndResolve = function sortAndResolve() {
var promises = urls.map(function (u) {
return _this2.getThumbnail(u);
});
Promise.all(promises).then(function () {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p]) // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
_this2.thumbnails.sort(function (x, y) { _this2.thumbnails.sort(function (x, y) {
return x.height - y.height; return x.height - y.height;
@ -7231,7 +7158,25 @@ typeof navigator === "object" && (function (global, factory) {
_this2.player.debug.log('Preview thumbnails', _this2.thumbnails); _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
resolve(); resolve();
}); }; // Via callback()
if (is$1.function(src)) {
src(function (thumbnails) {
_this2.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
else {
// If string, convert into single-element list
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
return _this2.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
}); });
} // Process individual VTT file } // Process individual VTT file
@ -7982,9 +7927,7 @@ typeof navigator === "object" && (function (global, factory) {
// const globals = new WeakMap(); // const globals = new WeakMap();
// Plyr instance // Plyr instance
var Plyr = var Plyr = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Plyr(target, options) { function Plyr(target, options) {
var _this = this; var _this = this;
@ -8228,7 +8171,7 @@ typeof navigator === "object" && (function (global, factory) {
if (this.isHTML5 && this.config.autoplay) { if (this.isHTML5 && this.config.autoplay) {
setTimeout(function () { setTimeout(function () {
return _this.play(); return silencePromise(_this.play());
}, 10); }, 10);
} // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
@ -8265,7 +8208,7 @@ typeof navigator === "object" && (function (global, factory) {
this.ads.managerPromise.then(function () { this.ads.managerPromise.then(function () {
return _this2.ads.play(); return _this2.ads.play();
}).catch(function () { }).catch(function () {
return _this2.media.play(); return silencePromise(_this2.media.play());
}); });
} // Return the promise (for HTML5) } // Return the promise (for HTML5)

4
dist/plyr.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
dist/plyr.min.mjs vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

607
dist/plyr.mjs vendored
View File

@ -70,19 +70,15 @@ function _objectSpread2(target) {
} }
function _slicedToArray(arr, i) { function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
} }
function _toConsumableArray(arr) { function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
} }
function _arrayWithoutHoles(arr) { function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) { if (Array.isArray(arr)) return _arrayLikeToArray(arr);
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
}
} }
function _arrayWithHoles(arr) { function _arrayWithHoles(arr) {
@ -90,14 +86,11 @@ function _arrayWithHoles(arr) {
} }
function _iterableToArray(iter) { function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
} }
function _iterableToArrayLimit(arr, i) { function _iterableToArrayLimit(arr, i) {
if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
return;
}
var _arr = []; var _arr = [];
var _n = true; var _n = true;
var _d = false; var _d = false;
@ -123,102 +116,142 @@ function _iterableToArrayLimit(arr, i) {
return _arr; return _arr;
} }
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(n);
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() { function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance"); 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() { function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance"); 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 _classCallCheck$1(e, t) {
if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");
}
function _defineProperties$1(e, t) {
for (var n = 0; n < t.length; n++) {
var r = t[n];
r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);
}
}
function _createClass$1(e, t, n) {
return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;
}
function _defineProperty$1(e, t, n) {
return t in e ? Object.defineProperty(e, t, {
value: n,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[t] = n, e;
}
function ownKeys$1(e, t) {
var n = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var r = Object.getOwnPropertySymbols(e);
t && (r = r.filter(function (t) {
return Object.getOwnPropertyDescriptor(e, t).enumerable;
})), n.push.apply(n, r);
}
return n;
}
function _objectSpread2$1(e) {
for (var t = 1; t < arguments.length; t++) {
var n = null != arguments[t] ? arguments[t] : {};
t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {
_defineProperty$1(e, t, n[t]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));
});
}
return e;
} }
var defaults = { var defaults = {
addCSS: true, addCSS: !0,
// Add CSS to the element to improve usability (required here or in your CSS!)
thumbWidth: 15, thumbWidth: 15,
// The width of the thumb handle watch: !0
watch: true // Watch for new elements that match a string target
}; };
// Element matches a selector function matches(e, t) {
function matches(element, selector) { return function () {
return Array.from(document.querySelectorAll(t)).includes(this);
}.call(e, t);
}
function match() { function trigger(e, t) {
return Array.from(document.querySelectorAll(selector)).includes(this); if (e && t) {
var n = new Event(t, {
bubbles: !0
});
e.dispatchEvent(n);
} }
var matches = match;
return matches.call(element, selector);
} }
// Trigger event var getConstructor = function getConstructor(e) {
function trigger(element, type) { return null != e ? e.constructor : null;
if (!element || !type) { },
return; instanceOf = function instanceOf(e, t) {
} // Create and dispatch the event return !!(e && t && e instanceof t);
},
isNullOrUndefined = function isNullOrUndefined(e) {
var event = new Event(type); // Dispatch the event return null == e;
},
element.dispatchEvent(event); isObject = function isObject(e) {
} return getConstructor(e) === Object;
},
// ========================================================================== isNumber = function isNumber(e) {
// Type checking utils return getConstructor(e) === Number && !Number.isNaN(e);
// ========================================================================== },
var getConstructor = function getConstructor(input) { isString = function isString(e) {
return input !== null && typeof input !== 'undefined' ? input.constructor : null; return getConstructor(e) === String;
}; },
isBoolean = function isBoolean(e) {
var instanceOf = function instanceOf(input, constructor) { return getConstructor(e) === Boolean;
return Boolean(input && constructor && input instanceof constructor); },
}; isFunction = function isFunction(e) {
return getConstructor(e) === Function;
var isNullOrUndefined = function isNullOrUndefined(input) { },
return input === null || typeof input === 'undefined'; isArray = function isArray(e) {
}; return Array.isArray(e);
},
var isObject = function isObject(input) { isNodeList = function isNodeList(e) {
return getConstructor(input) === Object; return instanceOf(e, NodeList);
}; },
isElement = function isElement(e) {
var isNumber = function isNumber(input) { return instanceOf(e, Element);
return getConstructor(input) === Number && !Number.isNaN(input); },
}; isEvent = function isEvent(e) {
return instanceOf(e, Event);
var isString = function isString(input) { },
return getConstructor(input) === String; isEmpty = function isEmpty(e) {
}; return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;
},
var isBoolean = function isBoolean(input) { is = {
return getConstructor(input) === Boolean;
};
var isFunction = function isFunction(input) {
return getConstructor(input) === Function;
};
var isArray = function isArray(input) {
return Array.isArray(input);
};
var isNodeList = function isNodeList(input) {
return instanceOf(input, NodeList);
};
var isElement = function isElement(input) {
return instanceOf(input, Element);
};
var isEvent = function isEvent(input) {
return instanceOf(input, Event);
};
var isEmpty = function isEmpty(input) {
return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
};
var is = {
nullOrUndefined: isNullOrUndefined, nullOrUndefined: isNullOrUndefined,
object: isObject, object: isObject,
number: isNumber, number: isNumber,
@ -232,219 +265,98 @@ var is = {
empty: isEmpty empty: isEmpty
}; };
// Get the number of decimal places function getDecimalPlaces(e) {
function getDecimalPlaces(value) { var t = "".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;
if (!match) {
return 0;
}
return Math.max(0, // Number of digits right of decimal point.
(match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
match[2] ? +match[2] : 0));
} // Round to the nearest step
function round(number, step) {
if (step < 1) {
var places = getDecimalPlaces(step);
return parseFloat(number.toFixed(places));
}
return Math.round(number / step) * step;
} }
var RangeTouch = function round(e, t) {
/*#__PURE__*/ if (1 > t) {
function () { var n = getDecimalPlaces(t);
/** return parseFloat(e.toFixed(n));
* Setup a new instance
* @param {String|Element} target
* @param {Object} options
*/
function RangeTouch(target, options) {
_classCallCheck(this, RangeTouch);
if (is.element(target)) {
// An Element is passed, use it directly
this.element = target;
} else if (is.string(target)) {
// A CSS Selector is passed, fetch it from the DOM
this.element = document.querySelector(target);
}
if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
return;
}
this.config = Object.assign({}, defaults, options);
this.init();
} }
_createClass(RangeTouch, [{ return Math.round(e / t) * t;
}
var RangeTouch = function () {
function e(t, n) {
_classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());
}
return _createClass$1(e, [{
key: "init", key: "init",
value: function init() { value: function value() {
// Bail if not a touch enabled device e.enabled && (this.config.addCSS && (this.element.style.userSelect = "none", this.element.style.webKitUserSelect = "none", this.element.style.touchAction = "manipulation"), this.listeners(!0), this.element.rangeTouch = this);
if (!RangeTouch.enabled) {
return;
} // Add useful CSS
if (this.config.addCSS) {
// TODO: Restore original values on destroy
this.element.style.userSelect = 'none';
this.element.style.webKitUserSelect = 'none';
this.element.style.touchAction = 'manipulation';
}
this.listeners(true);
this.element.rangeTouch = this;
} }
}, { }, {
key: "destroy", key: "destroy",
value: function destroy() { value: function value() {
// Bail if not a touch enabled device e.enabled && (this.config.addCSS && (this.element.style.userSelect = "", this.element.style.webKitUserSelect = "", this.element.style.touchAction = ""), this.listeners(!1), this.element.rangeTouch = null);
if (!RangeTouch.enabled) {
return;
}
this.listeners(false);
this.element.rangeTouch = null;
} }
}, { }, {
key: "listeners", key: "listeners",
value: function listeners(toggle) { value: function value(e) {
var _this = this; var t = this,
n = e ? "addEventListener" : "removeEventListener";
var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events ["touchstart", "touchmove", "touchend"].forEach(function (e) {
t.element[n](e, function (e) {
['touchstart', 'touchmove', 'touchend'].forEach(function (type) { return t.set(e);
_this.element[method](type, function (event) { }, !1);
return _this.set(event);
}, false);
}); });
} }
/**
* Get the value based on touch position
* @param {Event} event
*/
}, { }, {
key: "get", key: "get",
value: function get(event) { value: function value(t) {
if (!RangeTouch.enabled || !is.event(event)) { if (!e.enabled || !is.event(t)) return null;
return null; var n,
} r = t.target,
i = t.changedTouches[0],
var input = event.target; o = parseFloat(r.getAttribute("min")) || 0,
var touch = event.changedTouches[0]; s = parseFloat(r.getAttribute("max")) || 100,
var min = parseFloat(input.getAttribute('min')) || 0; u = parseFloat(r.getAttribute("step")) || 1,
var max = parseFloat(input.getAttribute('max')) || 100; c = r.getBoundingClientRect(),
var step = parseFloat(input.getAttribute('step')) || 1; a = 100 / c.width * (this.config.thumbWidth / 2) / 100;
var delta = max - min; // Calculate percentage return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);
var percent;
var clientRect = input.getBoundingClientRect();
var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
if (percent < 0) {
percent = 0;
} else if (percent > 100) {
percent = 100;
} // Factor in the thumb offset
if (percent < 50) {
percent -= (100 - percent * 2) * thumbWidth;
} else if (percent > 50) {
percent += (percent - 50) * 2 * thumbWidth;
} // Find the closest step to the mouse position
return min + round(delta * (percent / 100), step);
} }
/**
* Update range value based on position
* @param {Event} event
*/
}, { }, {
key: "set", key: "set",
value: function set(event) { value: function value(t) {
if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) { e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, "touchend" === t.type ? "change" : "input"));
return;
} // Prevent text highlight on iOS
event.preventDefault(); // Set value
event.target.value = this.get(event); // Trigger event
trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
} }
}], [{ }], [{
key: "setup", key: "setup",
value: function value(t) {
var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
r = null;
if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type="range"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;
/** var i = _objectSpread2$1({}, defaults, {}, n);
* Setup multiple instances
* @param {String|Element|NodeList|Array} target
* @param {Object} options
*/
value: function setup(target) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var targets = null;
if (is.empty(target) || is.string(target)) { if (is.string(t) && i.watch) {
targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]')); var o = new MutationObserver(function (n) {
} else if (is.element(target)) { Array.from(n).forEach(function (n) {
targets = [target]; Array.from(n.addedNodes).forEach(function (n) {
} else if (is.nodeList(target)) { is.element(n) && matches(n, t) && new e(n, i);
targets = Array.from(target);
} else if (is.array(target)) {
targets = target.filter(is.element);
}
if (is.empty(targets)) {
return null;
}
var config = Object.assign({}, defaults, options);
if (is.string(target) && config.watch) {
// Create an observer instance
var observer = new MutationObserver(function (mutations) {
Array.from(mutations).forEach(function (mutation) {
Array.from(mutation.addedNodes).forEach(function (node) {
if (!is.element(node) || !matches(node, target)) {
return;
} // eslint-disable-next-line no-unused-vars
var range = new RangeTouch(node, config);
}); });
}); });
}); // Pass in the target node, as well as the observer options });
o.observe(document.body, {
observer.observe(document.body, { childList: !0,
childList: true, subtree: !0
subtree: true
}); });
} }
return targets.map(function (t) { return r.map(function (t) {
return new RangeTouch(t, options); return new e(t, n);
}); });
} }
}, { }, {
key: "enabled", key: "enabled",
get: function get() { get: function get() {
return 'ontouchstart' in document.documentElement; return "ontouchstart" in document.documentElement;
} }
}]); }]), e;
return RangeTouch;
}(); }();
// ========================================================================== // ==========================================================================
@ -519,7 +431,7 @@ var isTrack = function isTrack(input) {
}; };
var isPromise = function isPromise(input) { var isPromise = function isPromise(input) {
return instanceOf$1(input, Promise); return instanceOf$1(input, Promise) && isFunction$1(input.then);
}; };
var isEmpty$1 = function isEmpty(input) { var isEmpty$1 = function isEmpty(input) {
@ -861,12 +773,14 @@ function hasClass(element, className) {
} // Element matches selector } // Element matches selector
function matches$1(element, selector) { function matches$1(element, selector) {
var _Element = Element,
prototype = _Element.prototype;
function match() { function match() {
return Array.from(document.querySelectorAll(selector)).includes(this); return Array.from(document.querySelectorAll(selector)).includes(this);
} }
var method = match; var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;
return method.call(element, selector); return method.call(element, selector);
} // Find all elements } // Find all elements
@ -1138,6 +1052,19 @@ function ready() {
}).then(function () {}); }).then(function () {});
} }
/**
* Silence a Promise-like object.
* This is useful for avoiding non-harmful, but potentially confusing "uncaught
* play promise" rejection error messages.
* @param {Object} value An object that may or may not be `Promise`-like.
*/
function silencePromise(value) {
if (is$1.promise(value)) {
value.then(null, function () {});
}
}
function validateRatio(input) { function validateRatio(input) {
if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) { if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {
return false; return false;
@ -1314,7 +1241,7 @@ var html5 = {
player.currentTime = currentTime; // Resume playing player.currentTime = currentTime; // Resume playing
if (!paused) { if (!paused) {
player.play(); silencePromise(player.play());
} }
}); // Load new source }); // Load new source
@ -1492,9 +1419,7 @@ var i18n = {
} }
}; };
var Storage = var Storage = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Storage(player) { function Storage(player) {
_classCallCheck(this, Storage); _classCallCheck(this, Storage);
@ -1776,7 +1701,7 @@ var controls = {
var icon = document.createElementNS(namespace, 'svg'); var icon = document.createElementNS(namespace, 'svg');
setAttributes(icon, extend(attributes, { setAttributes(icon, extend(attributes, {
role: 'presentation', 'aria-hidden': 'true',
focusable: 'false' focusable: 'false'
})); // Create the <use> to reference sprite })); // Create the <use> to reference sprite
@ -3366,7 +3291,7 @@ var captions = {
toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
controls.setCaptionsMenu.call(this); controls.setCaptionsMenu.call(this);
} }
}, },
@ -4005,9 +3930,7 @@ function getProviderByUrl(url) {
// ========================================================================== // ==========================================================================
var noop = function noop() {}; var noop = function noop() {};
var Console = var Console = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Console() { function Console() {
var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
@ -4043,9 +3966,7 @@ function () {
return Console; return Console;
}(); }();
var Fullscreen = var Fullscreen = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Fullscreen(player) { function Fullscreen(player) {
var _this = this; var _this = this;
@ -4235,7 +4156,7 @@ function () {
if (browser.isIos && this.player.config.fullscreen.iosNative) { if (browser.isIos && this.player.config.fullscreen.iosNative) {
this.target.webkitExitFullscreen(); this.target.webkitExitFullscreen();
this.player.play(); silencePromise(this.player.play());
} else if (!Fullscreen.native || this.forceFallback) { } else if (!Fullscreen.native || this.forceFallback) {
this.toggleFallback(false); this.toggleFallback(false);
} else if (!this.prefix) { } else if (!this.prefix) {
@ -4282,7 +4203,7 @@ function () {
} }
var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
return element === this.target; return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;
} // Get target element } // Get target element
}, { }, {
@ -4569,9 +4490,7 @@ var ui = {
} }
}; };
var Listeners = var Listeners = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Listeners(player) { function Listeners(player) {
_classCallCheck(this, Listeners); _classCallCheck(this, Listeners);
@ -4662,7 +4581,7 @@ function () {
case 75: case 75:
// Space and K key // Space and K key
if (!repeat) { if (!repeat) {
player.togglePlay(); silencePromise(player.togglePlay());
} }
break; break;
@ -4980,9 +4899,13 @@ function () {
if (player.ended) { if (player.ended) {
_this.proxy(event, player.restart, 'restart'); _this.proxy(event, player.restart, 'restart');
_this.proxy(event, player.play, 'play'); _this.proxy(event, function () {
silencePromise(player.play());
}, 'play');
} else { } else {
_this.proxy(event, player.togglePlay, 'play'); _this.proxy(event, function () {
silencePromise(player.togglePlay());
}, 'play');
} }
}); });
} // Disable right click } // Disable right click
@ -5080,7 +5003,9 @@ function () {
if (elements.buttons.play) { if (elements.buttons.play) {
Array.from(elements.buttons.play).forEach(function (button) { Array.from(elements.buttons.play).forEach(function (button) {
_this3.bind(button, 'click', player.togglePlay, 'play'); _this3.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
}); });
} // Pause } // Pause
@ -5177,7 +5102,7 @@ function () {
if (play && done) { if (play && done) {
seek.removeAttribute(attribute); seek.removeAttribute(attribute);
player.play(); silencePromise(player.play());
} else if (!done && player.playing) { } else if (!done && player.playing) {
seek.setAttribute(attribute, ''); seek.setAttribute(attribute, '');
player.pause(); player.pause();
@ -5812,6 +5737,9 @@ var vimeo = {
player.embed.setPlaybackRate(input).then(function () { player.embed.setPlaybackRate(input).then(function () {
speed = input; speed = input;
triggerEvent.call(player, player.media, 'ratechange'); triggerEvent.call(player, player.media, 'ratechange');
}).catch(function () {
// Cannot set Playback Rate, Video is probably not on Pro account
player.options.speed = [1];
}); });
} }
}); // Volume }); // Volume
@ -6451,9 +6379,7 @@ var destroy = function destroy(instance) {
instance.elements.container.remove(); instance.elements.container.remove();
}; };
var Ads = var Ads = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
/** /**
* Ads constructor. * Ads constructor.
* @param {Object} player * @param {Object} player
@ -6553,6 +6479,8 @@ function () {
* mobile devices, this initialization is done as the result of a user action. * mobile devices, this initialization is done as the result of a user action.
*/ */
value: function setupIMA() { value: function setupIMA() {
var _this4 = this;
// Create the container for our advertisements // Create the container for our advertisements
this.elements.container = createElement('div', { this.elements.container = createElement('div', {
class: this.player.config.classNames.ads class: this.player.config.classNames.ads
@ -6565,7 +6493,16 @@ function () {
google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader
this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
return _this4.onAdsManagerLoaded(event);
}, false);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
return _this4.onAdError(error);
}, false); // Request video ads to be pre-loaded
this.requestAds(); this.requestAds();
} }
@ -6576,21 +6513,10 @@ function () {
}, { }, {
key: "requestAds", key: "requestAds",
value: function requestAds() { value: function requestAds() {
var _this4 = this;
var container = this.player.elements.container; var container = this.player.elements.container;
try { try {
// Create ads loader // Request video ads
this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
return _this4.onAdsManagerLoaded(event);
}, false);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
return _this4.onAdError(error);
}, false); // Request video ads
var request = new google.ima.AdsRequest(); var request = new google.ima.AdsRequest();
request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
// to select the correct creative if multiple are returned // to select the correct creative if multiple are returned
@ -6769,7 +6695,13 @@ function () {
// }; // };
// TODO: So there is still this thing where a video should only be allowed to start // TODO: So there is still this thing where a video should only be allowed to start
// playing when the IMA SDK is ready or has failed // playing when the IMA SDK is ready or has failed
this.loadAds(); if (this.player.ended) {
this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
this.loader.contentComplete();
}
break; break;
case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
@ -6905,7 +6837,7 @@ function () {
this.playing = false; // Play video this.playing = false; // Play video
this.player.media.play(); silencePromise(this.player.media.play());
} }
/** /**
* Pause our video * Pause our video
@ -6962,7 +6894,9 @@ function () {
_this11.on('loaded', resolve); _this11.on('loaded', resolve);
_this11.player.debug.log(_this11.manager); _this11.player.debug.log(_this11.manager);
}); // Now request some new advertisements }); // Now that the manager has been destroyed set it to also be un-initialized
_this11.initialized = false; // Now request some new advertisements
_this11.requestAds(); _this11.requestAds();
}).catch(function () {}); }).catch(function () {});
@ -7145,9 +7079,7 @@ var fitRatio = function fitRatio(ratio, outer) {
return result; return result;
}; };
var PreviewThumbnails = var PreviewThumbnails = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
/** /**
* PreviewThumbnails constructor. * PreviewThumbnails constructor.
* @param {Plyr} player * @param {Plyr} player
@ -7208,15 +7140,10 @@ function () {
if (is$1.empty(src)) { if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute'); throw new Error('Missing previewThumbnails.src config attribute');
} // If string, convert into single-element list } // Resolve promise
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails var sortAndResolve = function sortAndResolve() {
var promises = urls.map(function (u) {
return _this2.getThumbnail(u);
});
Promise.all(promises).then(function () {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p]) // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
_this2.thumbnails.sort(function (x, y) { _this2.thumbnails.sort(function (x, y) {
return x.height - y.height; return x.height - y.height;
@ -7225,7 +7152,25 @@ function () {
_this2.player.debug.log('Preview thumbnails', _this2.thumbnails); _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
resolve(); resolve();
}); }; // Via callback()
if (is$1.function(src)) {
src(function (thumbnails) {
_this2.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
else {
// If string, convert into single-element list
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
return _this2.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
}); });
} // Process individual VTT file } // Process individual VTT file
@ -7976,9 +7921,7 @@ function clamp() {
// const globals = new WeakMap(); // const globals = new WeakMap();
// Plyr instance // Plyr instance
var Plyr = var Plyr = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Plyr(target, options) { function Plyr(target, options) {
var _this = this; var _this = this;
@ -8222,7 +8165,7 @@ function () {
if (this.isHTML5 && this.config.autoplay) { if (this.isHTML5 && this.config.autoplay) {
setTimeout(function () { setTimeout(function () {
return _this.play(); return silencePromise(_this.play());
}, 10); }, 10);
} // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
@ -8259,7 +8202,7 @@ function () {
this.ads.managerPromise.then(function () { this.ads.managerPromise.then(function () {
return _this2.ads.play(); return _this2.ads.play();
}).catch(function () { }).catch(function () {
return _this2.media.play(); return silencePromise(_this2.media.play());
}); });
} // Return the promise (for HTML5) } // Return the promise (for HTML5)

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
Plyr is a simple, lightweight, accessible and customizable HTML5, YouTube and Vimeo media player that supports [_modern_](#browser-support) browsers. Plyr is a simple, lightweight, accessible and customizable HTML5, YouTube and Vimeo media player that supports [_modern_](#browser-support) browsers.
[Checkout the demo](https://plyr.io) - [Donate](#donate) - [Slack](https://bit.ly/plyr--chat) - [![npm version](https://badge.fury.io/js/plyr.svg)](https://badge.fury.io/js/plyr) [Checkout the demo](https://plyr.io) - [Donate](#donate) - [Slack](https://bit.ly/plyr--chat)
[![npm version](https://badge.fury.io/js/plyr.svg)](https://badge.fury.io/js/plyr) [![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/sampotts/plyr) [![Financial Contributors on Open Collective](https://opencollective.com/plyr/all/badge.svg?label=financial+contributors)](https://opencollective.com/plyr)
[![Image of Plyr](https://cdn.plyr.io/static/demo/screenshot.png?v=3)](https://plyr.io) [![Image of Plyr](https://cdn.plyr.io/static/demo/screenshot.png?v=3)](https://plyr.io)
@ -168,12 +170,14 @@ Plyr has partnered up with [vi.ai](https://vi.ai/publisher-video-monetization/?a
Any questions regarding the ads can be sent straight to vi.ai and any issues with rendering raised through GitHub issues. Any questions regarding the ads can be sent straight to vi.ai and any issues with rendering raised through GitHub issues.
If you do not wish to use Vi, you can set your own `ads.tagUrl` [option](#options).
# Advanced # Advanced
## SASS ## SASS
You can use `bundle.scss` file included in `/src` as part of your build and change variables to suit your design. The SASS require you to You can use `plyr.scss` file included in `/src/sass` as part of your build and change variables to suit your design. The SASS requires you to
use the [autoprefixer](https://www.npmjs.com/package/gulp-autoprefixer) plugin (you should be already!) as all declarations use the W3C definitions. use [autoprefixer](https://www.npmjs.com/package/gulp-autoprefixer) (you should be already!) as all declarations use the W3C definitions.
The HTML markup uses the BEM methodology with `plyr` as the block, e.g. `.plyr__controls`. You can change the class hooks in the options to match any custom CSS The HTML markup uses the BEM methodology with `plyr` as the block, e.g. `.plyr__controls`. You can change the class hooks in the options to match any custom CSS
you write. Check out the JavaScript source for more on this. you write. Check out the JavaScript source for more on this.
@ -305,7 +309,7 @@ Note the single quotes encapsulating the JSON and double quotes on the object ke
| `speed` | Object | `{ selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] }` | `selected`: The default speed for playback. `options`: The speed options to display in the UI. YouTube and Vimeo will ignore any options outside of the 0.5-2 range, so options outside of this range will be hidden automatically. | | `speed` | Object | `{ selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] }` | `selected`: The default speed for playback. `options`: The speed options to display in the UI. YouTube and Vimeo will ignore any options outside of the 0.5-2 range, so options outside of this range will be hidden automatically. |
| `quality` | Object | `{ default: 576, options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] }` | `default` is the default quality level (if it exists in your sources). `options` are the options to display. This is used to filter the available sources. | | `quality` | Object | `{ default: 576, options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] }` | `default` is the default quality level (if it exists in your sources). `options` are the options to display. This is used to filter the available sources. |
| `loop` | Object | `{ active: false }` | `active`: Whether to loop the current video. If the `loop` attribute is present on a `<video>` or `<audio>` element, this will be automatically set to true This is an object to support future functionality. | | `loop` | Object | `{ active: false }` | `active`: Whether to loop the current video. If the `loop` attribute is present on a `<video>` or `<audio>` element, this will be automatically set to true This is an object to support future functionality. |
| `ads` | Object | `{ enabled: false, publisherId: '' }` | `enabled`: Whether to enable advertisements. `publisherId`: Your unique [vi.ai](https://vi.ai/publisher-video-monetization/?aid=plyrio) publisher ID. | | `ads` | Object | `{ enabled: false, publisherId: '', tagUrl: '' }` | `enabled`: Whether to enable advertisements. `publisherId`: Your unique [vi.ai](https://vi.ai/publisher-video-monetization/?aid=plyrio) publisher ID. `tagUrl` is a URL for a custom VAST tag if you're not using Vi. |
| `urls` | Object | See source. | If you wish to override any API URLs then you can do so here. You can also set a custom download URL for the download button. | | `urls` | Object | See source. | If you wish to override any API URLs then you can do so here. You can also set a custom download URL for the download button. |
| `vimeo` | Object | `{ byline: false, portrait: false, title: false, speed: true, transparent: false }` | See [Vimeo embed options](https://github.com/vimeo/player.js/#embed-options). Some are set automatically based on other config options, namely: `loop`, `autoplay`, `muted`, `gesture`, `playsinline` | | `vimeo` | Object | `{ byline: false, portrait: false, title: false, speed: true, transparent: false }` | See [Vimeo embed options](https://github.com/vimeo/player.js/#embed-options). Some are set automatically based on other config options, namely: `loop`, `autoplay`, `muted`, `gesture`, `playsinline` |
| `youtube` | Object | `{ noCookie: false, rel: 0, showinfo: 0, iv_load_policy: 3, modestbranding: 1 }` | See [YouTube embed options](https://developers.google.com/youtube/player_parameters#Parameters). The only custom option is `noCookie` to use an alternative to YouTube that doesn't use cookies (useful for GDPR, etc). Some are set automatically based on other config options, namely: `autoplay`, `hl`, `controls`, `disablekb`, `playsinline`, `cc_load_policy`, `cc_lang_pref`, `widget_referrer` | | `youtube` | Object | `{ noCookie: false, rel: 0, showinfo: 0, iv_load_policy: 3, modestbranding: 1 }` | See [YouTube embed options](https://developers.google.com/youtube/player_parameters#Parameters). The only custom option is `noCookie` to use an alternative to YouTube that doesn't use cookies (useful for GDPR, etc). Some are set automatically based on other config options, namely: `autoplay`, `hl`, `controls`, `disablekb`, `playsinline`, `cc_load_policy`, `cc_lang_pref`, `widget_referrer` |
@ -349,30 +353,30 @@ player.play(); // Start playback
player.fullscreen.enter(); // Enter fullscreen player.fullscreen.enter(); // Enter fullscreen
``` ```
| Method | Parameters | Description | | Method | Parameters | Description |
| ------------------------ | ---------------- | ---------------------------------------------------------------------------------------------------------- | | -------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------- |
| `play()`&sup1; | - | Start playback. | | `play()`&sup1; | - | Start playback. |
| `pause()` | - | Pause playback. | | `pause()` | - | Pause playback. |
| `togglePlay(toggle)` | Boolean | Toggle playback, if no parameters are passed, it will toggle based on current status. | | `togglePlay(toggle)`&sup1; | Boolean | Toggle playback, if no parameters are passed, it will toggle based on current status. |
| `stop()` | - | Stop playback and reset to start. | | `stop()` | - | Stop playback and reset to start. |
| `restart()` | - | Restart playback. | | `restart()` | - | Restart playback. |
| `rewind(seekTime)` | Number | Rewind playback by the specified seek time. If no parameter is passed, the default seek time will be used. | | `rewind(seekTime)` | Number | Rewind playback by the specified seek time. If no parameter is passed, the default seek time will be used. |
| `forward(seekTime)` | Number | Fast forward by the specified seek time. If no parameter is passed, the default seek time will be used. | | `forward(seekTime)` | Number | Fast forward by the specified seek time. If no parameter is passed, the default seek time will be used. |
| `increaseVolume(step)` | Number | Increase volume by the specified step. If no parameter is passed, the default step will be used. | | `increaseVolume(step)` | Number | Increase volume by the specified step. If no parameter is passed, the default step will be used. |
| `decreaseVolume(step)` | Number | Increase volume by the specified step. If no parameter is passed, the default step will be used. | | `decreaseVolume(step)` | Number | Increase volume by the specified step. If no parameter is passed, the default step will be used. |
| `toggleCaptions(toggle)` | Boolean | Toggle captions display. If no parameter is passed, it will toggle based on current status. | | `toggleCaptions(toggle)` | Boolean | Toggle captions display. If no parameter is passed, it will toggle based on current status. |
| `fullscreen.enter()` | - | Enter fullscreen. If fullscreen is not supported, a fallback "full window/viewport" is used instead. | | `fullscreen.enter()` | - | Enter fullscreen. If fullscreen is not supported, a fallback "full window/viewport" is used instead. |
| `fullscreen.exit()` | - | Exit fullscreen. | | `fullscreen.exit()` | - | Exit fullscreen. |
| `fullscreen.toggle()` | - | Toggle fullscreen. | | `fullscreen.toggle()` | - | Toggle fullscreen. |
| `airplay()` | - | Trigger the airplay dialog on supported devices. | | `airplay()` | - | Trigger the airplay dialog on supported devices. |
| `toggleControls(toggle)` | Boolean | Toggle the controls (video only). Takes optional truthy value to force it on/off. | | `toggleControls(toggle)` | Boolean | Toggle the controls (video only). Takes optional truthy value to force it on/off. |
| `on(event, function)` | String, Function | Add an event listener for the specified event. | | `on(event, function)` | String, Function | Add an event listener for the specified event. |
| `once(event, function)` | String, Function | Add an event listener for the specified event once. | | `once(event, function)` | String, Function | Add an event listener for the specified event once. |
| `off(event, function)` | String, Function | Remove an event listener for the specified event. | | `off(event, function)` | String, Function | Remove an event listener for the specified event. |
| `supports(type)` | String | Check support for a mime type. | | `supports(type)` | String | Check support for a mime type. |
| `destroy()` | - | Destroy the instance and garbage collect any elements. | | `destroy()` | - | Destroy the instance and garbage collect any elements. |
1. For HTML5 players, `play()` will return a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) in _some_ browsers - WebKit and Mozilla [according to MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) at time of writing. 1. For HTML5 players, `play()` will return a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) for most browsers - e.g. Chrome, Firefox, Opera, Safari and Edge [according to MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) at time of writing.
## Getters and Setters ## Getters and Setters
@ -446,7 +450,7 @@ player.source = {
], ],
poster: '/path/to/poster.jpg', poster: '/path/to/poster.jpg',
previewThumbnails: { previewThumbnails: {
src: '/path/to/thumbnails.vtt' src: '/path/to/thumbnails.vtt',
}, },
tracks: [ tracks: [
{ {
@ -752,6 +756,29 @@ Massive thanks to [Fastly](https://www.fastly.com/) for providing the CDN servic
Massive thanks to [Sentry](https://sentry.io/) for providing the logging services for the demo site. Massive thanks to [Sentry](https://sentry.io/) for providing the logging services for the demo site.
## Contributors
### Code Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="https://github.com/sampotts/plyr/graphs/contributors"><img src="https://opencollective.com/plyr/contributors.svg?width=890&button=false" /></a>
### Financial Contributors
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/plyr/contribute)]
#### Individuals
<a href="https://opencollective.com/plyr"><img src="https://opencollective.com/plyr/individuals.svg?width=890"></a>
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/plyr/contribute)]
<a href="https://opencollective.com/plyr/organization/0/website"><img src="https://opencollective.com/plyr/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/plyr/organization/1/website"><img src="https://opencollective.com/plyr/organization/1/avatar.svg"></a><a href="https://opencollective.com/plyr/organization/2/website"><img src="https://opencollective.com/plyr/organization/2/avatar.svg"></a>
# Copyright and License # Copyright and License
[The MIT license](license.md) [The MIT license](license.md)

View File

@ -151,7 +151,11 @@ const captions = {
toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks)); toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));
// Update available languages in list // Update available languages in list
if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { if (
is.array(this.config.controls) &&
this.config.controls.includes('settings') &&
this.config.settings.includes('captions')
) {
controls.setCaptionsMenu.call(this); controls.setCaptionsMenu.call(this);
} }
}, },

2
src/js/controls.js vendored
View File

@ -111,7 +111,7 @@ const controls = {
setAttributes( setAttributes(
icon, icon,
extend(attributes, { extend(attributes, {
role: 'presentation', 'aria-hidden': 'true',
focusable: 'false', focusable: 'false',
}), }),
); );

View File

@ -8,6 +8,7 @@ import browser from './utils/browser';
import { getElements, hasClass, toggleClass } from './utils/elements'; import { getElements, hasClass, toggleClass } from './utils/elements';
import { on, triggerEvent } from './utils/events'; import { on, triggerEvent } from './utils/events';
import is from './utils/is'; import is from './utils/is';
import { silencePromise } from './utils/promise';
class Fullscreen { class Fullscreen {
constructor(player) { constructor(player) {
@ -118,7 +119,7 @@ class Fullscreen {
const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`]; const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];
return element === this.target; return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;
} }
// Get target element // Get target element
@ -268,7 +269,7 @@ class Fullscreen {
// iOS native fullscreen // iOS native fullscreen
if (browser.isIos && this.player.config.fullscreen.iosNative) { if (browser.isIos && this.player.config.fullscreen.iosNative) {
this.target.webkitExitFullscreen(); this.target.webkitExitFullscreen();
this.player.play(); silencePromise(this.player.play());
} else if (!Fullscreen.native || this.forceFallback) { } else if (!Fullscreen.native || this.forceFallback) {
this.toggleFallback(false); this.toggleFallback(false);
} else if (!this.prefix) { } else if (!this.prefix) {

View File

@ -6,6 +6,7 @@ import support from './support';
import { removeElement } from './utils/elements'; import { removeElement } from './utils/elements';
import { triggerEvent } from './utils/events'; import { triggerEvent } from './utils/events';
import is from './utils/is'; import is from './utils/is';
import { silencePromise } from './utils/promise';
import { setAspectRatio } from './utils/style'; import { setAspectRatio } from './utils/style';
const html5 = { const html5 = {
@ -101,7 +102,7 @@ const html5 = {
// Resume playing // Resume playing
if (!paused) { if (!paused) {
player.play(); silencePromise(player.play());
} }
}); });

View File

@ -9,6 +9,7 @@ import browser from './utils/browser';
import { getElement, getElements, matches, toggleClass } from './utils/elements'; import { getElement, getElements, matches, toggleClass } from './utils/elements';
import { off, on, once, toggleListener, triggerEvent } from './utils/events'; import { off, on, once, toggleListener, triggerEvent } from './utils/events';
import is from './utils/is'; import is from './utils/is';
import { silencePromise } from './utils/promise';
import { getAspectRatio, setAspectRatio } from './utils/style'; import { getAspectRatio, setAspectRatio } from './utils/style';
class Listeners { class Listeners {
@ -99,7 +100,7 @@ class Listeners {
case 75: case 75:
// Space and K key // Space and K key
if (!repeat) { if (!repeat) {
player.togglePlay(); silencePromise(player.togglePlay());
} }
break; break;
@ -431,9 +432,9 @@ class Listeners {
if (player.ended) { if (player.ended) {
this.proxy(event, player.restart, 'restart'); this.proxy(event, player.restart, 'restart');
this.proxy(event, player.play, 'play'); this.proxy(event, () => { silencePromise(player.play()) }, 'play');
} else { } else {
this.proxy(event, player.togglePlay, 'play'); this.proxy(event, () => { silencePromise(player.togglePlay()) }, 'play');
} }
}); });
} }
@ -539,7 +540,7 @@ class Listeners {
// Play/pause toggle // Play/pause toggle
if (elements.buttons.play) { if (elements.buttons.play) {
Array.from(elements.buttons.play).forEach(button => { Array.from(elements.buttons.play).forEach(button => {
this.bind(button, 'click', player.togglePlay, 'play'); this.bind(button, 'click', () => { silencePromise(player.togglePlay()) }, 'play');
}); });
} }
@ -681,7 +682,7 @@ class Listeners {
// If we're done seeking and it was playing, resume playback // If we're done seeking and it was playing, resume playback
if (play && done) { if (play && done) {
seek.removeAttribute(attribute); seek.removeAttribute(attribute);
player.play(); silencePromise(player.play());
} else if (!done && player.playing) { } else if (!done && player.playing) {
seek.setAttribute(attribute, ''); seek.setAttribute(attribute, '');
player.pause(); player.pause();

View File

@ -11,6 +11,7 @@ import { triggerEvent } from '../utils/events';
import i18n from '../utils/i18n'; import i18n from '../utils/i18n';
import is from '../utils/is'; import is from '../utils/is';
import loadScript from '../utils/load-script'; import loadScript from '../utils/load-script';
import { silencePromise } from '../utils/promise';
import { formatTime } from '../utils/time'; import { formatTime } from '../utils/time';
import { buildUrlParams } from '../utils/urls'; import { buildUrlParams } from '../utils/urls';
@ -172,6 +173,17 @@ class Ads {
// We assume the adContainer is the video container of the plyr element that will house the ads // We assume the adContainer is the video container of the plyr element that will house the ads
this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);
// Create ads loader
this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
// Listen and respond to ads loaded and error events
this.loader.addEventListener(
google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
event => this.onAdsManagerLoaded(event),
false,
);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);
// Request video ads to be pre-loaded // Request video ads to be pre-loaded
this.requestAds(); this.requestAds();
} }
@ -183,17 +195,6 @@ class Ads {
const { container } = this.player.elements; const { container } = this.player.elements;
try { try {
// Create ads loader
this.loader = new google.ima.AdsLoader(this.elements.displayContainer);
// Listen and respond to ads loaded and error events
this.loader.addEventListener(
google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
event => this.onAdsManagerLoaded(event),
false,
);
this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);
// Request video ads // Request video ads
const request = new google.ima.AdsRequest(); const request = new google.ima.AdsRequest();
request.adTagUrl = this.tagUrl; request.adTagUrl = this.tagUrl;
@ -369,7 +370,12 @@ class Ads {
// TODO: So there is still this thing where a video should only be allowed to start // TODO: So there is still this thing where a video should only be allowed to start
// playing when the IMA SDK is ready or has failed // playing when the IMA SDK is ready or has failed
this.loadAds(); if (this.player.ended) {
this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
this.loader.contentComplete();
}
break; break;
@ -510,7 +516,7 @@ class Ads {
this.playing = false; this.playing = false;
// Play video // Play video
this.player.media.play(); silencePromise(this.player.media.play());
} }
/** /**
@ -563,6 +569,8 @@ class Ads {
this.on('loaded', resolve); this.on('loaded', resolve);
this.player.debug.log(this.manager); this.player.debug.log(this.manager);
}); });
// Now that the manager has been destroyed set it to also be un-initialized
this.initialized = false;
// Now request some new advertisements // Now request some new advertisements
this.requestAds(); this.requestAds();

View File

@ -137,19 +137,32 @@ class PreviewThumbnails {
throw new Error('Missing previewThumbnails.src config attribute'); throw new Error('Missing previewThumbnails.src config attribute');
} }
// If string, convert into single-element list // Resolve promise
const urls = is.string(src) ? [src] : src; const sortAndResolve = () => {
// Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
const promises = urls.map(u => this.getThumbnail(u));
Promise.all(promises).then(() => {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p]) // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
this.thumbnails.sort((x, y) => x.height - y.height); this.thumbnails.sort((x, y) => x.height - y.height);
this.player.debug.log('Preview thumbnails', this.thumbnails); this.player.debug.log('Preview thumbnails', this.thumbnails);
resolve(); resolve();
}); };
// Via callback()
if (is.function(src)) {
src(thumbnails => {
this.thumbnails = thumbnails;
sortAndResolve();
});
}
// VTT urls
else {
// If string, convert into single-element list
const urls = is.string(src) ? [src] : src;
// Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
const promises = urls.map(u => this.getThumbnail(u));
// Resolve
Promise.all(promises).then(sortAndResolve);
}
}); });
} }

View File

@ -204,6 +204,9 @@ const vimeo = {
player.embed.setPlaybackRate(input).then(() => { player.embed.setPlaybackRate(input).then(() => {
speed = input; speed = input;
triggerEvent.call(player, player.media, 'ratechange'); triggerEvent.call(player, player.media, 'ratechange');
}).catch(() => {
// Cannot set Playback Rate, Video is probably not on Pro account
player.options.speed = [1];
}); });
}, },
}); });

33
src/js/plyr.d.ts vendored
View File

@ -94,9 +94,8 @@ declare class Plyr {
/** /**
* Gets or sets the quality for the player. The setter accepts a value from the options specified in your config. * Gets or sets the quality for the player. The setter accepts a value from the options specified in your config.
* Remarks: YouTube only. HTML5 will follow.
*/ */
quality: string; quality: number;
/** /**
* Gets or sets the current loop state of the player. * Gets or sets the current loop state of the player.
@ -134,6 +133,21 @@ declare class Plyr {
*/ */
pip: boolean; pip: boolean;
/**
* Gets or sets the aspect ratio for embedded players.
*/
ratio?: string;
/**
* Returns the current video Provider
*/
readonly provider: 'html5' | 'vimeo' | 'youtube';
/**
* Returns the native API for Vimeo or Youtube players
*/
readonly embed?: any;
readonly fullscreen: Plyr.FullscreenControl; readonly fullscreen: Plyr.FullscreenControl;
/** /**
@ -472,11 +486,21 @@ declare namespace Plyr {
* enabled: Whether to enable vi.ai ads. publisherId: Your unique vi.ai publisher ID. * enabled: Whether to enable vi.ai ads. publisherId: Your unique vi.ai publisher ID.
*/ */
ads?: AdOptions; ads?: AdOptions;
/**
* Vimeo Player Options.
*/
vimeo?: object;
/**
* Youtube Player Options.
*/
youtube?: object;
} }
interface QualityOptions { interface QualityOptions {
default: string; default: number;
options: string[]; options: number[];
} }
interface LoopOptions { interface LoopOptions {
@ -507,6 +531,7 @@ declare namespace Plyr {
enabled?: boolean; enabled?: boolean;
fallback?: boolean; fallback?: boolean;
allowAudio?: boolean; allowAudio?: boolean;
iosNative?: boolean;
} }
interface CaptionOptions { interface CaptionOptions {

View File

@ -27,6 +27,7 @@ import is from './utils/is';
import loadSprite from './utils/load-sprite'; import loadSprite from './utils/load-sprite';
import { clamp } from './utils/numbers'; import { clamp } from './utils/numbers';
import { cloneDeep, extend } from './utils/objects'; import { cloneDeep, extend } from './utils/objects';
import { silencePromise } from './utils/promise';
import { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style'; import { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';
import { parseUrl } from './utils/urls'; import { parseUrl } from './utils/urls';
@ -303,7 +304,7 @@ class Plyr {
// Autoplay if required // Autoplay if required
if (this.isHTML5 && this.config.autoplay) { if (this.isHTML5 && this.config.autoplay) {
setTimeout(() => this.play(), 10); setTimeout(() => silencePromise(this.play()), 10);
} }
// Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
@ -356,7 +357,7 @@ class Plyr {
// Intecept play with ads // Intecept play with ads
if (this.ads && this.ads.enabled) { if (this.ads && this.ads.enabled) {
this.ads.managerPromise.then(() => this.ads.play()).catch(() => this.media.play()); this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));
} }
// Return the promise (for HTML5) // Return the promise (for HTML5)

View File

@ -221,7 +221,7 @@ export function hasClass(element, className) {
// Element matches selector // Element matches selector
export function matches(element, selector) { export function matches(element, selector) {
const prototype = { Element }; const {prototype} = Element;
function match() { function match() {
return Array.from(document.querySelectorAll(selector)).includes(this); return Array.from(document.querySelectorAll(selector)).includes(this);

View File

@ -19,7 +19,7 @@ const isEvent = input => instanceOf(input, Event);
const isKeyboardEvent = input => instanceOf(input, KeyboardEvent); const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);
const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue); const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
const isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind)); const isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));
const isPromise = input => instanceOf(input, Promise); const isPromise = input => instanceOf(input, Promise) && isFunction(input.then);
const isEmpty = input => const isEmpty = input =>
isNullOrUndefined(input) || isNullOrUndefined(input) ||

14
src/js/utils/promise.js Normal file
View File

@ -0,0 +1,14 @@
import is from './is';
/**
* Silence a Promise-like object.
* This is useful for avoiding non-harmful, but potentially confusing "uncaught
* play promise" rejection error messages.
* @param {Object} value An object that may or may not be `Promise`-like.
*/
export function silencePromise(value) {
if (is.promise(value)) {
value.then(null, () => {});
}
}
export default { silencePromise };

327
yarn.lock
View File

@ -41,9 +41,9 @@
source-map "^0.5.0" source-map "^0.5.0"
"@babel/generator@^7.9.0": "@babel/generator@^7.9.0":
version "7.9.0" version "7.9.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.0.tgz#0f67adea4ec39dad6e63345f70eec33014d78c89" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce"
integrity sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw== integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==
dependencies: dependencies:
"@babel/types" "^7.9.0" "@babel/types" "^7.9.0"
jsesc "^2.5.1" jsesc "^2.5.1"
@ -65,15 +65,6 @@
"@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/helper-explode-assignable-expression" "^7.8.3"
"@babel/types" "^7.8.3" "@babel/types" "^7.8.3"
"@babel/helper-call-delegate@^7.8.7":
version "7.8.7"
resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab"
integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ==
dependencies:
"@babel/helper-hoist-variables" "^7.8.3"
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.7"
"@babel/helper-compilation-targets@^7.8.7": "@babel/helper-compilation-targets@^7.8.7":
version "7.8.7" version "7.8.7"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde"
@ -232,9 +223,9 @@
"@babel/types" "^7.8.3" "@babel/types" "^7.8.3"
"@babel/helpers@^7.9.0": "@babel/helpers@^7.9.0":
version "7.9.0" version "7.9.2"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.0.tgz#ab2c1bc4821af766cab51d4868a5038874ea5a12" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
integrity sha512-/9GvfYTCG1NWCNwDj9e+XlnSCmWW/r9T794Xi58vPF9WCcnZCAZ0kWLSn54oqP40SUvh1T2G6VwKmFO5AOlW3A== integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
dependencies: dependencies:
"@babel/template" "^7.8.3" "@babel/template" "^7.8.3"
"@babel/traverse" "^7.9.0" "@babel/traverse" "^7.9.0"
@ -250,9 +241,9 @@
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
version "7.9.0" version "7.9.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.0.tgz#f821b32313f07ee570976d3f6238e8d2d66e0a8e" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
integrity sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg== integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
"@babel/plugin-proposal-async-generator-functions@^7.8.3": "@babel/plugin-proposal-async-generator-functions@^7.8.3":
version "7.8.3" version "7.8.3"
@ -422,9 +413,9 @@
lodash "^4.17.13" lodash "^4.17.13"
"@babel/plugin-transform-classes@^7.9.0": "@babel/plugin-transform-classes@^7.9.0":
version "7.9.0" version "7.9.2"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.0.tgz#ab89c175ecf5b4c8911194aa8657966615324ce9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d"
integrity sha512-xt/0CuBRBsBkqfk95ILxf0ge3gnXjEhOHrNxIiS8fdzSWgecuf9Vq2ogLUfaozJgt3LDO49ThMVWiyezGkei7A== integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==
dependencies: dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-define-map" "^7.8.3" "@babel/helper-define-map" "^7.8.3"
@ -561,11 +552,10 @@
"@babel/helper-replace-supers" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3"
"@babel/plugin-transform-parameters@^7.8.7": "@babel/plugin-transform-parameters@^7.8.7":
version "7.8.8" version "7.9.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a"
integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==
dependencies: dependencies:
"@babel/helper-call-delegate" "^7.8.7"
"@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-get-function-arity" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3"
@ -713,9 +703,9 @@
esutils "^2.0.2" esutils "^2.0.2"
"@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
version "7.9.0" version "7.9.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -743,7 +733,7 @@
globals "^11.1.0" globals "^11.1.0"
lodash "^4.17.13" lodash "^4.17.13"
"@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0":
version "7.9.0" version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5"
integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==
@ -842,9 +832,9 @@
integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
"@types/node@*": "@types/node@*":
version "13.9.2" version "13.9.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.5.tgz#59738bf30b31aea1faa2df7f4a5f55613750cf00"
integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== integrity sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==
"@types/normalize-package-data@^2.4.0": "@types/normalize-package-data@^2.4.0":
version "2.4.0" version "2.4.0"
@ -1395,34 +1385,19 @@ autoprefixer@^7.1.2:
postcss-value-parser "^3.2.3" postcss-value-parser "^3.2.3"
autoprefixer@^9.6.1, autoprefixer@^9.7.4: autoprefixer@^9.6.1, autoprefixer@^9.7.4:
version "9.7.4" version "9.7.5"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376"
integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==
dependencies: dependencies:
browserslist "^4.8.3" browserslist "^4.11.0"
caniuse-lite "^1.0.30001020" caniuse-lite "^1.0.30001036"
chalk "^2.4.2" chalk "^2.4.2"
normalize-range "^0.1.2" normalize-range "^0.1.2"
num2fraction "^1.2.2" num2fraction "^1.2.2"
postcss "^7.0.26" postcss "^7.0.27"
postcss-value-parser "^4.0.2" postcss-value-parser "^4.0.3"
aws-sdk@^2.389.0: aws-sdk@^2.389.0, aws-sdk@^2.648.0:
version "2.643.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.643.0.tgz#0b4cc49165a25c42ab0503580806d367d32ffb88"
integrity sha512-4r7VGQFqshrhXnOCVQdlatAWiK/8kmmtAtY9gbITPNpY5Is+SfIy6k/1BgrnL5H/2sYd27H+Xp8itXZoCnQeTw==
dependencies:
buffer "4.9.1"
events "1.1.1"
ieee754 "1.1.13"
jmespath "0.15.0"
querystring "0.2.0"
sax "1.2.1"
url "0.10.3"
uuid "3.3.2"
xml2js "0.4.19"
aws-sdk@^2.648.0:
version "2.648.0" version "2.648.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.648.0.tgz#6cbea887b98c3ee8316870e9eead659194e35094" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.648.0.tgz#6cbea887b98c3ee8316870e9eead659194e35094"
integrity sha512-b+PdZmCFvZBisqXEH68jO4xB30LrDHQMWrEX6MJoZaOlxPJfpOqRFUH3zsiAXF5Q2jTdjYLtS5bs3vcIwRzi3Q== integrity sha512-b+PdZmCFvZBisqXEH68jO4xB30LrDHQMWrEX6MJoZaOlxPJfpOqRFUH3zsiAXF5Q2jTdjYLtS5bs3vcIwRzi3Q==
@ -1765,13 +1740,13 @@ browserslist@^2.11.3:
caniuse-lite "^1.0.30000792" caniuse-lite "^1.0.30000792"
electron-to-chromium "^1.3.30" electron-to-chromium "^1.3.30"
browserslist@^4.8.3, browserslist@^4.9.1: browserslist@^4.11.0, browserslist@^4.8.3, browserslist@^4.9.1:
version "4.10.0" version "4.11.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad"
integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==
dependencies: dependencies:
caniuse-lite "^1.0.30001035" caniuse-lite "^1.0.30001035"
electron-to-chromium "^1.3.378" electron-to-chromium "^1.3.380"
node-releases "^1.1.52" node-releases "^1.1.52"
pkg-up "^3.1.0" pkg-up "^3.1.0"
@ -1956,10 +1931,10 @@ camelcase@^5.0.0, camelcase@^5.3.1:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036:
version "1.0.30001035" version "1.0.30001038"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff"
integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==
capture-stack-trace@^1.0.0: capture-stack-trace@^1.0.0:
version "1.0.1" version "1.0.1"
@ -2095,6 +2070,11 @@ chokidar@^3.0.0:
optionalDependencies: optionalDependencies:
fsevents "~2.1.2" fsevents "~2.1.2"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
ci-info@^1.5.0: ci-info@^1.5.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
@ -2561,6 +2541,14 @@ css-tree@1.0.0-alpha.37:
mdn-data "2.0.4" mdn-data "2.0.4"
source-map "^0.6.1" source-map "^0.6.1"
css-tree@1.0.0-alpha.39:
version "1.0.0-alpha.39"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
dependencies:
mdn-data "2.0.6"
source-map "^0.6.1"
css-what@2.1: css-what@2.1:
version "2.1.3" version "2.1.3"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
@ -2587,11 +2575,11 @@ cssesc@^3.0.0:
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
csso@^4.0.2: csso@^4.0.2:
version "4.0.2" version "4.0.3"
resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
dependencies: dependencies:
css-tree "1.0.0-alpha.37" css-tree "1.0.0-alpha.39"
currently-unhandled@^0.4.1: currently-unhandled@^0.4.1:
version "0.4.1" version "0.4.1"
@ -2644,7 +2632,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@3.X, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: debug@3.X, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.2.6:
version "3.2.6" version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@ -2833,6 +2821,11 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
detect-newline@2.X: detect-newline@2.X:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@ -3035,10 +3028,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.378: electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.380:
version "1.3.380" version "1.3.390"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz#1e1f07091b42b54bccd0ad6d3a14f2b73b60dc9d" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz#a49e67dea22e52ea8027c475dd5447b1c00b1d4e"
integrity sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw== integrity sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag==
"emoji-regex@>=6.0.0 <=6.1.1": "emoji-regex@>=6.0.0 <=6.1.1":
version "6.1.1" version "6.1.1"
@ -3153,9 +3146,9 @@ error-ex@^1.2.0, error-ex@^1.3.1:
is-arrayish "^0.2.1" is-arrayish "^0.2.1"
es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2:
version "1.17.4" version "1.17.5"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
dependencies: dependencies:
es-to-primitive "^1.2.1" es-to-primitive "^1.2.1"
function-bind "^1.1.1" function-bind "^1.1.1"
@ -3249,9 +3242,9 @@ eslint-import-resolver-node@^0.3.2:
resolve "^1.13.1" resolve "^1.13.1"
eslint-module-utils@^2.4.1: eslint-module-utils@^2.4.1:
version "2.5.2" version "2.6.0"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
dependencies: dependencies:
debug "^2.6.9" debug "^2.6.9"
pkg-dir "^2.0.0" pkg-dir "^2.0.0"
@ -3432,11 +3425,11 @@ esprima@^4.0.0:
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.0.0, esquery@^1.0.1: esquery@^1.0.0, esquery@^1.0.1:
version "1.1.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe"
integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==
dependencies: dependencies:
estraverse "^4.0.0" estraverse "^5.0.0"
esrecurse@^4.1.0: esrecurse@^4.1.0:
version "4.2.1" version "4.2.1"
@ -3445,11 +3438,16 @@ esrecurse@^4.1.0:
dependencies: dependencies:
estraverse "^4.1.0" estraverse "^4.1.0"
estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: estraverse@^4.1.0, estraverse@^4.1.1:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22"
integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==
estree-walker@^0.6.1: estree-walker@^0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
@ -4055,6 +4053,13 @@ fs-extra@3.0.1:
jsonfile "^3.0.0" jsonfile "^3.0.0"
universalify "^0.1.0" universalify "^0.1.0"
fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"
fs-mkdirp-stream@^1.0.0: fs-mkdirp-stream@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
@ -4244,9 +4249,9 @@ glob-parent@^3.1.0:
path-dirname "^1.0.0" path-dirname "^1.0.0"
glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.0" version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
dependencies: dependencies:
is-glob "^4.0.1" is-glob "^4.0.1"
@ -4951,7 +4956,7 @@ http-signature@~1.2.0:
jsprim "^1.2.2" jsprim "^1.2.2"
sshpk "^1.7.0" sshpk "^1.7.0"
iconv-lite@0.4.24, iconv-lite@^0.4.24: iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -4963,6 +4968,13 @@ ieee754@1.1.13, ieee754@^1.1.4:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
ignore-walk@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
dependencies:
minimatch "^3.0.4"
ignore@^3.3.3, ignore@^3.3.5: ignore@^3.3.3, ignore@^3.3.5:
version "3.3.10" version "3.3.10"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
@ -6389,6 +6401,11 @@ mdn-data@2.0.4:
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
mdn-data@2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
memoizee@0.4.X: memoizee@0.4.X:
version "0.4.14" version "0.4.14"
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
@ -6572,6 +6589,21 @@ minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minizlib@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"
mitt@^1.1.3: mitt@^1.1.3:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d"
@ -6586,9 +6618,9 @@ mixin-deep@^1.2.0:
is-extendable "^1.0.1" is-extendable "^1.0.1"
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.3" version "0.5.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512"
integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==
dependencies: dependencies:
minimist "^1.2.5" minimist "^1.2.5"
@ -6664,6 +6696,15 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.2.1:
version "2.3.3"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117"
integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.2: negotiator@0.6.2:
version "0.6.2" version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@ -6709,12 +6750,26 @@ node-gyp@^3.8.0:
tar "^2.0.0" tar "^2.0.0"
which "1" which "1"
node-releases@^1.1.52: node-pre-gyp@*:
version "1.1.52" version "0.14.0"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies: dependencies:
semver "^6.3.0" detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4.4.2"
node-releases@^1.1.52:
version "1.1.53"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4"
integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==
node-sass@^4.8.3: node-sass@^4.8.3:
version "4.13.1" version "4.13.1"
@ -6746,6 +6801,14 @@ node-sass@^4.8.3:
dependencies: dependencies:
abbrev "1" abbrev "1"
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -6794,6 +6857,13 @@ now-and-later@^2.0.0:
dependencies: dependencies:
once "^1.3.2" once "^1.3.2"
npm-bundled@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-conf@^1.1.0: npm-conf@^1.1.0:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
@ -6802,6 +6872,20 @@ npm-conf@^1.1.0:
config-chain "^1.1.11" config-chain "^1.1.11"
pify "^3.0.0" pify "^3.0.0"
npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-packlist@^1.1.6:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npm-prefix@^1.2.0: npm-prefix@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/npm-prefix/-/npm-prefix-1.2.0.tgz#e619455f7074ba54cc66d6d0d37dd9f1be6bcbc0" resolved "https://registry.yarnpkg.com/npm-prefix/-/npm-prefix-1.2.0.tgz#e619455f7074ba54cc66d6d0d37dd9f1be6bcbc0"
@ -6818,7 +6902,7 @@ npm-run-path@^2.0.0:
dependencies: dependencies:
path-key "^2.0.0" path-key "^2.0.0"
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@ -7069,7 +7153,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
osenv@0: osenv@0, osenv@^0.1.4:
version "0.1.5" version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@ -7414,9 +7498,9 @@ performance-now@^2.1.0:
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1:
version "2.2.1" version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
version "2.3.0" version "2.3.0"
@ -7852,9 +7936,9 @@ pseudomap@^1.0.2:
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
psl@^1.1.28: psl@^1.1.28:
version "1.7.0" version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
pump@^2.0.0: pump@^2.0.0:
version "2.0.1" version "2.0.1"
@ -7959,7 +8043,7 @@ raw-body@^2.3.2:
iconv-lite "0.4.24" iconv-lite "0.4.24"
unpipe "1.0.0" unpipe "1.0.0"
rc@^1.0.1, rc@^1.1.0, rc@^1.1.6: rc@^1.0.1, rc@^1.1.0, rc@^1.1.6, rc@^1.2.7:
version "1.2.8" version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@ -8568,7 +8652,7 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@2, rimraf@^2.5.4: rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1:
version "2.7.1" version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@ -8701,7 +8785,7 @@ sax@1.2.1:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o=
sax@>=0.6.0, sax@~1.2.4: sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@ -8762,7 +8846,7 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: semver@^6.0.0, semver@^6.1.2:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -8862,9 +8946,9 @@ shellsubstitute@^1.1.0:
integrity sha1-5PcCpQxRiw9v6YRRiQ1wWvKba3A= integrity sha1-5PcCpQxRiw9v6YRRiQ1wWvKba3A=
signal-exit@^3.0.0, signal-exit@^3.0.2: signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2" version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
slash@^1.0.0: slash@^1.0.0:
version "1.0.0" version "1.0.0"
@ -9680,6 +9764,19 @@ tar@^2.0.0:
fstream "^1.0.12" fstream "^1.0.12"
inherits "2" inherits "2"
tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.8.6"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.3"
temp-dir@^1.0.0: temp-dir@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
@ -10737,7 +10834,7 @@ yallist@^2.1.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
yallist@^3.0.2: yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
@ -10750,9 +10847,9 @@ yaml@^1.7.2:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
yargs-parser@^18.1.1: yargs-parser@^18.1.1:
version "18.1.1" version "18.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1"
integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==
dependencies: dependencies:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"