prebid.js 9.4.0 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/.eslintrc.js +31 -5
  2. package/.github/workflows/jscpd.yml +2 -2
  3. package/.github/workflows/linter.yml +107 -0
  4. package/creative/crossDomain.js +6 -3
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adagioAnalyticsAdapter.js +1 -1
  10. package/dist/adagioBidAdapter.js +1 -1
  11. package/dist/adagioRtdProvider.js +1 -1
  12. package/dist/adagioUtils.js +1 -1
  13. package/dist/addefendBidAdapter.js +1 -1
  14. package/dist/adgenerationBidAdapter.js +1 -1
  15. package/dist/adkernelAdnBidAdapter.js +1 -1
  16. package/dist/adkernelBidAdapter.js +1 -1
  17. package/dist/adkernelUtils.js +1 -0
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/admixerBidAdapter.js +1 -1
  20. package/dist/adqueryBidAdapter.js +1 -1
  21. package/dist/adrelevantisBidAdapter.js +1 -1
  22. package/dist/adstirBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/advRedAnalyticsAdapter.js +1 -0
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/ajaBidAdapter.js +1 -1
  30. package/dist/akamaiDapRtdProvider.js +1 -1
  31. package/dist/amxBidAdapter.js +1 -1
  32. package/dist/amxIdSystem.js +1 -1
  33. package/dist/anonymisedRtdProvider.js +1 -1
  34. package/dist/apacdexBidAdapter.js +1 -1
  35. package/dist/appierAnalyticsAdapter.js +1 -1
  36. package/dist/appnexusBidAdapter.js +1 -1
  37. package/dist/asoBidAdapter.js +1 -1
  38. package/dist/axonixBidAdapter.js +1 -1
  39. package/dist/azerionedgeRtdProvider.js +1 -1
  40. package/dist/bidglassBidAdapter.js +1 -1
  41. package/dist/big-richmediaBidAdapter.js +1 -1
  42. package/dist/bridBidAdapter.js +1 -1
  43. package/dist/bridgewellBidAdapter.js +1 -1
  44. package/dist/brightMountainMediaBidAdapter.js +1 -1
  45. package/dist/carodaBidAdapter.js +1 -1
  46. package/dist/chtnwBidAdapter.js +1 -1
  47. package/dist/chunk-core.js +1 -1
  48. package/dist/concertBidAdapter.js +1 -1
  49. package/dist/connatixBidAdapter.js +1 -1
  50. package/dist/connectadBidAdapter.js +1 -1
  51. package/dist/consumableBidAdapter.js +1 -1
  52. package/dist/contxtfulRtdProvider.js +1 -1
  53. package/dist/conversantAnalyticsAdapter.js +1 -1
  54. package/dist/conversantBidAdapter.js +1 -1
  55. package/dist/craftBidAdapter.js +1 -1
  56. package/dist/criteoBidAdapter.js +1 -1
  57. package/dist/currencyUtils.js +1 -1
  58. package/dist/cwireBidAdapter.js +1 -1
  59. package/dist/dailymotionBidAdapter.js +1 -1
  60. package/dist/debugging-standalone.js +1 -1
  61. package/dist/dependencies.json +43 -7
  62. package/dist/dfpAdServerVideo.js +1 -1
  63. package/dist/dfpAdpod.js +1 -1
  64. package/dist/dfpUtils.js +1 -1
  65. package/dist/discoveryBidAdapter.js +1 -1
  66. package/dist/dspxBidAdapter.js +1 -1
  67. package/dist/dxkultureBidAdapter.js +1 -1
  68. package/dist/eightPodAnalyticsAdapter.js +1 -1
  69. package/dist/eightPodBidAdapter.js +1 -1
  70. package/dist/eplanningBidAdapter.js +1 -1
  71. package/dist/euidIdSystem.js +1 -1
  72. package/dist/exadsBidAdapter.js +1 -1
  73. package/dist/feedadBidAdapter.js +1 -1
  74. package/dist/finativeBidAdapter.js +1 -1
  75. package/dist/fintezaAnalyticsAdapter.js +1 -1
  76. package/dist/fpdUtils.js +1 -0
  77. package/dist/freewheel-sspBidAdapter.js +1 -1
  78. package/dist/gmosspBidAdapter.js +1 -1
  79. package/dist/goldbachBidAdapter.js +1 -1
  80. package/dist/gptPreAuction.js +1 -1
  81. package/dist/gptUtils.js +1 -1
  82. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  83. package/dist/greenbidsRtdProvider.js +1 -1
  84. package/dist/gridBidAdapter.js +1 -1
  85. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  86. package/dist/growthCodeRtdProvider.js +1 -1
  87. package/dist/gumgumBidAdapter.js +1 -1
  88. package/dist/h12mediaBidAdapter.js +1 -1
  89. package/dist/hypelabBidAdapter.js +1 -1
  90. package/dist/id5AnalyticsAdapter.js +1 -1
  91. package/dist/id5IdSystem.js +1 -1
  92. package/dist/imdsBidAdapter.js +1 -1
  93. package/dist/improvedigitalBidAdapter.js +1 -1
  94. package/dist/insticatorBidAdapter.js +1 -1
  95. package/dist/intentIqAnalyticsAdapter.js +1 -0
  96. package/dist/ixBidAdapter.js +1 -1
  97. package/dist/jixieBidAdapter.js +1 -1
  98. package/dist/justpremiumBidAdapter.js +1 -1
  99. package/dist/jwplayerBidAdapter.js +1 -1
  100. package/dist/jwplayerRtdProvider.js +1 -1
  101. package/dist/kargoBidAdapter.js +1 -1
  102. package/dist/kimberliteBidAdapter.js +1 -1
  103. package/dist/konduitAnalyticsAdapter.js +1 -1
  104. package/dist/kueezBidAdapter.js +1 -1
  105. package/dist/lassoBidAdapter.js +1 -1
  106. package/dist/lifestreetBidAdapter.js +1 -1
  107. package/dist/liveIntentIdSystem.js +1 -1
  108. package/dist/logicadBidAdapter.js +1 -1
  109. package/dist/loglyliftBidAdapter.js +1 -1
  110. package/dist/luceadBidAdapter.js +1 -1
  111. package/dist/mabidderBidAdapter.js +1 -1
  112. package/dist/magniteAnalyticsAdapter.js +1 -1
  113. package/dist/malltvAnalyticsAdapter.js +1 -1
  114. package/dist/marsmediaBidAdapter.js +1 -1
  115. package/dist/mediafuseBidAdapter.js +1 -1
  116. package/dist/mediagoBidAdapter.js +1 -1
  117. package/dist/medianetAnalyticsAdapter.js +1 -1
  118. package/dist/medianetBidAdapter.js +1 -1
  119. package/dist/mediasquareBidAdapter.js +1 -1
  120. package/dist/mgidBidAdapter.js +1 -1
  121. package/dist/minutemediaBidAdapter.js +1 -1
  122. package/dist/missenaBidAdapter.js +1 -1
  123. package/dist/mobianRtdProvider.js +1 -1
  124. package/dist/nextMillenniumBidAdapter.js +1 -1
  125. package/dist/nexx360BidAdapter.js +1 -1
  126. package/dist/nobidAnalyticsAdapter.js +1 -1
  127. package/dist/nobidBidAdapter.js +1 -1
  128. package/dist/not-for-prod/prebid.js +201 -193
  129. package/dist/oguryBidAdapter.js +1 -1
  130. package/dist/onetagBidAdapter.js +1 -1
  131. package/dist/ooloAnalyticsAdapter.js +1 -1
  132. package/dist/openwebBidAdapter.js +1 -1
  133. package/dist/openxBidAdapter.js +1 -1
  134. package/dist/optidigitalBidAdapter.js +1 -1
  135. package/dist/optoutBidAdapter.js +1 -1
  136. package/dist/orbidderBidAdapter.js +1 -1
  137. package/dist/outbrainBidAdapter.js +1 -1
  138. package/dist/paapi.js +1 -1
  139. package/dist/permutiveRtdProvider.js +1 -1
  140. package/dist/pixfutureBidAdapter.js +1 -1
  141. package/dist/playdigoBidAdapter.js +1 -1
  142. package/dist/prebidServerBidAdapter.js +1 -1
  143. package/dist/programmaticaBidAdapter.js +1 -1
  144. package/dist/publinkIdSystem.js +1 -1
  145. package/dist/publirBidAdapter.js +1 -1
  146. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  147. package/dist/pubmaticBidAdapter.js +1 -1
  148. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  149. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  150. package/dist/pxyzBidAdapter.js +1 -1
  151. package/dist/quantcastBidAdapter.js +1 -1
  152. package/dist/readpeakBidAdapter.js +1 -1
  153. package/dist/relaidoBidAdapter.js +1 -1
  154. package/dist/relevatehealthBidAdapter.js +1 -1
  155. package/dist/retailspotBidAdapter.js +1 -1
  156. package/dist/rhythmoneBidAdapter.js +1 -1
  157. package/dist/ringieraxelspringerBidAdapter.js +1 -1
  158. package/dist/riseBidAdapter.js +1 -1
  159. package/dist/rubiconBidAdapter.js +1 -1
  160. package/dist/schainSerializer.js +1 -0
  161. package/dist/seedingAllianceBidAdapter.js +1 -1
  162. package/dist/seedtagBidAdapter.js +1 -1
  163. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  164. package/dist/sharethroughBidAdapter.js +1 -1
  165. package/dist/shinezBidAdapter.js +1 -1
  166. package/dist/sizeMapping.js +1 -1
  167. package/dist/sizeUtils.js +1 -1
  168. package/dist/smaatoBidAdapter.js +1 -1
  169. package/dist/smartadserverBidAdapter.js +1 -1
  170. package/dist/smartxBidAdapter.js +1 -1
  171. package/dist/smilewantedBidAdapter.js +1 -1
  172. package/dist/snigelBidAdapter.js +1 -1
  173. package/dist/sonobiBidAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/stnBidAdapter.js +1 -1
  177. package/dist/stvBidAdapter.js +1 -1
  178. package/dist/sublimeBidAdapter.js +1 -1
  179. package/dist/symitriDapRtdProvider.js +1 -0
  180. package/dist/taboolaBidAdapter.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/targetVideoUtils.js +1 -0
  184. package/dist/teadsBidAdapter.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/themoneytizerBidAdapter.js +1 -1
  187. package/dist/trionBidAdapter.js +1 -1
  188. package/dist/tripleliftBidAdapter.js +1 -1
  189. package/dist/ttdBidAdapter.js +1 -1
  190. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  191. package/dist/uid2IdSystem.js +1 -1
  192. package/dist/underdogmediaBidAdapter.js +1 -1
  193. package/dist/undertoneBidAdapter.js +1 -1
  194. package/dist/unrulyBidAdapter.js +1 -1
  195. package/dist/userAgentUtils.js +1 -0
  196. package/dist/utiqIdSystem.js +1 -1
  197. package/dist/vidazooUtils.js +1 -1
  198. package/dist/videobyteBidAdapter.js +1 -1
  199. package/dist/visxBidAdapter.js +1 -1
  200. package/dist/vuukleBidAdapter.js +1 -1
  201. package/dist/widespaceBidAdapter.js +1 -1
  202. package/dist/winrBidAdapter.js +1 -1
  203. package/dist/yahooAdsBidAdapter.js +1 -1
  204. package/dist/yandexIdSystem.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  208. package/libraries/adkernelUtils/adkernelUtils.js +11 -0
  209. package/libraries/currencyUtils/floor.js +23 -0
  210. package/libraries/dfpUtils/dfpUtils.js +7 -0
  211. package/libraries/fpdUtils/deviceInfo.js +58 -0
  212. package/libraries/fpdUtils/pageInfo.js +73 -0
  213. package/libraries/gptUtils/gptUtils.js +23 -1
  214. package/libraries/schainSerializer/schainSerializer.js +24 -0
  215. package/libraries/sizeUtils/tranformSize.js +43 -0
  216. package/libraries/targetVideoUtils/bidderUtils.js +178 -0
  217. package/libraries/targetVideoUtils/constants.js +23 -0
  218. package/libraries/userAgentUtils/index.js +58 -0
  219. package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
  220. package/modules/.submodules.json +1 -0
  221. package/modules/33acrossAnalyticsAdapter.js +2 -0
  222. package/modules/adagioBidAdapter.js +1 -1
  223. package/modules/adagioRtdProvider.js +18 -4
  224. package/modules/adkernelAdnBidAdapter.js +1 -12
  225. package/modules/adkernelBidAdapter.js +4 -13
  226. package/modules/adlooxAnalyticsAdapter.js +1 -0
  227. package/modules/admixerBidAdapter.js +10 -6
  228. package/modules/admixerBidAdapter.md +7 -10
  229. package/modules/adtrgtmeBidAdapter.js +1 -1
  230. package/modules/advRedAnalyticsAdapter.js +198 -0
  231. package/modules/advRedAnalyticsAdapter.md +30 -0
  232. package/modules/akamaiDapRtdProvider.js +19 -798
  233. package/modules/anonymisedRtdProvider.js +5 -1
  234. package/modules/anonymisedRtdProvider.md +1 -1
  235. package/modules/apacdexBidAdapter.js +1 -1
  236. package/modules/appnexusBidAdapter.js +56 -2
  237. package/modules/automatadAnalyticsAdapter.js +2 -0
  238. package/modules/azerionedgeRtdProvider.js +13 -3
  239. package/modules/azerionedgeRtdProvider.md +0 -17
  240. package/modules/bridBidAdapter.js +47 -47
  241. package/modules/cleanioRtdProvider.js +1 -0
  242. package/modules/concertBidAdapter.js +1 -1
  243. package/modules/connatixBidAdapter.js +36 -8
  244. package/modules/connectIdSystem.js +3 -1
  245. package/modules/contxtfulRtdProvider.js +20 -2
  246. package/modules/contxtfulRtdProvider.md +1 -0
  247. package/modules/craftBidAdapter.js +1 -1
  248. package/modules/criteoBidAdapter.js +1 -1
  249. package/modules/cwireBidAdapter.js +5 -1
  250. package/modules/dailymotionBidAdapter.js +85 -65
  251. package/modules/debugging/debugging.js +3 -0
  252. package/modules/dfpAdServerVideo.js +15 -33
  253. package/modules/dfpAdpod.js +2 -6
  254. package/modules/dgkeywordRtdProvider.js +2 -0
  255. package/modules/discoveryBidAdapter.js +26 -210
  256. package/modules/dspxBidAdapter.js +176 -54
  257. package/modules/eightPodAnalyticsAdapter.js +28 -34
  258. package/modules/eightPodBidAdapter.js +113 -57
  259. package/modules/fintezaAnalyticsAdapter.js +9 -4
  260. package/modules/goldbachBidAdapter.js +1 -1
  261. package/modules/gptPreAuction.js +63 -4
  262. package/modules/growthCodeAnalyticsAdapter.js +1 -1
  263. package/modules/growthCodeRtdProvider.js +1 -1
  264. package/modules/gumgumBidAdapter.js +14 -10
  265. package/modules/improvedigitalBidAdapter.js +1 -1
  266. package/modules/intentIqAnalyticsAdapter.js +234 -0
  267. package/modules/intentIqAnalyticsAdapter.md +27 -0
  268. package/modules/intentIqIdSystem.md +0 -0
  269. package/modules/jwplayerBidAdapter.js +1 -1
  270. package/modules/jwplayerRtdProvider.js +26 -6
  271. package/modules/jwplayerVideoProvider.js +6 -0
  272. package/modules/mediafuseBidAdapter.js +1 -1
  273. package/modules/mediagoBidAdapter.js +7 -176
  274. package/modules/medianetBidAdapter.js +101 -40
  275. package/modules/mgidBidAdapter.js +3 -1
  276. package/modules/mobianRtdProvider.js +16 -2
  277. package/modules/nextMillenniumBidAdapter.js +1 -27
  278. package/modules/nobidBidAdapter.js +1 -1
  279. package/modules/optoutBidAdapter.js +1 -1
  280. package/modules/paapi.js +48 -35
  281. package/modules/permutiveRtdProvider.js +72 -22
  282. package/modules/playdigoBidAdapter.js +4 -2
  283. package/modules/prebidServerBidAdapter/index.js +4 -2
  284. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  285. package/modules/programmaticaBidAdapter.js +1 -1
  286. package/modules/pubmaticBidAdapter.js +12 -0
  287. package/modules/pubxaiAnalyticsAdapter.js +306 -164
  288. package/modules/relevatehealthBidAdapter.js +2 -1
  289. package/modules/richaudienceBidAdapter.js +1 -1
  290. package/modules/rtdModule/index.js +5 -3
  291. package/modules/sirdataRtdProvider.js +2 -0
  292. package/modules/sizeMapping.js +2 -5
  293. package/modules/smaatoBidAdapter.js +18 -1
  294. package/modules/smilewantedBidAdapter.js +26 -22
  295. package/modules/snigelBidAdapter.js +1 -1
  296. package/modules/sonobiBidAdapter.js +5 -10
  297. package/modules/symitriDapRtdProvider.js +812 -0
  298. package/modules/symitriDapRtdProvider.md +49 -0
  299. package/modules/targetVideoBidAdapter.js +120 -152
  300. package/modules/targetVideoBidAdapter.md +20 -3
  301. package/modules/userId/eids.js +3 -0
  302. package/modules/utiqIdSystem.js +12 -10
  303. package/modules/validationFpdModule/index.js +22 -17
  304. package/modules/videojsVideoProvider.js +3 -0
  305. package/modules/visxBidAdapter.js +1 -1
  306. package/modules/winrBidAdapter.js +2 -27
  307. package/modules/yahooAdsBidAdapter.js +1 -1
  308. package/modules/yandexIdSystem.js +1 -1
  309. package/package.json +4 -4
  310. package/plugins/eslint/index.js +73 -45
  311. package/src/adRendering.js +7 -3
  312. package/src/adloader.js +1 -0
  313. package/src/ajax.js +15 -0
  314. package/src/config.js +0 -4
  315. package/src/debugging.js +1 -0
  316. package/src/secureCreatives.js +1 -1
  317. package/src/storageManager.js +62 -73
  318. package/src/targeting.js +26 -20
  319. package/src/utils.js +9 -0
  320. package/test/pages/banner_sync.html +97 -0
  321. package/test/pages/consent_mgt_gdpr.html +1 -1
  322. package/test/spec/ajax_spec.js +11 -0
  323. package/test/spec/creative/crossDomainCreative_spec.js +26 -9
  324. package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
  325. package/test/spec/fpd/gdpr_spec.js +1 -1
  326. package/test/spec/libraries/userAgentUtils_spec.js +109 -0
  327. package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
  328. package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
  329. package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
  330. package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
  331. package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
  332. package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
  333. package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
  334. package/test/spec/modules/consentManagement_spec.js +1 -1
  335. package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
  336. package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
  337. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
  338. package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
  339. package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
  340. package/test/spec/modules/gptPreAuction_spec.js +143 -1
  341. package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
  342. package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
  343. package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
  344. package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
  345. package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
  346. package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
  347. package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
  348. package/test/spec/modules/paapi_spec.js +177 -111
  349. package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
  350. package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
  351. package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
  352. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  353. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
  354. package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
  355. package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
  356. package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
  357. package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
  358. package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
  359. package/test/spec/modules/yandexIdSystem_spec.js +6 -1
  360. package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
  361. package/test/spec/unit/core/storageManager_spec.js +68 -51
  362. package/test/spec/utils_spec.js +19 -0
  363. /package/src/utils/{gpdr.js → gdpr.js} +0 -0
@@ -7,7 +7,7 @@ import {hook} from '../../../src/hook.js';
7
7
  import 'modules/appnexusBidAdapter.js';
8
8
  import 'modules/rubiconBidAdapter.js';
9
9
  import {
10
- addPaapiConfigHook,
10
+ addPaapiConfigHook, addPaapiData,
11
11
  buyersToAuctionConfigs,
12
12
  getPAAPIConfig,
13
13
  getPAAPISize,
@@ -652,110 +652,171 @@ describe('paapi module', () => {
652
652
  config.resetConfig();
653
653
  });
654
654
 
655
- function mark() {
656
- return Object.fromEntries(
657
- adapterManager.makeBidRequests(
658
- adUnits,
659
- Date.now(),
660
- utils.getUniqueIdentifierStr(),
661
- function callback() {
662
- },
663
- []
664
- ).map(b => [b.bidderCode, b])
665
- );
666
- }
667
-
668
- function expectFledgeFlags(...enableFlags) {
669
- const bidRequests = mark();
670
- expect(bidRequests.appnexus.paapi?.enabled).to.eql(enableFlags[0].enabled);
671
- bidRequests.appnexus.bids.forEach(bid => expect(bid.ortb2Imp.ext.ae).to.eql(enableFlags[0].ae));
655
+ describe('makeBidRequests', () => {
656
+ function mark() {
657
+ return Object.fromEntries(
658
+ adapterManager.makeBidRequests(
659
+ adUnits,
660
+ Date.now(),
661
+ utils.getUniqueIdentifierStr(),
662
+ function callback() {
663
+ },
664
+ []
665
+ ).map(b => [b.bidderCode, b])
666
+ );
667
+ }
672
668
 
673
- expect(bidRequests.rubicon.paapi?.enabled).to.eql(enableFlags[1].enabled);
674
- bidRequests.rubicon.bids.forEach(bid => expect(bid.ortb2Imp?.ext?.ae).to.eql(enableFlags[1].ae));
669
+ function expectFledgeFlags(...enableFlags) {
670
+ const bidRequests = mark();
671
+ expect(bidRequests.appnexus.paapi?.enabled).to.eql(enableFlags[0].enabled);
672
+ bidRequests.appnexus.bids.forEach(bid => expect(bid.ortb2Imp.ext.ae).to.eql(enableFlags[0].ae));
675
673
 
676
- Object.values(bidRequests).flatMap(req => req.bids).forEach(bid => {
677
- if (bid.ortb2Imp?.ext?.ae) {
678
- sinon.assert.match(bid.ortb2Imp.ext.igs, {
679
- ae: bid.ortb2Imp.ext.ae,
680
- biddable: 1
681
- });
682
- }
683
- });
684
- }
674
+ expect(bidRequests.rubicon.paapi?.enabled).to.eql(enableFlags[1].enabled);
675
+ bidRequests.rubicon.bids.forEach(bid => expect(bid.ortb2Imp?.ext?.ae).to.eql(enableFlags[1].ae));
685
676
 
686
- describe('with setConfig()', () => {
687
- it('should set paapi.enabled correctly per bidder', function () {
688
- config.setConfig({
689
- bidderSequence: 'fixed',
690
- paapi: {
691
- enabled: true,
692
- bidders: ['appnexus'],
693
- defaultForSlots: 1,
677
+ Object.values(bidRequests).flatMap(req => req.bids).forEach(bid => {
678
+ if (bid.ortb2Imp?.ext?.ae) {
679
+ sinon.assert.match(bid.ortb2Imp.ext.igs, {
680
+ ae: bid.ortb2Imp.ext.ae,
681
+ biddable: 1
682
+ });
694
683
  }
695
684
  });
696
- expectFledgeFlags({enabled: true, ae: 1}, {enabled: false, ae: undefined});
697
- });
685
+ }
698
686
 
699
- it('should set paapi.enabled correctly for all bidders', function () {
700
- config.setConfig({
701
- bidderSequence: 'fixed',
702
- paapi: {
703
- enabled: true,
704
- defaultForSlots: 1,
705
- }
687
+ describe('with setConfig()', () => {
688
+ it('should set paapi.enabled correctly per bidder', function () {
689
+ config.setConfig({
690
+ bidderSequence: 'fixed',
691
+ paapi: {
692
+ enabled: true,
693
+ bidders: ['appnexus'],
694
+ defaultForSlots: 1,
695
+ }
696
+ });
697
+ expectFledgeFlags({enabled: true, ae: 1}, {enabled: false, ae: 0});
706
698
  });
707
- expectFledgeFlags({enabled: true, ae: 1}, {enabled: true, ae: 1});
708
- });
709
699
 
710
- Object.entries({
711
- 'not set': {
712
- cfg: {},
713
- componentSeller: false
714
- },
715
- 'set': {
716
- cfg: {
717
- componentSeller: {
718
- auctionConfig: {
719
- decisionLogicURL: 'publisher.example'
720
- }
721
- }
722
- },
723
- componentSeller: true
724
- }
725
- }).forEach(([t, {cfg, componentSeller}]) => {
726
- it(`should set request paapi.componentSeller = ${componentSeller} when config componentSeller is ${t}`, () => {
700
+ it('should set paapi.enabled correctly for all bidders', function () {
727
701
  config.setConfig({
702
+ bidderSequence: 'fixed',
728
703
  paapi: {
729
704
  enabled: true,
730
705
  defaultForSlots: 1,
731
- ...cfg
732
706
  }
733
707
  });
734
- Object.values(mark()).forEach(br => expect(br.paapi?.componentSeller).to.eql(componentSeller));
708
+ expectFledgeFlags({enabled: true, ae: 1}, {enabled: true, ae: 1});
709
+ });
710
+
711
+ Object.entries({
712
+ 'not set': {
713
+ cfg: {},
714
+ componentSeller: false
715
+ },
716
+ 'set': {
717
+ cfg: {
718
+ componentSeller: {
719
+ auctionConfig: {
720
+ decisionLogicURL: 'publisher.example'
721
+ }
722
+ }
723
+ },
724
+ componentSeller: true
725
+ }
726
+ }).forEach(([t, {cfg, componentSeller}]) => {
727
+ it(`should set request paapi.componentSeller = ${componentSeller} when config componentSeller is ${t}`, () => {
728
+ config.setConfig({
729
+ paapi: {
730
+ enabled: true,
731
+ defaultForSlots: 1,
732
+ ...cfg
733
+ }
734
+ });
735
+ Object.values(mark()).forEach(br => expect(br.paapi?.componentSeller).to.eql(componentSeller));
736
+ });
735
737
  });
736
738
  });
739
+ });
740
+ describe('addPaapiData', () => {
741
+ function getEnrichedAdUnits() {
742
+ const next = sinon.stub();
743
+ addPaapiData(next, adUnits);
744
+ sinon.assert.calledWith(next, adUnits);
745
+ return adUnits;
746
+ }
747
+
748
+ function getImpExt() {
749
+ const next = sinon.stub();
750
+ addPaapiData(next, adUnits);
751
+ sinon.assert.calledWith(next, adUnits);
752
+ return {
753
+ global: adUnits[0].ortb2Imp?.ext,
754
+ ...Object.fromEntries(adUnits[0].bids.map(bid => [bid.bidder, bid.ortb2Imp?.ext]))
755
+ }
756
+ }
737
757
 
738
758
  it('should not override pub-defined ext.ae', () => {
739
759
  config.setConfig({
740
- bidderSequence: 'fixed',
741
760
  paapi: {
742
761
  enabled: true,
743
762
  defaultForSlots: 1,
744
763
  }
745
764
  });
746
765
  Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 0}}});
747
- expectFledgeFlags({enabled: true, ae: 0}, {enabled: true, ae: 0});
766
+ sinon.assert.match(getImpExt(), {
767
+ global: {
768
+ ae: 0,
769
+ },
770
+ rubicon: undefined,
771
+ appnexus: undefined
772
+ });
748
773
  });
749
774
 
775
+ it('should override per-bidder when excluded via paapi.bidders', () => {
776
+ config.setConfig({
777
+ paapi: {
778
+ enabled: true,
779
+ defaultForSlots: 1,
780
+ bidders: ['rubicon']
781
+ }
782
+ })
783
+ sinon.assert.match(getImpExt(), {
784
+ global: {
785
+ ae: 1,
786
+ igs: {
787
+ ae: 1,
788
+ biddable: 1
789
+ }
790
+ },
791
+ rubicon: undefined,
792
+ appnexus: {
793
+ ae: 0,
794
+ igs: {
795
+ ae: 0,
796
+ biddable: 0
797
+ }
798
+ }
799
+ })
800
+ })
801
+
750
802
  it('should populate ext.igs when request has ext.ae', () => {
751
803
  config.setConfig({
752
- bidderSequence: 'fixed',
753
804
  paapi: {
754
805
  enabled: true
755
806
  }
756
807
  });
757
808
  Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 3}}});
758
- expectFledgeFlags({enabled: true, ae: 3}, {enabled: true, ae: 3});
809
+ sinon.assert.match(getImpExt(), {
810
+ global: {
811
+ ae: 3,
812
+ igs: {
813
+ ae: 3,
814
+ biddable: 1
815
+ }
816
+ },
817
+ rubicon: undefined,
818
+ appnexus: undefined,
819
+ });
759
820
  });
760
821
 
761
822
  it('should not override pub-defined ext.igs', () => {
@@ -765,16 +826,17 @@ describe('paapi module', () => {
765
826
  }
766
827
  });
767
828
  Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 1, igs: {biddable: 0}}}});
768
- const bidReqs = mark();
769
- Object.values(bidReqs).flatMap(req => req.bids).forEach(bid => {
770
- sinon.assert.match(bid.ortb2Imp.ext, {
829
+ sinon.assert.match(getImpExt(), {
830
+ global: {
771
831
  ae: 1,
772
832
  igs: {
773
833
  ae: 1,
774
834
  biddable: 0
775
835
  }
776
- });
777
- });
836
+ },
837
+ rubicon: undefined,
838
+ appnexus: undefined
839
+ })
778
840
  });
779
841
 
780
842
  it('should fill ext.ae from ext.igs, if defined', () => {
@@ -784,60 +846,64 @@ describe('paapi module', () => {
784
846
  }
785
847
  });
786
848
  Object.assign(adUnits[0], {ortb2Imp: {ext: {igs: {}}}});
787
- expectFledgeFlags({enabled: true, ae: 1}, {enabled: true, ae: 1});
849
+ sinon.assert.match(getImpExt(), {
850
+ global: {
851
+ ae: 1,
852
+ igs: {
853
+ ae: 1,
854
+ biddable: 1
855
+ }
856
+ },
857
+ appnexus: undefined,
858
+ rubicon: undefined
859
+ })
788
860
  });
789
- });
790
861
 
791
- describe('ortb2Imp.ext.paapi.requestedSize', () => {
792
- beforeEach(() => {
793
- config.setConfig({
794
- paapi: {
795
- enabled: true,
796
- defaultForSlots: 1,
797
- }
862
+ describe('ortb2Imp.ext.paapi.requestedSize', () => {
863
+ beforeEach(() => {
864
+ config.setConfig({
865
+ paapi: {
866
+ enabled: true,
867
+ defaultForSlots: 1,
868
+ }
869
+ });
798
870
  });
799
- });
800
871
 
801
- it('should default to value returned by getPAAPISize', () => {
802
- getPAAPISizeStub.returns([123, 321]);
803
- Object.values(mark()).flatMap(b => b.bids).forEach(bidRequest => {
804
- sinon.assert.match(bidRequest.ortb2Imp.ext.paapi, {
872
+ it('should default to value returned by getPAAPISize', () => {
873
+ getPAAPISizeStub.returns([123, 321]);
874
+ expect(getImpExt().global.paapi).to.eql({
805
875
  requestedSize: {
806
876
  width: 123,
807
877
  height: 321
808
878
  }
809
879
  });
810
880
  });
811
- });
812
881
 
813
- it('should not be overridden, if provided by the pub', () => {
814
- adUnits[0].ortb2Imp = {
815
- ext: {
816
- paapi: {
817
- requestedSize: {
818
- width: '123px',
819
- height: '321px'
882
+ it('should not be overridden, if provided by the pub', () => {
883
+ adUnits[0].ortb2Imp = {
884
+ ext: {
885
+ paapi: {
886
+ requestedSize: {
887
+ width: '123px',
888
+ height: '321px'
889
+ }
820
890
  }
821
891
  }
822
- }
823
- };
824
- Object.values(mark()).flatMap(b => b.bids).forEach(bidRequest => {
825
- sinon.assert.match(bidRequest.ortb2Imp.ext.paapi, {
892
+ };
893
+ expect(getImpExt().global.paapi).to.eql({
826
894
  requestedSize: {
827
895
  width: '123px',
828
896
  height: '321px'
829
897
  }
830
- });
898
+ })
899
+ sinon.assert.notCalled(getPAAPISizeStub);
831
900
  });
832
- sinon.assert.notCalled(getPAAPISizeStub);
833
- });
834
901
 
835
- it('should not be set if adUnit has no banner sizes', () => {
836
- adUnits[0].mediaTypes = {
837
- video: {}
838
- };
839
- Object.values(mark()).flatMap(b => b.bids).forEach(bidRequest => {
840
- expect(bidRequest.ortb2Imp?.ext?.paapi?.requestedSize).to.not.exist;
902
+ it('should not be set if adUnit has no banner sizes', () => {
903
+ adUnits[0].mediaTypes = {
904
+ video: {}
905
+ };
906
+ expect(getImpExt().global?.paapi?.requestedSize).to.not.exist;
841
907
  });
842
908
  });
843
909
  });
@@ -484,7 +484,9 @@ describe('permutiveRtdProvider', function () {
484
484
  _psegs: [],
485
485
  _ppam: [],
486
486
  _pcrprs: [],
487
- _pssps: { ssps: [], cohorts: [] }
487
+ _pindexs: [],
488
+ _pssps: { ssps: [], cohorts: [] },
489
+ _ppsts: {},
488
490
  })
489
491
 
490
492
  setBidderRtb(bidderConfig, moduleConfig, segmentsData)
@@ -568,6 +570,7 @@ describe('permutiveRtdProvider', function () {
568
570
  const data = transformedTargeting()
569
571
  expect(getSegments(250)).to.deep.equal(data)
570
572
  })
573
+
571
574
  it('should enforce max segments', function () {
572
575
  const max = 1
573
576
  const segments = getSegments(max)
@@ -584,6 +587,26 @@ describe('permutiveRtdProvider', function () {
584
587
  }
585
588
  }
586
589
  })
590
+
591
+ it('should coerce numbers to strings', function () {
592
+ setLocalStorage({ _prubicons: [1, 2, 3], _pssps: { ssps: ['foo', 'bar'], cohorts: [4, 5, 6] } })
593
+
594
+ const segments = getSegments(200)
595
+
596
+ expect(segments.rubicon).to.deep.equal(['1', '2', '3'])
597
+ expect(segments.ssp.ssps).to.deep.equal(['foo', 'bar'])
598
+ expect(segments.ssp.cohorts).to.deep.equal(['4', '5', '6'])
599
+ })
600
+
601
+ it('should return empty values on unexpected format', function () {
602
+ setLocalStorage({ _prubicons: 'a string instead?', _pssps: 123 })
603
+
604
+ const segments = getSegments(200)
605
+
606
+ expect(segments.rubicon).to.deep.equal([])
607
+ expect(segments.ssp.ssps).to.deep.equal([])
608
+ expect(segments.ssp.cohorts).to.deep.equal([])
609
+ })
587
610
  })
588
611
 
589
612
  describe('Existing key-value targeting', function () {
@@ -703,14 +726,25 @@ function getConfig () {
703
726
  }
704
727
 
705
728
  function transformedTargeting (data = getTargetingData()) {
729
+ const topics = (() => {
730
+ const topics = {}
731
+ for (const topic in data._ppsts) {
732
+ topics[topic] = data._ppsts[topic].map(String)
733
+ }
734
+ return topics
735
+ })()
736
+
706
737
  return {
707
- ac: [...data._pcrprs, ...data._ppam, ...data._psegs.filter(seg => seg >= 1000000)],
708
- appnexus: data._papns,
709
- ix: data._pindexs,
710
- rubicon: data._prubicons,
711
- gam: data._pdfps,
712
- ssp: data._pssps,
713
- topics: data._ppsts,
738
+ ac: [...data._pcrprs, ...data._ppam, ...data._psegs.filter(seg => seg >= 1000000)].map(String),
739
+ appnexus: data._papns.map(String),
740
+ ix: data._pindexs.map(String),
741
+ rubicon: data._prubicons.map(String),
742
+ gam: data._pdfps.map(String),
743
+ ssp: {
744
+ ssps: data._pssps.ssps.map(String),
745
+ cohorts: data._pssps.cohorts.map(String)
746
+ },
747
+ topics,
714
748
  }
715
749
  }
716
750
 
@@ -825,7 +825,7 @@ describe('S2S Adapter', function () {
825
825
  })
826
826
  })
827
827
  })
828
-
828
+
829
829
  it('should set customHeaders correctly when publisher has provided it', () => {
830
830
  let configWithCustomHeaders = utils.deepClone(CONFIG);
831
831
  configWithCustomHeaders.customHeaders = { customHeader1: 'customHeader1Value' };
@@ -3578,18 +3578,32 @@ describe('S2S Adapter', function () {
3578
3578
  sinon.assert.calledWith(fledgeStub, sinon.match({auctionId, adUnitCode: AU, ortb2: undefined, ortb2Imp: undefined}), sinon.match({config: {id: 2}}))
3579
3579
  }
3580
3580
 
3581
- it('calls addComponentAuction alongside addBidResponse', function () {
3581
+ it('calls addPaapiConfig alongside addBidResponse', function () {
3582
3582
  adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
3583
3583
  server.requests[0].respond(200, {}, JSON.stringify(mergeDeep({}, RESPONSE_OPENRTB, FLEDGE_RESP)));
3584
3584
  expect(addBidResponse.called).to.be.true;
3585
3585
  expectFledgeCalls();
3586
3586
  });
3587
3587
 
3588
- it('calls addComponentAuction when there is no bid in the response', () => {
3588
+ it('calls addPaapiConfig when there is no bid in the response', () => {
3589
3589
  adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
3590
3590
  server.requests[0].respond(200, {}, JSON.stringify(FLEDGE_RESP));
3591
3591
  expect(addBidResponse.called).to.be.false;
3592
3592
  expectFledgeCalls();
3593
+ });
3594
+
3595
+ it('wraps call in runWithBidder', () => {
3596
+ let fail = false;
3597
+ fledgeStub.callsFake(({bidder}) => {
3598
+ try {
3599
+ expect(bidder).to.exist.and.to.eql(config.getCurrentBidder());
3600
+ } catch (e) {
3601
+ fail = true;
3602
+ }
3603
+ });
3604
+ adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
3605
+ server.requests[0].respond(200, {}, JSON.stringify(FLEDGE_RESP));
3606
+ expect(fail).to.be.false;
3593
3607
  })
3594
3608
  });
3595
3609
  });
@@ -81,7 +81,7 @@ describe('ProxistoreBidAdapter', function () {
81
81
  it('should contain a valid url', function () {
82
82
  // has gdpr consent
83
83
  expect(request.url).equal(url.cookieBase);
84
- // doens't have gpdr consent
84
+ // doens't have gdpr consent
85
85
  bidderRequest.gdprConsent.vendorData = null;
86
86
 
87
87
  request = spec.buildRequests([bid], bidderRequest);
@@ -4084,6 +4084,46 @@ describe('PubMatic adapter', function () {
4084
4084
  })
4085
4085
  });
4086
4086
  }
4087
+
4088
+ describe('Banner Request param battr checking', function() {
4089
+ it('should add battr params to bannerObj if present in ortb2Imp.banner', function() {
4090
+ let originalBidRequests = utils.deepClone(bidRequests);
4091
+ let bannerObj = utils.deepClone(originalBidRequests[0].ortb2Imp.banner);
4092
+ originalBidRequests[0].ortb2Imp.banner = Object.assign(bannerObj, {
4093
+ battr: [1, 2]
4094
+ });
4095
+
4096
+ const req = spec.buildRequests(originalBidRequests, {
4097
+ auctionId: 'new-auction-id'
4098
+ });
4099
+ let data = JSON.parse(req.data);
4100
+ expect(data.imp[0]['banner']['battr']).to.exist.and.to.be.an('array');
4101
+ expect(data.imp[0]['banner']['battr'][0]).to.equal(originalBidRequests[0].ortb2Imp.banner['battr'][0]);
4102
+ expect(data.imp[0]['banner']['battr'][1]).to.equal(originalBidRequests[0].ortb2Imp.banner['battr'][1]);
4103
+ });
4104
+
4105
+ it('should not add battr params to bannerObj if not present in ortb2Imp.banner', function() {
4106
+ const req = spec.buildRequests(bidRequests, {
4107
+ auctionId: 'new-auction-id'
4108
+ });
4109
+ let data = JSON.parse(req.data);
4110
+ expect(data.imp[0]['banner']['battr']).to.equal(undefined);
4111
+ });
4112
+
4113
+ it('should not add battr params if _checkParamDataType returns undefined (Mismatch data type)', function() {
4114
+ let originalBidRequests = utils.deepClone(bidRequests);
4115
+ let bannerObj = utils.deepClone(originalBidRequests[0].ortb2Imp.banner);
4116
+ originalBidRequests[0].ortb2Imp.banner = Object.assign(bannerObj, {
4117
+ battr: 1
4118
+ });
4119
+
4120
+ const req = spec.buildRequests(originalBidRequests, {
4121
+ auctionId: 'new-auction-id'
4122
+ });
4123
+ let data = JSON.parse(req.data);
4124
+ expect(data.imp[0]['banner']['battr']).to.equal(undefined);
4125
+ });
4126
+ });
4087
4127
  });
4088
4128
 
4089
4129
  if (FEATURES.VIDEO) {