prebid.js 8.4.0 → 8.6.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 (332) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/a1MediaRtdProvider.js +1 -0
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adfBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnBidAdapter.js +1 -1
  9. package/dist/adkernelBidAdapter.js +1 -1
  10. package/dist/admixerIdSystem.js +1 -1
  11. package/dist/adnuntiusBidAdapter.js +1 -1
  12. package/dist/adqueryBidAdapter.js +1 -1
  13. package/dist/adqueryIdSystem.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adsinteractiveBidAdapter.js +1 -1
  16. package/dist/adtelligentIdSystem.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/appierAnalyticsAdapter.js +1 -1
  24. package/dist/appnexusBidAdapter.js +1 -1
  25. package/dist/asoBidAdapter.js +1 -1
  26. package/dist/axonixBidAdapter.js +1 -1
  27. package/dist/beachfrontBidAdapter.js +1 -1
  28. package/dist/bidglassBidAdapter.js +1 -1
  29. package/dist/big-richmediaBidAdapter.js +1 -1
  30. package/dist/bridBidAdapter.js +1 -1
  31. package/dist/bridgewellBidAdapter.js +1 -1
  32. package/dist/brightMountainMediaBidAdapter.js +1 -1
  33. package/dist/britepoolIdSystem.js +1 -1
  34. package/dist/carodaBidAdapter.js +1 -1
  35. package/dist/chtnwBidAdapter.js +1 -1
  36. package/dist/concertBidAdapter.js +1 -1
  37. package/dist/connectIdSystem.js +1 -1
  38. package/dist/connectadBidAdapter.js +1 -1
  39. package/dist/consentManagementGpp.js +1 -1
  40. package/dist/consumableBidAdapter.js +1 -1
  41. package/dist/conversantAnalyticsAdapter.js +1 -1
  42. package/dist/conversantBidAdapter.js +1 -1
  43. package/dist/craftBidAdapter.js +1 -1
  44. package/dist/criteoBidAdapter.js +1 -1
  45. package/dist/criteoIdSystem.js +1 -1
  46. package/dist/cwireBidAdapter.js +1 -1
  47. package/dist/czechAdIdSystem.js +1 -1
  48. package/dist/dacIdSystem.js +1 -1
  49. package/dist/deepintentDpesIdSystem.js +1 -1
  50. package/dist/dependencies.json +6 -0
  51. package/dist/dmdIdSystem.js +1 -1
  52. package/dist/dspxBidAdapter.js +1 -1
  53. package/dist/eplanningBidAdapter.js +1 -1
  54. package/dist/euidIdSystem.js +1 -1
  55. package/dist/fabrickIdSystem.js +1 -1
  56. package/dist/feedadBidAdapter.js +1 -1
  57. package/dist/finativeBidAdapter.js +1 -1
  58. package/dist/freewheel-sspBidAdapter.js +1 -1
  59. package/dist/ftrackIdSystem.js +1 -1
  60. package/dist/geolocationRtdProvider.js +1 -0
  61. package/dist/gmosspBidAdapter.js +1 -1
  62. package/dist/goldbachBidAdapter.js +1 -1
  63. package/dist/gravitoIdSystem.js +1 -1
  64. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  65. package/dist/greenbidsRtdProvider.js +1 -1
  66. package/dist/gridBidAdapter.js +1 -1
  67. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  68. package/dist/growthCodeIdSystem.js +1 -1
  69. package/dist/gumgumBidAdapter.js +1 -1
  70. package/dist/h12mediaBidAdapter.js +1 -1
  71. package/dist/hadronIdSystem.js +1 -1
  72. package/dist/hypelabBidAdapter.js +1 -1
  73. package/dist/id5IdSystem.js +1 -1
  74. package/dist/identityLinkIdSystem.js +1 -1
  75. package/dist/idxIdSystem.js +1 -1
  76. package/dist/imdsBidAdapter.js +1 -1
  77. package/dist/improvedigitalBidAdapter.js +1 -1
  78. package/dist/imuIdSystem.js +1 -1
  79. package/dist/insticatorBidAdapter.js +1 -1
  80. package/dist/intentIqIdSystem.js +1 -1
  81. package/dist/invibesBidAdapter.js +1 -1
  82. package/dist/ixBidAdapter.js +1 -1
  83. package/dist/justIdSystem.js +1 -1
  84. package/dist/justpremiumBidAdapter.js +1 -1
  85. package/dist/kargoBidAdapter.js +1 -1
  86. package/dist/kinessoIdSystem.js +1 -1
  87. package/dist/konduitAnalyticsAdapter.js +1 -1
  88. package/dist/kueezBidAdapter.js +1 -1
  89. package/dist/kueezRtbBidAdapter.js +1 -1
  90. package/dist/kulturemediaBidAdapter.js +1 -1
  91. package/dist/lassoBidAdapter.js +1 -1
  92. package/dist/lifestreetBidAdapter.js +1 -1
  93. package/dist/liveIntentIdSystem.js +1 -1
  94. package/dist/logicadBidAdapter.js +1 -1
  95. package/dist/loglyliftBidAdapter.js +1 -1
  96. package/dist/lotamePanoramaIdSystem.js +1 -1
  97. package/dist/magniteAnalyticsAdapter.js +1 -1
  98. package/dist/malltvAnalyticsAdapter.js +1 -1
  99. package/dist/marsmediaBidAdapter.js +1 -1
  100. package/dist/mediafuseBidAdapter.js +1 -1
  101. package/dist/mediasquareBidAdapter.js +1 -1
  102. package/dist/merkleIdSystem.js +1 -1
  103. package/dist/mgidBidAdapter.js +1 -1
  104. package/dist/minutemediaBidAdapter.js +1 -1
  105. package/dist/minutemediaplusBidAdapter.js +1 -1
  106. package/dist/mspa.js +1 -1
  107. package/dist/mwOpenLinkIdSystem.js +1 -1
  108. package/dist/naveggIdSystem.js +1 -1
  109. package/dist/netIdSystem.js +1 -1
  110. package/dist/newspassidBidAdapter.js +1 -1
  111. package/dist/nexx360BidAdapter.js +1 -1
  112. package/dist/not-for-prod/prebid.js +186 -181
  113. package/dist/novatiqIdSystem.js +1 -1
  114. package/dist/oguryBidAdapter.js +1 -1
  115. package/dist/oneKeyIdSystem.js +1 -1
  116. package/dist/onetagBidAdapter.js +1 -1
  117. package/dist/ooloAnalyticsAdapter.js +1 -1
  118. package/dist/optidigitalBidAdapter.js +1 -1
  119. package/dist/outbrainBidAdapter.js +1 -1
  120. package/dist/ozoneBidAdapter.js +1 -1
  121. package/dist/pairIdSystem.js +1 -1
  122. package/dist/parrableIdSystem.js +1 -1
  123. package/dist/pixfutureBidAdapter.js +1 -1
  124. package/dist/prebid-core.js +1 -1
  125. package/dist/pubCircleBidAdapter.js +1 -0
  126. package/dist/publinkIdSystem.js +1 -1
  127. package/dist/pubmaticBidAdapter.js +1 -1
  128. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  129. package/dist/pxyzBidAdapter.js +1 -1
  130. package/dist/quantcastBidAdapter.js +1 -1
  131. package/dist/quantcastIdSystem.js +1 -1
  132. package/dist/readpeakBidAdapter.js +1 -1
  133. package/dist/relaidoBidAdapter.js +1 -1
  134. package/dist/relevadRtdProvider.js +1 -1
  135. package/dist/retailspotBidAdapter.js +1 -1
  136. package/dist/rhythmoneBidAdapter.js +1 -1
  137. package/dist/riseBidAdapter.js +1 -1
  138. package/dist/rubiconBidAdapter.js +1 -1
  139. package/dist/seedingAllianceBidAdapter.js +1 -1
  140. package/dist/seedtagBidAdapter.js +1 -1
  141. package/dist/sharedIdSystem.js +1 -1
  142. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  143. package/dist/sharethroughBidAdapter.js +1 -1
  144. package/dist/shinezBidAdapter.js +1 -1
  145. package/dist/silverpushBidAdapter.js +1 -1
  146. package/dist/smaatoBidAdapter.js +1 -1
  147. package/dist/smartadserverBidAdapter.js +1 -1
  148. package/dist/smartxBidAdapter.js +1 -1
  149. package/dist/smilewantedBidAdapter.js +1 -1
  150. package/dist/sonobiBidAdapter.js +1 -1
  151. package/dist/sovrnAnalyticsAdapter.js +1 -1
  152. package/dist/sovrnBidAdapter.js +1 -1
  153. package/dist/ssmasBidAdapter.js +1 -0
  154. package/dist/sspBCBidAdapter.js +1 -1
  155. package/dist/stvBidAdapter.js +1 -1
  156. package/dist/sublimeBidAdapter.js +1 -1
  157. package/dist/tapadIdSystem.js +1 -1
  158. package/dist/tappxBidAdapter.js +1 -1
  159. package/dist/targetVideoBidAdapter.js +1 -1
  160. package/dist/teadsBidAdapter.js +1 -1
  161. package/dist/tncIdSystem.js +1 -1
  162. package/dist/topicsFpdModule.js +1 -1
  163. package/dist/trionBidAdapter.js +1 -1
  164. package/dist/tripleliftBidAdapter.js +1 -1
  165. package/dist/ttdBidAdapter.js +1 -1
  166. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  167. package/dist/uid2IdSystem.js +1 -1
  168. package/dist/underdogmediaBidAdapter.js +1 -1
  169. package/dist/undertoneBidAdapter.js +1 -1
  170. package/dist/unifiedIdSystem.js +1 -1
  171. package/dist/userId.js +1 -1
  172. package/dist/utiqSystem.js +1 -1
  173. package/dist/verizonMediaIdSystem.js +1 -1
  174. package/dist/viantOrtbBidAdapter.js +1 -0
  175. package/dist/vidazooBidAdapter.js +1 -1
  176. package/dist/videobyteBidAdapter.js +1 -1
  177. package/dist/videojsVideoProvider.js +1 -1
  178. package/dist/visxBidAdapter.js +1 -1
  179. package/dist/vrtcalBidAdapter.js +1 -1
  180. package/dist/vuukleBidAdapter.js +1 -1
  181. package/dist/widespaceBidAdapter.js +1 -1
  182. package/dist/winrBidAdapter.js +1 -1
  183. package/dist/yahoosspBidAdapter.js +1 -1
  184. package/dist/yieldmoBidAdapter.js +1 -1
  185. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  186. package/dist/zeotapIdPlusIdSystem.js +1 -1
  187. package/integrationExamples/gpt/adUnitFloors.html +0 -1
  188. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
  189. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +1 -1
  190. package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +137 -0
  191. package/integrationExamples/videoModule/jwplayer/eventListeners.html +1 -1
  192. package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
  193. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
  194. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
  195. package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
  196. package/integrationExamples/videoModule/videojs/bidsBackHandlerOverride.html +164 -0
  197. package/libraries/mspa/activityControls.js +51 -32
  198. package/modules/.submodules.json +1 -0
  199. package/modules/33acrossIdSystem.js +9 -0
  200. package/modules/a1MediaRtdProvider.js +92 -0
  201. package/modules/a1MediaRtdProvider.md +46 -0
  202. package/modules/adfBidAdapter.js +4 -1
  203. package/modules/adgenerationBidAdapter.js +3 -3
  204. package/modules/adkernelAdnBidAdapter.js +1 -1
  205. package/modules/adkernelBidAdapter.js +10 -3
  206. package/modules/admixerIdSystem.js +6 -0
  207. package/modules/adnuntiusBidAdapter.js +5 -13
  208. package/modules/adqueryIdSystem.js +6 -0
  209. package/modules/adsinteractiveBidAdapter.js +2 -2
  210. package/modules/adtelligentIdSystem.js +6 -0
  211. package/modules/adyoulikeBidAdapter.js +6 -3
  212. package/modules/amxIdSystem.js +6 -0
  213. package/modules/appnexusBidAdapter.js +1 -1
  214. package/modules/beachfrontBidAdapter.js +32 -6
  215. package/modules/britepoolIdSystem.js +6 -0
  216. package/modules/connectIdSystem.js +6 -0
  217. package/modules/consentManagementGpp.js +10 -1
  218. package/modules/consumableBidAdapter.js +9 -1
  219. package/modules/criteoBidAdapter.js +18 -0
  220. package/modules/criteoIdSystem.js +6 -0
  221. package/modules/cwireBidAdapter.js +19 -0
  222. package/modules/czechAdIdSystem.js +6 -0
  223. package/modules/dacIdSystem.js +6 -0
  224. package/modules/deepintentDpesIdSystem.js +7 -2
  225. package/modules/dmdIdSystem.js +6 -0
  226. package/modules/euidIdSystem.js +9 -0
  227. package/modules/fabrickIdSystem.js +6 -0
  228. package/modules/ftrackIdSystem.js +16 -0
  229. package/modules/geolocationRtdProvider.js +65 -0
  230. package/modules/gravitoIdSystem.js +6 -0
  231. package/modules/greenbidsRtdProvider.js +1 -1
  232. package/modules/growthCodeAnalyticsAdapter.js +7 -2
  233. package/modules/growthCodeIdSystem.js +20 -1
  234. package/modules/hadronIdSystem.js +6 -0
  235. package/modules/id5IdSystem.js +34 -8
  236. package/modules/identityLinkIdSystem.js +6 -0
  237. package/modules/idxIdSystem.js +6 -0
  238. package/modules/imdsBidAdapter.js +38 -14
  239. package/modules/imuIdSystem.js +10 -0
  240. package/modules/intentIqIdSystem.js +6 -0
  241. package/modules/invibesBidAdapter.js +5 -5
  242. package/modules/ixBidAdapter.js +16 -0
  243. package/modules/justIdSystem.js +6 -0
  244. package/modules/kinessoIdSystem.js +7 -2
  245. package/modules/liveIntentIdSystem.js +53 -0
  246. package/modules/lotamePanoramaIdSystem.js +6 -0
  247. package/modules/merkleIdSystem.js +24 -0
  248. package/modules/mwOpenLinkIdSystem.js +6 -0
  249. package/modules/naveggIdSystem.js +6 -0
  250. package/modules/netIdSystem.js +6 -0
  251. package/modules/newspassid.md +76 -0
  252. package/modules/newspassidBidAdapter.js +44 -18
  253. package/modules/novatiqIdSystem.js +12 -0
  254. package/modules/oneKeyIdSystem.js +26 -0
  255. package/modules/ozoneBidAdapter.js +65 -18
  256. package/modules/ozoneBidAdapter.md +3 -1
  257. package/modules/pairIdSystem.js +6 -0
  258. package/modules/parrableIdSystem.js +38 -2
  259. package/modules/pubCircleBidAdapter.js +231 -0
  260. package/modules/pubCircleBidAdapter.md +79 -0
  261. package/modules/publinkIdSystem.js +7 -1
  262. package/modules/quantcastIdSystem.js +6 -0
  263. package/modules/relevadRtdProvider.js +6 -7
  264. package/modules/rubiconBidAdapter.js +9 -0
  265. package/modules/sharedIdSystem.js +6 -0
  266. package/modules/silverpushBidAdapter.js +2 -2
  267. package/modules/ssmasBidAdapter.js +126 -0
  268. package/modules/ssmasBidAdapter.md +35 -0
  269. package/modules/sspBCBidAdapter.js +36 -13
  270. package/modules/tapadIdSystem.js +6 -0
  271. package/modules/tappxBidAdapter.js +10 -1
  272. package/modules/tappxBidAdapter.md +17 -0
  273. package/modules/tncIdSystem.js +6 -0
  274. package/modules/topicsFpdModule.js +21 -48
  275. package/modules/tripleliftBidAdapter.js +5 -0
  276. package/modules/uid2IdSystem.js +14 -0
  277. package/modules/unifiedIdSystem.js +11 -0
  278. package/modules/userId/eids.js +6 -445
  279. package/modules/userId/index.js +36 -24
  280. package/modules/utiqSystem.js +9 -0
  281. package/modules/verizonMediaIdSystem.js +6 -0
  282. package/modules/viantOrtbBidAdapter.js +113 -0
  283. package/modules/viantOrtbBidAdapter.md +54 -0
  284. package/modules/vidazooBidAdapter.js +9 -2
  285. package/modules/videojsVideoProvider.js +9 -2
  286. package/modules/vrtcalBidAdapter.js +10 -6
  287. package/modules/zeotapIdPlusIdSystem.js +6 -0
  288. package/package.json +1 -1
  289. package/src/adapters/bidderFactory.js +15 -6
  290. package/src/adloader.js +2 -1
  291. package/test/spec/libraries/mspa/activityControls_spec.js +145 -212
  292. package/test/spec/modules/a1MediaRtdProvider_spec.js +105 -0
  293. package/test/spec/modules/adfBidAdapter_spec.js +47 -0
  294. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  295. package/test/spec/modules/adkernelAdnBidAdapter_spec.js +1 -2
  296. package/test/spec/modules/adkernelBidAdapter_spec.js +7 -2
  297. package/test/spec/modules/adnuntiusBidAdapter_spec.js +116 -64
  298. package/test/spec/modules/adyoulikeBidAdapter_spec.js +13 -24
  299. package/test/spec/modules/appnexusBidAdapter_spec.js +12 -1
  300. package/test/spec/modules/beachfrontBidAdapter_spec.js +35 -2
  301. package/test/spec/modules/consentManagementGpp_spec.js +16 -0
  302. package/test/spec/modules/consumableBidAdapter_spec.js +15 -0
  303. package/test/spec/modules/criteoBidAdapter_spec.js +31 -3
  304. package/test/spec/modules/cwireBidAdapter_spec.js +47 -0
  305. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -5
  306. package/test/spec/modules/geolocationRtdProvider_spec.js +119 -0
  307. package/test/spec/modules/greenbidsRtdProvider_spec.js +1 -1
  308. package/test/spec/modules/id5IdSystem_spec.js +18 -0
  309. package/test/spec/modules/imdsBidAdapter_spec.js +98 -17
  310. package/test/spec/modules/invibesBidAdapter_spec.js +123 -32
  311. package/test/spec/modules/ixBidAdapter_spec.js +23 -5
  312. package/test/spec/modules/medianetBidAdapter_spec.js +117 -0
  313. package/test/spec/modules/newspassidBidAdapter_spec.js +6 -0
  314. package/test/spec/modules/outbrainBidAdapter_spec.js +3 -5
  315. package/test/spec/modules/ozoneBidAdapter_spec.js +27 -1
  316. package/test/spec/modules/prebidServerBidAdapter_spec.js +2 -20
  317. package/test/spec/modules/priceFloors_spec.js +14 -0
  318. package/test/spec/modules/pubCircleBidAdapter_spec.js +399 -0
  319. package/test/spec/modules/pubmaticBidAdapter_spec.js +6 -373
  320. package/test/spec/modules/rubiconBidAdapter_spec.js +220 -9
  321. package/test/spec/modules/smaatoBidAdapter_spec.js +4 -6
  322. package/test/spec/modules/ssmasBidAdapter_spec.js +244 -0
  323. package/test/spec/modules/sspBCBidAdapter_spec.js +18 -19
  324. package/test/spec/modules/topicsFpdModule_spec.js +343 -365
  325. package/test/spec/modules/tripleliftBidAdapter_spec.js +40 -0
  326. package/test/spec/modules/userId_spec.js +116 -7
  327. package/test/spec/modules/viantOrtbBidAdapter_spec.js +432 -0
  328. package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -4
  329. package/test/spec/modules/xeBidAdapter_spec.js +366 -368
  330. package/test/spec/modules/yahoosspBidAdapter_spec.js +5 -18
  331. package/test/spec/unit/core/bidderFactory_spec.js +61 -14
  332. package/integrationExamples/gpt/pbjs_video_adUnit.html +0 -109
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- import {deepAccess, deepSetValue, getAdUnitSizes, isFn, isPlainObject, logWarn} from '../src/utils.js';
3
+ import {deepAccess, deepSetValue, getAdUnitSizes, isFn, isPlainObject, logWarn, mergeDeep} from '../src/utils.js';
4
4
  import {registerBidder} from '../src/adapters/bidderFactory.js';
5
5
  import {BANNER, VIDEO} from '../src/mediaTypes.js';
6
6
  import {includes} from '../src/polyfill.js';
@@ -8,7 +8,8 @@ import {config} from '../src/config.js';
8
8
 
9
9
  const BID_SCHEME = 'https://';
10
10
  const BID_DOMAIN = 'technoratimedia.com';
11
- const USER_SYNC_HOST = 'https://ad-cdn.technoratimedia.com';
11
+ const USER_SYNC_IFRAME_URL = 'https://ad-cdn.technoratimedia.com/html/usersync.html';
12
+ const USER_SYNC_PIXEL_URL = 'https://sync.technoratimedia.com/services';
12
13
  const VIDEO_PARAMS = [ 'minduration', 'maxduration', 'startdelay', 'placement', 'linearity', 'mimes', 'protocols', 'api' ];
13
14
  const BLOCKED_AD_SIZES = [
14
15
  '1x1',
@@ -38,11 +39,11 @@ export const spec = {
38
39
  return;
39
40
  }
40
41
  const refererInfo = bidderRequest.refererInfo;
41
- const openRtbBidRequest = {
42
+ // start with some defaults, overridden by anything set in ortb2, if provided.
43
+ const openRtbBidRequest = mergeDeep({
42
44
  id: bidderRequest.bidderRequestId,
43
45
  site: {
44
- // TODO: does the fallback make sense here?
45
- domain: refererInfo.domain || location.hostname,
46
+ domain: refererInfo.domain,
46
47
  page: refererInfo.page,
47
48
  ref: refererInfo.ref
48
49
  },
@@ -50,7 +51,7 @@ export const spec = {
50
51
  ua: navigator.userAgent
51
52
  },
52
53
  imp: []
53
- };
54
+ }, bidderRequest.ortb2 || {});
54
55
 
55
56
  const tmax = bidderRequest.timeout;
56
57
  if (tmax) {
@@ -101,9 +102,17 @@ export const spec = {
101
102
  }
102
103
  });
103
104
 
104
- // CCPA
105
- if (bidderRequest.uspConsent) {
106
- deepSetValue(openRtbBidRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent);
105
+ // Move us_privacy from regs.ext to regs if there isn't already a us_privacy in regs
106
+ if (openRtbBidRequest.regs?.ext?.us_privacy && !openRtbBidRequest.regs?.us_privacy) {
107
+ deepSetValue(openRtbBidRequest, 'regs.us_privacy', openRtbBidRequest.regs.ext.us_privacy);
108
+ }
109
+
110
+ // Remove regs.ext.us_privacy
111
+ if (openRtbBidRequest.regs?.ext?.us_privacy) {
112
+ delete openRtbBidRequest.regs.ext.us_privacy;
113
+ if (Object.keys(openRtbBidRequest.regs.ext).length < 1) {
114
+ delete openRtbBidRequest.regs.ext;
115
+ }
107
116
  }
108
117
 
109
118
  // User ID
@@ -117,7 +126,7 @@ export const spec = {
117
126
  if (openRtbBidRequest.imp.length && seatId) {
118
127
  return {
119
128
  method: 'POST',
120
- url: `${BID_SCHEME}${seatId}.${BID_DOMAIN}/openrtb/bids/${seatId}?src=$$REPO_AND_VERSION$$`,
129
+ url: `${BID_SCHEME}${seatId}.${BID_DOMAIN}/openrtb/bids/${seatId}?src=pbjs%2F$prebid.version$`,
121
130
  data: openRtbBidRequest,
122
131
  options: {
123
132
  contentType: 'application/json',
@@ -294,16 +303,31 @@ export const spec = {
294
303
  }
295
304
  return bids;
296
305
  },
297
- getUserSyncs: function (syncOptions, serverResponses) {
306
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) {
298
307
  const syncs = [];
308
+ const queryParams = ['src=pbjs%2F$prebid.version$'];
309
+ if (gdprConsent) {
310
+ queryParams.push(`gdpr=${Number(gdprConsent.gdprApplies && 1)}&consent=${encodeURIComponent(gdprConsent.consentString || '')}`);
311
+ }
312
+ if (uspConsent) {
313
+ queryParams.push('us_privacy=' + encodeURIComponent(uspConsent));
314
+ }
315
+ if (gppConsent) {
316
+ queryParams.push('gpp=' + encodeURIComponent(gppConsent.gppString || '') + '&gppsid=' + encodeURIComponent((gppConsent.applicableSections || []).join(',')));
317
+ }
318
+
299
319
  if (syncOptions.iframeEnabled) {
300
320
  syncs.push({
301
321
  type: 'iframe',
302
- url: `${USER_SYNC_HOST}/html/usersync.html?src=$$REPO_AND_VERSION$$`
322
+ url: `${USER_SYNC_IFRAME_URL}?${queryParams.join('&')}`
323
+ });
324
+ } else if (syncOptions.pixelEnabled) {
325
+ syncs.push({
326
+ type: 'pixel',
327
+ url: `${USER_SYNC_PIXEL_URL}?srv=cs&${queryParams.join('&')}`
303
328
  });
304
- } else {
305
- logWarn('IMDS: Please enable iframe based user sync.');
306
329
  }
330
+
307
331
  return syncs;
308
332
  }
309
333
  };
@@ -160,6 +160,16 @@ export const imuIdSubmodule = {
160
160
  imppid: localData.ppid
161
161
  }
162
162
  };
163
+ },
164
+ eids: {
165
+ 'imppid': {
166
+ source: 'ppid.intimatemerger.com',
167
+ atype: 1
168
+ },
169
+ 'imuid': {
170
+ source: 'intimatemerger.com',
171
+ atype: 1
172
+ },
163
173
  }
164
174
  };
165
175
 
@@ -193,6 +193,12 @@ export const intentIqIdSubmodule = {
193
193
  }
194
194
  };
195
195
  return { callback: resp };
196
+ },
197
+ eids: {
198
+ 'intentIqId': {
199
+ source: 'intentiq.com',
200
+ atype: 1
201
+ },
196
202
  }
197
203
  };
198
204
 
@@ -1,4 +1,4 @@
1
- import { logInfo } from '../src/utils.js';
1
+ import {logInfo} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {getStorageManager} from '../src/storageManager.js';
4
4
 
@@ -9,7 +9,7 @@ const CONSTANTS = {
9
9
  SYNC_ENDPOINT: 'https://k.r66net.com/GetUserSync',
10
10
  TIME_TO_LIVE: 300,
11
11
  DEFAULT_CURRENCY: 'EUR',
12
- PREBID_VERSION: 9,
12
+ PREBID_VERSION: 10,
13
13
  METHOD: 'GET',
14
14
  INVIBES_VENDOR_ID: 436,
15
15
  USERID_PROVIDERS: ['pubcid', 'pubProvidedId', 'uid2', 'zeotapIdPlus', 'id5id'],
@@ -116,7 +116,7 @@ function buildRequest(bidRequests, bidderRequest) {
116
116
  bidParamsJson.userId = userIdModel;
117
117
  }
118
118
  let data = {
119
- location: getDocumentLocation(topWin),
119
+ location: getDocumentLocation(bidderRequest),
120
120
  videoAdHtmlId: generateRandomId(),
121
121
  showFallback: currentQueryStringParams['advs'] === '0',
122
122
  ivbsCampIdsLocal: readFromLocalStorage('IvbsCampIdsLocal'),
@@ -371,8 +371,8 @@ function generateRandomId() {
371
371
  return (Math.round(Math.random() * 1e12)).toString(36).substring(0, 10);
372
372
  }
373
373
 
374
- function getDocumentLocation(topWin) {
375
- return topWin.location.href.substring(0, 300).split(/[?#]/)[0];
374
+ function getDocumentLocation(bidderRequest) {
375
+ return bidderRequest.refererInfo.page.substring(0, 300);
376
376
  }
377
377
 
378
378
  function getUserIds(bidUserId) {
@@ -736,6 +736,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
736
736
 
737
737
  const isLastAdUnit = adUnitIndex === impKeys.length - 1;
738
738
 
739
+ r = addDeviceInfo(r);
739
740
  r = deduplicateImpExtFields(r);
740
741
  r = removeSiteIDs(r);
741
742
 
@@ -2056,4 +2057,19 @@ function getFormatCount(imp) {
2056
2057
  return formatCount;
2057
2058
  }
2058
2059
 
2060
+ /**
2061
+ * Adds device.w / device.h info
2062
+ * @param {object} r
2063
+ * @returns object
2064
+ */
2065
+ export function addDeviceInfo(r) {
2066
+ if (r.device == undefined) {
2067
+ r.device = {};
2068
+ }
2069
+ r.device.h = window.screen.height;
2070
+ r.device.w = window.screen.width;
2071
+
2072
+ return r;
2073
+ }
2074
+
2059
2075
  registerBidder(spec);
@@ -91,6 +91,12 @@ export const justIdSubmodule = {
91
91
  }
92
92
  }
93
93
  };
94
+ },
95
+ eids: {
96
+ 'justId': {
97
+ source: 'justtag.com',
98
+ atype: 1
99
+ },
94
100
  }
95
101
  };
96
102
 
@@ -233,8 +233,13 @@ export const kinessoIdSubmodule = {
233
233
  const payloadString = JSON.stringify(kinessoIdPayload);
234
234
  ajax(kinessoSyncUrl(accountId, consentData), syncId(knnsoId), payloadString, {method: 'POST', withCredentials: true});
235
235
  return {'id': knnsoId};
236
- }
237
-
236
+ },
237
+ eids: {
238
+ 'kpuid': {
239
+ source: 'kpuid.com',
240
+ atype: 3
241
+ },
242
+ },
238
243
  };
239
244
 
240
245
  // Register submodule for userId
@@ -242,6 +242,59 @@ export const liveIntentIdSubmodule = {
242
242
  }
243
243
 
244
244
  return { callback: result };
245
+ },
246
+ eids: {
247
+ 'lipb': {
248
+ getValue: function(data) {
249
+ return data.lipbid;
250
+ },
251
+ source: 'liveintent.com',
252
+ atype: 3,
253
+ getEidExt: function(data) {
254
+ if (Array.isArray(data.segments) && data.segments.length) {
255
+ return {
256
+ segments: data.segments
257
+ };
258
+ }
259
+ }
260
+ },
261
+ 'bidswitch': {
262
+ source: 'bidswitch.net',
263
+ atype: 3,
264
+ getValue: function(data) {
265
+ return data.id;
266
+ },
267
+ getUidExt: function(data) {
268
+ if (data.ext) {
269
+ return data.ext;
270
+ }
271
+ }
272
+ },
273
+ 'medianet': {
274
+ source: 'media.net',
275
+ atype: 3,
276
+ getValue: function(data) {
277
+ return data.id;
278
+ },
279
+ getUidExt: function(data) {
280
+ if (data.ext) {
281
+ return data.ext;
282
+ }
283
+ }
284
+ },
285
+ 'magnite': {
286
+ source: 'rubiconproject.com',
287
+ atype: 3,
288
+ getValue: function(data) {
289
+ return data.id;
290
+ },
291
+ getUidExt: function(data) {
292
+ if (data.ext) {
293
+ return data.ext;
294
+ }
295
+ }
296
+ },
297
+
245
298
  }
246
299
  };
247
300
 
@@ -368,6 +368,12 @@ export const lotamePanoramaIdSubmodule = {
368
368
 
369
369
  return { callback: resolveIdFunction };
370
370
  },
371
+ eids: {
372
+ lotamePanoramaId: {
373
+ source: 'crwdcntrl.net',
374
+ atype: 1,
375
+ },
376
+ },
371
377
  };
372
378
 
373
379
  submodule('userId', lotamePanoramaIdSubmodule);
@@ -196,6 +196,30 @@ export const merkleIdSubmodule = {
196
196
 
197
197
  logInfo('User ID - merkleId not refreshed');
198
198
  return {id: storedId};
199
+ },
200
+ eids: {
201
+ 'merkleId': {
202
+ atype: 3,
203
+ getSource: function(data) {
204
+ if (data?.ext?.ssp) {
205
+ return `${data.ext.ssp}.merkleinc.com`
206
+ }
207
+ return 'merkleinc.com'
208
+ },
209
+ getValue: function(data) {
210
+ return data.id;
211
+ },
212
+ getUidExt: function(data) {
213
+ if (data.keyID) {
214
+ return {
215
+ keyID: data.keyID
216
+ }
217
+ }
218
+ if (data.ext) {
219
+ return data.ext;
220
+ }
221
+ }
222
+ },
199
223
  }
200
224
 
201
225
  };
@@ -137,6 +137,12 @@ export const mwOpenLinkIdSubModule = {
137
137
  const submoduleConfigParams = (submoduleConfig && submoduleConfig.params) || {};
138
138
  if (!isValidConfig(submoduleConfigParams)) return undefined;
139
139
  return setID(submoduleConfigParams);
140
+ },
141
+ eids: {
142
+ 'mwOpenLinkId': {
143
+ source: 'mediawallahscript.com',
144
+ atype: 1
145
+ },
140
146
  }
141
147
  };
142
148
 
@@ -107,6 +107,12 @@ export const naveggIdSubmodule = {
107
107
  }
108
108
  }
109
109
  return undefined;
110
+ },
111
+ eids: {
112
+ 'naveggId': {
113
+ source: 'navegg.com',
114
+ atype: 1
115
+ },
110
116
  }
111
117
  };
112
118
  submodule('userId', naveggIdSubmodule);
@@ -34,6 +34,12 @@ export const netIdSubmodule = {
34
34
  getId(config) {
35
35
  /* currently not possible */
36
36
  return {};
37
+ },
38
+ eids: {
39
+ 'netId': {
40
+ source: 'netid.de',
41
+ atype: 1
42
+ },
37
43
  }
38
44
  };
39
45
 
@@ -0,0 +1,76 @@
1
+ ---
2
+ Module Name: NewspassId Bidder Adapter
3
+ Module Type: Bidder Adapter
4
+ Maintainer: techsupport@newspassid.com
5
+ layout: bidder
6
+ title: Newspass ID
7
+ description: LMC Newspass ID Prebid JS Bidder Adapter
8
+ biddercode: newspassid
9
+ gdpr_supported: false
10
+ gvl_id: none
11
+ usp_supported: true
12
+ coppa_supported: false
13
+ schain_supported: true
14
+ dchain_supported: false
15
+ userIds: criteo, id5Id, tdid, identityLink, liveIntentId, parrableId, pubCommonId, lotamePanoramaId, sharedId, fabrickId
16
+ media_types: banner
17
+ safeframes_ok: true
18
+ deals_supported: true
19
+ floors_supported: false
20
+ fpd_supported: false
21
+ pbjs: true
22
+ pbs: false
23
+ prebid_member: false
24
+ multiformat_supported: will-bid-on-any
25
+ ---
26
+
27
+ ### Description
28
+
29
+ LMC Newspass ID Prebid JS Bidder Adapter that connects to the NewspassId demand source(s).
30
+
31
+ The Newspass bid adapter supports Banner mediaTypes ONLY.
32
+ This is intended for USA audiences only, and does not support GDPR
33
+
34
+
35
+ ### Bid Params
36
+
37
+ {: .table .table-bordered .table-striped }
38
+
39
+ | Name | Scope | Description | Example | Type |
40
+ |-----------|----------|---------------------------|------------|----------|
41
+ | `siteId` | required | The site ID. | `"NPID0000001"` | `string` |
42
+ | `publisherId` | required | The publisher ID. | `"4204204201"` | `string` |
43
+ | `placementId` | required | The placement ID. | `"0420420421"` | `string` |
44
+ | `customData` | optional | publisher key-values used for targeting | `[{"settings":{},"targeting":{"key1": "value1", "key2": "value2"}}], ` | `array` |
45
+
46
+ ### Test Parameters
47
+
48
+
49
+ A test ad unit that will consistently return test creatives:
50
+
51
+ ```
52
+
53
+ //Banner adUnit
54
+
55
+ adUnits = [{
56
+ code: 'id-of-your-banner-div',
57
+ mediaTypes: {
58
+ banner: {
59
+ sizes: [[300, 250], [300,600]]
60
+ }
61
+ },
62
+ bids: [{
63
+ bidder: 'newspassid',
64
+ params: {
65
+ publisherId: 'NEWSPASS0001', /* an ID to identify the publisher account - required */
66
+ siteId: '4204204201', /* An ID used to identify a site within a publisher account - required */
67
+ placementId: '8000000015', /* an ID used to identify the piece of inventory - required - for appnexus test use 13144370. */
68
+ customData: [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"]}}],/* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */
69
+ }
70
+ }]
71
+ }];
72
+ ```
73
+
74
+ ### Note:
75
+
76
+ Please contact us at techsupport@newspassid.com for any assistance testing your implementation before going live into production.
@@ -1,15 +1,24 @@
1
- import {contains, deepAccess, deepSetValue, isArray, logError, logInfo, logWarn, parseUrl} from '../src/utils.js';
2
- import {registerBidder} from '../src/adapters/bidderFactory.js';
3
- import {BANNER, NATIVE} from '../src/mediaTypes.js';
1
+ import {
2
+ logInfo,
3
+ logError,
4
+ deepAccess,
5
+ logWarn,
6
+ deepSetValue,
7
+ isArray,
8
+ contains,
9
+ parseUrl,
10
+ generateUUID
11
+ } from '../src/utils.js';
12
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
13
+ import { BANNER, NATIVE } from '../src/mediaTypes.js';
4
14
  import {config} from '../src/config.js';
5
15
  import {getPriceBucketString} from '../src/cpmBucketManager.js';
6
16
  import {getRefererInfo} from '../src/refererDetection.js';
7
-
8
17
  const BIDDER_CODE = 'newspassid';
9
18
  const ORIGIN = 'https://bidder.newspassid.com' // applies only to auction & cookie
10
19
  const AUCTIONURI = '/openrtb2/auction';
11
20
  const NEWSPASSCOOKIESYNC = '/static/load-cookie.html';
12
- const NEWSPASSVERSION = '1.0.1';
21
+ const NEWSPASSVERSION = '1.1.4';
13
22
  export const spec = {
14
23
  version: NEWSPASSVERSION,
15
24
  code: BIDDER_CODE,
@@ -155,7 +164,7 @@ export const spec = {
155
164
  let placementId = placementIdOverrideFromGetParam || this.getPlacementId(npBidRequest); // prefer to use a valid override param, else the bidRequest placement Id
156
165
  obj.id = npBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder newspass made bid for unknown request ID: mb7953.859498327448. Ignoring."
157
166
  obj.tagid = placementId;
158
- let parsed = parseUrl(getRefererInfo().page);
167
+ let parsed = parseUrl(this.getRefererInfo().page);
159
168
  obj.secure = parsed.protocol === 'https' ? 1 : 0;
160
169
  let arrBannerSizes = [];
161
170
  if (!npBidRequest.hasOwnProperty('mediaTypes')) {
@@ -189,7 +198,6 @@ export const spec = {
189
198
  deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
190
199
  obj.ext['newspassid'] = {};
191
200
  obj.ext['newspassid'].adUnitCode = npBidRequest.adUnitCode; // eg. 'mpu'
192
- obj.ext['newspassid'].transactionId = npBidRequest.transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
193
201
  if (npBidRequest.params.hasOwnProperty('customData')) {
194
202
  obj.ext['newspassid'].customData = npBidRequest.params.customData;
195
203
  }
@@ -216,6 +224,10 @@ export const spec = {
216
224
  if (!schain && deepAccess(npBidRequest, 'schain')) {
217
225
  schain = npBidRequest.schain;
218
226
  }
227
+ let gpid = deepAccess(npBidRequest, 'ortb2Imp.ext.gpid');
228
+ if (gpid) {
229
+ deepSetValue(obj, 'ext.gpid', gpid);
230
+ }
219
231
  return obj;
220
232
  });
221
233
  let extObj = {};
@@ -240,7 +252,7 @@ export const spec = {
240
252
  let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module
241
253
  npRequest.site = {
242
254
  'publisher': {'id': htmlParams.publisherId},
243
- 'page': getRefererInfo().page,
255
+ 'page': this.getRefererInfo().page,
244
256
  'id': htmlParams.siteId
245
257
  };
246
258
  npRequest.test = config.getConfig('debug') ? 1 : 0;
@@ -259,12 +271,9 @@ export const spec = {
259
271
  }
260
272
  if (singleRequest) {
261
273
  logInfo('buildRequests starting to generate response for a single request');
262
- // TODO: fix auctionId & transactionId leak: https://github.com/prebid/Prebid.js/issues/9781
263
- npRequest.id = bidderRequest.auctionId; // Unique ID of the bid request, provided by the exchange.
264
- npRequest.auctionId = bidderRequest.auctionId; // not sure if this should be here?
274
+ npRequest.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
265
275
  npRequest.imp = tosendtags;
266
276
  npRequest.ext = extObj;
267
- deepSetValue(npRequest, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
268
277
  deepSetValue(npRequest, 'user.ext.eids', userExtEids);
269
278
  var ret = {
270
279
  method: 'POST',
@@ -280,12 +289,9 @@ export const spec = {
280
289
  let arrRet = tosendtags.map(imp => {
281
290
  logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
282
291
  let npRequestSingle = Object.assign({}, npRequest);
283
- imp.ext['newspassid'].pageAuctionId = bidderRequest['auctionId']; // make a note in the ext object of what the original auctionId was, in the bidderRequest object
284
- npRequestSingle.id = imp.ext['newspassid'].transactionId; // Unique ID of the bid request, provided by the exchange.
285
- npRequestSingle.auctionId = imp.ext['newspassid'].transactionId; // not sure if this should be here?
292
+ npRequestSingle.id = generateUUID();
286
293
  npRequestSingle.imp = [imp];
287
294
  npRequestSingle.ext = extObj;
288
- deepSetValue(npRequestSingle, 'source.tid', bidderRequest.auctionId);// RTB 2.5 : tid is Transaction ID that must be common across all participants in this bid request (e.g., potentially multiple exchanges).
289
295
  deepSetValue(npRequestSingle, 'user.ext.eids', userExtEids);
290
296
  logInfo('buildRequests RequestSingle (for non-single) = ', npRequestSingle);
291
297
  return {
@@ -305,6 +311,7 @@ export const spec = {
305
311
  logInfo(`interpretResponse time: ${startTime}. buildRequests done -> interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
306
312
  logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
307
313
  serverResponse = serverResponse.body || {};
314
+ let aucId = serverResponse.id; // this will be correct for single requests and non-single
308
315
  if (!serverResponse.hasOwnProperty('seatbid')) {
309
316
  return [];
310
317
  }
@@ -351,7 +358,7 @@ export const spec = {
351
358
  logInfo(`newspassid.enhancedAdserverTargeting is set to false, no per-bid keys will be sent to adserver.`);
352
359
  }
353
360
  let {seat: winningSeat, bid: winningBid} = this.getWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
354
- adserverTargeting['np_auc_id'] = String(request.bidderRequest.auctionId);
361
+ adserverTargeting['np_auc_id'] = String(aucId);
355
362
  adserverTargeting['np_winner'] = String(winningSeat);
356
363
  adserverTargeting['np_bid'] = 'true';
357
364
  if (enhancedAdserverTargeting) {
@@ -490,10 +497,29 @@ export const spec = {
490
497
  return null;
491
498
  },
492
499
  getGetParametersAsObject() {
493
- let parsed = parseUrl(getRefererInfo().page);
500
+ let parsed = parseUrl(this.getRefererInfo().location); // was getRefererInfo().page but this is not backwards compatible
494
501
  logInfo('getGetParametersAsObject found:', parsed.search);
495
502
  return parsed.search;
496
503
  },
504
+ getRefererInfo() {
505
+ if (getRefererInfo().hasOwnProperty('location')) {
506
+ logInfo('FOUND location on getRefererInfo OK (prebid >= 7); will use getRefererInfo for location & page');
507
+ return getRefererInfo();
508
+ } else {
509
+ logInfo('DID NOT FIND location on getRefererInfo (prebid < 7); will use legacy code that ALWAYS worked reliably to get location & page ;-)');
510
+ try {
511
+ return {
512
+ page: top.location.href,
513
+ location: top.location.href
514
+ };
515
+ } catch (e) {
516
+ return {
517
+ page: window.location.href,
518
+ location: window.location.href
519
+ };
520
+ }
521
+ }
522
+ },
497
523
  blockTheRequest() {
498
524
  let npRequest = config.getConfig('newspassid.np_request');
499
525
  if (typeof npRequest == 'boolean' && !npRequest) {
@@ -259,6 +259,18 @@ export const novatiqIdSubmodule = {
259
259
  srcId = configParams.sourceid;
260
260
  }
261
261
  return srcId;
262
+ },
263
+ eids: {
264
+ 'novatiq': {
265
+ getValue: function(data) {
266
+ if (data.snowflake.id === undefined) {
267
+ return data.snowflake;
268
+ }
269
+
270
+ return data.snowflake.id;
271
+ },
272
+ source: 'novatiq.com',
273
+ },
262
274
  }
263
275
  };
264
276
  submodule('userId', novatiqIdSubmodule);
@@ -72,6 +72,32 @@ export const oneKeyIdSubmodule = {
72
72
  return {
73
73
  callback: getIdsAndPreferences
74
74
  };
75
+ },
76
+ eids: {
77
+ 'oneKeyData': {
78
+ getValue: function(data) {
79
+ if (data && Array.isArray(data.identifiers) && data.identifiers[0]) {
80
+ return data.identifiers[0].value;
81
+ }
82
+ },
83
+ source: 'paf',
84
+ atype: 1,
85
+ getEidExt: function(data) {
86
+ if (data && data.preferences) {
87
+ return {preferences: data.preferences};
88
+ }
89
+ },
90
+ getUidExt: function(data) {
91
+ if (data && Array.isArray(data.identifiers) && data.identifiers[0]) {
92
+ const id = data.identifiers[0];
93
+ return {
94
+ version: id.version,
95
+ type: id.type,
96
+ source: id.source
97
+ };
98
+ }
99
+ }
100
+ }
75
101
  }
76
102
  };
77
103