PageSourceSearch

https://www.pfizermenopause.com/lib/scripts/symlink-analytics.js

js pfizermenopause.com collected 2026-10-09 18:13:24 UTC 4,571 bytes, 138 lines download raw bytes

1import { getMetadata } from './lib-franklin.js';
2
3class Analytics {
4  constructor(manager) {
5    this.manager = manager;
6    this.globals = {};
7    this.data = {};
8  }
9
10  async loadGlobalAnalytics(url = '/global/analytics.json') {
11    const resp = await fetch(url);
12    const json = await resp.json();
13    this.globals = json.data.map((row) => row.Key);
14    const dataArray = json.data
15      .filter((row) => row.Value !== '')
16      .map((row) => [row.Key, row.Value]);
17    this.setData(Object.fromEntries(dataArray));
18  }
19
20  /* eslint-disable class-methods-use-this */
21  getPageUrl() {
22    const { host, protocol } = document.location;
23    let { pathname } = document.location;
24    pathname = pathname !== '/' ? pathname : '';
25    const urlSegments = [protocol, '//', host, pathname];
26    return urlSegments.join('');
27  }
28
29  getGlobalOverrides() {
30    const data = {};
31    this.globals.forEach((key) => {
32      const value = getMetadata(key);
33      if (value) {
34        data[key] = value;
35      }
36    });
37    return data;
38  }
39
40  loadPageAnalyticsData() {
41    const defaults = {};
42    defaults['Page Name'] = getMetadata('og:title');
43    defaults['Page URL'] = this.getPageUrl();
44    const overrides = this.getGlobalOverrides();
45    this.setData({ ...defaults, ...overrides });
46  }
47
48  setData(data) {
49    this.data = { ...this.data, ...data };
50  }
51
52  toCamelCase(text) {
53    const words = text.split(/[\s_-]+/);
54    for (let i = 1; i < words.length; i += 1) {
55      words[i] = words[i][0].toUpperCase() + words[i].substring(1);
56    }
57    const camelCase = words.join('');
58    return camelCase[0].toLowerCase() + camelCase.substring(1);
59  }
60
61  formatMetaDataKeys(data) {
62    const newData = {};
63    Object.keys(data).forEach((key) => {
64      newData[this.toCamelCase(key)] = data[key];
65    });
66    return newData;
67  }
68
69  /**
70   * Returns experiment id and variant running, if any
71   * @returns {{experimentVariant: *, experimentId}}
72   */
73  getExperimentDetails() {
74    let experiment;
75    if (window.hlx && window.hlx.experiment) {
76      experiment = {
77        experimentId: window.hlx.experiment.id,
78        experimentVariant: window.hlx.experiment.selectedVariant,
79      };
80    }
81    return experiment;
82  }
83
84  async initialize(defaults, url) {
85    this.setData(defaults);
86    if (!this.manager.endpoint) return;
87    await this.loadGlobalAnalytics(url);
88    this.loadPageAnalyticsData();
89    window.pfAnalyticsData = window.pfAnalyticsData || {};
90    window.pfAnalyticsData.pfPage = window.pfAnalyticsData.pfPage || {};
91    const pfExperiment = this.getExperimentDetails();
92    if (pfExperiment) {
93      window.pfAnalyticsData.pfExperiment = pfExperiment;
94    }
95    Object.assign(window.pfAnalyticsData.pfPage, this.formatMetaDataKeys(this.data));
96  }
97
98  /**
99   * Appends data to element as an attribute.
100   * Recommended for all clickable all events (e.g. <a>, <button>, etc.).
101   * @param {string} event The event type (i.e. pfLinkName, pfFileDownload, etc.)
102   * @param {json} data The data to append to analytics data layer
103   * @param {element} element The element to append the data layer attribute
104   */
105  static setDataLayer(event, data, element) {
106    if (!element || !event || !data) {
107      return; // No Action
108    }
109    const dataLayer = { pfAnalyticsAttrData: {} };
110    dataLayer.pfAnalyticsAttrData[event] = data;
111    element.setAttribute('sc-pf-data', JSON.stringify(dataLayer));
112  }
113
114  /**
115   * Appends data to element as an attribute
116   * Recommended for all NON clickable all events (e.g. scroll, custom events, specific conditions, etc.).
117   * @param {string} event The data type (i.e. pfLinkName, pfFileDownload, etc.)
118   * @param {json} data The data to append to analytics data layer
119   */
120  static triggerEvent(event, data) {
121    if (event === 'pfPage') { // Exception for pfPage event for assign on page load
122      window.pfAnalyticsData = window.pfAnalyticsData || {};
123      window.pfAnalyticsData.pfPage = window.pfAnalyticsData.pfPage || {};
124      Object.assign(window.pfAnalyticsData.pfPage, data);
125    } else if (window.$pfa_datalayer) { // If Pfizer Analytics events handler already setup triggers event
126      const dataLayer = { event };
127      dataLayer[event] = data;
128      const eventObj = new CustomEvent('pfAnalytics', { detail: [dataLayer] });
129      document.querySelector('body').dispatchEvent(eventObj);
130    } else { // If Pfizer Analytics events handler no ready, it add event to queue
131      window.$pfa_queue_dl = window.$pfa_queue_dl || [];
132      window.$pfa_queue_dl.push([event, data]);
133    }
134  }
135
136}
137
138export default Analytics;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.