@wistia/wistia-player
Version:
An embeddable wistia-player web component and React wrapper to add responsive, lightweight, and SEO-friendly videos to your site.
1,245 lines (1,183 loc) • 762 kB
JavaScript
/******/ var __webpack_modules__ = ({
/***/ 159:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ Rb: () => (/* binding */ findScriptInDomBySrc)
/* harmony export */ });
/* unused harmony exports removeScriptsBySrc, runScript, runScripts, scriptInputsToHash */
/* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6637);
/* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(731);
/* harmony import */ var utilities_runScript_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1248);
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var findScriptInDomBySrc = function findScriptInDomBySrc(targetSrc) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var scriptTags = document.getElementsByTagName('script');
for (var i = 0; i < scriptTags.length; i++) {
var s = scriptTags[i];
var src = s.getAttribute('src') || '';
if (options.ignoreQueryParams) {
var matches = src.split('?');
var urlWithoutParams = matches[0];
src = urlWithoutParams;
}
if (!options.scriptRegex && options.ignoreProtocol) {
src = src.replace(/^https?:/, '');
targetSrc = targetSrc.replace(/^https?:/, '');
}
if (options.scriptRegex && options.scriptRegex.test(src)) {
return s;
}
if (options.testStartsWith && src.indexOf(targetSrc) === 0) {
return s;
}
if (src === targetSrc) {
return s;
}
}
return null;
};
var removeScriptsBySrc = function removeScriptsBySrc(targetSrc) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var s;
var _loop = function _loop() {
if (s) {
s.onload = s.onreadystatechange = s.onerror = null;
if (s.parentNode && typeof s.parentNode.removeChild) {
try {
s.parentNode.removeChild(s);
} catch (e) {
setTimeout(function () {
throw e;
}, 0);
}
}
}
};
while (s = findScriptInDomBySrc(targetSrc, options)) {
_loop();
}
};
// fire and forget.
// run a script and immediately remove it from the DOM.
var runScript = function runScript(src) {
var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8000;
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (timeout == null) {
timeout = 8000;
}
if (options == null) {
options = {};
}
var s;
var alreadyExists;
return new Promise(function (resolve) {
if (options.once === true && (s = findScriptInDomBySrc(src))) {
alreadyExists = true;
}
if (options.once && alreadyExists) {
if (!s.readyState || /loaded|complete/.test(s.readyState)) {
setTimeout(function () {
resolve();
}, 1);
}
} else {
runScriptWithPromise(src, timeout).then(resolve).catch(function (msg) {
resolve(msg);
setTimeout(function () {
console.error(msg);
}, 1);
});
}
});
};
var runScripts = function runScripts() {
// support either an array of scripts or a single script as a string
var scripts;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args[0] instanceof Array) {
scripts = args[0];
} else {
scripts = args;
}
scripts = scriptInputsToHash(scripts);
var asyncScripts = [];
var syncScripts = [];
var scriptPromises = [];
scripts.forEach(function (s) {
var script = _objectSpread({}, s);
var p = new Promise(function (resolve) {
script.resolve = resolve;
});
script.promise = p;
scriptPromises.push(script.promise);
if (s.async) {
asyncScripts.push(script);
} else {
syncScripts.push(script);
}
});
syncScripts.reduce(function (prev, script) {
if (script.fn) {
try {
script.fn();
} catch (e) {
wlog.error(e);
} finally {
script.resolve();
}
} else if (script.src) {
runScript(script.src, null, script).then(script.resolve);
}
return prev.then(script.promise);
}, Promise.resolve());
setTimeout(function () {
asyncScripts.forEach(function (script) {
if (script.fn) {
try {
script.fn();
} catch (e) {
wlog.error(e);
} finally {
script.resolve();
}
} else if (script.src) {
runScript(script.src, null, script).then(script.resolve);
}
});
}, 1);
return Promise.all(scriptPromises);
};
var scriptInputsToHash = function scriptInputsToHash(scripts) {
var result = [];
for (var i = 0; i < scripts.length; i++) {
var script = scripts[i];
if (typeof script === 'string') {
result.push({
src: script,
async: false
});
} else if (isObject(script)) {
result.push(script);
} else {
result.push({
fn: script,
async: false
});
}
}
return result;
};
/***/ }),
/***/ 267:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ O: () => (/* binding */ hasPerformanceMeasureSupport)
/* harmony export */ });
var hasPerformanceMeasureSupport = function hasPerformanceMeasureSupport() {
var _window = window,
performance = _window.performance;
// eslint-disable-next-line @typescript-eslint/unbound-method
return Boolean(performance) && Boolean(performance.measure);
};
/***/ }),
/***/ 438:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ $F: () => (/* binding */ choosePlayer),
/* harmony export */ gC: () => (/* binding */ buildContext)
/* harmony export */ });
/* unused harmony exports HLS_ENGINE_PATH, NATIVE_HLS_ENGINE_PATH, SIMPLE_AUDIO_ENGINE_PATH, MANUAL_QUALITY_ENGINE_PATH, SPHERICAL_VIDEO_ENGINE_PATH, PLUGIN_CONFIGS, bestPlayer, bestUsableEngine, bestUsableEngineClass, canPlayInline, canUsePlayer, determinePlayerPreferenceFromInput, doesBrowserSupportHlsTools, enginesToLoad, getDefaultContext, hasAssetsForPlayer, hasEnoughReadyMp4Assets, hasSupportedHlsAssets, isBrowserInNativeAndroid, isBrowserOldChrome, isHlsEnabled, isMobile, isNotPlayable, isPasswordProtected, isSupportedPlayer, isValidPlayer, logWarnings, playerPlugins, report, shouldServeHls, supportedPlayers, usablePlayers, urlHasBeenTamperedWith, xhrHasBeenTamperedWith */
/* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(731);
/* harmony import */ var utilities_detect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7231);
/* harmony import */ var utilities_metrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(655);
/* harmony import */ var utilities_legacyLocalstorage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3695);
/* harmony import */ var utilities_root_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8176);
/* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6637);
/* harmony import */ var _assets_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7209);
/* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5509);
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var wlog = utilities_wlog_js__WEBPACK_IMPORTED_MODULE_5__/* .wlog */ .ct.getPrefixedFunctions('judy');
var AUTO = 'auto';
var CAROUSEL_HARD_WALL = 'carouselHardWall';
var EXTERNAL = 'external';
var HLS_VIDEO = 'hlsVideo';
var HTML5 = 'html5';
var MANUAL_QUALITY_VIDEO = 'manualQualityVideo';
var NATIVE_HLS_VIDEO = 'nativeHlsVideo';
var NOT_PLAYABLE = 'notplayable';
var PASSWORD_PROTECTED = 'passwordprotected';
var SIMPLE_HTML5 = 'simplehtml5';
var VULCAN_V2 = 'vulcan-v2';
var SPHERICAL_VIDEO = 'sphericalVideo';
var PLAYERS = [VULCAN_V2, HTML5, SIMPLE_HTML5, EXTERNAL, NOT_PLAYABLE, PASSWORD_PROTECTED];
var HLS_ENGINE_PATH = 'engines/hls_video.js';
var NATIVE_HLS_ENGINE_PATH = 'engines/native_hls_video.js';
var SIMPLE_AUDIO_ENGINE_PATH = 'engines/simple_audio.js';
var MANUAL_QUALITY_ENGINE_PATH = 'engines/manual_quality_video.js';
var SPHERICAL_VIDEO_ENGINE_PATH = 'engines/spherical_video.js';
var PLUGIN_CONFIGS = {
notPlayableVideo: {
on: true,
initBeforeHasData: true,
async: false,
loadWeight: -1
},
vulcanV2Player: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: -1
},
hlsVideo: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: 0
},
nativeHlsVideo: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: 0
},
passwordProtectedVideo: {
on: true,
initBeforeHasData: true,
async: false,
loadWeight: -1
},
externalPlayer: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: -1
},
html5Player: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: -1
},
playlist: {
on: true,
initBeforeHasData: false,
async: false,
loadWeight: -1
}
};
var bestPlayer = function bestPlayer(context, mediaData, embedOptions) {
var detect = context.detect,
logger = context.logger;
var isSpherical = isSphericalVideo({
mediaData: mediaData,
options: embedOptions
}, detect);
if (detect.oldandroid) {
logger.info('external on old android');
return EXTERNAL;
}
if (canUsePlayer(context, VULCAN_V2, mediaData)) {
logger.info('default, ret', VULCAN_V2);
return VULCAN_V2;
}
if (mediaData.mediaType === 'Audio' || mediaData.mediaType === 'LiveStream') {
// audio and lives are only supported with vulcan_v2
return VULCAN_V2;
}
if (canUsePlayer(context, HTML5, mediaData)) {
logger.info('default, ret', HTML5);
return HTML5;
}
logger.info('nothing left, use', EXTERNAL);
// Everything supports external, but nobody likes it. It's just an image
// and a link to an mp4 file.
return EXTERNAL;
};
var bestUsableEngine = function bestUsableEngine(context, mediaData) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var detect = context.detect,
logger = context.logger;
logger.info('bestUsableEngineClass');
var allowHls = shouldServeHls(context, mediaData, options);
var isSpherical = isSphericalVideo({
mediaData: mediaData,
options: options
}, detect);
if (options.engine) {
return options.engine;
}
if (isSpherical) {
logger.info(SPHERICAL_VIDEO);
return SPHERICAL_VIDEO_ENGINE_PATH;
}
if (mediaData.mediaType === 'Audio') {
return SIMPLE_AUDIO_ENGINE_PATH;
}
// If managedMediaSource is false or restricted by same origin (often iframes), we need to use the native hls video engine
// Otherwise, we can use the hls.js in Safari
var isApple = detect.safari || detect.ios.version > 0;
var allowsSameOrigin = window.origin !== 'null';
var restrictedBySameOrigin = isApple && !allowsSameOrigin;
if (allowHls && detect.nativeHls && (detect.managedMediaSource === false || restrictedBySameOrigin)) {
logger.info(NATIVE_HLS_VIDEO);
return NATIVE_HLS_ENGINE_PATH;
}
if (allowHls) {
logger.info(HLS_VIDEO);
return HLS_ENGINE_PATH;
}
logger.info(MANUAL_QUALITY_VIDEO);
return MANUAL_QUALITY_ENGINE_PATH;
};
// Given a media data blob and options--and assuming all engine scripts have
// been loaded--return the engine class that we should initialize.
var bestUsableEngineClass = function bestUsableEngineClass(context, mediaData) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var detect = context.detect,
logger = context.logger;
logger.info('bestUsableEngineClass');
var allowHls = shouldServeHls(context, mediaData, options);
var engines = Wistia.engines || {};
if (mediaData.mediaType === 'Audio') {
return engines.SimpleAudio;
}
if (allowHls && detect.nativeHls && engines.NativeHlsVideo) {
logger.info(NATIVE_HLS_VIDEO);
return engines.NativeHlsVideo;
}
if (allowHls && engines.HlsVideo) {
logger.info(HLS_VIDEO);
return engines.HlsVideo;
}
logger.info(MANUAL_QUALITY_VIDEO);
return engines.ManualQualityVideo;
};
var buildContext = function buildContext() {
var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var pageUrl = contextUrl(overrides);
return _objectSpread(_objectSpread(_objectSpread({}, getDefaultContext()), overrides), {}, {
pageUrl: pageUrl
});
};
var canPlayInline = function canPlayInline(context) {
var detect = context.detect;
return detect.android || detect.ios.version >= 10;
};
var canUsePlayer = function canUsePlayer(context, player, mediaData) {
return isSupportedPlayer(context, player) && hasAssetsForPlayer(context, player, mediaData);
};
var choosePlayer = function choosePlayer(context, mediaData, embedOptions) {
var detect = context.detect;
var logger = context.logger;
var playerForce = embedOptions.playerForce;
logger.info('choosePlayer input', mediaData.hashedId);
// This can be falsey if there is no specific player preference. Users may
// also pass in "auto" to be explicit, which means there should be no
// preference.
var playerPreference = determinePlayerPreferenceFromInput(context, mediaData, embedOptions);
// Loudly error but don't die if given invalid input.
if (playerForce && !isValidPlayer(context, playerForce)) {
logger.error("Invalid playerForce option: \"".concat(playerForce, "\", ignoring"));
playerForce = null;
}
if (playerPreference && playerPreference !== AUTO && !isValidPlayer(context, playerPreference)) {
logger.error("Invalid playerPreference option: \"".concat(playerPreference, "\", ignoring"));
playerPreference = AUTO;
}
logger.info('playerPreference is', playerPreference);
if (playerForce) {
// This is really only used when testing.
logger.info('"playerForce" used, return', playerForce);
return playerForce;
}
// A carousel can contain a password-protected media which should be unlocked
// when the carousel is unlocked, so this check should always
// come before the check to see if a media is password-protected
if (mediaData.carouselHardWall) {
logger.info('return', CAROUSEL_HARD_WALL);
return CAROUSEL_HARD_WALL;
}
if (isPasswordProtected(context, embedOptions)) {
// the video is marked as being password protected. it's expected that the
// password protected player, upon a successful password entry, changes an
// option and is replaced such that isPasswordProtected() returns false.
logger.info('return', PASSWORD_PROTECTED);
return PASSWORD_PROTECTED;
}
if (isNotPlayable(context, mediaData, embedOptions)) {
// 1. We can generate embed codes before a video can actually be played. If we
// can't field any kind of player, we want to embed NOT_PLAYABLE instead,
// which shows upload and encoding progress, then re-embeds as a "real"
// player once it reaches 100%.
// 2. DRM-lite customers must include their `authorization` credentials as embedOptions. If we know
// a media is "protected", but there are no authorization credentials for the embed, we can build
// directly into the NotPlayablePlayer state.
// 3. DRM-lite customers that either do not have HLS enabled or cannot use HLS
// will reach a NOT_PLAYABLE state.
logger.info('return', NOT_PLAYABLE);
return NOT_PLAYABLE;
}
// DRM-lite medias are marked as "protected". And those medias must be played back using our
// VULCAN_V2 player.
if (mediaData.protected) {
return VULCAN_V2;
}
if (playerPreference !== AUTO && canUsePlayer(context, playerPreference, mediaData)) {
var isSpherical = isSphericalVideo({
mediaData: mediaData,
options: embedOptions
}, detect);
if (playerPreference !== VULCAN_V2 && isSpherical) {
logger.info("this player doesn't support spherical, return", VULCAN_V2);
return VULCAN_V2;
}
// Hooray! The customer has chosen a preference that we can actually use.
// Let's use it.
logger.info('"playerPreference" used, return', playerPreference);
return playerPreference;
}
// Okay, we are not being compelled to use any particular player. Choose
// the best one that we can support.
logger.info('choosing player with no preference');
return bestPlayer(context, mediaData, embedOptions);
};
// return the url to use for building up the Judy context.
var contextUrl = function contextUrl() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (opts.pageUrl) {
return opts.pageUrl;
}
if (Object(window.FreshUrl).originalUrl) {
return window.FreshUrl.originalUrl;
}
if (window.top === window.self) {
return location.href || '';
}
return document.referrer || '';
};
var determinePlayerPreferenceFromInput = function determinePlayerPreferenceFromInput(context, mediaData, embedOptions) {
// platformPreference is a legacy option. It used to have difference
// semantics as playerPreference, but let's treat it the same now.
var playerPreference = embedOptions.playerPreference || embedOptions.platformPreference;
if (playerPreference && playerPreference !== AUTO) {
if (playerPreference === HTML5) {
if (isMobile(context)) {
return HTML5;
}
return VULCAN_V2;
}
if (playerPreference === SIMPLE_HTML5) {
// Because "html5" is an overloaded term on desktop, we add this other one
// so we can more easily test the simple/mobile html5 player.
return HTML5;
}
return playerPreference;
}
// no preference was specified
return AUTO;
};
// the browser can support hlsjs or native HLS
var doesBrowserSupportHlsTools = function doesBrowserSupportHlsTools(detect) {
var hasPromise = Boolean(window.Promise);
return (detect.mediaSource || detect.nativeHls) && hasPromise;
};
// Given a media data blob and options, return _all_ engines and sub-engines
// that will need to be loaded. This is how we determine which scripts to load.
var enginesToLoad = function enginesToLoad(context, mediaData) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var detect = context.detect,
logger = context.logger;
var engineNames = [];
logger.info('enginesToLoad');
var allowHls = shouldServeHls(context, mediaData, options);
if (allowHls && detect.nativeHls) {
logger.info(NATIVE_HLS_VIDEO);
engineNames.push(NATIVE_HLS_VIDEO);
} else if (allowHls) {
logger.info(HLS_VIDEO);
engineNames.push(HLS_VIDEO);
} else {
logger.info(MANUAL_QUALITY_VIDEO);
engineNames.push(MANUAL_QUALITY_VIDEO);
}
var isSpherical = isSphericalVideo({
mediaData: mediaData,
options: options
}, detect);
if (isSpherical) {
engineNames.push(SPHERICAL_VIDEO);
logger.info(SPHERICAL_VIDEO);
}
// Make sure engine names are unique in this array.
var tmpHash = {};
engineNames.forEach(function (engineName) {
tmpHash[engineName] = true;
});
var result = [];
for (var engineName in tmpHash) {
result.push(engineName);
}
return result;
};
var cachedDefaultContext;
var getDefaultContext = function getDefaultContext() {
if (cachedDefaultContext) {
return cachedDefaultContext;
}
cachedDefaultContext = {
detect: (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .clone */ .o8)((0,utilities_detect_js__WEBPACK_IMPORTED_MODULE_1__/* .cachedDetect */ .o1)()),
inIframe: top !== self,
location: window.location,
logger: wlog,
pageUrl: location.href,
silenceGlobalWarnings: utilities_root_js__WEBPACK_IMPORTED_MODULE_4__/* .root */ .z.wistiaSilenceGlobalWarnings,
userAgent: navigator.userAgent
};
return cachedDefaultContext;
};
var getPluginConfig = function getPluginConfig(context, pluginName) {
var result = {};
result[pluginName] = PLUGIN_CONFIGS[pluginName];
return result;
};
var canUseInstantHls = function canUseInstantHls(context, mediaData) {
var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return embedOptions.instantHls !== false && mediaData.instantHlsAssetsReady && shouldServeHls(context, mediaData, embedOptions);
};
var canUseOriginalFilePlayback = function canUseOriginalFilePlayback(context, mediaData) {
var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return mediaData.originalIsEligibleForDirectPlayback && shouldServeHls(context, mediaData, embedOptions);
};
var hasAssetsForPlayer = function hasAssetsForPlayer(context, player, mediaData) {
if (!isValidPlayer(context, player)) {
return false;
}
if (player === NOT_PLAYABLE || player === PASSWORD_PROTECTED || player === CAROUSEL_HARD_WALL) {
// No special asset requirements for these.
return true;
}
var assets = mediaData.assets;
if (player === VULCAN_V2) {
return canUseInstantHls(context, mediaData) || canUseOriginalFilePlayback(context, mediaData) || hasReadyVideoAssets(assets) || hasReadyAudioAssets(assets);
}
if (player === HTML5) {
return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0;
}
if (player === EXTERNAL) {
return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0;
}
throw new Error("Unhandled player type '".concat(player, "'"));
};
var hasReadyVideoAssets = function hasReadyVideoAssets(assets) {
return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length > 0 || (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicM3u8s */ .x4)(assets).length > 0;
};
var hasReadyAudioAssets = function hasReadyAudioAssets(assets) {
return (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp3s */ .o2)(assets).length > 0;
};
var hasEnoughReadyMp4Assets = function hasEnoughReadyMp4Assets(assets) {
var mp4Assets = (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .filter */ .pb)(assets, {
container: 'mp4',
metadata: function metadata(m) {
return m && m.max_bitrate;
},
public: true,
sortBy: 'width desc',
status: _assets_js__WEBPACK_IMPORTED_MODULE_6__/* .READY */ .yE,
type: /\b(?!captioned_video)\S+/ // no burned in captions
});
// ensure that we have at least one asset at or above 400 width. This prevents
// using HLS from using too low quality an asset, say in the scenario where
// the other assets are still being processed.
var hasAssetWithBitRateAndSize = Boolean(mp4Assets[0] && mp4Assets[0].width >= 400);
return hasAssetWithBitRateAndSize;
};
var hasSupportedHlsAssets = function hasSupportedHlsAssets(mediaData) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (options.instantHls !== false && mediaData.instantHlsAssetsReady) {
return true;
}
if (mediaData.originalIsEligibleForDirectPlayback) {
return true;
}
var hasAssets = hasEnoughReadyMp4Assets(mediaData.assets);
if (!hasAssets) {
(0,utilities_metrics_js__WEBPACK_IMPORTED_MODULE_2__/* .count */ .U9)('player/originV2/media-has-no-metadata', 1, {
hashedId: mediaData.hashedId
});
}
return hasAssets;
};
var hlsOverrideValue = function hlsOverrideValue(_ref, embedOptions) {
var pageUrl = _ref.pageUrl;
var paramVal = hlsQueryParamValue(pageUrl);
if (paramVal != null) {
return paramVal;
}
var localStorageVal = (0,utilities_legacyLocalstorage_js__WEBPACK_IMPORTED_MODULE_3__/* .setOrGet */ .Qy)('forceHls');
if (localStorageVal != null) {
return localStorageVal;
}
return embedOptions.hls;
};
var hlsQueryParamValue = function hlsQueryParamValue(pageUrl) {
var match = pageUrl && pageUrl.match && pageUrl.match(/[&?]whls=([^&]+)/);
var val = match && match[1];
if (val != null) {
return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .cast */ .wg)(val);
}
return null;
};
// Chromecast doesn't work with hlsjs because it only understands a src
// that can be referenced externally. And playsinline=false or
// nativeMode=true is our signal to use something close to a native player.
var isBrowserInNativeAndroid = function isBrowserInNativeAndroid(detect, embedOptions) {
return detect.android && (embedOptions.playsinline === false || embedOptions.nativeMode === true);
};
// chrome 49 and earlier (the last supported version on Win XP/Vista) does
// not support MSE well enough for hls.js.
var isBrowserOldChrome = function isBrowserOldChrome(detect) {
return detect.chrome && parseInt(detect.chrome.version, 10) < 50;
};
var isHlsEnabled = function isHlsEnabled(context, mediaData, embedOptions) {
// always prefer the hls override value if it is present, regardless of the
// hls_enabled value
var overrideValue = hlsOverrideValue(context, embedOptions);
if (overrideValue === true || overrideValue === false) {
return overrideValue;
}
if (mediaData.hls_enabled === false) {
return false;
}
return true;
};
var isMobile = function isMobile(_ref2) {
var detect = _ref2.detect;
return detect.iphone || detect.ipad || detect.android;
};
var isNotPlayable = function isNotPlayable(context, mediaData) {
var _embedOptions$authori;
var embedOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var assets = mediaData.assets;
if (!mediaData.protected && (canUseInstantHls(context, mediaData, embedOptions) || canUseOriginalFilePlayback(context, mediaData, embedOptions))) {
return false;
}
var assetsArentReady = mediaData.type === 'Audio' ? (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp3s */ .o2)(assets).length == 0 : (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicMp4s */ .Fi)(assets).length == 0;
// LiveStreams won't have ready assets, but that does not mean we're in an
// unplayable position.
if (mediaData.mediaType === 'LiveStream') {
return false;
}
// DRM-lite authorization check!
// For DRM-lite, customers must include their `authorization` credentials as embedOptions. If we know
// a media is "protected", but there are no authorization credentials for the embed, we can build
// directly into the NotPlayablePlayer state.
if (mediaData.protected && !((_embedOptions$authori = embedOptions.authorization) !== null && _embedOptions$authori !== void 0 && _embedOptions$authori.jwt)) {
embedOptions.notPlayableOptions = {
fadeIn: false,
message: 'This video is set to private.',
shouldRefresh: false
};
return true;
}
var allowHls = shouldServeHls(context, mediaData, embedOptions);
if (mediaData.protected && allowHls === false) {
embedOptions.notPlayableOptions = {
fadeIn: false,
message: 'This video is not playable.',
shouldRefresh: false
};
return true;
}
return assets.length === 0 || assets.length === 1 && assets[0].type === 'original' || assetsArentReady || (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .nonfailedPublicOver400 */ .aF)(assets).length > 0 && (0,_assets_js__WEBPACK_IMPORTED_MODULE_6__/* .readyPublicOver400 */ .n9)(assets).length === 0;
};
var isPasswordProtected = function isPasswordProtected(context, embedOptions) {
var pluginOpts = (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .getDeep */ .b$)(embedOptions, 'plugin.passwordProtectedVideo');
return pluginOpts != null && pluginOpts.on !== false;
};
var isSphericalVideo = function isSphericalVideo() {
var _mediaInfo$mediaData, _mediaInfo$opts;
var mediaInfo = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (mediaInfo.options.overrideSpherical) {
return false;
}
var mediaDataSpherical = String((_mediaInfo$mediaData = mediaInfo.mediaData) === null || _mediaInfo$mediaData === void 0 ? void 0 : _mediaInfo$mediaData.spherical);
var optsSpherical = String((_mediaInfo$opts = mediaInfo.opts) === null || _mediaInfo$opts === void 0 ? void 0 : _mediaInfo$opts.spherical);
return mediaDataSpherical === 'true' || optsSpherical === 'true';
};
var isSupportedPlayer = function isSupportedPlayer(context, player) {
if (!isValidPlayer(context, player)) {
return false;
}
return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .indexOf */ .qh)(supportedPlayers(context), player) >= 0;
};
var isValidPlayer = function isValidPlayer(context, player) {
return (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_0__/* .indexOf */ .qh)(PLAYERS, player) >= 0;
};
var logWarnings = function logWarnings(context) {
var detect = context.detect,
userAgent = context.userAgent,
logger = context.logger,
silenceGlobalWarnings = context.silenceGlobalWarnings;
if (silenceGlobalWarnings) {
// Customers can set window.wistiaSilenceGlobalWarnings = true, and that
// will be included in the default judy context.
return;
}
var isHeadless = /phantomjs/i.test(userAgent);
if (xhrHasBeenTamperedWith()) {
if (!isHeadless) {
logger.error('The XMLHttpRequest constructor has been tampered with. Because this affects CORS/Range XHR requests, HLS playback has been disabled. To enable HLS playback and other important features, please remove code that changes the definition of window.XMLHttpRequest.');
}
}
if (urlHasBeenTamperedWith()) {
if (detect.mediaSource && !isHeadless) {
logger.error('window.URL.createObjectURL has been tampered with. Because this affects use of Media Source Extensions, HLS playback has been disabled. window.URL is a browser API that should not be clobbered. Its current value is:', window.URL);
}
}
};
var playerPlugins = function playerPlugins(context, player, mediaData, embedOptions) {
var logger = context.logger;
var plugins = {};
logger.info('playerPlugins input', player, mediaData.hashedId, mediaData, embedOptions);
if (player === NOT_PLAYABLE) {
merge(plugins, getPluginConfig(context, 'notPlayableVideo'));
} else if (player === PASSWORD_PROTECTED) {
merge(plugins, getPluginConfig(context, 'passwordProtectedVideo'));
} else if (player === HTML5) {
merge(plugins, getPluginConfig(context, 'html5Player'));
} else if (player === EXTERNAL) {
merge(plugins, getPluginConfig(context, 'externalPlayer'));
} else if (player === VULCAN_V2) {
merge(plugins, getPluginConfig(context, 'vulcanV2Player'));
}
var pluginNames = [];
for (var k in plugins) {
pluginNames.push(k);
}
logger.info.apply(logger, ['playerPlugins output'].concat(pluginNames, [plugins]));
return plugins;
};
var report = function report(context, mediaData, embedOptions) {
return {
bestPlayer: bestPlayer(context, mediaData, embedOptions),
playerPreferenceFromInput: determinePlayerPreferenceFromInput(context, mediaData, embedOptions),
supportedPlayers: supportedPlayers(context),
usablePlayers: usablePlayers(context, mediaData.assets)
};
};
var shouldServeHls = function shouldServeHls(context, mediaData, embedOptions) {
// start by forcing HLS when the type is livestream, but later
// refactor things such that NotPlayablePlayer is used if we can't handle
// live
if (mediaData.type === 'LiveStream') {
return true;
}
var detect = context.detect;
return doesBrowserSupportHlsTools(detect) && !isBrowserOldChrome(detect) && !isBrowserInNativeAndroid(detect, embedOptions) &&
// the account has hls enabled or explicitly trying to force
isHlsEnabled(context, mediaData, embedOptions) &&
// the media actually has desktop assets compatable with the delivery system
hasSupportedHlsAssets(mediaData) && (
// Some sites completely replace the XMLHttpRequest constructor with one
// that doesn't work with hls.js. If we detect that, don't use HLS
// (...unless we explicitly say to try it.)
!xhrHasBeenTamperedWith(context) && !urlHasBeenTamperedWith(context) || hlsOverrideValue(context, embedOptions));
};
var supportedPlayers = function supportedPlayers(context) {
var detect = context.detect;
var result = [NOT_PLAYABLE, PASSWORD_PROTECTED, EXTERNAL, CAROUSEL_HARD_WALL];
if (detect.vulcanV2Support) {
result.push(VULCAN_V2);
}
if (detect.video.h264) {
result.push(HTML5);
}
return result;
};
var usablePlayers = function usablePlayers(context, mediaData) {
var result = [];
var candidates = supportedPlayers(context);
for (var i = 0; i < candidates.length; i++) {
var player = candidates[i];
if (canUsePlayer(context, player, mediaData)) {
result.push(player);
}
}
return result;
};
// `URL` is a built-in type, but a lot sites accidentally clobber it like
// `URL = location.href`. hls.js uses it though.
var urlHasBeenTamperedWith = function urlHasBeenTamperedWith() {
return typeof (window.URL && window.URL.createObjectURL) !== 'function';
};
// `XMLHttpRequest.prototype.constructor.toString()` should be of this form if it's untampered with
var XMLHTTPREQUEST_CONSTRUCTOR_RE = /\s*function\s+XMLHttpRequest\(\)\s*{\s*\[native code\]\s*}\s*/m;
// Oddly, safari 9.x seems to display this in the [object ...] form.
var XMLHTTPREQUEST_CONSTRUCTOR_IN_SAFARI_9_RE = /\[object XMLHttpRequestConstructor\]/m;
var xhrHasBeenTamperedWith = function xhrHasBeenTamperedWith() {
if (XMLHttpRequest && XMLHttpRequest.prototype && XMLHttpRequest.prototype.constructor) {
var constructorString = XMLHttpRequest.prototype.constructor.toString();
return !(XMLHTTPREQUEST_CONSTRUCTOR_RE.test(constructorString) || XMLHTTPREQUEST_CONSTRUCTOR_IN_SAFARI_9_RE.test(constructorString));
}
return true;
};
/***/ }),
/***/ 541:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ z: () => (/* binding */ maybeStartWistiaQueue)
/* harmony export */ });
/* unused harmony export stopWistiaQueue */
/* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5509);
var QUEUE_INTERVAL = 500;
var wistiaQueue = null;
/**
* Periodically checks the Wistia queue and executes the functions in it
* @returns {void}
*/
var maybeStartWistiaQueue = function maybeStartWistiaQueue() {
if (wistiaQueue) {
return;
}
wistiaQueue = setInterval(function () {
var queue = window._wq;
if (!queue || queue.length === 0) {
return;
}
queue.slice(0).forEach(function (item) {
if (typeof item === 'function') {
item(_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__/* .Wistia */ .s);
queue.splice(queue.indexOf(item), 1);
} else if (!_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_0__/* .Wistia */ .s.flushInitQueue) {
queue.splice(queue.indexOf(item), 1);
// eslint-disable-next-line no-console
console.warn("<wistia-player> elements must be configured via window.wistiaOptions instead of window._wq. Config not applied", item);
}
});
}, QUEUE_INTERVAL);
};
/**
* Stops the Wistia queue
* @returns {void}
*/
var stopWistiaQueue = function stopWistiaQueue() {
if (wistiaQueue) {
clearInterval(wistiaQueue);
wistiaQueue = null;
}
};
/***/ }),
/***/ 655:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ U9: () => (/* binding */ count)
/* harmony export */ });
/* unused harmony exports send, msend, sample */
/* harmony import */ var utilities_timeout_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3737);
/* harmony import */ var utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6637);
/* harmony import */ var utilities_obj_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(731);
/* harmony import */ var utilities_elem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7715);
/* harmony import */ var utilities_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2671);
/* harmony import */ var utilities_hosts_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5857);
/* harmony import */ var utilities_trackingConsentApi_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4755);
/* harmony import */ var _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5509);
var _this = undefined;
var W = (/* unused pure expression or super */ null && (Wistia));
if (_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache == null) {
_wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache = {};
}
var METRICS_CACHE = _wistia_namespace_ts__WEBPACK_IMPORTED_MODULE_7__/* .Wistia */ .s._metricsCache;
var send = function send(type, key, val) {
var extraData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
try {
if (METRICS_CACHE.toMput == null) {
METRICS_CACHE.toMput = [];
}
if (METRICS_CACHE.requestId == null) {
METRICS_CACHE.requestId = 0;
}
var messageObj = (0,utilities_obj_js__WEBPACK_IMPORTED_MODULE_2__/* .merge */ .h1)({
type: type,
key: key,
value: val != null ? val : null,
request_id: METRICS_CACHE.requestId
}, extraData);
var serialized = JSON.stringify(messageObj);
utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__/* .wlog */ .ct.debug('send metrics', serialized);
METRICS_CACHE.toMput.push(serialized);
(0,utilities_timeout_utils_js__WEBPACK_IMPORTED_MODULE_0__/* .doTimeout */ .L)('metrics.debounce', function () {
(0,utilities_elem_js__WEBPACK_IMPORTED_MODULE_3__/* .pageLoaded */ .Rx)(function () {
msend.apply(_this, METRICS_CACHE.toMput);
METRICS_CACHE.toMput = [];
METRICS_CACHE.requestId += 1;
});
}, 500);
} catch (e) {
utilities_wlog_js__WEBPACK_IMPORTED_MODULE_1__/* .wlog */ .ct.error(e);
}
};
var msend = function msend() {
if (!(0,utilities_trackingConsentApi_js__WEBPACK_IMPORTED_MODULE_6__/* .isVisitorTrackingEnabled */ .D5)()) {
return;
}
var url = "".concat((0,utilities_url_js__WEBPACK_IMPORTED_MODULE_4__/* .proto */ .ff)(), "//").concat((0,utilities_hosts_js__WEBPACK_IMPORTED_MODULE_5__/* .metricsHost */ .Qz)(), "/mput?topic=metrics");
for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
messages[_key] = arguments[_key];
}
return fetch(url, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: messages.join('\n')
}).then(function (response) {
if (!response.ok) {
// If fetch returns a response with an HTTP error code,
// print an error in the console
console.error(response);
}
}).catch(function (reason) {
// If fetch fails (such as when this URL is blocked by an ad blocking extension),
// print an error in the console
console.error(reason);
});
};
var count = function count(key) {
var val = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var extraData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return send('count', key, val, extraData);
};
var sample = function sample(key, val, extraData) {
return send('sample', key, val, extraData);
};
/***/ }),
/***/ 731:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ Cs: () => (/* binding */ eachLeaf),
/* harmony export */ G0: () => (/* binding */ unsetDeep),
/* harmony export */ Im: () => (/* binding */ isEmpty),
/* harmony export */ Lt: () => (/* binding */ select),
/* harmony export */ b$: () => (/* binding */ getDeep),
/* harmony export */ cy: () => (/* binding */ isArray),
/* harmony export */ di: () => (/* binding */ sort),
/* harmony export */ h1: () => (/* binding */ merge),
/* harmony export */ iu: () => (/* binding */ except),
/* harmony export */ j6: () => (/* binding */ only),
/* harmony export */ kp: () => (/* reexport safe */ utilities_assign_js__WEBPACK_IMPORTED_MODULE_0__.k),
/* harmony export */ mA: () => (/* binding */ setAndPreserveUndefined),
/* harmony export */ o8: () => (/* binding */ clone),
/* harmony export */ qh: () => (/* binding */ indexOf),
/* harmony export */ vd: () => (/* binding */ setDeep),
/* harmony export */ wg: () => (/* binding */ cast)
/* harmony export */ });
/* unused harmony exports mergeOne, identityFunc, legacyShouldDeleteFromMerge, exists, castDeep, filter, values, isObject, isFunction, isRegExp, isBasicType, isSubsetDeep, equalsDeep, eachDeep, pick, keys */
/* harmony import */ var utilities_assign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9025);
var _this = (/* unused pure expression or super */ null && (undefined));
var _objectHasOwn = function (object, property) {
if (typeof object === 'undefined' || object === null) {
throw new TypeError('Cannot convert undefined or null to object');
}
return Object.prototype.hasOwnProperty.call(Object(object), property);
};
// Old trick to clone arrays, i.e. `aps.call(array)`.
var aps = Array.prototype.slice;
var merge = function merge(obj1) {
if ((arguments.length <= 1 ? 0 : arguments.length - 1) === 0) {
return obj1;
}
for (var i = 0; i < (arguments.length <= 1 ? 0 : arguments.length - 1); i++) {
_mergeOne(obj1, i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1]);
}
return obj1;
};
// Recursively merge the leaf values of obj2 into obj1. obj1 is modified
// in-place. Accepts objects or arrays. Always returns obj1.
//
// By default, we do not transform any merged values.
//
// We also use a non-ideal legacy strategy when merging null/undefined
// values from obj2: they will _delete_ corresponding keys in obj1. The more
// correct solution seems like it would be to _never_ delete from obj1, or
// at least to only delete `undefined` values, but maybe not null. We _may_
// be able to just make this change, but let's do one thing at a time.
var _mergeOne = function mergeOne(obj1, obj2) {
var transformerFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : identityFunc;
var shouldDeleteFn = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : legacyShouldDeleteFromMerge;
if (isArray(obj2)) {
if (!isArray(obj1)) {
obj1 = [];
}
for (var i = 0; i < obj2.length; i++) {
var v = obj2[i];
// note that setting an index of an array will naturally increase the
// length of the array. Array#push() is not necessary.
if (obj1[i] == null && v != null) {
if (isArray(v)) {
obj1[i] = [];
} else if (isObject(v)) {
obj1[i] = {};
}
}
var result = _mergeOne(obj1[i], v, transformerFn);
if (shouldDeleteFn(obj2, i, result)) {
delete obj1[i];
} else {
obj1[i] = result;
}
}
return transformerFn(obj1);
}
if (isObject(obj2)) {
for (var k in obj2) {
if (_objectHasOwn(obj2, k) && (_objectHasOwn(obj1, k) || obj1[k] == null)) {
var _v = obj2[k];
if (isArray(_v)) {
if (!isArray(obj1[k])) {
obj1[k] = [];
}
_mergeOne(obj1[k], _v, transformerFn);
obj1[k] = transformerFn(obj1[k]);
} else if (isObject(_v)) {
if (!isObject(obj1[k])) {
obj1[k] = {};
}
_mergeOne(obj1[k], _v, transformerFn);
obj1[k] = transformerFn(obj1[k]);
} else if (obj1 == null) {
obj1 = {};
if (!shouldDeleteFn(obj2, k, _v)) {
obj1[k] = transformerFn(_v);
}
} else if (shouldDeleteFn(obj2, k, _v)) {
delete obj1[k];
} else {
obj1[k] = transformerFn(_v);
}
}
}
return transformerFn(obj1);
}
// obj2 is not an object that can be cloned. Since we may recurse down
// to this level, we should just return obj2, since it will overwrite
// obj1.
return transformerFn(obj2);
};
var identityFunc = function identityFunc(v) {
return v;
};
// When merging, delete key from obj1 if the value from obj2 is null or
// undefined.
var legacyShouldDeleteFromMerge = function legacyShouldDeleteFromMerge(obj, k, v) {
return v == null;
};
var clone = function clone(obj, transformerFn) {
if (isArray(obj)) {
return _mergeOne([], obj, transformerFn);
}
return _mergeOne({}, obj, transformerFn);
};
var getDeep = function getDeep(obj, parts, create) {
if (typeof parts === 'string') {
parts = parts.split('.');
} else {
parts = aps.call(parts);
}
var lastObj = obj;
var lastP;
while (obj != null && parts.length) {
var p = parts.shift();
if ((obj[p] === undefined || !isObject(obj[p]) && !isArray(obj[p])) && create) {
if (p === 0) {
obj = lastObj[lastP] = [];
obj[p] = {};
} else {
obj[p] = {};
}
}
lastObj = obj;
lastP = p;
// Only descend into properties that the object directly owns. getDeep({}, '__proto__')
// See for security vulnerability reproduction.
// https://github.com/wistia/player-modern/issues/1800
if (_objectHasOwn(obj, p)) {
obj = obj[p];
} else {
obj = undefined;
}
}
return obj;
};
var setDeep = function setDeep(obj, parts, value) {
return setAndMaybeDeleteUndefined(obj, parts, value, true);
};
var setAndPreserveUndefined = function setAndPreserveUndefined(obj, parts, value) {
return setAndMaybeDeleteUndefined(obj, parts, value, false);
};
var setAndMaybeDeleteUndefined = function setAndMaybeDeleteUndefined(obj, parts, value) {
var shouldDeleteUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
if (typeof parts === 'string') {
parts = parts.split('.');
} else {
parts = aps.call(parts);
}
var prop = parts.pop();
obj = getDeep(obj, parts, true);
if (obj != null && (isObject(obj) || isArray(obj)) && prop != null) {
if (!shouldDeleteUndefined || value != null) {
obj[prop] = value;
} else {
delete obj[prop];
}
} else {
// nothing to set or delete
return undefined;
}
};
var unsetDeep = function unsetDeep(obj, parts) {
return setDeep(obj, parts);
};
var exists = function exists(obj, name) {
return getDeep(obj, name) !== undefined;
};
var cast = function cast(maybeStr) {
if (maybeStr == null) {
return maybeStr;
}
if (isObject(maybeStr) || isArray(maybeStr)) {
return castDeep(maybeStr);
}
return castStr("".concat(maybeStr), maybeStr);
};
var castStr = function castStr(str) {
var defaultRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : str;
if (/^-?[1-9]\d*?$/.test(str)) {
return parseInt(str, 10);
}
if (str === '0' || str === '-0') {
return 0;
}
if (/^-?\d*\.\d+$/.test(str)) {
return parseFloat(str);
}
if (/^true$/i.test(str)) {
return true;
}
if (/^false$/i.test(str)) {
return false;
}
return defaultRet;
};
// Given an object or array, iterates over each leaf and casts the value.
var