gatsby-core-theme 44.13.0 → 44.13.2

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,33 @@
1
+ ## [44.13.2](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/compare/v44.13.1...v44.13.2) (2026-02-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * update removeUnwantedSections function ([c2c4e35](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/c2c4e3592bfd9f7701ed9189a5252eb6d2206489))
7
+
8
+
9
+ * Merge branch 'en-360-search' into 'master' ([0b1fc19](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/0b1fc1916c148930195ffbee900ec9369023516d))
10
+
11
+ ## [44.13.1](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/compare/v44.13.0...v44.13.1) (2026-02-02)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * conditional set cookie in tracker ssr ([75b54b0](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/75b54b0d15b9b43304c3de7cdc0d16dcf6022a43))
17
+ * delete external referrer cookie ([24881a3](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/24881a3042486a3289ca1e16eec89095415b28c6))
18
+ * external referer as request url on tracker ([c78a5ee](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/c78a5eec765c99067135c2e9fbdeeadcec1e319f))
19
+ * remove external referer on route update ([a951246](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/a9512464b6c1008764b8696e741df5a5aae6707b))
20
+ * update tracker link ([f52be1c](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/f52be1c3dc67c1b1fbd2c8c044574b3b8ba206d8))
21
+
22
+
23
+ * Merge branch 'fix/delete-external-referrer-cookie' into 'master' ([e2af155](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/e2af1555083beff6f7cf6c76f0013668c56b8045))
24
+ * Merge branch 'feat-tracker-referer' into 'master' ([3dbbc21](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/3dbbc2148762b8cfd6bb10ace986fc42850f99ab))
25
+
26
+
27
+ ### Tests
28
+
29
+ * trackers ([6730f77](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/commit/6730f77e591e7e70f23f65c822600dc1813b0e79))
30
+
1
31
  # [44.13.0](https://gitlab.com/g2m-gentoo/team-floyd/themes/gatsby-themes/compare/v44.12.4...v44.13.0) (2026-01-28)
2
32
 
3
33
 
package/gatsby-browser.js CHANGED
@@ -9,23 +9,27 @@
9
9
  /* eslint-disable prefer-destructuring */
10
10
 
11
11
  // Main Vars
12
- require('./src/styles/utils/variables/_colors.scss');
13
- require('./src/styles/utils/variables/_main.scss');
14
- require('./src/styles/base/_typography.scss');
15
- require('./src/styles/base/_reset.scss');
16
- require('./src/styles/base/_spacing.scss');
17
- require('./src/styles/layouts/_grid.scss');
12
+ require("./src/styles/utils/variables/_colors.scss");
13
+ require("./src/styles/utils/variables/_main.scss");
14
+ require("./src/styles/base/_typography.scss");
15
+ require("./src/styles/base/_reset.scss");
16
+ require("./src/styles/base/_spacing.scss");
17
+ require("./src/styles/layouts/_grid.scss");
18
18
 
19
19
  function initGTM() {
20
- if (window.loadGTM === false || window.gtmDidInit || process.env.DISABLE_GTM === 'true') {
20
+ if (
21
+ window.loadGTM === false ||
22
+ window.gtmDidInit ||
23
+ process.env.DISABLE_GTM === "true"
24
+ ) {
21
25
  return false;
22
26
  }
23
27
 
24
28
  window.gtmDidInit = true; // flag to ensure script does not get added to DOM more than once.
25
29
  const trackingLink = `https://www.googletagmanager.com/gtm.js?id=${process.env.GA_TRACKING_ID}`;
26
30
 
27
- const script = document.createElement('script');
28
- script.type = 'text/javascript';
31
+ const script = document.createElement("script");
32
+ script.type = "text/javascript";
29
33
  script.async = true;
30
34
  script.src = trackingLink;
31
35
 
@@ -33,18 +37,18 @@ function initGTM() {
33
37
  // eslint-disable-next-line no-undef
34
38
  dataLayer.push({
35
39
  // ensure PageViews are always tracked
36
- event: 'gtm.js',
37
- 'gtm.start': new Date().getTime(),
38
- 'gtm.uniqueEventId': 0,
40
+ event: "gtm.js",
41
+ "gtm.start": new Date().getTime(),
42
+ "gtm.uniqueEventId": 0,
39
43
  });
40
44
  };
41
45
  document.head.appendChild(script);
42
46
 
43
- const noscript = document.createElement('noscript');
44
- const iframe = document.createElement('iframe');
47
+ const noscript = document.createElement("noscript");
48
+ const iframe = document.createElement("iframe");
45
49
  iframe.src = trackingLink;
46
- iframe.style.display = 'none';
47
- iframe.style.visibility = 'hidden';
50
+ iframe.style.display = "none";
51
+ iframe.style.visibility = "hidden";
48
52
  iframe.height = 0;
49
53
  iframe.width = 0;
50
54
  noscript.innerHTML += iframe.outerHTML;
@@ -52,16 +56,15 @@ function initGTM() {
52
56
  }
53
57
 
54
58
  function optinMonster() {
55
- const script = document.createElement('script');
56
- script.id = 'optin-monstr';
57
- script.setAttribute('data-user', process.env.OPTINMONSTR_USER);
58
- script.setAttribute('data-account', process.env.OPTINMONSTR_ACC);
59
- script.src = 'https://a.omappapi.com/app/js/api.min.js';
59
+ const script = document.createElement("script");
60
+ script.id = "optin-monstr";
61
+ script.setAttribute("data-user", process.env.OPTINMONSTR_USER);
62
+ script.setAttribute("data-account", process.env.OPTINMONSTR_ACC);
63
+ script.src = "https://a.omappapi.com/app/js/api.min.js";
60
64
  script.async = true;
61
65
  document.head.appendChild(script);
62
66
  }
63
67
 
64
-
65
68
  const loadFacebookPixel = () => {
66
69
  !(function (f, b, e, v, n, t, s) {
67
70
  // eslint-disable-next-line no-multi-assign
@@ -75,15 +78,20 @@ const loadFacebookPixel = () => {
75
78
  if (!f._fbq) f._fbq = n;
76
79
  n.push = n;
77
80
  n.loaded = !0;
78
- n.version = '2.0';
81
+ n.version = "2.0";
79
82
  n.queue = [];
80
83
  t = b.createElement(e);
81
84
  t.async = !0;
82
- t.id = 'pixel-code';
85
+ t.id = "pixel-code";
83
86
  t.src = v;
84
87
  s = b.getElementsByTagName(e)[0];
85
88
  s.parentNode.insertBefore(t, s);
86
- })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
89
+ })(
90
+ window,
91
+ document,
92
+ "script",
93
+ "https://connect.facebook.net/en_US/fbevents.js"
94
+ );
87
95
  };
88
96
 
89
97
  const microsoftAdvertising = () => {
@@ -91,59 +99,71 @@ const microsoftAdvertising = () => {
91
99
  var f, n, i;
92
100
  (w[u] = w[u] || []),
93
101
  (f = function () {
94
- var o = { ti: '187106455', enableAutoSpaTracking: true };
95
- (o.q = w[u]), (w[u] = new UET(o)), w[u].push('pageLoad');
102
+ var o = { ti: "187106455", enableAutoSpaTracking: true };
103
+ (o.q = w[u]), (w[u] = new UET(o)), w[u].push("pageLoad");
96
104
  }),
97
105
  (n = d.createElement(t)),
98
106
  (n.src = r),
99
107
  (n.async = 1),
100
- (n.id = 'microsoft-code'),
108
+ (n.id = "microsoft-code"),
101
109
  (n.onload = n.onreadystatechange =
102
110
  function () {
103
111
  var s = this.readyState;
104
- (s && s !== 'loaded' && s !== 'complete') ||
112
+ (s && s !== "loaded" && s !== "complete") ||
105
113
  (f(), (n.onload = n.onreadystatechange = null));
106
114
  }),
107
115
  (i = d.getElementsByTagName(t)[0]),
108
116
  i.parentNode.insertBefore(n, i);
109
- })(window, document, 'script', '//bat.bing.com/bat.js', 'uetq');
117
+ })(window, document, "script", "//bat.bing.com/bat.js", "uetq");
110
118
  };
111
119
 
112
- const piguard = () =>{
120
+ const piguard = () => {
113
121
  if (window.loadGTM === false) {
114
122
  return false;
115
123
  }
116
124
 
117
- const script = document.createElement('script');
118
- script.id = 'piguard';
125
+ const script = document.createElement("script");
126
+ script.id = "piguard";
119
127
  script.src = `https://pg.${process.env.GATSBY_SITE_NAME}/analytics.js?tid=PP-${process.env.PIGUARD_ID}`;
120
128
  script.async = true;
121
129
  document.head.appendChild(script);
122
- }
130
+ };
123
131
 
124
132
  function scrollEvent(event) {
125
133
  initGTM();
126
134
 
127
- if (!document.getElementById('piguard') && process.env.ENABLE_PIGUARD === 'true') {
135
+ if (
136
+ !document.getElementById("piguard") &&
137
+ process.env.ENABLE_PIGUARD === "true"
138
+ ) {
128
139
  piguard();
129
140
  }
130
141
 
131
- if (process.env.ENABLE_MICROSOFT === 'true' && !document.getElementById('microsoft-code'))
142
+ if (
143
+ process.env.ENABLE_MICROSOFT === "true" &&
144
+ !document.getElementById("microsoft-code")
145
+ )
132
146
  microsoftAdvertising();
133
147
 
134
- if (process.env.ENABLE_OPTINMONSTR === 'true' && !document.getElementById('optin-monstr'))
148
+ if (
149
+ process.env.ENABLE_OPTINMONSTR === "true" &&
150
+ !document.getElementById("optin-monstr")
151
+ )
135
152
  optinMonster();
136
- if (process.env.ENABLE_PIXEL === 'true' && !document.getElementById('pixel-code')) {
153
+ if (
154
+ process.env.ENABLE_PIXEL === "true" &&
155
+ !document.getElementById("pixel-code")
156
+ ) {
137
157
  if (
138
- typeof window !== 'undefined' &&
158
+ typeof window !== "undefined" &&
139
159
  window.location.pathname !== process.env.PAGE_EXCLUDE_PIXEL
140
160
  ) {
141
161
  loadFacebookPixel();
142
162
 
143
- fbq('init', process.env.PIXEL_ID);
163
+ fbq("init", process.env.PIXEL_ID);
144
164
 
145
165
  // Initialize and track the PageView event
146
- fbq('track', 'PageView');
166
+ fbq("track", "PageView");
147
167
  }
148
168
  }
149
169
 
@@ -153,11 +173,23 @@ function scrollEvent(event) {
153
173
  }
154
174
 
155
175
  exports.onClientEntry = () => {
156
- if (process.env.PPC === 'true') {
176
+ if (process.env.PPC === "true") {
157
177
  scrollEvent(null);
158
178
  } else {
159
- document.addEventListener('scroll', scrollEvent, { passive: true });
160
- document.addEventListener('mousemove', scrollEvent, { passive: true });
161
- document.addEventListener('touchstart', scrollEvent, { passive: true });
179
+ document.addEventListener("scroll", scrollEvent, { passive: true });
180
+ document.addEventListener("mousemove", scrollEvent, { passive: true });
181
+ document.addEventListener("touchstart", scrollEvent, { passive: true });
162
182
  }
183
+ // Capture external referrer on first entry
184
+ if (
185
+ document.referrer &&
186
+ !document.referrer.includes(window.location.hostname)
187
+ ) {
188
+ document.cookie = `external_referer=${document.referrer}; path=/; SameSite=Lax`;
189
+ }
190
+ };
191
+
192
+ exports.onRouteUpdate = () => {
193
+ document.cookie =
194
+ "external_referer=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax";
163
195
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gatsby-core-theme",
3
- "version": "44.13.0",
3
+ "version": "44.13.2",
4
4
  "description": "Gatsby Theme NPM Package",
5
5
  "author": "",
6
6
  "license": "ISC",
@@ -22,13 +22,14 @@ const AppTracker = (props) => {
22
22
  }
23
23
  `);
24
24
 
25
-
26
-
27
25
  const { pageContext } = props;
28
26
 
29
27
  return (
30
28
  <MainProvider
31
- value={{ translations: data.translations, language: pageContext.page.language }}
29
+ value={{
30
+ translations: data.translations,
31
+ language: pageContext.page.language,
32
+ }}
32
33
  >
33
34
  <Tracker {...props} />
34
35
  </MainProvider>
@@ -36,18 +37,22 @@ const AppTracker = (props) => {
36
37
  };
37
38
 
38
39
  export const Head = ({ pageContext }) => (
39
- <HeadData page={pageContext.page} authors={pageContext.authors} siteInfo={pageContext.siteInfo} />
40
+ <HeadData
41
+ page={pageContext.page}
42
+ authors={pageContext.authors}
43
+ siteInfo={pageContext.siteInfo}
44
+ />
40
45
  );
41
46
 
42
47
  export async function getServerData({ pageContext, headers, url }) {
43
- let res = "";
44
- res = await getAffiliateLink(
48
+ const res = await getAffiliateLink(
45
49
  pageContext.operator,
46
50
  pageContext.page.path,
47
51
  pageContext.page,
48
52
  headers,
49
53
  url
50
54
  );
55
+
51
56
  return res;
52
57
  }
53
58
 
@@ -107,16 +107,20 @@ function extractUrlParams(url) {
107
107
  function buildUrlParams(operator, trackerName, headers, cookie, extraParams) {
108
108
  const ip = headers?.get("x-real-ip") || headers?.get("host") || "127.0.0.1";
109
109
  const userAgent = headers?.get("user-agent") || null;
110
+
110
111
  const affObject = isJsonString(cookie.affObject)
111
112
  ? JSON.parse(cookie.affObject)
112
113
  : {};
113
114
 
114
115
  if (extraParams && extraParams.pt) affObject.module = extraParams.pt;
116
+
115
117
  affObject.request_url =
116
- affObject.http_referer ||
117
- headers?.get("referrer") ||
118
118
  affObject.request_url ||
119
+ cookie.external_referer ||
120
+ headers?.get("referer") ||
121
+ affObject.http_referer ||
119
122
  null;
123
+
120
124
  return {
121
125
  site_id: process.env.SITE_ID,
122
126
  operator_short_name: operator.short_name,
@@ -137,7 +141,7 @@ function buildUrlParams(operator, trackerName, headers, cookie, extraParams) {
137
141
  cookie: JSON.stringify(cookie),
138
142
  ...(affObject || {}),
139
143
  ...(affObject && !affObject.referer
140
- ? { referer: headers?.get("referrer") }
144
+ ? { referer: headers?.get("referer") }
141
145
  : {}),
142
146
  ...(extraParams || {}),
143
147
  };
@@ -279,3 +283,45 @@ export function trackerLinkActive(operator, tracker = "main") {
279
283
  }
280
284
  return operator?.links[tracker] || operator?.links?.main;
281
285
  }
286
+ export function buildExternalRefererDeleteSetCookies(headers) {
287
+ const getHeader = (name) => {
288
+ if (!headers) return null;
289
+ if (typeof headers.get === "function") return headers.get(name) || null;
290
+ return headers[name] || null;
291
+ };
292
+
293
+ const hostHeader =
294
+ getHeader("host") ||
295
+ getHeader(":authority") ||
296
+ getHeader("x-forwarded-host") ||
297
+ getHeader("x-forwarded-server");
298
+
299
+ let hostname = null;
300
+ if (hostHeader) hostname = hostHeader.split(":")[0];
301
+
302
+ const normalizeDomain = (d) => {
303
+ if (!d) return null;
304
+ let dn = d.trim();
305
+ if (dn.startsWith(".")) dn = dn.slice(1);
306
+ if (dn.startsWith("www.")) dn = dn.slice(4);
307
+ return dn || null;
308
+ };
309
+
310
+ const normalizedHost = normalizeDomain(hostname);
311
+ const domainPart =
312
+ normalizedHost && !normalizedHost.includes("localhost")
313
+ ? `; Domain=${normalizedHost}`
314
+ : "";
315
+
316
+ const cookieBase =
317
+ "external_referer=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0";
318
+ const buildDeleteCookie = (dp) => `${cookieBase}${dp}; SameSite=Lax`;
319
+
320
+ // Only emit deletion cookies derived from the Host (domainPart) and
321
+ // a host-only variant. No need to parse existing Set-Cookie headers.
322
+ if (domainPart) {
323
+ return [buildDeleteCookie(domainPart), buildDeleteCookie("")];
324
+ }
325
+
326
+ return buildDeleteCookie("");
327
+ }
@@ -273,4 +273,40 @@ describe("Tracker Helper", () => {
273
273
  expect(Tracker.isTrackerLink("za_en/type/short_name")).toBe(false);
274
274
  });
275
275
  });
276
+
277
+ describe("buildExternalRefererDeleteSetCookies()", () => {
278
+ const cookieBase =
279
+ "external_referer=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0";
280
+
281
+ test("returns two deletion cookies when host header present (Map)", () => {
282
+ const headers = new Map();
283
+ headers.set("host", "example.com:8080");
284
+
285
+ const result = Tracker.buildExternalRefererDeleteSetCookies(headers);
286
+
287
+ expect(Array.isArray(result)).toBe(true);
288
+ expect(result.length).toBe(2);
289
+ expect(result[0]).toBe(`${cookieBase}; Domain=example.com; SameSite=Lax`);
290
+ expect(result[1]).toBe(`${cookieBase}; SameSite=Lax`);
291
+ });
292
+
293
+ test("returns single deletion cookie when no host header present", () => {
294
+ const result = Tracker.buildExternalRefererDeleteSetCookies(null);
295
+ expect(result).toBe(`${cookieBase}; SameSite=Lax`);
296
+ });
297
+
298
+ test("normalizes leading dot and www. in host (object with :authority)", () => {
299
+ const headers = {
300
+ get: (name) => {
301
+ if (name === ":authority") return "www.example.com";
302
+ return null;
303
+ },
304
+ };
305
+
306
+ const result = Tracker.buildExternalRefererDeleteSetCookies(headers);
307
+ expect(Array.isArray(result)).toBe(true);
308
+ expect(result[0]).toBe(`${cookieBase}; Domain=example.com; SameSite=Lax`);
309
+ expect(result[1]).toBe(`${cookieBase}; SameSite=Lax`);
310
+ });
311
+ });
276
312
  });
@@ -4,6 +4,7 @@ import { pickPageKeys, pickRelationKeys } from '../constants/pick-keys.mjs';
4
4
  import settings from '../constants/settings.mjs';
5
5
  // eslint-disable-next-line import/no-cycle
6
6
  import { processExtraFields } from './index.mjs';
7
+ import { mainSettings } from '../constants/site-settings/main.mjs';
7
8
 
8
9
  const { pick } = loadash;
9
10
 
@@ -141,7 +142,7 @@ export function clean(object) {
141
142
  }
142
143
 
143
144
  export function removeUnwantedSections(obj, pageType, ribbonsData) {
144
-
145
+ const limit = mainSettings?.default?.recommended_casinos_limit || 3;
145
146
  const marketSection = {
146
147
  games: ["post_main_games"],
147
148
  operator: [
@@ -183,7 +184,7 @@ export function removeUnwantedSections(obj, pageType, ribbonsData) {
183
184
  ) {
184
185
  acc[key].modules[0].items[0].items = acc[
185
186
  key
186
- ].modules[0].items[0].items.slice(0, 3);
187
+ ].modules[0].items[0].items.slice(0, limit);
187
188
  const { items } = acc[key].modules[0].items[0];
188
189
 
189
190
  // Connect ribbons ID to label