From de5ed4d4c72cbdf2038f553ceb6bfa362f0f27e4 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 6 Dec 2017 13:39:39 -0700 Subject: [PATCH] remove polyfill.js and remove global polyfills (#1918) * remove polyfill.js and remove global polyfills * make sure find, findIndex, and includes use core-js in tests * switch from virtual function bind core-js to explicit usage. * remove transform-function-bind babel plugin --- .babelrc | 6 +++++- modules/adkernelAdnBidAdapter.js | 3 ++- modules/adkernelBidAdapter.js | 6 ++++-- modules/adomikAnalyticsAdapter.js | 7 ++++--- modules/aolBidAdapter.js | 8 +++++++- modules/appnexusBidAdapter.js | 16 +++++++++------- modules/audienceNetworkBidAdapter.js | 6 ++++-- modules/bridgewellBidAdapter.js | 5 +++-- modules/prebidServerBidAdapter.js | 5 +++-- modules/roxotAnalyticsAdapter.js | 7 ++++--- src/adaptermanager.js | 15 ++++++++------- src/adapters/bidderFactory.js | 3 ++- src/auction.js | 8 +++++--- src/auctionManager.js | 7 +++---- src/config.js | 6 ++++-- src/cpmBucketManager.js | 3 ++- src/native.js | 7 ++++--- src/polyfill.js | 14 -------------- src/prebid.js | 4 ++-- src/secureCreatives.js | 7 +++---- src/sizeMapping.js | 5 +++-- src/targeting.js | 17 +++++++++-------- src/utils.js | 12 +++++++----- src/video.js | 3 ++- test/spec/modules/s2sTesting_spec.js | 3 ++- test/spec/sizeMapping_spec.js | 5 +++-- test/spec/unit/core/adapterManager_spec.js | 14 ++++++++------ 27 files changed, 112 insertions(+), 90 deletions(-) delete mode 100644 src/polyfill.js diff --git a/.babelrc b/.babelrc index 8726a848e2e..b366d78478e 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,8 @@ { "presets": ["es2015"], - "plugins": ["transform-object-assign", "transform-es3-property-literals", "transform-es3-member-expression-literals"] + "plugins": [ + "transform-object-assign", + "transform-es3-property-literals", + "transform-es3-member-expression-literals" + ] } diff --git a/modules/adkernelAdnBidAdapter.js b/modules/adkernelAdnBidAdapter.js index b1c8bbf398b..28fb564320d 100644 --- a/modules/adkernelAdnBidAdapter.js +++ b/modules/adkernelAdnBidAdapter.js @@ -1,6 +1,7 @@ import * as utils from 'src/utils'; import {registerBidder} from 'src/adapters/bidderFactory'; import { BANNER, VIDEO } from 'src/mediaTypes'; +import includes from 'core-js/library/fn/array/includes'; const DEFAULT_ADKERNEL_DSP_DOMAIN = 'tag.adkernel.com'; const VIDEO_TARGETING = ['mimes', 'protocols', 'api']; @@ -28,7 +29,7 @@ function buildImp(bidRequest) { }; if (bidRequest.params.video) { Object.keys(bidRequest.params.video) - .filter(param => VIDEO_TARGETING.includes(param)) + .filter(param => includes(VIDEO_TARGETING, param)) .forEach(param => imp.video[param] = bidRequest.params.video[param]); } } else { diff --git a/modules/adkernelBidAdapter.js b/modules/adkernelBidAdapter.js index 095a6cec4b9..016cc5794fb 100644 --- a/modules/adkernelBidAdapter.js +++ b/modules/adkernelBidAdapter.js @@ -1,6 +1,8 @@ import * as utils from 'src/utils'; import { BANNER, VIDEO } from 'src/mediaTypes'; import {registerBidder} from 'src/adapters/bidderFactory'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; const VIDEO_TARGETING = ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'linearity', 'boxingallowed', 'playbackmethod', 'delivery', @@ -63,7 +65,7 @@ export const spec = { .reduce((a, b) => a.concat(b), []); return rtbBids.map(rtbBid => { - let imp = rtbImps.find(imp => imp.id === rtbBid.impid); + let imp = find(rtbImps, imp => imp.id === rtbBid.impid); let prBid = { requestId: rtbBid.impid, cpm: rtbBid.price, @@ -119,7 +121,7 @@ function buildImp(bid) { imp.video = {w: size[0], h: size[1]}; if (bid.params.video) { Object.keys(bid.params.video) - .filter(param => VIDEO_TARGETING.includes(param)) + .filter(param => includes(VIDEO_TARGETING, param)) .forEach(param => imp.video[param] = bid.params.video[param]); } } else { diff --git a/modules/adomikAnalyticsAdapter.js b/modules/adomikAnalyticsAdapter.js index c9bd7990ec8..929a4d5deae 100644 --- a/modules/adomikAnalyticsAdapter.js +++ b/modules/adomikAnalyticsAdapter.js @@ -1,7 +1,8 @@ import adapter from 'src/AnalyticsAdapter'; import CONSTANTS from 'src/constants.json'; import adaptermanager from 'src/adaptermanager'; -// import utils from 'src/utils'; +import find from 'core-js/library/fn/array/find'; +import findIndex from 'core-js/library/fn/array/find-index'; // Events used in adomik analytics adapter const auctionInit = CONSTANTS.EVENTS.AUCTION_INIT; @@ -139,7 +140,7 @@ adomikAdapter.buildBidResponse = function (bid) { adomikAdapter.sizeUtils = { sizeAlreadyExists: (sizes, typedEventSize) => { - return sizes.find((size) => size.height === typedEventSize.height && size.width === typedEventSize.width); + return find(sizes, (size) => size.height === typedEventSize.height && size.width === typedEventSize.width); }, formatSize: (typedEventSize) => { return { @@ -160,7 +161,7 @@ adomikAdapter.buildTypedEvents = function () { const groupedTypedEvents = []; adomikAdapter.bucketEvents.forEach(function(typedEvent, i) { const [placementCode, type] = [typedEvent.event.placementCode, typedEvent.type]; - let existTypedEvent = groupedTypedEvents.findIndex((groupedTypedEvent) => groupedTypedEvent.placementCode === placementCode); + let existTypedEvent = findIndex(groupedTypedEvents, (groupedTypedEvent) => groupedTypedEvent.placementCode === placementCode); if (existTypedEvent === -1) { groupedTypedEvents.push({ diff --git a/modules/aolBidAdapter.js b/modules/aolBidAdapter.js index c76bd1ccfd6..71b1e4f7902 100644 --- a/modules/aolBidAdapter.js +++ b/modules/aolBidAdapter.js @@ -61,12 +61,18 @@ let showCpmAdjustmentWarning = (function () { }; })(); +function isInteger(value) { + return typeof value === 'number' && + isFinite(value) && + Math.floor(value) === value; +} + function template(strings, ...keys) { return function(...values) { let dict = values[values.length - 1] || {}; let result = [strings[0]]; keys.forEach(function(key, i) { - let value = Number.isInteger(key) ? values[key] : dict[key]; + let value = isInteger(key) ? values[key] : dict[key]; result.push(value, strings[i + 1]); }); return result.join(''); diff --git a/modules/appnexusBidAdapter.js b/modules/appnexusBidAdapter.js index 92d5f6ba1ba..c4e7b8e882b 100644 --- a/modules/appnexusBidAdapter.js +++ b/modules/appnexusBidAdapter.js @@ -2,6 +2,8 @@ import { Renderer } from 'src/Renderer'; import * as utils from 'src/utils'; import { registerBidder } from 'src/adapters/bidderFactory'; import { NATIVE, VIDEO } from 'src/mediaTypes'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; const BIDDER_CODE = 'appnexus'; const URL = '//ib.adnxs.com/ut/v3/prebid'; @@ -49,16 +51,16 @@ export const spec = { */ buildRequests: function(bidRequests, bidderRequest) { const tags = bidRequests.map(bidToTag); - const userObjBid = bidRequests.find(hasUserInfo); + const userObjBid = find(bidRequests, hasUserInfo); let userObj; if (userObjBid) { userObj = {}; Object.keys(userObjBid.params.user) - .filter(param => USER_PARAMS.includes(param)) + .filter(param => includes(USER_PARAMS, param)) .forEach(param => userObj[param] = userObjBid.params.user[param]); } - const memberIdBid = bidRequests.find(hasMemberId); + const memberIdBid = find(bidRequests, hasMemberId); const member = memberIdBid ? parseInt(memberIdBid.params.member, 10) : 0; const payload = { @@ -101,7 +103,7 @@ export const spec = { serverResponse.tags.forEach(serverBid => { const rtbBid = getRtbBid(serverBid); if (rtbBid) { - if (rtbBid.cpm !== 0 && SUPPORTED_AD_TYPES.includes(rtbBid.ad_type)) { + if (rtbBid.cpm !== 0 && includes(SUPPORTED_AD_TYPES, rtbBid.ad_type)) { const bid = newBid(serverBid, rtbBid); bid.mediaType = parseMediaType(rtbBid); bids.push(bid); @@ -300,7 +302,7 @@ function bidToTag(bid) { tag.video = {}; // place any valid video params on the tag Object.keys(bid.params.video) - .filter(param => VIDEO_TARGETING.includes(param)) + .filter(param => includes(VIDEO_TARGETING, param)) .forEach(param => tag.video[param] = bid.params.video[param]); } @@ -339,7 +341,7 @@ function hasMemberId(bid) { } function getRtbBid(tag) { - return tag && tag.ads && tag.ads.length && tag.ads.find(ad => ad.rtb); + return tag && tag.ads && tag.ads.length && find(tag.ads, ad => ad.rtb); } function buildNativeRequest(params) { @@ -368,7 +370,7 @@ function buildNativeRequest(params) { // subtract required keys from adunit keys const adunitKeys = Object.keys(params[key]); const requiredKeys = Object.keys(requiredParams); - const remaining = adunitKeys.filter(key => !requiredKeys.includes(key)); + const remaining = adunitKeys.filter(key => !includes(requiredKeys, key)); // if none are left over, the minimum params needs to be sent if (remaining.length === 0) { diff --git a/modules/audienceNetworkBidAdapter.js b/modules/audienceNetworkBidAdapter.js index 04df8e845c9..41ca539ccba 100644 --- a/modules/audienceNetworkBidAdapter.js +++ b/modules/audienceNetworkBidAdapter.js @@ -5,6 +5,8 @@ import { registerBidder } from 'src/adapters/bidderFactory'; import { config } from 'src/config'; import { formatQS } from 'src/url'; import { getTopWindowUrl } from 'src/utils'; +import findIndex from 'core-js/library/fn/array/find-index'; +import includes from 'core-js/library/fn/array/includes'; const code = 'audienceNetwork'; const currency = 'USD'; @@ -47,7 +49,7 @@ const expandSize = size => size.split('x').map(Number); * @param {String} size * @returns {Boolean} */ -const isValidSize = size => ['300x250', '320x50'].includes(size); +const isValidSize = size => includes(['300x250', '320x50'], size); /** * Is this a video format? @@ -139,7 +141,7 @@ const buildRequests = bids => { pageurl, sdk }; - const video = adformats.findIndex(isVideo); + const video = findIndex(adformats, isVideo); if (video !== -1) { [search.playerwidth, search.playerheight] = sizes[video].split('x').map(Number) } diff --git a/modules/bridgewellBidAdapter.js b/modules/bridgewellBidAdapter.js index d224355c3a5..ec70342c964 100644 --- a/modules/bridgewellBidAdapter.js +++ b/modules/bridgewellBidAdapter.js @@ -1,5 +1,6 @@ import * as utils from 'src/utils'; import {registerBidder} from 'src/adapters/bidderFactory'; +import find from 'core-js/library/fn/array/find'; const BIDDER_CODE = 'bridgewell'; const REQUEST_ENDPOINT = '//rec.scupio.com/recweb/prebid.aspx'; @@ -58,8 +59,8 @@ export const spec = { return; } - let matchedResponse = serverResponse.body.find(function(res) { - return !!res && !res.consumed && req.sizes.find(function(size) { + let matchedResponse = find(serverResponse.body, function(res) { + return !!res && !res.consumed && find(req.sizes, function(size) { return res.width === size[0] && res.height === size[1]; }); }); diff --git a/modules/prebidServerBidAdapter.js b/modules/prebidServerBidAdapter.js index 8bb211d2f2d..dd8b0600af8 100644 --- a/modules/prebidServerBidAdapter.js +++ b/modules/prebidServerBidAdapter.js @@ -8,6 +8,7 @@ import adaptermanager from 'src/adaptermanager'; import { config } from 'src/config'; import { VIDEO } from 'src/mediaTypes'; import { isValid } from 'src/adapters/bidderFactory'; +import includes from 'core-js/library/fn/array/includes'; const getConfig = config.getConfig; @@ -43,7 +44,7 @@ function setS2sConfig(options) { let keys = Object.keys(options); if (['accountId', 'bidders', 'endpoint'].filter(key => { - if (!keys.includes(key)) { + if (!includes(keys, key)) { utils.logError(key + ' missing in server to server config'); return true; } @@ -319,7 +320,7 @@ export function PrebidServer() { utils.logError(error); } - if (!result || (result.status && result.status.includes('Error'))) { + if (!result || (result.status && includes(result.status, 'Error'))) { utils.logError('error parsing response: ', result.status); } diff --git a/modules/roxotAnalyticsAdapter.js b/modules/roxotAnalyticsAdapter.js index 0a274660699..65771ad245d 100644 --- a/modules/roxotAnalyticsAdapter.js +++ b/modules/roxotAnalyticsAdapter.js @@ -1,6 +1,7 @@ import adapter from 'src/AnalyticsAdapter'; import CONSTANTS from 'src/constants.json'; import adaptermanager from 'src/adaptermanager'; +import includes from 'core-js/library/fn/array/includes'; const utils = require('src/utils'); @@ -106,7 +107,7 @@ function checkAdUnitConfig() { function buildBidWon(eventType, args) { bidWon.options = initOptions; if (checkAdUnitConfig()) { - if (initOptions.adUnits.includes(args.adUnitCode)) { + if (includes(initOptions.adUnits, args.adUnitCode)) { bidWon.events = [{ args: args, eventType: eventType }]; } } else { @@ -121,7 +122,7 @@ function buildEventStack() { function filterBidsByAdUnit(bids) { var filteredBids = []; bids.forEach(function (bid) { - if (initOptions.adUnits.includes(bid.placementCode)) { + if (includes(initOptions.adUnits, bid.placementCode)) { filteredBids.push(bid); } }); @@ -131,7 +132,7 @@ function filterBidsByAdUnit(bids) { function isValidEvent(eventType, adUnitCode) { if (checkAdUnitConfig()) { let validationEvents = [bidAdjustmentConst, bidResponseConst, bidWonConst]; - if (!initOptions.adUnits.includes(adUnitCode) && validationEvents.includes(eventType)) { + if (!includes(initOptions.adUnits, adUnitCode) && includes(validationEvents, eventType)) { return false; } } diff --git a/src/adaptermanager.js b/src/adaptermanager.js index 867d8c54379..95db1e74b2a 100644 --- a/src/adaptermanager.js +++ b/src/adaptermanager.js @@ -6,6 +6,7 @@ import { processNativeAdUnitParams, nativeAdapters } from './native'; import { newBidder } from './adapters/bidderFactory'; import { ajaxBuilder } from 'src/ajax'; import { config, RANDOM } from 'src/config'; +import includes from 'core-js/library/fn/array/includes'; var utils = require('./utils.js'); var CONSTANTS = require('./constants.json'); @@ -115,7 +116,7 @@ function getAdUnitCopyForPrebidServer(adUnits) { // filter out client side bids adUnit.bids = adUnit.bids.filter((bid) => { - return adaptersServerSide.includes(bid.bidder) && (!doingS2STesting() || bid.finalSource !== s2sTestingModule.CLIENT); + return includes(adaptersServerSide, bid.bidder) && (!doingS2STesting() || bid.finalSource !== s2sTestingModule.CLIENT); }).map((bid) => { bid.bid_id = utils.getUniqueIdentifierStr(); return bid; @@ -167,7 +168,7 @@ exports.makeBidRequests = function(adUnits, auctionStart, auctionId, cbTimeout, // don't call these client side (unless client request is needed for testing) clientBidderCodes = bidderCodes.filter((elm) => { - return !adaptersServerSide.includes(elm) || clientTestAdapters.includes(elm); + return !includes(adaptersServerSide, elm) || includes(clientTestAdapters, elm); }); let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits); @@ -240,7 +241,7 @@ exports.callBids = (adUnits, bidRequests, addBidResponse, doneCb) => { return adapters.concat((adUnit.bids || []).reduce((adapters, bid) => { return adapters.concat(bid.bidder) }, [])); }, []); utils.logMessage(`CALLING S2S HEADER BIDDERS ==== ${adaptersServerSide.filter(adapter => { - return allBidders.includes(adapter); + return includes(allBidders, adapter); }).join(',')}`); // fire BID_REQUESTED event for each s2s bidRequest @@ -283,8 +284,8 @@ function doingS2STesting() { function getSupportedMediaTypes(bidderCode) { let result = []; - if (exports.videoAdapters.includes(bidderCode)) result.push('video'); - if (nativeAdapters.includes(bidderCode)) result.push('native'); + if (includes(exports.videoAdapters, bidderCode)) result.push('video'); + if (includes(nativeAdapters, bidderCode)) result.push('native'); return result; } @@ -295,10 +296,10 @@ exports.registerBidAdapter = function (bidAdaptor, bidderCode, {supportedMediaTy if (typeof bidAdaptor.callBids === 'function') { _bidderRegistry[bidderCode] = bidAdaptor; - if (supportedMediaTypes.includes('video')) { + if (includes(supportedMediaTypes, 'video')) { exports.videoAdapters.push(bidderCode); } - if (supportedMediaTypes.includes('native')) { + if (includes(supportedMediaTypes, 'native')) { nativeAdapters.push(bidderCode); } } else { diff --git a/src/adapters/bidderFactory.js b/src/adapters/bidderFactory.js index 885b9e96d43..ed3cc28db32 100644 --- a/src/adapters/bidderFactory.js +++ b/src/adapters/bidderFactory.js @@ -6,6 +6,7 @@ import { STATUS } from 'src/constants'; import { userSync } from 'src/userSync'; import { nativeBidIsValid } from 'src/native'; import { isValidVideoBid } from 'src/video'; +import includes from 'core-js/library/fn/array/includes'; import { logWarn, logError, parseQueryStringParameters, delayExecution, parseSizesInput, getBidderRequest } from 'src/utils'; @@ -362,7 +363,7 @@ function validBidSize(adUnitCode, bid, bidRequests) { export function isValid(adUnitCode, bid, bidRequests) { function hasValidKeys() { let bidKeys = Object.keys(bid); - return COMMON_BID_RESPONSE_KEYS.every(key => bidKeys.includes(key)); + return COMMON_BID_RESPONSE_KEYS.every(key => includes(bidKeys, key)); } function errorMessage(msg) { diff --git a/src/auction.js b/src/auction.js index 5e4be6901bd..80ea1226ace 100644 --- a/src/auction.js +++ b/src/auction.js @@ -57,6 +57,8 @@ import { config } from 'src/config'; import { userSync } from 'src/userSync'; import { createHook } from 'src/hook'; import { videoAdUnit } from 'src/video'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; const { syncUsers } = userSync; const utils = require('./utils'); @@ -147,7 +149,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels}) function done(bidRequestId) { var innerBidRequestId = bidRequestId; return delayExecution(function() { - let request = _bidderRequests.find((bidRequest) => { + let request = find(_bidderRequests, (bidRequest) => { return innerBidRequestId === bidRequest.bidderRequestId; }); request.doneCbCallCount += 1; @@ -488,10 +490,10 @@ function getTimedOutBids(bidderRequests, bidsReceived) { .filter(uniques); const timedOutBidderCodes = bidRequestedCodes - .filter(bidder => !bidReceivedCodes.includes(bidder)); + .filter(bidder => !includes(bidReceivedCodes, bidder)); const timedOutBids = bidderRequests - .map(bid => (bid.bids || []).filter(bid => timedOutBidderCodes.includes(bid.bidder))) + .map(bid => (bid.bids || []).filter(bid => includes(timedOutBidderCodes, bid.bidder))) .reduce(flatten, []) .map(bid => ({ bidId: bid.bidId, diff --git a/src/auctionManager.js b/src/auctionManager.js index 36ddec10cb9..65723d6c199 100644 --- a/src/auctionManager.js +++ b/src/auctionManager.js @@ -18,6 +18,7 @@ import { uniques, flatten } from './utils'; import { newAuction, getStandardBidderSettings, AUCTION_COMPLETED } from 'src/auction'; +import find from 'core-js/library/fn/array/find'; const CONSTANTS = require('./constants.json'); @@ -32,7 +33,7 @@ export function newAuctionManager() { let auctionManager = {}; auctionManager.addWinningBid = function(bid) { - const auction = _auctions.find(auction => auction.getAuctionId() === bid.auctionId); + const auction = find(_auctions, auction => auction.getAuctionId() === bid.auctionId); if (auction) { auction.setWinningBid(bid); } else { @@ -80,9 +81,7 @@ export function newAuctionManager() { }; auctionManager.findBidByAdId = function(adId) { - return _auctions.map(auction => auction.getBidsReceived()) - .reduce(flatten, []) - .find(bid => bid.adId === adId); + return find(_auctions.map(auction => auction.getBidsReceived()).reduce(flatten, []), bid => bid.adId === adId); }; auctionManager.getStandardBidderAdServerTargeting = function() { diff --git a/src/config.js b/src/config.js index 7115ae496e8..ce1b472a44f 100644 --- a/src/config.js +++ b/src/config.js @@ -8,6 +8,8 @@ * continue to work during a deprecation window. */ import { isValidPriceConfig } from './cpmBucketManager'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; const utils = require('./utils'); const DEFAULT_DEBUG = false; @@ -142,7 +144,7 @@ export function newConfig() { }; function hasGranularity(val) { - return Object.keys(GRANULARITY_OPTIONS).find(option => val === GRANULARITY_OPTIONS[option]); + return find(Object.keys(GRANULARITY_OPTIONS), option => val === GRANULARITY_OPTIONS[option]); } function validatePriceGranularity(val) { @@ -273,7 +275,7 @@ export function newConfig() { // call subscribers of a specific topic, passing only that configuration listeners - .filter(listener => TOPICS.includes(listener.topic)) + .filter(listener => includes(TOPICS, listener.topic)) .forEach(listener => { listener.callback({ [listener.topic]: options[listener.topic] }); }); diff --git a/src/cpmBucketManager.js b/src/cpmBucketManager.js index 5eb66bc1376..0061d35f483 100644 --- a/src/cpmBucketManager.js +++ b/src/cpmBucketManager.js @@ -1,3 +1,4 @@ +import find from 'core-js/library/fn/array/find'; const utils = require('src/utils'); const _defaultPrecision = 2; @@ -86,7 +87,7 @@ function getCpmStringValue(cpm, config, granularityMultiplier) { }, { 'max': 0, }); - let bucket = config.buckets.find(bucket => { + let bucket = find(config.buckets, bucket => { if (cpm > cap.max * granularityMultiplier) { // cpm exceeds cap, just return the cap. let precision = bucket.precision; diff --git a/src/native.js b/src/native.js index 53450592d5a..ace39efffaf 100644 --- a/src/native.js +++ b/src/native.js @@ -1,4 +1,5 @@ import { deepAccess, getBidRequest, logError, triggerPixel } from './utils'; +import includes from 'core-js/library/fn/array/includes'; export const nativeAdapters = []; @@ -46,7 +47,7 @@ export function processNativeAdUnitParams(params) { * Check if the native type specified in the adUnit is supported by Prebid. */ function typeIsSupported(type) { - if (!(type && Object.keys(SUPPORTED_TYPES).includes(type))) { + if (!(type && includes(Object.keys(SUPPORTED_TYPES), type))) { logError(`${type} nativeParam is not supported`); return false; } @@ -64,7 +65,7 @@ export const nativeAdUnit = adUnit => { const mediaTypes = deepAccess(adUnit, 'mediaTypes.native'); return mediaType || mediaTypes; } -export const nativeBidder = bid => nativeAdapters.includes(bid.bidder); +export const nativeBidder = bid => includes(nativeAdapters, bid.bidder); export const hasNonNativeBidder = adUnit => adUnit.bids.filter(bid => !nativeBidder(bid)).length; @@ -96,7 +97,7 @@ export function nativeBidIsValid(bid, bidRequests) { key => bid['native'][key] ); - return requiredAssets.every(asset => returnedAssets.includes(asset)); + return requiredAssets.every(asset => includes(returnedAssets, asset)); } /* diff --git a/src/polyfill.js b/src/polyfill.js deleted file mode 100644 index 1c8913824ae..00000000000 --- a/src/polyfill.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @module polyfill -Misc polyfills -*/ -require('core-js/fn/array/find'); -require('core-js/fn/array/find-index'); -require('core-js/fn/array/includes'); -require('core-js/fn/object/assign'); - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger -Number.isInteger = Number.isInteger || function(value) { - return typeof value === 'number' && - isFinite(value) && - Math.floor(value) === value; -}; diff --git a/src/prebid.js b/src/prebid.js index f047462d93c..ffecabe05eb 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -4,13 +4,13 @@ import { getGlobal } from './prebidGlobal'; import { flatten, uniques, isGptPubadsDefined, adUnitsFilter } from './utils'; import { videoAdUnit, videoBidder, hasNonVideoBidder } from './video'; import { nativeAdUnit, nativeBidder, hasNonNativeBidder } from './native'; -import './polyfill'; import { listenMessagesFromCreative } from './secureCreatives'; import { userSync } from 'src/userSync.js'; import { loadScript } from './adloader'; import { config } from './config'; import { auctionManager } from './auctionManager'; import { targeting } from './targeting'; +import includes from 'core-js/library/fn/array/includes'; var $$PREBID_GLOBAL$$ = getGlobal(); @@ -291,7 +291,7 @@ $$PREBID_GLOBAL$$.requestBids = function ({ bidsBackHandler, timeout, adUnits, a if (adUnitCodes && adUnitCodes.length) { // if specific adUnitCodes supplied filter adUnits for those codes - adUnits = adUnits.filter(unit => adUnitCodes.includes(unit.code)); + adUnits = adUnits.filter(unit => includes(adUnitCodes, unit.code)); } else { // otherwise derive adUnitCodes from adUnits adUnitCodes = adUnits && adUnits.map(unit => unit.code); diff --git a/src/secureCreatives.js b/src/secureCreatives.js index fef2f40e25e..424d1402831 100644 --- a/src/secureCreatives.js +++ b/src/secureCreatives.js @@ -8,6 +8,7 @@ import { fireNativeTrackers } from './native'; import { EVENTS } from './constants'; import { isSlotMatchingAdUnitCode } from './utils'; import { auctionManager } from './auctionManager'; +import find from 'core-js/library/fn/array/find'; const BID_WON = EVENTS.BID_WON; @@ -25,7 +26,7 @@ function receiveMessage(ev) { } if (data.adId) { - const adObject = auctionManager.getBidsReceived().find(function (bid) { + const adObject = find(auctionManager.getBidsReceived(), function (bid) { return bid.adId === data.adId; }); @@ -69,9 +70,7 @@ function sendAdToCreative(adObject, remoteDomain, source) { function resizeRemoteCreative({ adUnitCode, width, height }) { const iframe = document.getElementById( - window.googletag.pubads().getSlots() - .filter(isSlotMatchingAdUnitCode(adUnitCode)) - .find(slot => slot) + find(window.googletag.pubads().getSlots().filter(isSlotMatchingAdUnitCode(adUnitCode)), slot => slot) .getSlotElementId()).querySelector('iframe'); iframe.width = '' + width; diff --git a/src/sizeMapping.js b/src/sizeMapping.js index 6238df6cd26..4a4c9ff77c1 100644 --- a/src/sizeMapping.js +++ b/src/sizeMapping.js @@ -1,4 +1,5 @@ import { config } from 'src/config'; +import includes from 'core-js/library/fn/array/includes'; let sizeConfig = []; @@ -46,11 +47,11 @@ export function resolveStatus({labels = [], labelAll = false, activeLabels = []} labels.length === 0 || ( (!labelAll && ( labels.some(label => maps.labels[label]) || - labels.some(label => activeLabels.includes(label)) + labels.some(label => includes(activeLabels, label)) )) || (labelAll && ( labels.reduce((result, label) => !result ? result : ( - maps.labels[label] || activeLabels.includes(label) + maps.labels[label] || includes(activeLabels, label) ), true) )) ) diff --git a/src/targeting.js b/src/targeting.js index bb1257be8ec..2169af21b2b 100644 --- a/src/targeting.js +++ b/src/targeting.js @@ -2,6 +2,7 @@ import { uniques, isGptPubadsDefined, getHighestCpm, groupBy, isAdUnitCodeMatchi import { config } from './config'; import { NATIVE_TARGETING_KEYS } from './native'; import { auctionManager } from './auctionManager'; +import includes from 'core-js/library/fn/array/includes'; const utils = require('./utils.js'); var CONSTANTS = require('./constants.json'); @@ -33,7 +34,7 @@ export function newTargeting(auctionManager) { targeting.resetPresetTargeting = function(adUnitCode) { if (isGptPubadsDefined()) { const adUnitCodes = getAdUnitCodes(adUnitCode); - const adUnits = auctionManager.getAdUnits().filter(adUnit => adUnitCodes.includes(adUnit.code)); + const adUnits = auctionManager.getAdUnits().filter(adUnit => includes(adUnitCodes, adUnit.code)); window.googletag.pubads().getSlots().forEach(slot => { pbTargetingKeys.forEach(function(key) { // reset only registered adunits @@ -50,7 +51,7 @@ export function newTargeting(auctionManager) { /** * Returns all ad server targeting for all ad units. - * @param {string=} adUnitCode + * @param {string=} adUnitCode * @return {Object.} targeting */ targeting.getAllTargeting = function(adUnitCode) { @@ -79,7 +80,7 @@ export function newTargeting(auctionManager) { /** * Converts targeting array and flattens to make it easily iteratable - * e.g: Sample input to this function + * e.g: Sample input to this function * ``` * [ * { @@ -99,7 +100,7 @@ export function newTargeting(auctionManager) { * } * } * ``` - * + * * @param {targetingArray} targeting * @return {Object.} targeting */ @@ -123,7 +124,7 @@ export function newTargeting(auctionManager) { /** * Sets targeting for DFP - * @param {Object.>} targetingConfig + * @param {Object.>} targetingConfig */ targeting.setTargetingForGPT = function(targetingConfig) { window.googletag.pubads().getSlots().forEach(slot => { @@ -172,7 +173,7 @@ export function newTargeting(auctionManager) { const adUnitCodes = getAdUnitCodes(adUnitCode); return getBidsReceived() - .filter(bid => adUnitCodes.includes(bid.adUnitCode)) + .filter(bid => includes(adUnitCodes, bid.adUnitCode)) .filter(bid => bid.cpm > 0) .map(bid => bid.adUnitCode) .filter(uniques) @@ -240,7 +241,7 @@ export function newTargeting(auctionManager) { /** * Merge custom adserverTargeting with same key name for same adUnitCode. * e.g: Appnexus defining custom keyvalue pair foo:bar and Rubicon defining custom keyvalue pair foo:baz will be merged to foo: ['bar','baz'] - * + * * @param {Object[]} acc Accumulator for reducer. It will store updated bidResponse objects * @param {Object} bid BidResponse * @param {number} index current index @@ -303,7 +304,7 @@ export function newTargeting(auctionManager) { */ function getCustomBidTargeting(adUnitCodes) { return getBidsReceived() - .filter(bid => adUnitCodes.includes(bid.adUnitCode)) + .filter(bid => includes(adUnitCodes, bid.adUnitCode)) .map(bid => Object.assign({}, bid)) .reduce(mergeAdServerTargeting, []) .map(truncateCustomKeys) diff --git a/src/utils.js b/src/utils.js index a45fd37e3f7..d5657845492 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,5 +1,7 @@ import { config } from './config'; import clone from 'just-clone'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; var CONSTANTS = require('./constants'); var _loggingChecked = false; @@ -573,7 +575,7 @@ export function flatten(a, b) { } export function getBidRequest(id, bidsRequested) { - return bidsRequested.map(bidSet => bidSet.bids.find(bid => bid.bidId === id)).find(bid => bid); + return find(bidsRequested.map(bidSet => find(bidSet.bids, bid => bid.bidId === id)), bid => bid); } export function getKeys(obj) { @@ -631,7 +633,7 @@ export function shuffle(array) { } export function adUnitsFilter(filter, bid) { - return filter.includes(bid && bid.adUnitCode); + return includes(filter, bid && bid.adUnitCode); } /** @@ -777,19 +779,19 @@ export function isValidMediaTypes(mediaTypes) { const types = Object.keys(mediaTypes); - if (!types.every(type => SUPPORTED_MEDIA_TYPES.includes(type))) { + if (!types.every(type => includes(SUPPORTED_MEDIA_TYPES, type))) { return false; } if (mediaTypes.video && mediaTypes.video.context) { - return SUPPORTED_STREAM_TYPES.includes(mediaTypes.video.context); + return includes(SUPPORTED_STREAM_TYPES, mediaTypes.video.context); } return true; } export function getBidderRequest(bidRequests, bidder, adUnitCode) { - return bidRequests.find(request => { + return find(bidRequests, request => { return request.bids .filter(bid => bid.bidder === bidder && bid.adUnitCode === adUnitCode).length > 0; }) || { start: null, requestId: null }; diff --git a/src/video.js b/src/video.js index 2efdfdac126..e4d31e0f8ee 100644 --- a/src/video.js +++ b/src/video.js @@ -1,6 +1,7 @@ import { videoAdapters } from './adaptermanager'; import { getBidRequest, deepAccess, logError } from './utils'; import { config } from '../src/config'; +import includes from 'core-js/library/fn/array/includes'; const VIDEO_MEDIA_TYPE = 'video'; const OUTSTREAM = 'outstream'; @@ -13,7 +14,7 @@ export const videoAdUnit = adUnit => { const mediaTypes = deepAccess(adUnit, 'mediaTypes.video'); return mediaType || mediaTypes; }; -export const videoBidder = bid => videoAdapters.includes(bid.bidder); +export const videoBidder = bid => includes(videoAdapters, bid.bidder); export const hasNonVideoBidder = adUnit => adUnit.bids.filter(bid => !videoBidder(bid)).length; diff --git a/test/spec/modules/s2sTesting_spec.js b/test/spec/modules/s2sTesting_spec.js index 4ddd7278f4e..26d5eb8884b 100644 --- a/test/spec/modules/s2sTesting_spec.js +++ b/test/spec/modules/s2sTesting_spec.js @@ -1,5 +1,6 @@ import { getSourceBidderMap, calculateBidSources, getSource } from 'modules/s2sTesting'; import { config } from 'src/config'; +import find from 'core-js/library/fn/array/find'; var events = require('src/events'); var CONSTANTS = require('src/constants.json'); @@ -326,7 +327,7 @@ describe('s2sTesting', function () { expect(targeting).to.be.undefined; return; } - expect(targeting.find((kvp) => { + expect(find(targeting, (kvp) => { return kvp.key === `hb_source_${bidder}`; })).to.be.undefined; } diff --git a/test/spec/sizeMapping_spec.js b/test/spec/sizeMapping_spec.js index fd517d1145e..24a6063cf7d 100644 --- a/test/spec/sizeMapping_spec.js +++ b/test/spec/sizeMapping_spec.js @@ -1,5 +1,6 @@ import { expect } from 'chai'; import { resolveStatus, setSizeConfig } from 'src/sizeMapping'; +import includes from 'core-js/library/fn/array/includes'; describe('sizeMapping', () => { var testSizes = [[970, 90], [728, 90], [300, 250], [300, 100], [80, 80]]; @@ -79,10 +80,10 @@ describe('sizeMapping', () => { }); it('when multiple mediaQuery block matches, it should filter a union of the matched sizesSupported', () => { - matchMediaOverride = (str) => [ + matchMediaOverride = (str) => includes([ '(min-width: 1200px)', '(min-width: 768px) and (max-width: 1199px)' - ].includes(str) ? {matches: true} : {matches: false}; + ], str) ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, testSizes, sizeConfig); expect(status).to.deep.equal({ diff --git a/test/spec/unit/core/adapterManager_spec.js b/test/spec/unit/core/adapterManager_spec.js index 07e04509f72..21ab14ea99e 100644 --- a/test/spec/unit/core/adapterManager_spec.js +++ b/test/spec/unit/core/adapterManager_spec.js @@ -6,6 +6,8 @@ import * as utils from 'src/utils'; import { config } from 'src/config'; import { registerBidder } from 'src/adapters/bidderFactory'; import { setSizeConfig } from 'src/sizeMapping'; +import find from 'core-js/library/fn/array/find'; +import includes from 'core-js/library/fn/array/includes'; var s2sTesting = require('../../../../modules/s2sTesting'); var events = require('../../../../src/events'); @@ -548,7 +550,7 @@ describe('adapterManager tests', () => { let adUnits; beforeEach(() => { adUnits = utils.deepClone(getAdUnits()).map(adUnit => { - adUnit.bids = adUnit.bids.filter(bid => ['appnexus', 'rubicon'].includes(bid.bidder)); + adUnit.bids = adUnit.bids.filter(bid => includes(['appnexus', 'rubicon'], bid.bidder)); return adUnit; }) }); @@ -573,14 +575,14 @@ describe('adapterManager tests', () => { ); expect(bidRequests.length).to.equal(2); - let rubiconBidRequests = bidRequests.find(bidRequest => bidRequest.bidderCode === 'rubicon'); + let rubiconBidRequests = find(bidRequests, bidRequest => bidRequest.bidderCode === 'rubicon'); expect(rubiconBidRequests.bids.length).to.equal(1); - expect(rubiconBidRequests.bids[0].sizes).to.deep.equal(adUnits.find(adUnit => adUnit.code === rubiconBidRequests.bids[0].adUnitCode).sizes); + expect(rubiconBidRequests.bids[0].sizes).to.deep.equal(find(adUnits, adUnit => adUnit.code === rubiconBidRequests.bids[0].adUnitCode).sizes); - let appnexusBidRequests = bidRequests.find(bidRequest => bidRequest.bidderCode === 'appnexus'); + let appnexusBidRequests = find(bidRequests, bidRequest => bidRequest.bidderCode === 'appnexus'); expect(appnexusBidRequests.bids.length).to.equal(2); - expect(appnexusBidRequests.bids[0].sizes).to.deep.equal(adUnits.find(adUnit => adUnit.code === appnexusBidRequests.bids[0].adUnitCode).sizes); - expect(appnexusBidRequests.bids[1].sizes).to.deep.equal(adUnits.find(adUnit => adUnit.code === appnexusBidRequests.bids[1].adUnitCode).sizes); + expect(appnexusBidRequests.bids[0].sizes).to.deep.equal(find(adUnits, adUnit => adUnit.code === appnexusBidRequests.bids[0].adUnitCode).sizes); + expect(appnexusBidRequests.bids[1].sizes).to.deep.equal(find(adUnits, adUnit => adUnit.code === appnexusBidRequests.bids[1].adUnitCode).sizes); }); it('should filter sizes using size config', () => {