• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

prebid / Prebid.js / 16197995703

10 Jul 2025 02:32PM UTC coverage: 96.232% (+0.003%) from 96.229%
16197995703

push

github

web-flow
Linting: remove exception (#13518)

* bump coveralls

* remove exceptions

* results

* eslint fix

* Update package-lock.json

* Update package-lock.json

* Core: remove codex comments and unused lint rule (#13520)

---------

Co-authored-by: Demetrio Girardi <dgirardi@prebid.org>

39174 of 48116 branches covered (81.42%)

9842 of 9975 new or added lines in 861 files covered. (98.67%)

15 existing lines in 8 files now uncovered.

192483 of 200020 relevant lines covered (96.23%)

88.4 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.67
/modules/scaleableAnalyticsAdapter.js
1
/* COPYRIGHT SCALEABLE LLC 2019 */
1✔
2

3
import { ajax } from '../src/ajax.js';
4
import { EVENTS } from '../src/constants.js';
5
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
import adapterManager from '../src/adapterManager.js';
7
import { logMessage } from '../src/utils.js';
8

9
// Object.entries polyfill
10
const entries = Object.entries || function(obj) {
1!
11
  const ownProps = Object.keys(obj);
×
12
  let i = ownProps.length;
×
NEW
13
  const resArray = new Array(i); // preallocate the Array
×
14
  while (i--) { resArray[i] = [ownProps[i], obj[ownProps[i]]]; }
×
15

16
  return resArray;
×
17
};
18

19
const BID_TIMEOUT = EVENTS.BID_TIMEOUT;
1✔
20
const AUCTION_INIT = EVENTS.AUCTION_INIT;
1✔
21
const BID_WON = EVENTS.BID_WON;
1✔
22
const AUCTION_END = EVENTS.AUCTION_END;
1✔
23

24
const URL = 'https://auction.scaleable.ai/';
1✔
25
const ANALYTICS_TYPE = 'endpoint';
1✔
26

27
let auctionData = {};
1✔
28

29
const scaleableAnalytics = Object.assign({},
1✔
30
  adapter({
31
    URL,
32
    ANALYTICS_TYPE
33
  }),
34
  {
35
    // Override AnalyticsAdapter functions by supplying custom methods
36
    track({ eventType, args }) {
4✔
37
      switch (eventType) {
4!
38
        case AUCTION_INIT:
39
          onAuctionInit(args);
1✔
40
          break;
1✔
41
        case AUCTION_END:
42
          onAuctionEnd(args);
1✔
43
          break;
1✔
44
        case BID_WON:
45
          onBidWon(args);
1✔
46
          break;
1✔
47
        case BID_TIMEOUT:
48
          onBidTimeout(args);
1✔
49
          break;
1✔
50
        default:
51
          break;
×
52
      }
53
    }
54
  }
55
);
56

57
scaleableAnalytics.config = {};
1✔
58
scaleableAnalytics.originEnableAnalytics = scaleableAnalytics.enableAnalytics;
1✔
59
scaleableAnalytics.enableAnalytics = config => {
1✔
60
  scaleableAnalytics.config = config;
4✔
61

62
  scaleableAnalytics.originEnableAnalytics(config);
4✔
63

64
  scaleableAnalytics.enableAnalytics = function _enable() {
4✔
65
    return logMessage(`Analytics adapter for "${global}" already enabled, unnecessary call to \`enableAnalytics\`.`);
×
66
  };
67
}
68

69
scaleableAnalytics.getAuctionData = () => {
1✔
70
  return auctionData;
1✔
71
};
72

73
const sendDataToServer = data => ajax(URL, () => {}, JSON.stringify(data));
3✔
74

75
// Track auction initiated
76
const onAuctionInit = args => {
1✔
77
  const config = scaleableAnalytics.config || {options: {}};
1!
78

79
  const adunitObj = {};
1✔
80
  const adunits = [];
1✔
81

82
  // Loop through adunit codes first
83
  args.adUnitCodes.forEach((code) => {
1✔
84
    adunitObj[code] = [{
1✔
85
      bidder: 'scaleable_adunit_request'
86
    }]
87
  });
88

89
  // Loop through bidder requests and bids
90
  args.bidderRequests.forEach((bidderObj) => {
1✔
91
    bidderObj.bids.forEach((bidObj) => {
1✔
92
      adunitObj[bidObj.adUnitCode].push({
1✔
93
        bidder: bidObj.bidder,
94
        params: bidObj.params
95
      })
96
    });
97
  });
98

99
  entries(adunitObj).forEach(([adunitCode, bidRequests]) => {
1✔
100
    adunits.push({
1✔
101
      code: adunitCode,
102
      bidRequests: bidRequests
103
    });
104
  });
105

106
  const data = {
1✔
107
    event: 'request',
108
    site: config.options.site,
109
    adunits: adunits
110
  }
111

112
  sendDataToServer(data);
1✔
113
}
114

115
// Handle all events besides requests and wins
116
const onAuctionEnd = args => {
1✔
117
  const config = scaleableAnalytics.config || {options: {}};
1!
118

119
  const adunitObj = {};
1✔
120
  const adunits = [];
1✔
121

122
  // Add Bids Received
123
  args.bidsReceived.forEach((bidObj) => {
1✔
124
    if (!adunitObj[bidObj.adUnitCode]) { adunitObj[bidObj.adUnitCode] = []; }
1✔
125

126
    adunitObj[bidObj.adUnitCode].push({
1✔
127
      bidder: bidObj.bidderCode || bidObj.bidder,
1!
128
      cpm: bidObj.cpm,
129
      currency: bidObj.currency,
130
      dealId: bidObj.dealId,
131
      type: bidObj.mediaType,
132
      ttr: bidObj.timeToRespond,
133
      size: bidObj.size
134
    });
135
  });
136

137
  // Add in other data (timeouts) as we push to adunits
138
  entries(adunitObj).forEach(([adunitCode, bidsReceived]) => {
1✔
139
    const bidData = bidsReceived.concat(auctionData[adunitCode] || []);
1✔
140
    adunits.push({
1✔
141
      code: adunitCode,
142
      bidData: bidData
143
    });
144

145
    delete auctionData[adunitCode];
1✔
146
  });
147

148
  // Add in any missed auction data
149
  entries(auctionData).forEach(([adunitCode, bidData]) => {
1✔
150
    adunits.push({
1✔
151
      code: adunitCode,
152
      bidData: bidData
153
    })
154
  });
155

156
  const data = {
1✔
157
    event: 'bids',
158
    site: config.options.site,
159
    adunits: adunits
160
  }
161

162
  if (adunits.length) { sendDataToServer(data); }
1✔
163

164
  // Reset auctionData
165
  auctionData = {}
1✔
166
}
167

168
// Bid Win Events occur after auction end
169
const onBidWon = args => {
1✔
170
  const config = scaleableAnalytics.config || {options: {}};
1!
171

172
  const data = {
1✔
173
    event: 'win',
174
    site: config.options.site,
175
    adunit: args.adUnitCode,
176
    code: args.bidderCode,
177
    cpm: args.cpm,
178
    ttr: args.timeToRespond,
179
    params: args.params
180
  };
181

182
  sendDataToServer(data);
1✔
183
}
184

185
const onBidTimeout = args => {
1✔
186
  args.forEach(currObj => {
1✔
187
    if (!auctionData[currObj.adUnitCode]) {
1✔
188
      auctionData[currObj.adUnitCode] = []
1✔
189
    }
190

191
    auctionData[currObj.adUnitCode].push({
1✔
192
      timeouts: 1,
193
      bidder: currObj.bidder
194
    });
195
  });
196
}
197

198
adapterManager.registerAnalyticsAdapter({
1✔
199
  adapter: scaleableAnalytics,
200
  code: 'scaleable'
201
})
202

203
export default scaleableAnalytics;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc