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

prebid / Prebid.js / 22148703734

18 Feb 2026 04:41PM UTC coverage: 96.218% (+0.01%) from 96.205%
22148703734

Pull #14488

github

ff15b7
patmmccann
Docs: require TypeScript for new src/modules/libraries files
Pull Request #14488: Prebid 11: document TypeScript-first policy for new source files

54237 of 66588 branches covered (81.45%)

208182 of 216366 relevant lines covered (96.22%)

69.07 hits per line

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

58.75
/modules/growthCodeAnalyticsAdapter.js
1
/**
1✔
2
 * growthCodeAnalyticsAdapter.js - GrowthCode Analytics Adapter
3
 */
4
import { ajax } from '../src/ajax.js';
5
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
import adapterManager from '../src/adapterManager.js';
7
import * as utils from '../src/utils.js';
8
import { EVENTS } from '../src/constants.js';
9
import {getStorageManager} from '../src/storageManager.js';
10
import {getRefererInfo} from '../src/refererDetection.js';
11
import {logError, logInfo} from '../src/utils.js';
12
import {MODULE_TYPE_ANALYTICS} from '../src/activities/modules.js';
13

14
const MODULE_NAME = 'growthCodeAnalytics';
1✔
15
const DEFAULT_PID = 'INVALID_PID'
1✔
16
const ENDPOINT_URL = 'https://analytics.gcprivacy.com/v3/pb/analytics'
1✔
17

18
export const storage = getStorageManager({moduleType: MODULE_TYPE_ANALYTICS, moduleName: MODULE_NAME});
1✔
19

20
const sessionId = utils.generateUUID();
1✔
21

22
let trackEvents = [];
1✔
23
let pid = DEFAULT_PID;
1✔
24
let url = ENDPOINT_URL;
1✔
25

26
let eventQueue = [];
1✔
27

28
let startAuction = 0;
1✔
29
let bidRequestTimeout = 0;
1✔
30
const analyticsType = 'endpoint';
1✔
31

32
const growthCodeAnalyticsAdapter = Object.assign(adapter({url: url, analyticsType}), {
1✔
33
  track({eventType, args}) {
2✔
34
    const eventData = args ? utils.deepClone(args) : {};
2!
35
    let data = {};
2✔
36
    if (!trackEvents.includes(eventType)) return;
2✔
37
    switch (eventType) {
1!
38
      case EVENTS.AUCTION_INIT: {
39
        data = eventData;
×
40
        startAuction = data.timestamp;
×
41
        bidRequestTimeout = data.timeout;
×
42
        break;
×
43
      }
44

45
      case EVENTS.AUCTION_END: {
46
        data = eventData;
1✔
47
        data.start = startAuction;
1✔
48
        data.end = Date.now();
1✔
49
        break;
1✔
50
      }
51

52
      case EVENTS.BID_ADJUSTMENT: {
53
        data.bidders = eventData;
×
54
        break;
×
55
      }
56

57
      case EVENTS.BID_TIMEOUT: {
58
        data.bidders = eventData;
×
59
        data.duration = bidRequestTimeout;
×
60
        break;
×
61
      }
62

63
      case EVENTS.BID_REQUESTED: {
64
        data = eventData;
×
65
        break;
×
66
      }
67

68
      case EVENTS.BID_RESPONSE: {
69
        data = eventData;
×
70
        delete data.ad;
×
71
        break;
×
72
      }
73

74
      case EVENTS.BID_WON: {
75
        data = eventData;
×
76
        delete data.ad;
×
77
        delete data.adUrl;
×
78
        break;
×
79
      }
80

81
      case EVENTS.BIDDER_DONE: {
82
        data = eventData;
×
83
        break;
×
84
      }
85

86
      case EVENTS.SET_TARGETING: {
87
        data.targetings = eventData;
×
88
        break;
×
89
      }
90

91
      case EVENTS.REQUEST_BIDS: {
92
        data = eventData;
×
93
        break;
×
94
      }
95

96
      case EVENTS.NO_BID: {
97
        data = eventData
×
98
        break;
×
99
      }
100

101
      default:
102
        return;
×
103
    }
104

105
    data.eventType = eventType;
1✔
106
    data.timestamp = data.timestamp || Date.now();
1✔
107

108
    sendEvent(data);
1✔
109
  }
110
});
111

112
growthCodeAnalyticsAdapter.originEnableAnalytics = growthCodeAnalyticsAdapter.enableAnalytics;
1✔
113

114
growthCodeAnalyticsAdapter.enableAnalytics = function(conf = {}) {
3!
115
  if (typeof conf.options === 'object') {
3!
116
    if (conf.options.pid) {
3!
117
      pid = conf.options.pid;
3✔
118
      url = conf.options.url ? conf.options.url : ENDPOINT_URL;
3!
119
    } else {
120
      logError(MODULE_NAME + ' Not a valid PartnerID')
×
121
      return
×
122
    }
123
    if (conf.options.trackEvents) {
3✔
124
      trackEvents = conf.options.trackEvents;
3✔
125
    }
126
  } else {
127
    logError(MODULE_NAME + ' Invalid configuration');
×
128
    return;
×
129
  }
130

131
  growthCodeAnalyticsAdapter.originEnableAnalytics(conf);
3✔
132
};
133

134
function logToServer() {
135
  if (pid === DEFAULT_PID) return;
1!
136
  if (eventQueue.length >= 1) {
1✔
137
    // Get the correct GCID
138
    const gcid = storage.getDataFromLocalStorage('gcid');
1✔
139

140
    const data = {
1✔
141
      session: sessionId,
142
      pid: pid,
143
      gcid: gcid,
144
      timestamp: Date.now(),
145
      url: getRefererInfo().page,
146
      referer: document.referrer,
147
      events: eventQueue
148
    };
149

150
    ajax(url, {
1✔
151
      success: response => {
152
        logInfo(MODULE_NAME + ' Send Data to Server')
×
153
      },
154
      error: error => {
155
        logInfo(MODULE_NAME + ' Problem Send Data to Server: ' + error)
×
156
      }
157
    }, JSON.stringify(data), {method: 'POST', withCredentials: true})
158

159
    eventQueue = [
1✔
160
    ];
161
  }
162
}
163

164
function sendEvent(event) {
165
  eventQueue.push(event);
1✔
166
  logInfo(MODULE_NAME + 'Analytics Event: ' + event);
1✔
167

168
  if ((event.eventType === EVENTS.AUCTION_END) || (event.eventType === EVENTS.BID_WON)) {
1!
169
    logToServer();
1✔
170
  }
171
}
172

173
adapterManager.registerAnalyticsAdapter({
1✔
174
  adapter: growthCodeAnalyticsAdapter,
175
  code: 'growthCodeAnalytics'
176
});
177

178
growthCodeAnalyticsAdapter.logToServer = logToServer;
1✔
179

180
export default growthCodeAnalyticsAdapter;
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