diff --git a/libraries/advangUtils/index.js b/libraries/advangUtils/index.js index 08c8e43cea3..f815f389ed6 100644 --- a/libraries/advangUtils/index.js +++ b/libraries/advangUtils/index.js @@ -14,7 +14,7 @@ export function isVideoBid(bid) { export function getBannerBidFloor(bid) { let floorInfo = isFn(bid.getFloor) ? bid.getFloor({ currency: 'USD', mediaType: 'banner', size: '*' }) : {}; - return floorInfo.floor || getBannerBidParam(bid, 'bidfloor'); + return floorInfo?.floor || getBannerBidParam(bid, 'bidfloor'); } export function getVideoBidFloor(bid) { diff --git a/libraries/currencyUtils/floor.js b/libraries/currencyUtils/floor.js index 0bd52172a41..ee41bad01da 100644 --- a/libraries/currencyUtils/floor.js +++ b/libraries/currencyUtils/floor.js @@ -16,7 +16,7 @@ export function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (_) { return 0; } diff --git a/libraries/dspxUtils/bidderUtils.js b/libraries/dspxUtils/bidderUtils.js index f19e2bfc29a..612a20f6865 100644 --- a/libraries/dspxUtils/bidderUtils.js +++ b/libraries/dspxUtils/bidderUtils.js @@ -225,7 +225,7 @@ export function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (_) { return 0 } diff --git a/libraries/precisoUtils/bidUtilsCommon.js b/libraries/precisoUtils/bidUtilsCommon.js index 74cf00b8450..a8ea97efcaf 100644 --- a/libraries/precisoUtils/bidUtilsCommon.js +++ b/libraries/precisoUtils/bidUtilsCommon.js @@ -37,7 +37,7 @@ export function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (_) { return 0 } diff --git a/libraries/riseUtils/index.js b/libraries/riseUtils/index.js index 25c7183d552..2bc337b9c55 100644 --- a/libraries/riseUtils/index.js +++ b/libraries/riseUtils/index.js @@ -5,7 +5,8 @@ import { isEmpty, contains, isInteger, - getBidIdParameter + getBidIdParameter, + isPlainObject } from '../../src/utils.js'; import { BANNER, VIDEO } from '../../src/mediaTypes.js'; import {config} from '../../src/config.js'; @@ -19,7 +20,7 @@ export function getFloor(bid, mediaType) { mediaType: mediaType, size: '*' }); - return floorResult.currency === 'USD' && floorResult.floor ? floorResult.floor : 0; + return isPlainObject(floorResult) && floorResult.currency === 'USD' && floorResult.floor ? floorResult.floor : 0; } export function getSizesArray(bid, mediaType) { diff --git a/libraries/teqblazeUtils/bidderUtils.js b/libraries/teqblazeUtils/bidderUtils.js index 6186e526eb8..f9484ebe5d1 100644 --- a/libraries/teqblazeUtils/bidderUtils.js +++ b/libraries/teqblazeUtils/bidderUtils.js @@ -29,7 +29,7 @@ const getBidFloor = (bid) => { size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (err) { return 0; } diff --git a/libraries/vidazooUtils/bidderUtils.js b/libraries/vidazooUtils/bidderUtils.js index 5c3409f4780..df947142a4c 100644 --- a/libraries/vidazooUtils/bidderUtils.js +++ b/libraries/vidazooUtils/bidderUtils.js @@ -255,7 +255,7 @@ export function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidder size: '*' }); - if (floorInfo.currency === 'USD') { + if (floorInfo?.currency === 'USD') { bidFloor = floorInfo.floor; } } diff --git a/libraries/xeUtils/bidderUtils.js b/libraries/xeUtils/bidderUtils.js index abbd14db6a9..f03c6323d76 100644 --- a/libraries/xeUtils/bidderUtils.js +++ b/libraries/xeUtils/bidderUtils.js @@ -1,4 +1,4 @@ -import {deepAccess, getBidIdParameter, isFn, logError, isArray, parseSizesInput} from '../../src/utils.js'; +import {deepAccess, getBidIdParameter, isFn, logError, isArray, parseSizesInput, isPlainObject} from '../../src/utils.js'; import {getAdUnitSizes} from '../sizeUtils/sizeUtils.js'; import {findIndex} from '../../src/polyfill.js'; @@ -13,7 +13,7 @@ export function getBidFloor(bid, currency = 'USD') { size: '*' }); - if (typeof floor === 'object' && !isNaN(floor.floor) && floor.currency === currency) { + if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === currency) { return floor.floor; } diff --git a/modules/33acrossBidAdapter.js b/modules/33acrossBidAdapter.js index ae002d79d58..555d9c8a291 100644 --- a/modules/33acrossBidAdapter.js +++ b/modules/33acrossBidAdapter.js @@ -535,7 +535,7 @@ function _getBidFloors(bidRequest, size, mediaType) { size: [ size.w, size.h ] }); - if (!isNaN(bidFloors.floor) && (bidFloors.currency === CURRENCY)) { + if (!isNaN(bidFloors?.floor) && (bidFloors?.currency === CURRENCY)) { return bidFloors.floor; } } diff --git a/modules/adagioBidAdapter.js b/modules/adagioBidAdapter.js index cb125d4446e..d44c7e249d6 100644 --- a/modules/adagioBidAdapter.js +++ b/modules/adagioBidAdapter.js @@ -313,7 +313,7 @@ function _getFloors(bidRequest) { floors.push(cleanObj({ mt: mediaType, s: isArray(size) ? `${size[0]}x${size[1]}` : undefined, - f: (!isNaN(info.floor) && info.currency === CURRENCY) ? info.floor : undefined + f: (!isNaN(info?.floor) && info?.currency === CURRENCY) ? info?.floor : undefined })); } diff --git a/modules/adfBidAdapter.js b/modules/adfBidAdapter.js index 925c0b3500e..b74c3efc628 100644 --- a/modules/adfBidAdapter.js +++ b/modules/adfBidAdapter.js @@ -75,8 +75,8 @@ export const spec = { mediaType: '*' }) : {}; - const bidfloor = floorInfo.floor; - const bidfloorcur = floorInfo.currency; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; const { mid, inv, mname } = bid.params; const impExtData = bid.ortb2Imp?.ext?.data; diff --git a/modules/admixerBidAdapter.js b/modules/admixerBidAdapter.js index 4deeaee5206..1570a36c5f0 100644 --- a/modules/admixerBidAdapter.js +++ b/modules/admixerBidAdapter.js @@ -133,7 +133,7 @@ function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (_) { return 0; } diff --git a/modules/adotBidAdapter.js b/modules/adotBidAdapter.js index 5167eeb8244..18c7e9265bf 100644 --- a/modules/adotBidAdapter.js +++ b/modules/adotBidAdapter.js @@ -641,7 +641,7 @@ function getFloor(adUnit, size, mediaType, currency) { const floorResult = adUnit.getFloor({ currency, mediaType, size }); - return floorResult.currency === currency ? floorResult.floor : 0; + return floorResult?.currency === currency ? floorResult?.floor : 0; } /** diff --git a/modules/adriverBidAdapter.js b/modules/adriverBidAdapter.js index 5bce315f572..7ac8e4fb728 100644 --- a/modules/adriverBidAdapter.js +++ b/modules/adriverBidAdapter.js @@ -1,5 +1,5 @@ // ADRIVER BID ADAPTER for Prebid 1.13 -import {logInfo, getWindowLocation, _each, getBidIdParameter} from '../src/utils.js'; +import {logInfo, getWindowLocation, _each, getBidIdParameter, isPlainObject} from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { getStorageManager } from '../src/storageManager.js'; @@ -188,12 +188,12 @@ function _getFloor(bid, currencyPar, sizes) { size: isSize ? sizes : '*' }); - if (typeof floorInfo === 'object' && - !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && + !isNaN(parseFloat(floorInfo?.floor))) { floor = floorInfo.floor; } - if (typeof floorInfo === 'object' && floorInfo.currency) { + if (isPlainObject(floorInfo) && floorInfo.currency) { currencyResult = floorInfo.currency; } } diff --git a/modules/adtrgtmeBidAdapter.js b/modules/adtrgtmeBidAdapter.js index c342c2625be..18cbd1e6ae7 100644 --- a/modules/adtrgtmeBidAdapter.js +++ b/modules/adtrgtmeBidAdapter.js @@ -90,7 +90,7 @@ function getFloorModuleData(bid) { mediaType: BANNER, size: '*' }; - return (isFn(bid.getFloor)) ? bid.getFloor(getFloorRequestObject) : false; + return (isFn(bid.getFloor)) ? (bid.getFloor(getFloorRequestObject) || {}) : false; }; function generateOpenRtbObject(bidderRequest, bid) { diff --git a/modules/adyoulikeBidAdapter.js b/modules/adyoulikeBidAdapter.js index 146e1d3b24a..fce5d1ae000 100644 --- a/modules/adyoulikeBidAdapter.js +++ b/modules/adyoulikeBidAdapter.js @@ -255,7 +255,7 @@ function getFloor(bidRequest, size, mediaType) { size: [ size.width, size.height ] }); - if (!isNaN(bidFloors.floor) && (bidFloors.currency === CURRENCY)) { + if (!isNaN(bidFloors?.floor) && (bidFloors?.currency === CURRENCY)) { return bidFloors.floor; } } diff --git a/modules/amxBidAdapter.js b/modules/amxBidAdapter.js index df260958104..508c4d6a0c7 100644 --- a/modules/amxBidAdapter.js +++ b/modules/amxBidAdapter.js @@ -142,7 +142,7 @@ function getFloor(bid) { size: '*', bidRequest: bid, }); - return floor.floor; + return floor?.floor; } catch (e) { logError('call to getFloor failed: ', e); return DEFAULT_MIN_FLOOR; diff --git a/modules/appushBidAdapter.js b/modules/appushBidAdapter.js index 67557aed10c..ec742120582 100644 --- a/modules/appushBidAdapter.js +++ b/modules/appushBidAdapter.js @@ -85,7 +85,7 @@ function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (err) { logError(err); return 0; diff --git a/modules/audiencerunBidAdapter.js b/modules/audiencerunBidAdapter.js index 92a4343b3ed..2e3125e8aa0 100644 --- a/modules/audiencerunBidAdapter.js +++ b/modules/audiencerunBidAdapter.js @@ -47,7 +47,7 @@ function getBidFloor(bid) { mediaType: BANNER, size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (_) { return 0; } diff --git a/modules/axonixBidAdapter.js b/modules/axonixBidAdapter.js index b1ccef155de..2eefb617636 100644 --- a/modules/axonixBidAdapter.js +++ b/modules/axonixBidAdapter.js @@ -21,7 +21,7 @@ function getBidFloor(bidRequest) { }); } - return floorInfo.floor || 0; + return floorInfo?.floor || 0; } function getPageUrl(bidRequest, bidderRequest) { diff --git a/modules/beopBidAdapter.js b/modules/beopBidAdapter.js index 5237f3d7573..103820651fa 100644 --- a/modules/beopBidAdapter.js +++ b/modules/beopBidAdapter.js @@ -3,6 +3,7 @@ import { deepAccess, getBidIdParameter, getValue, isArray, + isPlainObject, logInfo, logWarn, triggerPixel @@ -147,7 +148,7 @@ function beOpRequestSlotsMaker(bid) { let floor; if (typeof bid.getFloor === 'function') { const floorInfo = bid.getFloor({currency: publisherCurrency, mediaType: 'banner', size: [1, 1]}); - if (typeof floorInfo === 'object' && floorInfo.currency === publisherCurrency && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === publisherCurrency && !isNaN(parseFloat(floorInfo.floor))) { floor = parseFloat(floorInfo.floor); } } diff --git a/modules/brightMountainMediaBidAdapter.js b/modules/brightMountainMediaBidAdapter.js index 98b97286631..5e5b062889d 100644 --- a/modules/brightMountainMediaBidAdapter.js +++ b/modules/brightMountainMediaBidAdapter.js @@ -1,4 +1,4 @@ -import { generateUUID, deepAccess, logWarn, deepSetValue } from '../src/utils.js'; +import { generateUUID, deepAccess, logWarn, deepSetValue, isPlainObject } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; import { config } from '../src/config.js'; @@ -224,7 +224,7 @@ function getFloor(bid, size) { size: size, }); - if (typeof floorInfo === 'object' && floorInfo.currency === 'USD') { + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD') { return parseFloat(floorInfo.floor); } } diff --git a/modules/c1xBidAdapter.js b/modules/c1xBidAdapter.js index 79ba8cf499d..d1b51dcb27d 100644 --- a/modules/c1xBidAdapter.js +++ b/modules/c1xBidAdapter.js @@ -185,7 +185,7 @@ function getBidFloor(bidRequest) { } let floor = - floorInfo.floor || + floorInfo?.floor || bidRequest.params.bidfloor || bidRequest.params.floorPriceMap || 0; diff --git a/modules/carodaBidAdapter.js b/modules/carodaBidAdapter.js index 8ec260213b6..a2370a13942 100644 --- a/modules/carodaBidAdapter.js +++ b/modules/carodaBidAdapter.js @@ -184,8 +184,8 @@ function getImps (validBidRequests, common) { const floorInfo = bid.getFloor ? bid.getFloor({ currency: common.currency || 'EUR' }) : {}; - const bidfloor = floorInfo.floor; - const bidfloorcur = floorInfo.currency; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; const { ctok, placementId } = bid.params; const imp = { bid_id: bid.bidId, diff --git a/modules/connatixBidAdapter.js b/modules/connatixBidAdapter.js index aeadd2d1cd9..ea02b49d8ed 100644 --- a/modules/connatixBidAdapter.js +++ b/modules/connatixBidAdapter.js @@ -57,7 +57,7 @@ export function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (err) { logError(err); return 0; diff --git a/modules/connectadBidAdapter.js b/modules/connectadBidAdapter.js index 6789c937afb..982bff22585 100644 --- a/modules/connectadBidAdapter.js +++ b/modules/connectadBidAdapter.js @@ -243,7 +243,7 @@ function getBidFloor(bidRequest) { }); } - let floor = floorInfo.floor || bidRequest.params.bidfloor || bidRequest.params.floorprice || 0; + let floor = floorInfo?.floor || bidRequest.params.bidfloor || bidRequest.params.floorprice || 0; return floor; } diff --git a/modules/dailyhuntBidAdapter.js b/modules/dailyhuntBidAdapter.js index f96e07b71bf..fd7a5c137a7 100644 --- a/modules/dailyhuntBidAdapter.js +++ b/modules/dailyhuntBidAdapter.js @@ -129,7 +129,7 @@ const createOrtbPublisherObj = (validBidRequests) => ({ ...extractKeyInfo(validB // get bidFloor Function for different creatives function getBidFloor(bid, creative) { let floorInfo = typeof (bid.getFloor) == 'function' ? bid.getFloor({ currency: 'USD', mediaType: creative, size: '*' }) : {}; - return Math.floor(floorInfo.floor || (bid.params.bidfloor ? bid.params.bidfloor : 0.0)); + return Math.floor(floorInfo?.floor || (bid.params.bidfloor ? bid.params.bidfloor : 0.0)); } const createOrtbImpObj = (bid) => { diff --git a/modules/deltaprojectsBidAdapter.js b/modules/deltaprojectsBidAdapter.js index 15e94a5bc36..bf5489322c9 100644 --- a/modules/deltaprojectsBidAdapter.js +++ b/modules/deltaprojectsBidAdapter.js @@ -229,7 +229,7 @@ export function getBidFloor(bid, mediaType, size, currency) { if (isFn(bid.getFloor)) { const bidFloorCurrency = currency || 'USD'; const bidFloor = bid.getFloor({currency: bidFloorCurrency, mediaType: mediaType, size: size}); - if (isNumber(bidFloor.floor)) { + if (isNumber(bidFloor?.floor)) { return bidFloor; } } diff --git a/modules/dianomiBidAdapter.js b/modules/dianomiBidAdapter.js index 3ae8b4d6b80..777878b5207 100644 --- a/modules/dianomiBidAdapter.js +++ b/modules/dianomiBidAdapter.js @@ -128,8 +128,8 @@ export const spec = { currency: currency || 'USD', }) : {}; - const bidfloor = floorInfo.floor; - const bidfloorcur = floorInfo.currency; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; const { smartadId } = bid.params; const imp = { diff --git a/modules/eplanningBidAdapter.js b/modules/eplanningBidAdapter.js index d57804c04e6..1fe5cb09c10 100644 --- a/modules/eplanningBidAdapter.js +++ b/modules/eplanningBidAdapter.js @@ -274,7 +274,7 @@ function getFloorStr(bid) { currency: DOLLAR_CODE, mediaType: '*', size: '*' - }); + }) || {}; if (bidFloor.floor) { return '|' + encodeURIComponent(bidFloor.floor); diff --git a/modules/freewheel-sspBidAdapter.js b/modules/freewheel-sspBidAdapter.js index 0ac848bf62a..fc85edc483b 100644 --- a/modules/freewheel-sspBidAdapter.js +++ b/modules/freewheel-sspBidAdapter.js @@ -231,7 +231,7 @@ function getBidFloor(bid, config) { mediaType: typeof bid.mediaTypes['banner'] == 'object' ? 'banner' : 'video', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } catch (e) { return -1; } diff --git a/modules/getintentBidAdapter.js b/modules/getintentBidAdapter.js index a8888893333..67a0e1e91be 100644 --- a/modules/getintentBidAdapter.js +++ b/modules/getintentBidAdapter.js @@ -152,7 +152,7 @@ function getBidFloor(bidRequest, currency) { currency: currency || DEFAULT_CURRENCY, mediaType: bidRequest.mediaType, size: bidRequest.sizes || '*' - }); + }) || {}; } return { diff --git a/modules/gridBidAdapter.js b/modules/gridBidAdapter.js index 8d10a0f18d2..4f3dfb94747 100644 --- a/modules/gridBidAdapter.js +++ b/modules/gridBidAdapter.js @@ -7,7 +7,8 @@ import { mergeDeep, logWarn, isNumber, - isStr + isStr, + isPlainObject } from '../src/utils.js'; import { ajax } from '../src/ajax.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; @@ -508,7 +509,7 @@ function _getFloor (mediaTypes, bid) { size: bid.sizes.map(([w, h]) => ({w, h})) }); - if (typeof floorInfo === 'object' && + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { floor = Math.max(floor, parseFloat(floorInfo.floor)); diff --git a/modules/gumgumBidAdapter.js b/modules/gumgumBidAdapter.js index dbfdbef2e91..2911522c89b 100644 --- a/modules/gumgumBidAdapter.js +++ b/modules/gumgumBidAdapter.js @@ -233,7 +233,7 @@ function _getFloor(mediaTypes, staticBidFloor, bid) { const { currency, floor } = bid.getFloor({ mediaType: curMediaType, size: '*' - }); + }) || {}; floor && (bidFloor.floor = floor); currency && (bidFloor.currency = currency); diff --git a/modules/impactifyBidAdapter.js b/modules/impactifyBidAdapter.js index 79522f4a089..fcd9360d973 100644 --- a/modules/impactifyBidAdapter.js +++ b/modules/impactifyBidAdapter.js @@ -1,6 +1,6 @@ 'use strict'; -import { deepAccess, deepSetValue, generateUUID } from '../src/utils.js'; +import { deepAccess, deepSetValue, generateUUID, isPlainObject } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { config } from '../src/config.js'; import { ajax } from '../src/ajax.js'; @@ -98,7 +98,7 @@ const helpers = { mediaType: '*', size: '*' }); - if (typeof floorInfo === 'object' && floorInfo.currency === DEFAULT_CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === DEFAULT_CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { return parseFloat(floorInfo.floor); } return null; diff --git a/modules/kargoBidAdapter.js b/modules/kargoBidAdapter.js index 46ad7dfec71..9416e6a0411 100644 --- a/modules/kargoBidAdapter.js +++ b/modules/kargoBidAdapter.js @@ -1,4 +1,4 @@ -import { _each, isEmpty, buildUrl, deepAccess, pick, logError } from '../src/utils.js'; +import { _each, isEmpty, buildUrl, deepAccess, pick, logError, isPlainObject } from '../src/utils.js'; import { config } from '../src/config.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { getStorageManager } from '../src/storageManager.js'; @@ -526,7 +526,7 @@ function getImpression(bid) { } catch (e) { logError('Kargo: getFloor threw an error: ', e); } - imp.floor = typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; + imp.floor = isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; } } diff --git a/modules/koblerBidAdapter.js b/modules/koblerBidAdapter.js index 3ef40c8a921..54e70686fcc 100644 --- a/modules/koblerBidAdapter.js +++ b/modules/koblerBidAdapter.js @@ -163,7 +163,7 @@ function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) { function buildOpenRtbImpObject(validBidRequest) { const sizes = getSizes(validBidRequest); const mainSize = sizes[0]; - const floorInfo = getFloorInfo(validBidRequest, mainSize); + const floorInfo = getFloorInfo(validBidRequest, mainSize) || {}; return { id: validBidRequest.bidId, diff --git a/modules/kubientBidAdapter.js b/modules/kubientBidAdapter.js index 57cbe6acd07..8ccfa4ab059 100644 --- a/modules/kubientBidAdapter.js +++ b/modules/kubientBidAdapter.js @@ -1,4 +1,4 @@ -import { isArray, deepAccess } from '../src/utils.js'; +import { isArray, deepAccess, isPlainObject } from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import { config } from '../src/config.js'; @@ -33,7 +33,7 @@ export const spec = { const mediaType = (Object.keys(bid.mediaTypes).length == 1) ? Object.keys(bid.mediaTypes)[0] : '*'; const sizes = bid.sizes || '*'; const floorInfo = bid.getFloor({currency: 'USD', mediaType: mediaType, size: sizes}); - if (typeof floorInfo === 'object' && floorInfo.currency === 'USD') { + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD') { let floor = parseFloat(floorInfo.floor) if (!isNaN(floor) && floor > 0) { adSlot.floor = parseFloat(floorInfo.floor); diff --git a/modules/kueezBidAdapter.js b/modules/kueezBidAdapter.js index 63a01bfea02..f11d71f3318 100644 --- a/modules/kueezBidAdapter.js +++ b/modules/kueezBidAdapter.js @@ -155,7 +155,7 @@ function getFloorPrice(bid, mediaType) { currency: MAIN_CURRENCY, mediaType: mediaType, size: '*' - }); + }) || {}; floor = floorResult.currency === MAIN_CURRENCY && floorResult.floor ? floorResult.floor : 0; } diff --git a/modules/lemmaDigitalBidAdapter.js b/modules/lemmaDigitalBidAdapter.js index dde7c25d9b9..f2d677f14db 100644 --- a/modules/lemmaDigitalBidAdapter.js +++ b/modules/lemmaDigitalBidAdapter.js @@ -295,7 +295,7 @@ export var spec = { [BANNER, VIDEO].forEach(mediaType => { if (impObj.hasOwnProperty(mediaType)) { let floorInfo = bid.getFloor({ currency: impObj.bidfloorcur, mediaType: mediaType, size: '*' }); - if (typeof floorInfo === 'object' && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { + if (utils.isPlainObject(floorInfo) && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { let mediaTypeFloor = parseFloat(floorInfo.floor); bidFloor = (bidFloor == -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor)); } diff --git a/modules/luponmediaBidAdapter.js b/modules/luponmediaBidAdapter.js index 447257f97da..63435437967 100755 --- a/modules/luponmediaBidAdapter.js +++ b/modules/luponmediaBidAdapter.js @@ -6,6 +6,7 @@ import { isArray, isEmpty, isFn, + isPlainObject, logError, logMessage, logWarn, @@ -320,7 +321,7 @@ function newOrtbBidRequest(bidRequest, bidderRequest, currentImps) { } catch (e) { logError('LuponMedia: getFloor threw an error: ', e); } - bidFloor = typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? parseFloat(floorInfo.floor) : undefined; + bidFloor = isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? parseFloat(floorInfo.floor) : undefined; } else { bidFloor = parseFloat(deepAccess(bidRequest, 'params.floor')); } diff --git a/modules/marsmediaBidAdapter.js b/modules/marsmediaBidAdapter.js index 82a25af60d1..1d322a23a77 100644 --- a/modules/marsmediaBidAdapter.js +++ b/modules/marsmediaBidAdapter.js @@ -1,6 +1,6 @@ 'use strict'; -import { deepAccess, getDNT, parseSizesInput, isArray, getWindowTop, deepSetValue, triggerPixel, getWindowSelf } from '../src/utils.js'; +import { deepAccess, getDNT, parseSizesInput, isArray, getWindowTop, deepSetValue, triggerPixel, getWindowSelf, isPlainObject } from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; import {config} from '../src/config.js'; @@ -341,7 +341,7 @@ function MarsmediaAdapter() { size: '*' }); - if (typeof floorInfo === 'object' && + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { floor = floorInfo.floor; diff --git a/modules/mediakeysBidAdapter.js b/modules/mediakeysBidAdapter.js index 987b2689f6b..efe9eb90256 100644 --- a/modules/mediakeysBidAdapter.js +++ b/modules/mediakeysBidAdapter.js @@ -11,6 +11,7 @@ import { isFn, isInteger, isNumber, + isPlainObject, isStr, logError, logWarn, @@ -139,7 +140,7 @@ function getFloor(bid, mediaType, size = '*') { size }) - return (!isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) ? floor.floor : false + return (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) ? floor.floor : false } /** diff --git a/modules/medianetBidAdapter.js b/modules/medianetBidAdapter.js index 0c43b04f53c..5adf3f743a7 100644 --- a/modules/medianetBidAdapter.js +++ b/modules/medianetBidAdapter.js @@ -291,7 +291,7 @@ function getBidFloorByType(bidRequest) { return floorInfo; } function setFloorInfo(bidRequest, mediaType, size, floorInfo) { - let floor = bidRequest.getFloor({currency: 'USD', mediaType: mediaType, size: size}); + let floor = bidRequest.getFloor({currency: 'USD', mediaType: mediaType, size: size}) || {}; if (size.length > 1) floor.size = size; floor.mediaType = mediaType; floorInfo.push(floor); diff --git a/modules/mediasniperBidAdapter.js b/modules/mediasniperBidAdapter.js index 5cf0ceaba18..796a15e1778 100644 --- a/modules/mediasniperBidAdapter.js +++ b/modules/mediasniperBidAdapter.js @@ -7,6 +7,7 @@ import { isEmpty, isFn, isNumber, + isPlainObject, isStr, logError, logMessage, @@ -262,7 +263,7 @@ function getFloor(bid, mediaType, size = '*') { size, }); - return !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY + return isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY ? floor.floor : false; } diff --git a/modules/missenaBidAdapter.js b/modules/missenaBidAdapter.js index 0069bf052ba..e621e478ce7 100644 --- a/modules/missenaBidAdapter.js +++ b/modules/missenaBidAdapter.js @@ -41,7 +41,7 @@ function getFloor(bidRequest) { mediaType: BANNER, }); - if (!isNaN(bidFloors.floor)) { + if (!isNaN(bidFloors?.floor)) { return bidFloors; } } diff --git a/modules/nativoBidAdapter.js b/modules/nativoBidAdapter.js index c945619c667..bdd0fa7e054 100644 --- a/modules/nativoBidAdapter.js +++ b/modules/nativoBidAdapter.js @@ -609,7 +609,7 @@ export function parseFloorPriceData(bidRequest) { size, }) // Save the data and track the sizes - mediaTypeFloorPriceData[sizeToString(size)] = priceFloorData.floor + mediaTypeFloorPriceData[sizeToString(size)] = priceFloorData?.floor sizeOptions.add(size) }) bidRequestFloorPriceData[mediaType] = mediaTypeFloorPriceData @@ -617,7 +617,7 @@ export function parseFloorPriceData(bidRequest) { // Get floor price of current media type with a wildcard size const sizeWildcardFloor = getSizeWildcardPrice(bidRequest, mediaType) // Save the wildcard floor price if it was retrieved successfully - if (sizeWildcardFloor.floor > 0) { + if (sizeWildcardFloor?.floor > 0) { mediaTypeFloorPriceData['*'] = sizeWildcardFloor.floor } }) diff --git a/modules/nextMillenniumBidAdapter.js b/modules/nextMillenniumBidAdapter.js index 8cf20848675..112f0d68504 100644 --- a/modules/nextMillenniumBidAdapter.js +++ b/modules/nextMillenniumBidAdapter.js @@ -419,8 +419,8 @@ function getCurrency(bid = {}) { if (typeof bid.getFloor === 'function') { let floorInfo = bid.getFloor({currency, mediaType, size: '*'}); - mediaTypes[mediaType].bidfloorcur = floorInfo.currency; - mediaTypes[mediaType].bidfloor = floorInfo.floor; + mediaTypes[mediaType].bidfloorcur = floorInfo?.currency; + mediaTypes[mediaType].bidfloor = floorInfo?.floor; } else { mediaTypes[mediaType].bidfloorcur = currency; }; diff --git a/modules/nobidBidAdapter.js b/modules/nobidBidAdapter.js index 4865ea3bc9c..7cacac819c1 100644 --- a/modules/nobidBidAdapter.js +++ b/modules/nobidBidAdapter.js @@ -231,7 +231,7 @@ function nobidBuildRequests(bids, bidderRequest) { return adunits; } function getFloor (bid) { - if (bid && typeof bid.getFloor === 'function' && bid.getFloor().floor) { + if (bid && typeof bid.getFloor === 'function' && bid.getFloor()?.floor) { return bid.getFloor().floor; } return null; diff --git a/modules/oguryBidAdapter.js b/modules/oguryBidAdapter.js index c33fccdbac9..ecf512f11d3 100644 --- a/modules/oguryBidAdapter.js +++ b/modules/oguryBidAdapter.js @@ -1,7 +1,7 @@ 'use strict'; import {BANNER} from '../src/mediaTypes.js'; -import {getWindowSelf, getWindowTop, isFn, logWarn, deepAccess} from '../src/utils.js'; +import {getWindowSelf, getWindowTop, isFn, logWarn, deepAccess, isPlainObject} from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {ajax} from '../src/ajax.js'; import {getAdUnitSizes} from '../libraries/sizeUtils/sizeUtils.js'; @@ -211,7 +211,7 @@ function getFloor(bid) { mediaType: 'banner', size: '*' }); - return floorResult.currency === 'USD' ? floorResult.floor : 0; + return (isPlainObject(floorResult) && floorResult.currency === 'USD') ? floorResult.floor : 0; } function getWindowContext() { diff --git a/modules/onetagBidAdapter.js b/modules/onetagBidAdapter.js index 8ddcb2c3980..8bf326b4848 100644 --- a/modules/onetagBidAdapter.js +++ b/modules/onetagBidAdapter.js @@ -411,7 +411,7 @@ function getBidFloor(bidRequest, mediaType, sizes) { currency: 'EUR', mediaType: mediaType || '*', size: [size.width, size.height] - }); + }) || {}; floor.size = deepClone(size); if (!floor.floor) { floor.floor = null; } priceFloors.push(floor); diff --git a/modules/optidigitalBidAdapter.js b/modules/optidigitalBidAdapter.js index 396131fd8aa..f8dea0f5a92 100755 --- a/modules/optidigitalBidAdapter.js +++ b/modules/optidigitalBidAdapter.js @@ -1,6 +1,6 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER} from '../src/mediaTypes.js'; -import {deepAccess, parseSizesInput} from '../src/utils.js'; +import {deepAccess, isPlainObject, parseSizesInput} from '../src/utils.js'; import {getAdUnitSizes} from '../libraries/sizeUtils/sizeUtils.js'; /** @@ -247,7 +247,7 @@ function _getFloor (bid, sizes, currency) { mediaType: 'banner', size: size }); - if (typeof floorInfo === 'object' && floorInfo.currency === CUR && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === CUR && !isNaN(parseFloat(floorInfo.floor))) { floor = parseFloat(floorInfo.floor); } } catch (err) {} diff --git a/modules/outbrainBidAdapter.js b/modules/outbrainBidAdapter.js index 5ce514a46d7..f626b2485d1 100644 --- a/modules/outbrainBidAdapter.js +++ b/modules/outbrainBidAdapter.js @@ -5,7 +5,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import { getStorageManager } from '../src/storageManager.js'; import {OUTSTREAM} from '../src/video.js'; -import {_map, deepAccess, deepSetValue, logWarn, replaceAuctionPrice, setOnAny, parseGPTSingleSizeArrayToRtbSize} from '../src/utils.js'; +import {_map, deepAccess, deepSetValue, logWarn, replaceAuctionPrice, setOnAny, parseGPTSingleSizeArrayToRtbSize, isPlainObject} from '../src/utils.js'; import {ajax} from '../src/ajax.js'; import {config} from '../src/config.js'; import {convertOrtbRequestToProprietaryNative} from '../src/native.js'; @@ -353,7 +353,7 @@ function _getFloor(bid, type) { mediaType: type, size: '*' }); - if (typeof floorInfo === 'object' && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { return parseFloat(floorInfo.floor); } return null; diff --git a/modules/ozoneBidAdapter.js b/modules/ozoneBidAdapter.js index d3ba7fc0792..d554c0afeda 100644 --- a/modules/ozoneBidAdapter.js +++ b/modules/ozoneBidAdapter.js @@ -494,13 +494,13 @@ export const spec = { logInfo('getFloorObjectForAuction mediaTypesSizes : ', mediaTypesSizes); let ret = {}; if (mediaTypesSizes.banner) { - ret.banner = bidRequestRef.getFloor({mediaType: 'banner', currency: 'USD', size: mediaTypesSizes.banner}); + ret.banner = bidRequestRef.getFloor({mediaType: 'banner', currency: 'USD', size: mediaTypesSizes.banner}) || {}; } if (mediaTypesSizes.video) { - ret.video = bidRequestRef.getFloor({mediaType: 'video', currency: 'USD', size: mediaTypesSizes.video}); + ret.video = bidRequestRef.getFloor({mediaType: 'video', currency: 'USD', size: mediaTypesSizes.video}) || {}; } if (mediaTypesSizes.native) { - ret.native = bidRequestRef.getFloor({mediaType: 'native', currency: 'USD', size: mediaTypesSizes.native}); + ret.native = bidRequestRef.getFloor({mediaType: 'native', currency: 'USD', size: mediaTypesSizes.native}) || {}; } logInfo('getFloorObjectForAuction returning : ', deepClone(ret)); return ret; diff --git a/modules/priceFloors.js b/modules/priceFloors.js index 5df8f938c3d..54353a15c4e 100644 --- a/modules/priceFloors.js +++ b/modules/priceFloors.js @@ -270,6 +270,10 @@ export function getFloor(requestParams = {currency: 'USD', mediaType: '*', size: } } + if (floorInfo.floorRuleValue === null) { + return null; + } + if (floorInfo.matchingFloor) { return { floor: roundUp(floorInfo.matchingFloor, 4), @@ -467,7 +471,7 @@ function isValidRule(key, floor, numFields, delimiter) { if (typeof key !== 'string' || key.split(delimiter).length !== numFields) { return false; } - return typeof floor === 'number'; + return typeof floor === 'number' || floor === null; } function validateRules(floorsData, numFields, delimiter) { @@ -827,7 +831,7 @@ export function setOrtbImpBidFloor(imp, bidRequest, context) { currency: context.currency || config.getConfig('currency.adServerCurrency') || 'USD', mediaType: context.mediaType || '*', size: '*' - })); + }) || {}); } catch (e) { logWarn('Cannot compute floor for bid', bidRequest); return; diff --git a/modules/pubgeniusBidAdapter.js b/modules/pubgeniusBidAdapter.js index 617123746e5..19260e65e60 100644 --- a/modules/pubgeniusBidAdapter.js +++ b/modules/pubgeniusBidAdapter.js @@ -194,7 +194,7 @@ function buildImp(bid) { mediaType: bid.mediaTypes.banner ? 'banner' : 'video', size: '*', currency: 'USD', - }); + }) || {}; if (floor) { imp.bidfloor = floor; diff --git a/modules/pubmaticBidAdapter.js b/modules/pubmaticBidAdapter.js index 8952d8d1852..ab83cfdf88a 100644 --- a/modules/pubmaticBidAdapter.js +++ b/modules/pubmaticBidAdapter.js @@ -833,7 +833,7 @@ function _addFloorFromFloorModule(impObj, bid) { sizesArray.forEach(size => { let floorInfo = bid.getFloor({ currency: impObj.bidfloorcur, mediaType: mediaType, size: size }); logInfo(LOG_WARN_PREFIX, 'floor from floor module returned for mediatype:', mediaType, ' and size:', size, ' is: currency', floorInfo.currency, 'floor', floorInfo.floor); - if (typeof floorInfo === 'object' && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { let mediaTypeFloor = parseFloat(floorInfo.floor); logInfo(LOG_WARN_PREFIX, 'floor from floor module:', mediaTypeFloor, 'previous floor value', bidFloor, 'Min:', Math.min(mediaTypeFloor, bidFloor)); if (bidFloor === -1) { diff --git a/modules/pubwiseBidAdapter.js b/modules/pubwiseBidAdapter.js index 639a39d4636..df31dde127b 100644 --- a/modules/pubwiseBidAdapter.js +++ b/modules/pubwiseBidAdapter.js @@ -1,5 +1,5 @@ -import { _each, isBoolean, isEmptyStr, isNumber, isStr, deepClone, isArray, deepSetValue, inIframe, mergeDeep, deepAccess, logMessage, logInfo, logWarn, logError } from '../src/utils.js'; +import { _each, isBoolean, isEmptyStr, isNumber, isStr, deepClone, isArray, deepSetValue, inIframe, mergeDeep, deepAccess, logMessage, logInfo, logWarn, logError, isPlainObject } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'; import { config } from '../src/config.js'; @@ -667,7 +667,7 @@ function _addFloorFromFloorModule(impObj, bid) { [BANNER, VIDEO, NATIVE].forEach(mediaType => { if (impObj.hasOwnProperty(mediaType)) { let floorInfo = bid.getFloor({ currency: impObj.bidFloorCur, mediaType: mediaType, size: '*' }); - if (typeof floorInfo === 'object' && floorInfo.currency === impObj.bidFloorCur && !isNaN(parseInt(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === impObj.bidFloorCur && !isNaN(parseInt(floorInfo.floor))) { let mediaTypeFloor = parseFloat(floorInfo.floor); bidFloor = (bidFloor == -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor)) } diff --git a/modules/readpeakBidAdapter.js b/modules/readpeakBidAdapter.js index 4ff51aeb43e..da3153c0b68 100644 --- a/modules/readpeakBidAdapter.js +++ b/modules/readpeakBidAdapter.js @@ -136,7 +136,7 @@ function impression(slot) { mediaType: 'native', size: '\*' }); - bidFloorFromModule = floorInfo.currency === 'USD' ? floorInfo.floor : undefined; + bidFloorFromModule = floorInfo?.currency === 'USD' ? floorInfo?.floor : undefined; } const imp = { id: slot.bidId, diff --git a/modules/resetdigitalBidAdapter.js b/modules/resetdigitalBidAdapter.js index 1fe4b4d750c..4f1ebafdf9c 100644 --- a/modules/resetdigitalBidAdapter.js +++ b/modules/resetdigitalBidAdapter.js @@ -1,4 +1,4 @@ -import { timestamp, deepAccess, isStr, deepClone } from '../src/utils.js'; +import { timestamp, deepAccess, isStr, deepClone, isPlainObject } from '../src/utils.js'; import { getOrigin } from '../libraries/getOrigin/index.js'; import { config } from '../src/config.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; @@ -92,7 +92,7 @@ export const spec = { size: '*', }); if ( - typeof floorInfo === 'object' && + isPlainObject(floorInfo) && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor)) ) { diff --git a/modules/revcontentBidAdapter.js b/modules/revcontentBidAdapter.js index f1d5521f780..ce04e3aa822 100644 --- a/modules/revcontentBidAdapter.js +++ b/modules/revcontentBidAdapter.js @@ -207,7 +207,7 @@ function buildImp(bid, id) { currency: 'USD', mediaType: '*', size: '*' - }).floor; + })?.floor; } else { bidfloor = deepAccess(bid, `params.bidfloor`) || 0.1; } diff --git a/modules/rtbhouseBidAdapter.js b/modules/rtbhouseBidAdapter.js index bcc076f1781..74a4df14f6f 100644 --- a/modules/rtbhouseBidAdapter.js +++ b/modules/rtbhouseBidAdapter.js @@ -215,7 +215,7 @@ function applyFloor(slot) { if (typeof slot.getFloor === 'function') { Object.keys(slot.mediaTypes).forEach(type => { if (includes(SUPPORTED_MEDIA_TYPES, type)) { - floors.push(slot.getFloor({ currency: DEFAULT_CURRENCY_ARR[0], mediaType: type, size: slot.sizes || '*' }).floor); + floors.push(slot.getFloor({ currency: DEFAULT_CURRENCY_ARR[0], mediaType: type, size: slot.sizes || '*' })?.floor); } }); } diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js index 7bcc7bbd69b..411e194b1ee 100644 --- a/modules/rubiconBidAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -18,7 +18,8 @@ import { mergeDeep, parseSizesInput, pick, - _each + _each, + isPlainObject } from '../src/utils.js'; import {getAllOrtbKeywords} from '../libraries/keywords/keywords.js'; import {getUserSyncParams} from '../libraries/userSyncUtils/userSyncUtils.js'; @@ -520,7 +521,7 @@ export const spec = { } catch (e) { logError('Rubicon: getFloor threw an error: ', e); } - data['rp_hard_floor'] = typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; + data['rp_hard_floor'] = isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; } // Send multiformat data if requested diff --git a/modules/seedtagBidAdapter.js b/modules/seedtagBidAdapter.js index 4cde02c690e..ad579f1cdbf 100644 --- a/modules/seedtagBidAdapter.js +++ b/modules/seedtagBidAdapter.js @@ -47,7 +47,7 @@ function getBidFloor(bidRequest) { }); } - return floorInfo.floor; + return floorInfo?.floor; } const getConnectionType = () => { diff --git a/modules/sharethroughBidAdapter.js b/modules/sharethroughBidAdapter.js index 4096d0320e9..7144370dc9c 100644 --- a/modules/sharethroughBidAdapter.js +++ b/modules/sharethroughBidAdapter.js @@ -1,7 +1,7 @@ import { registerBidder } from '../src/adapters/bidderFactory.js'; import { config } from '../src/config.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; -import { deepAccess, generateUUID, inIframe, logWarn, mergeDeep } from '../src/utils.js'; +import { deepAccess, generateUUID, inIframe, isPlainObject, logWarn, mergeDeep } from '../src/utils.js'; const VERSION = '4.3.0'; const BIDDER_CODE = 'sharethrough'; @@ -285,7 +285,7 @@ function getBidRequestFloor(bid) { mediaType: bid.mediaTypes && bid.mediaTypes.video ? 'video' : 'banner', size: bid.sizes.map((size) => ({ w: size[0], h: size[1] })), }); - if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { floor = parseFloat(floorInfo.floor); } } diff --git a/modules/silverpushBidAdapter.js b/modules/silverpushBidAdapter.js index 1d5662f88eb..593e613d603 100644 --- a/modules/silverpushBidAdapter.js +++ b/modules/silverpushBidAdapter.js @@ -259,7 +259,7 @@ function getBidFloor(bid) { mediaType: '*', size: '*', }); - return bidFloor.floor; + return bidFloor?.floor; } function _renderer(bid) { diff --git a/modules/sovrnBidAdapter.js b/modules/sovrnBidAdapter.js index 5478f9aa6e5..d4e53c00472 100644 --- a/modules/sovrnBidAdapter.js +++ b/modules/sovrnBidAdapter.js @@ -373,7 +373,7 @@ function _getBidFloors(bid) { mediaType: bid.mediaTypes && bid.mediaTypes.banner ? 'banner' : 'video', size: '*' }) : {} - const floorModuleValue = parseFloat(floorInfo.floor) + const floorModuleValue = parseFloat(floorInfo?.floor) if (!isNaN(floorModuleValue)) { return floorModuleValue } diff --git a/modules/sspBCBidAdapter.js b/modules/sspBCBidAdapter.js index e05c9db6303..ba9af3314b0 100644 --- a/modules/sspBCBidAdapter.js +++ b/modules/sspBCBidAdapter.js @@ -261,18 +261,18 @@ const getHighestFloor = (slot) => { mediaType: 'banner', size: next, currency - }); + }) || {}; return prev > currentFloor ? prev : currentFloor; }, 0); } const { floor: nativeFloor = 0 } = slot.getFloor({ mediaType: 'native', currency - }); + }) || {}; const { floor: videoFloor = 0 } = slot.getFloor({ mediaType: 'video', currency - }); + }) || {}; result.floor = Math.max(bannerFloor, nativeFloor, videoFloor); } diff --git a/modules/stroeerCoreBidAdapter.js b/modules/stroeerCoreBidAdapter.js index 5630cfe006f..5a492a8e5e0 100644 --- a/modules/stroeerCoreBidAdapter.js +++ b/modules/stroeerCoreBidAdapter.js @@ -253,14 +253,14 @@ const createFloorPriceObject = (mediaType, sizes, bidRequest) => { currency: 'EUR', mediaType: mediaType, size: '*' - }); + }) || {}; const sizeFloors = sizes.map(size => { const floor = bidRequest.getFloor({ currency: 'EUR', mediaType: mediaType, size: [size[0], size[1]] - }); + }) || {}; return {...floor, size}; }); diff --git a/modules/taboolaBidAdapter.js b/modules/taboolaBidAdapter.js index 5fa7f2c8b8e..da7559ef144 100644 --- a/modules/taboolaBidAdapter.js +++ b/modules/taboolaBidAdapter.js @@ -3,7 +3,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER} from '../src/mediaTypes.js'; import {config} from '../src/config.js'; -import {deepAccess, deepSetValue, getWindowSelf, replaceAuctionPrice, isArray, safeJSONParse} from '../src/utils.js'; +import {deepAccess, deepSetValue, getWindowSelf, replaceAuctionPrice, isArray, safeJSONParse, isPlainObject} from '../src/utils.js'; import {getStorageManager} from '../src/storageManager.js'; import {ajax} from '../src/ajax.js'; import {ortbConverter} from '../libraries/ortbConverter/converter.js'; @@ -338,7 +338,7 @@ function fillTaboolaImpData(bid, imp) { currency: CURRENCY, size: '*' }); - if (typeof floorInfo === 'object' && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { imp.bidfloor = parseFloat(floorInfo.floor); imp.bidfloorcur = CURRENCY; } diff --git a/modules/tripleliftBidAdapter.js b/modules/tripleliftBidAdapter.js index a665de6140f..0c8bd330e11 100644 --- a/modules/tripleliftBidAdapter.js +++ b/modules/tripleliftBidAdapter.js @@ -255,7 +255,7 @@ function _getFloor (bid) { mediaType: _isVideoBidRequest(bid) ? 'video' : 'banner', size: '*' }); - if (typeof floorInfo === 'object' && + if (utils.isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { floor = parseFloat(floorInfo.floor); } diff --git a/modules/ucfunnelBidAdapter.js b/modules/ucfunnelBidAdapter.js index 19b933a8666..d5017db0705 100644 --- a/modules/ucfunnelBidAdapter.js +++ b/modules/ucfunnelBidAdapter.js @@ -235,7 +235,7 @@ function getFloor(bid, size, mediaTypes) { mediaType: getMediaType(mediaTypes), size: (size) ? [ size[0], size[1] ] : '*', }); - if (bidFloor.currency === CURRENCY) { + if (bidFloor?.currency === CURRENCY) { return bidFloor.floor; } } diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js index 39d77c81b57..53e6629d8cc 100644 --- a/modules/unrulyBidAdapter.js +++ b/modules/unrulyBidAdapter.js @@ -31,7 +31,7 @@ const addBidFloorInfo = (validBid) => { currency: 'USD', mediaType: key, size: '*' - }).floor || 0; + })?.floor || 0; } else { floor = validBid.params.floor || 0; } diff --git a/modules/videobyteBidAdapter.js b/modules/videobyteBidAdapter.js index b62474d0c25..c34d3ecb097 100644 --- a/modules/videobyteBidAdapter.js +++ b/modules/videobyteBidAdapter.js @@ -214,8 +214,8 @@ function buildRequestData(bidRequest, bidderRequest) { id: '1', video: video, secure: isSecure() ? 1 : 0, - bidfloor: floorData.floor, - bidfloorcur: floorData.currency + bidfloor: floorData?.floor, + bidfloorcur: floorData?.currency } ], site: { diff --git a/modules/vidoomyBidAdapter.js b/modules/vidoomyBidAdapter.js index c9ac9fae0f4..9f341b42ff5 100644 --- a/modules/vidoomyBidAdapter.js +++ b/modules/vidoomyBidAdapter.js @@ -1,4 +1,4 @@ -import {deepAccess, logError, parseSizesInput} from '../src/utils.js'; +import {deepAccess, isPlainObject, logError, parseSizesInput} from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {config} from '../src/config.js'; @@ -88,7 +88,7 @@ function getBidFloor(bid, mediaType, sizes, bidfloor) { var size = sizes && sizes.length > 0 ? sizes[0] : '*'; if (typeof bid.getFloor === 'function') { const floorInfo = bid.getFloor({currency: 'USD', mediaType, size}); - if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + if (isPlainObject(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { floor = Math.max(bidfloor, parseFloat(floorInfo.floor)); } } diff --git a/modules/yahooAdsBidAdapter.js b/modules/yahooAdsBidAdapter.js index eec5420ec6c..7622a5b7587 100644 --- a/modules/yahooAdsBidAdapter.js +++ b/modules/yahooAdsBidAdapter.js @@ -346,7 +346,7 @@ function appendImpObject(bid, openRtbObject) { const impObject = { id: bid.bidId, secure: isSecure(bid), - bidfloor: getFloorModuleData(bid).floor || deepAccess(bid, 'params.bidOverride.imp.bidfloor') + bidfloor: getFloorModuleData(bid)?.floor || deepAccess(bid, 'params.bidOverride.imp.bidfloor') }; if (bid.mediaTypes.banner && (typeof mediaTypeMode === 'undefined' || mediaTypeMode === BANNER || mediaTypeMode === '*')) { diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js index 67a34ae4870..9be01096084 100644 --- a/modules/yieldlabBidAdapter.js +++ b/modules/yieldlabBidAdapter.js @@ -555,7 +555,7 @@ function getBidFloor(bid, sizes) { mediaType: mediaType !== undefined && spec.supportedMediaTypes.includes(mediaType) ? mediaType : '*', size: sizes.length !== 1 ? '*' : sizes[0].split(DIMENSION_SIGN), }); - if (floor.currency === CURRENCY_CODE) { + if (floor?.currency === CURRENCY_CODE) { return (floor.floor * 100).toFixed(0); } return undefined; diff --git a/test/spec/modules/priceFloors_spec.js b/test/spec/modules/priceFloors_spec.js index ceb3446b570..41f1609f74f 100644 --- a/test/spec/modules/priceFloors_spec.js +++ b/test/spec/modules/priceFloors_spec.js @@ -2401,3 +2401,87 @@ describe('the price floors module', function () { }) }); }); + +describe('setting null as rule value', () => { + const nullFloorData = { + modelVersion: 'basic model', + modelWeight: 10, + modelTimestamp: 1606772895, + currency: 'USD', + schema: { + delimiter: '|', + fields: ['mediaType', 'size'] + }, + values: { + 'banner|600x300': null, + } + }; + + const basicBidRequest = { + bidder: 'rubicon', + adUnitCode: 'test_div_1', + auctionId: '1234-56-789', + transactionId: 'tr_test_div_1', + adUnitId: 'tr_test_div_1', + }; + + it('should validate for null values', function () { + let data = utils.deepClone(nullFloorData); + data.floorsSchemaVersion = 1; + expect(isFloorsDataValid(data)).to.to.equal(true); + }); + + it('getFloor should not return numeric value if null set as value', function () { + const bidRequest = { ...basicBidRequest, getFloor }; + const basicFloorConfig = { + enabled: true, + auctionDelay: 0, + endpoint: {}, + enforcement: { + enforceJS: true, + enforcePBS: false, + floorDeals: false, + bidAdjustment: true + }, + data: nullFloorData + } + _floorDataForAuction[bidRequest.auctionId] = basicFloorConfig; + + let inputParams = {mediaType: 'banner', size: [600, 300]}; + expect(bidRequest.getFloor(inputParams)).to.deep.equal(null); + }) + + it('getFloor should not return numeric value if null set as value - external floor provider', function () { + const basicFloorConfig = { + enabled: true, + auctionDelay: 0, + endpoint: {}, + enforcement: { + enforceJS: true, + enforcePBS: false, + floorDeals: false, + bidAdjustment: true + }, + data: nullFloorData + } + server.respondWith(JSON.stringify(nullFloorData)); + let exposedAdUnits; + + handleSetFloorsConfig({...basicFloorConfig, floorProvider: 'floorprovider', endpoint: {url: 'http://www.fakefloorprovider.json/'}}); + + const adUnits = [{ + cod: 'test_div_1', + mediaTypes: {banner: { sizes: [[600, 300]] }, native: {}}, + bids: [{bidder: 'someBidder', adUnitCode: 'test_div_1'}, {bidder: 'someOtherBidder', adUnitCode: 'test_div_1'}] + }]; + + requestBidsHook(config => exposedAdUnits = config.adUnits, { + auctionId: basicBidRequest.auctionId, + adUnits + }); + + let inputParams = {mediaType: 'banner', size: [600, 300]}; + + expect(exposedAdUnits[0].bids[0].getFloor(inputParams)).to.deep.equal(null); + }); +})