@lidofinance/analytics-matomo 0.54.0 → 0.55.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.
package/dist/index.cjs CHANGED
@@ -27,7 +27,6 @@ $parcel$export($ef5c629b17efc154$exports, "COOKIE_ALLOWED_MAIN_KEY", function ()
27
27
  $parcel$export($ef5c629b17efc154$exports, "META_INFO_COOKIE", function () { return $ef5c629b17efc154$export$506bf4ed084a716; });
28
28
  $parcel$export($ef5c629b17efc154$exports, "COOKIE_ALLOWED_KEYS", function () { return $ef5c629b17efc154$export$7567476bb64c3721; });
29
29
  $parcel$export($ef5c629b17efc154$exports, "matomoAvailable", function () { return $ef5c629b17efc154$export$e5ed1c22a80aba4b; });
30
- $parcel$export($ef5c629b17efc154$exports, "checkCookieAllowed", function () { return $ef5c629b17efc154$export$83c2c3def90d3b5a; });
31
30
  $parcel$export($ef5c629b17efc154$exports, "callMatomo", function () { return $ef5c629b17efc154$export$cecaccc605742066; });
32
31
  $parcel$export($ef5c629b17efc154$exports, "trackEvent", function () { return $ef5c629b17efc154$export$73d0a139caca1fee; });
33
32
  $parcel$export($ef5c629b17efc154$exports, "trackVisibleContentImpressions", function () { return $ef5c629b17efc154$export$40aa6af9e848a6e0; });
@@ -49,18 +48,9 @@ const $ef5c629b17efc154$var$getCrossDomainCookieClientSide = (key)=>{
49
48
  const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`);
50
49
  return document.cookie.match(cookieMatcher)?.[2] ?? defaultValue;
51
50
  };
52
- const $ef5c629b17efc154$export$83c2c3def90d3b5a = ()=>{
53
- if (typeof window === "undefined") return false;
54
- for (const key of $ef5c629b17efc154$export$7567476bb64c3721){
55
- const cookieValue = $ef5c629b17efc154$var$getCrossDomainCookieClientSide(key);
56
- const cookieAllowed = !!(cookieValue && cookieValue === $ef5c629b17efc154$export$69479293c4b47320);
57
- if (cookieAllowed) return cookieAllowed;
58
- }
59
- return false;
60
- };
61
51
  const $ef5c629b17efc154$export$cecaccc605742066 = (apiMethod, ...args)=>{
62
52
  if (!$ef5c629b17efc154$export$e5ed1c22a80aba4b()) (0, $8ec118068c18cb0c$export$6ec25100f86fa29d)();
63
- if (typeof window === "undefined" || !$ef5c629b17efc154$export$83c2c3def90d3b5a()) return;
53
+ if (typeof window === "undefined") return;
64
54
  const customDimensionValue = $ef5c629b17efc154$var$getCrossDomainCookieClientSide($ef5c629b17efc154$export$506bf4ed084a716) || "none";
65
55
  window?._paq?.push([
66
56
  "setCustomDimension",
@@ -83,9 +73,6 @@ const $ef5c629b17efc154$export$3e8733322718eb9 = ()=>{
83
73
  };
84
74
 
85
75
 
86
- // Need if we tried to init matomo manually without cookie,
87
- // and use it after accepting the cookie policy
88
- let $8ec118068c18cb0c$var$futureInitMatomoHost = undefined;
89
76
  const $8ec118068c18cb0c$var$injectMatomoScript = (matomoHost)=>{
90
77
  /**
91
78
  * # How to update matomo
@@ -123,11 +110,7 @@ const $8ec118068c18cb0c$var$injectMatomoScript = (matomoHost)=>{
123
110
  const $8ec118068c18cb0c$export$6ec25100f86fa29d = (matomoHost, customConfig = [])=>{
124
111
  if (typeof window === "undefined") // SSR not supported!
125
112
  return;
126
- if (!(0, $ef5c629b17efc154$export$83c2c3def90d3b5a)()) {
127
- if (matomoHost) $8ec118068c18cb0c$var$futureInitMatomoHost = matomoHost;
128
- return;
129
- }
130
- const _matomoHost = $8ec118068c18cb0c$var$futureInitMatomoHost || matomoHost || window?.__env__?.matomoHost || undefined;
113
+ const _matomoHost = matomoHost || window?.__env__?.matomoHost || undefined;
131
114
  if (!_matomoHost) // Where Do I send analytics?
132
115
  return;
133
116
  if (window._paq) // window._paq has been initialized
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/analytics/matomo/src/index.ts","packages/analytics/matomo/src/init.ts","packages/analytics/matomo/src/utils.ts","packages/analytics/matomo/src/type.ts","packages/analytics/matomo/src/decoratorts.ts"],"sourcesContent":["import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n","import { getDomain, checkCookieAllowed } from './utils'\n\ndeclare global {\n interface Window {\n _paq?: undefined | [string, ...unknown[]][]\n __env__: { matomoHost: string } & Record<string | number | symbol, unknown>\n }\n}\n\n// Need if we tried to init matomo manually without cookie,\n// and use it after accepting the cookie policy\nlet futureInitMatomoHost: string | undefined = undefined\n\nconst injectMatomoScript = (matomoHost: string) => {\n /**\n * # How to update matomo\n *\n * To safely update Matomo without analytics downtime:\n *\n * 1. Download the new Matomo version zip from https://github.com/matomo-org/matomo/releases\n * 2. Extract matomo.js from the zip archive\n * 3. Generate integrity checksum:\n * - Run: `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * - Add 'sha384-' prefix to the generated hash\n * 4. Add the new integrity hash to the array below (keep the old one)\n * 5. Release this package and update all dependent repositories\n *\n * Notes:\n * - The script will automatically use the matching integrity hash\n * - Old integrity values can be safely removed later if desired\n * - No console errors will occur during the transition\n * - This approach ensures zero analytics downtime during updates\n */\n document.documentElement.appendChild(\n Object.assign(document.createElement('script'), {\n async: true,\n src: new URL('/matomo.js', matomoHost).href,\n crossOrigin: 'anonymous',\n /**\n * To generate checksum:\n * 1. Download matomo.js via `curl -O https://matomo.lido.fi/matomo.js`\n * 2. Calculate checkusm via `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * 3. Add sha384 prefix\n * For other options see https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#tools_for_generating_sri_hashes\n */\n integrity: [\n 'sha384-zEaC37u+jplyCMnmF4H7LxCC9kIFKvwV32PWyiLIIIUVOrm1W8+ljIA2kUa/cTHa', // Matomo v 5.2.0 && Matomo v 5.2.2\n ].join(' '),\n }),\n )\n}\n\nexport type MatomoConfig = Array<[string, ...unknown[]]>\n\nexport const initMatomo = (matomoHost?: string, customConfig: MatomoConfig = []): void => {\n if (typeof window === 'undefined') {\n // SSR not supported!\n return\n }\n\n if (!checkCookieAllowed()) {\n if (matomoHost) {\n futureInitMatomoHost = matomoHost\n }\n return\n }\n\n const _matomoHost = futureInitMatomoHost || matomoHost || window?.__env__?.matomoHost || undefined\n\n if (!_matomoHost) {\n // Where Do I send analytics?\n return\n }\n\n if (window._paq) {\n // window._paq has been initialized\n return\n }\n\n window._paq ??= []\n\n const rawConfig = [\n // These are hardcoded values and cannot be changed\n ['setTrackerUrl', new URL('/matomo.php', _matomoHost).href],\n ['requireCookieConsent', true],\n // Add subdomain prefix to page titles to separate analytics by subdomain\n ['setDocumentTitle', window.location.hostname + '/' + (document.title || '')],\n\n // These are custom settings\n ...customConfig,\n\n // These are default settings, will be overwritten if custom set\n ['trackPageView', true],\n ['enableLinkTracking', true],\n ['setSiteId', '1'],\n ['setDomains', [`*.${getDomain()}`]],\n ['enableCrossDomainLinking', true],\n ]\n\n // Map keeps order of keys\n const config = new Map()\n for (const [key, value] of rawConfig) {\n if (!config.has(key)) {\n config.set(key, value)\n }\n }\n\n window?._paq?.push(\n ...Array.from(config.entries())\n .map(([key, value]) => {\n switch (value) {\n case false:\n return false\n case true:\n case undefined:\n return [key]\n default:\n return [key, value]\n }\n })\n .filter((item): item is [string, ...unknown[]] => item !== false),\n )\n\n injectMatomoScript(_matomoHost)\n}\n","import { initMatomo } from './init'\nimport { MatomoEventType } from './type'\n\nexport const COOKIE_ALLOWED_VALUE_YES = 'yes'\nexport const COOKIE_ALLOWED_MAIN_KEY = 'cookie-allowed'\nexport const META_INFO_COOKIE = 'meta-info'\n\nexport const COOKIE_ALLOWED_KEYS = [\n 'LIDO_WIDGET__COOKIES_ALLOWED', // will be deprecated soon\n COOKIE_ALLOWED_MAIN_KEY,\n]\n\nexport const matomoAvailable = (): boolean => {\n return typeof window !== 'undefined' && window._paq !== undefined\n}\n\nconst getCrossDomainCookieClientSide = (key: string): string | null => {\n const defaultValue = null\n\n if (typeof window === 'undefined') {\n return defaultValue\n }\n\n const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`)\n return (document.cookie.match(cookieMatcher)?.[2] as string) ?? defaultValue\n}\n\nexport const checkCookieAllowed = (): boolean => {\n if (typeof window === 'undefined') {\n return false\n }\n\n for (const key of COOKIE_ALLOWED_KEYS) {\n const cookieValue = getCrossDomainCookieClientSide(key)\n const cookieAllowed = !!(cookieValue && cookieValue === COOKIE_ALLOWED_VALUE_YES)\n\n if (cookieAllowed) {\n return cookieAllowed\n }\n }\n\n return false\n}\n\nexport const callMatomo = (apiMethod: string, ...args: unknown[]): void => {\n if (!matomoAvailable()) {\n initMatomo()\n }\n\n if (typeof window === 'undefined' || !checkCookieAllowed()) {\n return\n }\n\n const customDimensionValue = getCrossDomainCookieClientSide(META_INFO_COOKIE) || 'none'\n window?._paq?.push(['setCustomDimension', 1, customDimensionValue])\n\n window?._paq?.push([apiMethod, ...args])\n}\n\nexport const trackEvent = (...event: MatomoEventType): void => {\n callMatomo('trackEvent', ...event)\n}\n\nexport const trackVisibleContentImpressions = (checkOnScroll = true, timeIntervalInMs = 750): void => {\n callMatomo('trackVisibleContentImpressions', checkOnScroll, timeIntervalInMs)\n}\n\nexport const getDomain = () => {\n return location.hostname.split('.').slice(-2).join('.')\n}\n","export type MatomoEventType = [category: string, action: string, name: string]\n","import { MatomoEventType } from './type'\nimport { callMatomo } from './utils'\n\nexport const wrapWithEventTrack = <A extends unknown[], R>(event: MatomoEventType | void, fn: (...args: A) => R) =>\n event\n ? (...args: A): R => {\n callMatomo('trackEvent', ...event)\n return fn?.(...args)\n }\n : fn\n"],"names":[],"version":3,"file":"index.cjs.map"}
1
+ {"mappings":"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","sources":["packages/analytics/matomo/src/index.ts","packages/analytics/matomo/src/init.ts","packages/analytics/matomo/src/utils.ts","packages/analytics/matomo/src/type.ts","packages/analytics/matomo/src/decoratorts.ts"],"sourcesContent":["import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n","import { getDomain } from './utils'\n\ndeclare global {\n interface Window {\n _paq?: undefined | [string, ...unknown[]][]\n __env__: { matomoHost: string } & Record<string | number | symbol, unknown>\n }\n}\n\nconst injectMatomoScript = (matomoHost: string) => {\n /**\n * # How to update matomo\n *\n * To safely update Matomo without analytics downtime:\n *\n * 1. Download the new Matomo version zip from https://github.com/matomo-org/matomo/releases\n * 2. Extract matomo.js from the zip archive\n * 3. Generate integrity checksum:\n * - Run: `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * - Add 'sha384-' prefix to the generated hash\n * 4. Add the new integrity hash to the array below (keep the old one)\n * 5. Release this package and update all dependent repositories\n *\n * Notes:\n * - The script will automatically use the matching integrity hash\n * - Old integrity values can be safely removed later if desired\n * - No console errors will occur during the transition\n * - This approach ensures zero analytics downtime during updates\n */\n document.documentElement.appendChild(\n Object.assign(document.createElement('script'), {\n async: true,\n src: new URL('/matomo.js', matomoHost).href,\n crossOrigin: 'anonymous',\n /**\n * To generate checksum:\n * 1. Download matomo.js via `curl -O https://matomo.lido.fi/matomo.js`\n * 2. Calculate checkusm via `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * 3. Add sha384 prefix\n * For other options see https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#tools_for_generating_sri_hashes\n */\n integrity: [\n 'sha384-zEaC37u+jplyCMnmF4H7LxCC9kIFKvwV32PWyiLIIIUVOrm1W8+ljIA2kUa/cTHa', // Matomo v 5.2.0 && Matomo v 5.2.2\n ].join(' '),\n }),\n )\n}\n\nexport type MatomoConfig = Array<[string, ...unknown[]]>\n\nexport const initMatomo = (matomoHost?: string, customConfig: MatomoConfig = []): void => {\n if (typeof window === 'undefined') {\n // SSR not supported!\n return\n }\n\n const _matomoHost = matomoHost || window?.__env__?.matomoHost || undefined\n\n if (!_matomoHost) {\n // Where Do I send analytics?\n return\n }\n\n if (window._paq) {\n // window._paq has been initialized\n return\n }\n\n window._paq ??= []\n\n const rawConfig = [\n // These are hardcoded values and cannot be changed\n ['setTrackerUrl', new URL('/matomo.php', _matomoHost).href],\n ['requireCookieConsent', true],\n // Add subdomain prefix to page titles to separate analytics by subdomain\n ['setDocumentTitle', window.location.hostname + '/' + (document.title || '')],\n\n // These are custom settings\n ...customConfig,\n\n // These are default settings, will be overwritten if custom set\n ['trackPageView', true],\n ['enableLinkTracking', true],\n ['setSiteId', '1'],\n ['setDomains', [`*.${getDomain()}`]],\n ['enableCrossDomainLinking', true],\n ]\n\n // Map keeps order of keys\n const config = new Map()\n for (const [key, value] of rawConfig) {\n if (!config.has(key)) {\n config.set(key, value)\n }\n }\n\n window?._paq?.push(\n ...Array.from(config.entries())\n .map(([key, value]) => {\n switch (value) {\n case false:\n return false\n case true:\n case undefined:\n return [key]\n default:\n return [key, value]\n }\n })\n .filter((item): item is [string, ...unknown[]] => item !== false),\n )\n\n injectMatomoScript(_matomoHost)\n}\n","import { initMatomo } from './init'\nimport { MatomoEventType } from './type'\n\nexport const COOKIE_ALLOWED_VALUE_YES = 'yes'\nexport const COOKIE_ALLOWED_MAIN_KEY = 'cookie-allowed'\nexport const META_INFO_COOKIE = 'meta-info'\n\nexport const COOKIE_ALLOWED_KEYS = [\n 'LIDO_WIDGET__COOKIES_ALLOWED', // will be deprecated soon\n COOKIE_ALLOWED_MAIN_KEY,\n]\n\nexport const matomoAvailable = (): boolean => {\n return typeof window !== 'undefined' && window._paq !== undefined\n}\n\nconst getCrossDomainCookieClientSide = (key: string): string | null => {\n const defaultValue = null\n\n if (typeof window === 'undefined') {\n return defaultValue\n }\n\n const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`)\n return (document.cookie.match(cookieMatcher)?.[2] as string) ?? defaultValue\n}\n\nexport const callMatomo = (apiMethod: string, ...args: unknown[]): void => {\n if (!matomoAvailable()) {\n initMatomo()\n }\n\n if (typeof window === 'undefined') {\n return\n }\n\n const customDimensionValue = getCrossDomainCookieClientSide(META_INFO_COOKIE) || 'none'\n window?._paq?.push(['setCustomDimension', 1, customDimensionValue])\n\n window?._paq?.push([apiMethod, ...args])\n}\n\nexport const trackEvent = (...event: MatomoEventType): void => {\n callMatomo('trackEvent', ...event)\n}\n\nexport const trackVisibleContentImpressions = (checkOnScroll = true, timeIntervalInMs = 750): void => {\n callMatomo('trackVisibleContentImpressions', checkOnScroll, timeIntervalInMs)\n}\n\nexport const getDomain = () => {\n return location.hostname.split('.').slice(-2).join('.')\n}\n","export type MatomoEventType = [category: string, action: string, name: string]\n","import { MatomoEventType } from './type'\nimport { callMatomo } from './utils'\n\nexport const wrapWithEventTrack = <A extends unknown[], R>(event: MatomoEventType | void, fn: (...args: A) => R) =>\n event\n ? (...args: A): R => {\n callMatomo('trackEvent', ...event)\n return fn?.(...args)\n }\n : fn\n"],"names":[],"version":3,"file":"index.cjs.map"}
package/dist/index.d.ts CHANGED
@@ -4,7 +4,6 @@ export const COOKIE_ALLOWED_MAIN_KEY = "cookie-allowed";
4
4
  export const META_INFO_COOKIE = "meta-info";
5
5
  export const COOKIE_ALLOWED_KEYS: string[];
6
6
  export const matomoAvailable: () => boolean;
7
- export const checkCookieAllowed: () => boolean;
8
7
  export const callMatomo: (apiMethod: string, ...args: unknown[]) => void;
9
8
  export const trackEvent: (category: string, action: string, name: string) => void;
10
9
  export const trackVisibleContentImpressions: (checkOnScroll?: boolean, timeIntervalInMs?: number) => void;
@@ -1 +1 @@
1
- {"mappings":"AAAA,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;ACG9E,OAAO,MAAM,gCAAgC,CAAA;AAC7C,OAAO,MAAM,0CAA0C,CAAA;AACvD,OAAO,MAAM,8BAA8B,CAAA;AAE3C,OAAO,MAAM,6BAGZ,CAAA;AAED,OAAO,MAAM,uBAAsB,OAElC,CAAA;AAaD,OAAO,MAAM,0BAAyB,OAerC,CAAA;AAED,OAAO,MAAM,wBAAyB,MAAM,WAAW,OAAO,EAAE,KAAG,IAalE,CAAA;AAED,OAAO,MAAM,gEAA0C,IAEtD,CAAA;AAED,OAAO,MAAM,wFAAiF,IAE7F,CAAA;AAED,OAAO,MAAM,uBAEZ,CAAA;ACnED,QAAQ,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,CAAA;QAC3C,OAAO,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAA;KAC5E;CACF;AA6CD,2BAA2B,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;AAExD,OAAO,MAAM,0BAA2B,MAAM,kCAAoC,IAsEjF,CAAA;ACzHD,OAAO,MAAM,oDAAqD,eAAe,GAAG,IAAI,6CAMhF,CAAA","sources":["packages/analytics/matomo/src/src/type.ts","packages/analytics/matomo/src/src/utils.ts","packages/analytics/matomo/src/src/init.ts","packages/analytics/matomo/src/src/decoratorts.ts","packages/analytics/matomo/src/src/index.ts","packages/analytics/matomo/src/index.ts"],"sourcesContent":[null,null,null,null,null,"import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n"],"names":[],"version":3,"file":"index.d.ts.map"}
1
+ {"mappings":"AAAA,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;ACG9E,OAAO,MAAM,gCAAgC,CAAA;AAC7C,OAAO,MAAM,0CAA0C,CAAA;AACvD,OAAO,MAAM,8BAA8B,CAAA;AAE3C,OAAO,MAAM,6BAGZ,CAAA;AAED,OAAO,MAAM,uBAAsB,OAElC,CAAA;AAaD,OAAO,MAAM,wBAAyB,MAAM,WAAW,OAAO,EAAE,KAAG,IAalE,CAAA;AAED,OAAO,MAAM,gEAA0C,IAEtD,CAAA;AAED,OAAO,MAAM,wFAAiF,IAE7F,CAAA;AAED,OAAO,MAAM,uBAEZ,CAAA;AClDD,QAAQ,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,CAAA;QAC3C,OAAO,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAA;KAC5E;CACF;AAyCD,2BAA2B,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;AAExD,OAAO,MAAM,0BAA2B,MAAM,kCAAoC,IA+DjF,CAAA;AC9GD,OAAO,MAAM,oDAAqD,eAAe,GAAG,IAAI,6CAMhF,CAAA","sources":["packages/analytics/matomo/src/src/type.ts","packages/analytics/matomo/src/src/utils.ts","packages/analytics/matomo/src/src/init.ts","packages/analytics/matomo/src/src/decoratorts.ts","packages/analytics/matomo/src/src/index.ts","packages/analytics/matomo/src/index.ts"],"sourcesContent":[null,null,null,null,null,"import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n"],"names":[],"version":3,"file":"index.d.ts.map"}
package/dist/index.mjs CHANGED
@@ -11,7 +11,6 @@ $parcel$export($427566b8f1d3367d$exports, "COOKIE_ALLOWED_MAIN_KEY", function ()
11
11
  $parcel$export($427566b8f1d3367d$exports, "META_INFO_COOKIE", function () { return $427566b8f1d3367d$export$506bf4ed084a716; });
12
12
  $parcel$export($427566b8f1d3367d$exports, "COOKIE_ALLOWED_KEYS", function () { return $427566b8f1d3367d$export$7567476bb64c3721; });
13
13
  $parcel$export($427566b8f1d3367d$exports, "matomoAvailable", function () { return $427566b8f1d3367d$export$e5ed1c22a80aba4b; });
14
- $parcel$export($427566b8f1d3367d$exports, "checkCookieAllowed", function () { return $427566b8f1d3367d$export$83c2c3def90d3b5a; });
15
14
  $parcel$export($427566b8f1d3367d$exports, "callMatomo", function () { return $427566b8f1d3367d$export$cecaccc605742066; });
16
15
  $parcel$export($427566b8f1d3367d$exports, "trackEvent", function () { return $427566b8f1d3367d$export$73d0a139caca1fee; });
17
16
  $parcel$export($427566b8f1d3367d$exports, "trackVisibleContentImpressions", function () { return $427566b8f1d3367d$export$40aa6af9e848a6e0; });
@@ -33,18 +32,9 @@ const $427566b8f1d3367d$var$getCrossDomainCookieClientSide = (key)=>{
33
32
  const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`);
34
33
  return document.cookie.match(cookieMatcher)?.[2] ?? defaultValue;
35
34
  };
36
- const $427566b8f1d3367d$export$83c2c3def90d3b5a = ()=>{
37
- if (typeof window === "undefined") return false;
38
- for (const key of $427566b8f1d3367d$export$7567476bb64c3721){
39
- const cookieValue = $427566b8f1d3367d$var$getCrossDomainCookieClientSide(key);
40
- const cookieAllowed = !!(cookieValue && cookieValue === $427566b8f1d3367d$export$69479293c4b47320);
41
- if (cookieAllowed) return cookieAllowed;
42
- }
43
- return false;
44
- };
45
35
  const $427566b8f1d3367d$export$cecaccc605742066 = (apiMethod, ...args)=>{
46
36
  if (!$427566b8f1d3367d$export$e5ed1c22a80aba4b()) (0, $76adf94c93f4a7f4$export$6ec25100f86fa29d)();
47
- if (typeof window === "undefined" || !$427566b8f1d3367d$export$83c2c3def90d3b5a()) return;
37
+ if (typeof window === "undefined") return;
48
38
  const customDimensionValue = $427566b8f1d3367d$var$getCrossDomainCookieClientSide($427566b8f1d3367d$export$506bf4ed084a716) || "none";
49
39
  window?._paq?.push([
50
40
  "setCustomDimension",
@@ -67,9 +57,6 @@ const $427566b8f1d3367d$export$3e8733322718eb9 = ()=>{
67
57
  };
68
58
 
69
59
 
70
- // Need if we tried to init matomo manually without cookie,
71
- // and use it after accepting the cookie policy
72
- let $76adf94c93f4a7f4$var$futureInitMatomoHost = undefined;
73
60
  const $76adf94c93f4a7f4$var$injectMatomoScript = (matomoHost)=>{
74
61
  /**
75
62
  * # How to update matomo
@@ -107,11 +94,7 @@ const $76adf94c93f4a7f4$var$injectMatomoScript = (matomoHost)=>{
107
94
  const $76adf94c93f4a7f4$export$6ec25100f86fa29d = (matomoHost, customConfig = [])=>{
108
95
  if (typeof window === "undefined") // SSR not supported!
109
96
  return;
110
- if (!(0, $427566b8f1d3367d$export$83c2c3def90d3b5a)()) {
111
- if (matomoHost) $76adf94c93f4a7f4$var$futureInitMatomoHost = matomoHost;
112
- return;
113
- }
114
- const _matomoHost = $76adf94c93f4a7f4$var$futureInitMatomoHost || matomoHost || window?.__env__?.matomoHost || undefined;
97
+ const _matomoHost = matomoHost || window?.__env__?.matomoHost || undefined;
115
98
  if (!_matomoHost) // Where Do I send analytics?
116
99
  return;
117
100
  if (window._paq) // window._paq has been initialized
@@ -199,5 +182,5 @@ const $dfa3db2a6cffa71c$export$e8f57ad64147d191 = (event, fn)=>event ? (...args)
199
182
  (0, $76adf94c93f4a7f4$export$6ec25100f86fa29d)();
200
183
 
201
184
 
202
- export {$76adf94c93f4a7f4$export$6ec25100f86fa29d as initMatomo, $dfa3db2a6cffa71c$export$e8f57ad64147d191 as wrapWithEventTrack, $427566b8f1d3367d$export$69479293c4b47320 as COOKIE_ALLOWED_VALUE_YES, $427566b8f1d3367d$export$ed61d9b9718a39c9 as COOKIE_ALLOWED_MAIN_KEY, $427566b8f1d3367d$export$506bf4ed084a716 as META_INFO_COOKIE, $427566b8f1d3367d$export$7567476bb64c3721 as COOKIE_ALLOWED_KEYS, $427566b8f1d3367d$export$e5ed1c22a80aba4b as matomoAvailable, $427566b8f1d3367d$export$83c2c3def90d3b5a as checkCookieAllowed, $427566b8f1d3367d$export$cecaccc605742066 as callMatomo, $427566b8f1d3367d$export$73d0a139caca1fee as trackEvent, $427566b8f1d3367d$export$40aa6af9e848a6e0 as trackVisibleContentImpressions, $427566b8f1d3367d$export$3e8733322718eb9 as getDomain};
185
+ export {$76adf94c93f4a7f4$export$6ec25100f86fa29d as initMatomo, $dfa3db2a6cffa71c$export$e8f57ad64147d191 as wrapWithEventTrack, $427566b8f1d3367d$export$69479293c4b47320 as COOKIE_ALLOWED_VALUE_YES, $427566b8f1d3367d$export$ed61d9b9718a39c9 as COOKIE_ALLOWED_MAIN_KEY, $427566b8f1d3367d$export$506bf4ed084a716 as META_INFO_COOKIE, $427566b8f1d3367d$export$7567476bb64c3721 as COOKIE_ALLOWED_KEYS, $427566b8f1d3367d$export$e5ed1c22a80aba4b as matomoAvailable, $427566b8f1d3367d$export$cecaccc605742066 as callMatomo, $427566b8f1d3367d$export$73d0a139caca1fee as trackEvent, $427566b8f1d3367d$export$40aa6af9e848a6e0 as trackVisibleContentImpressions, $427566b8f1d3367d$export$3e8733322718eb9 as getDomain};
203
186
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/analytics/matomo/src/index.ts","packages/analytics/matomo/src/init.ts","packages/analytics/matomo/src/utils.ts","packages/analytics/matomo/src/type.ts","packages/analytics/matomo/src/decoratorts.ts"],"sourcesContent":["import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n","import { getDomain, checkCookieAllowed } from './utils'\n\ndeclare global {\n interface Window {\n _paq?: undefined | [string, ...unknown[]][]\n __env__: { matomoHost: string } & Record<string | number | symbol, unknown>\n }\n}\n\n// Need if we tried to init matomo manually without cookie,\n// and use it after accepting the cookie policy\nlet futureInitMatomoHost: string | undefined = undefined\n\nconst injectMatomoScript = (matomoHost: string) => {\n /**\n * # How to update matomo\n *\n * To safely update Matomo without analytics downtime:\n *\n * 1. Download the new Matomo version zip from https://github.com/matomo-org/matomo/releases\n * 2. Extract matomo.js from the zip archive\n * 3. Generate integrity checksum:\n * - Run: `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * - Add 'sha384-' prefix to the generated hash\n * 4. Add the new integrity hash to the array below (keep the old one)\n * 5. Release this package and update all dependent repositories\n *\n * Notes:\n * - The script will automatically use the matching integrity hash\n * - Old integrity values can be safely removed later if desired\n * - No console errors will occur during the transition\n * - This approach ensures zero analytics downtime during updates\n */\n document.documentElement.appendChild(\n Object.assign(document.createElement('script'), {\n async: true,\n src: new URL('/matomo.js', matomoHost).href,\n crossOrigin: 'anonymous',\n /**\n * To generate checksum:\n * 1. Download matomo.js via `curl -O https://matomo.lido.fi/matomo.js`\n * 2. Calculate checkusm via `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * 3. Add sha384 prefix\n * For other options see https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#tools_for_generating_sri_hashes\n */\n integrity: [\n 'sha384-zEaC37u+jplyCMnmF4H7LxCC9kIFKvwV32PWyiLIIIUVOrm1W8+ljIA2kUa/cTHa', // Matomo v 5.2.0 && Matomo v 5.2.2\n ].join(' '),\n }),\n )\n}\n\nexport type MatomoConfig = Array<[string, ...unknown[]]>\n\nexport const initMatomo = (matomoHost?: string, customConfig: MatomoConfig = []): void => {\n if (typeof window === 'undefined') {\n // SSR not supported!\n return\n }\n\n if (!checkCookieAllowed()) {\n if (matomoHost) {\n futureInitMatomoHost = matomoHost\n }\n return\n }\n\n const _matomoHost = futureInitMatomoHost || matomoHost || window?.__env__?.matomoHost || undefined\n\n if (!_matomoHost) {\n // Where Do I send analytics?\n return\n }\n\n if (window._paq) {\n // window._paq has been initialized\n return\n }\n\n window._paq ??= []\n\n const rawConfig = [\n // These are hardcoded values and cannot be changed\n ['setTrackerUrl', new URL('/matomo.php', _matomoHost).href],\n ['requireCookieConsent', true],\n // Add subdomain prefix to page titles to separate analytics by subdomain\n ['setDocumentTitle', window.location.hostname + '/' + (document.title || '')],\n\n // These are custom settings\n ...customConfig,\n\n // These are default settings, will be overwritten if custom set\n ['trackPageView', true],\n ['enableLinkTracking', true],\n ['setSiteId', '1'],\n ['setDomains', [`*.${getDomain()}`]],\n ['enableCrossDomainLinking', true],\n ]\n\n // Map keeps order of keys\n const config = new Map()\n for (const [key, value] of rawConfig) {\n if (!config.has(key)) {\n config.set(key, value)\n }\n }\n\n window?._paq?.push(\n ...Array.from(config.entries())\n .map(([key, value]) => {\n switch (value) {\n case false:\n return false\n case true:\n case undefined:\n return [key]\n default:\n return [key, value]\n }\n })\n .filter((item): item is [string, ...unknown[]] => item !== false),\n )\n\n injectMatomoScript(_matomoHost)\n}\n","import { initMatomo } from './init'\nimport { MatomoEventType } from './type'\n\nexport const COOKIE_ALLOWED_VALUE_YES = 'yes'\nexport const COOKIE_ALLOWED_MAIN_KEY = 'cookie-allowed'\nexport const META_INFO_COOKIE = 'meta-info'\n\nexport const COOKIE_ALLOWED_KEYS = [\n 'LIDO_WIDGET__COOKIES_ALLOWED', // will be deprecated soon\n COOKIE_ALLOWED_MAIN_KEY,\n]\n\nexport const matomoAvailable = (): boolean => {\n return typeof window !== 'undefined' && window._paq !== undefined\n}\n\nconst getCrossDomainCookieClientSide = (key: string): string | null => {\n const defaultValue = null\n\n if (typeof window === 'undefined') {\n return defaultValue\n }\n\n const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`)\n return (document.cookie.match(cookieMatcher)?.[2] as string) ?? defaultValue\n}\n\nexport const checkCookieAllowed = (): boolean => {\n if (typeof window === 'undefined') {\n return false\n }\n\n for (const key of COOKIE_ALLOWED_KEYS) {\n const cookieValue = getCrossDomainCookieClientSide(key)\n const cookieAllowed = !!(cookieValue && cookieValue === COOKIE_ALLOWED_VALUE_YES)\n\n if (cookieAllowed) {\n return cookieAllowed\n }\n }\n\n return false\n}\n\nexport const callMatomo = (apiMethod: string, ...args: unknown[]): void => {\n if (!matomoAvailable()) {\n initMatomo()\n }\n\n if (typeof window === 'undefined' || !checkCookieAllowed()) {\n return\n }\n\n const customDimensionValue = getCrossDomainCookieClientSide(META_INFO_COOKIE) || 'none'\n window?._paq?.push(['setCustomDimension', 1, customDimensionValue])\n\n window?._paq?.push([apiMethod, ...args])\n}\n\nexport const trackEvent = (...event: MatomoEventType): void => {\n callMatomo('trackEvent', ...event)\n}\n\nexport const trackVisibleContentImpressions = (checkOnScroll = true, timeIntervalInMs = 750): void => {\n callMatomo('trackVisibleContentImpressions', checkOnScroll, timeIntervalInMs)\n}\n\nexport const getDomain = () => {\n return location.hostname.split('.').slice(-2).join('.')\n}\n","export type MatomoEventType = [category: string, action: string, name: string]\n","import { MatomoEventType } from './type'\nimport { callMatomo } from './utils'\n\nexport const wrapWithEventTrack = <A extends unknown[], R>(event: MatomoEventType | void, fn: (...args: A) => R) =>\n event\n ? (...args: A): R => {\n callMatomo('trackEvent', ...event)\n return fn?.(...args)\n }\n : fn\n"],"names":[],"version":3,"file":"index.mjs.map"}
1
+ {"mappings":"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","sources":["packages/analytics/matomo/src/index.ts","packages/analytics/matomo/src/init.ts","packages/analytics/matomo/src/utils.ts","packages/analytics/matomo/src/type.ts","packages/analytics/matomo/src/decoratorts.ts"],"sourcesContent":["import { initMatomo } from './init'\n\nexport * from './type'\nexport * from './decoratorts'\nexport * from './utils'\nexport * from './init'\n\n// Run after import\ninitMatomo()\n","import { getDomain } from './utils'\n\ndeclare global {\n interface Window {\n _paq?: undefined | [string, ...unknown[]][]\n __env__: { matomoHost: string } & Record<string | number | symbol, unknown>\n }\n}\n\nconst injectMatomoScript = (matomoHost: string) => {\n /**\n * # How to update matomo\n *\n * To safely update Matomo without analytics downtime:\n *\n * 1. Download the new Matomo version zip from https://github.com/matomo-org/matomo/releases\n * 2. Extract matomo.js from the zip archive\n * 3. Generate integrity checksum:\n * - Run: `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * - Add 'sha384-' prefix to the generated hash\n * 4. Add the new integrity hash to the array below (keep the old one)\n * 5. Release this package and update all dependent repositories\n *\n * Notes:\n * - The script will automatically use the matching integrity hash\n * - Old integrity values can be safely removed later if desired\n * - No console errors will occur during the transition\n * - This approach ensures zero analytics downtime during updates\n */\n document.documentElement.appendChild(\n Object.assign(document.createElement('script'), {\n async: true,\n src: new URL('/matomo.js', matomoHost).href,\n crossOrigin: 'anonymous',\n /**\n * To generate checksum:\n * 1. Download matomo.js via `curl -O https://matomo.lido.fi/matomo.js`\n * 2. Calculate checkusm via `cat matomo.js | openssl dgst -sha384 -binary | openssl base64 -A`\n * 3. Add sha384 prefix\n * For other options see https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity#tools_for_generating_sri_hashes\n */\n integrity: [\n 'sha384-zEaC37u+jplyCMnmF4H7LxCC9kIFKvwV32PWyiLIIIUVOrm1W8+ljIA2kUa/cTHa', // Matomo v 5.2.0 && Matomo v 5.2.2\n ].join(' '),\n }),\n )\n}\n\nexport type MatomoConfig = Array<[string, ...unknown[]]>\n\nexport const initMatomo = (matomoHost?: string, customConfig: MatomoConfig = []): void => {\n if (typeof window === 'undefined') {\n // SSR not supported!\n return\n }\n\n const _matomoHost = matomoHost || window?.__env__?.matomoHost || undefined\n\n if (!_matomoHost) {\n // Where Do I send analytics?\n return\n }\n\n if (window._paq) {\n // window._paq has been initialized\n return\n }\n\n window._paq ??= []\n\n const rawConfig = [\n // These are hardcoded values and cannot be changed\n ['setTrackerUrl', new URL('/matomo.php', _matomoHost).href],\n ['requireCookieConsent', true],\n // Add subdomain prefix to page titles to separate analytics by subdomain\n ['setDocumentTitle', window.location.hostname + '/' + (document.title || '')],\n\n // These are custom settings\n ...customConfig,\n\n // These are default settings, will be overwritten if custom set\n ['trackPageView', true],\n ['enableLinkTracking', true],\n ['setSiteId', '1'],\n ['setDomains', [`*.${getDomain()}`]],\n ['enableCrossDomainLinking', true],\n ]\n\n // Map keeps order of keys\n const config = new Map()\n for (const [key, value] of rawConfig) {\n if (!config.has(key)) {\n config.set(key, value)\n }\n }\n\n window?._paq?.push(\n ...Array.from(config.entries())\n .map(([key, value]) => {\n switch (value) {\n case false:\n return false\n case true:\n case undefined:\n return [key]\n default:\n return [key, value]\n }\n })\n .filter((item): item is [string, ...unknown[]] => item !== false),\n )\n\n injectMatomoScript(_matomoHost)\n}\n","import { initMatomo } from './init'\nimport { MatomoEventType } from './type'\n\nexport const COOKIE_ALLOWED_VALUE_YES = 'yes'\nexport const COOKIE_ALLOWED_MAIN_KEY = 'cookie-allowed'\nexport const META_INFO_COOKIE = 'meta-info'\n\nexport const COOKIE_ALLOWED_KEYS = [\n 'LIDO_WIDGET__COOKIES_ALLOWED', // will be deprecated soon\n COOKIE_ALLOWED_MAIN_KEY,\n]\n\nexport const matomoAvailable = (): boolean => {\n return typeof window !== 'undefined' && window._paq !== undefined\n}\n\nconst getCrossDomainCookieClientSide = (key: string): string | null => {\n const defaultValue = null\n\n if (typeof window === 'undefined') {\n return defaultValue\n }\n\n const cookieMatcher = new RegExp(`(^| )${key}=([^;]+)`)\n return (document.cookie.match(cookieMatcher)?.[2] as string) ?? defaultValue\n}\n\nexport const callMatomo = (apiMethod: string, ...args: unknown[]): void => {\n if (!matomoAvailable()) {\n initMatomo()\n }\n\n if (typeof window === 'undefined') {\n return\n }\n\n const customDimensionValue = getCrossDomainCookieClientSide(META_INFO_COOKIE) || 'none'\n window?._paq?.push(['setCustomDimension', 1, customDimensionValue])\n\n window?._paq?.push([apiMethod, ...args])\n}\n\nexport const trackEvent = (...event: MatomoEventType): void => {\n callMatomo('trackEvent', ...event)\n}\n\nexport const trackVisibleContentImpressions = (checkOnScroll = true, timeIntervalInMs = 750): void => {\n callMatomo('trackVisibleContentImpressions', checkOnScroll, timeIntervalInMs)\n}\n\nexport const getDomain = () => {\n return location.hostname.split('.').slice(-2).join('.')\n}\n","export type MatomoEventType = [category: string, action: string, name: string]\n","import { MatomoEventType } from './type'\nimport { callMatomo } from './utils'\n\nexport const wrapWithEventTrack = <A extends unknown[], R>(event: MatomoEventType | void, fn: (...args: A) => R) =>\n event\n ? (...args: A): R => {\n callMatomo('trackEvent', ...event)\n return fn?.(...args)\n }\n : fn\n"],"names":[],"version":3,"file":"index.mjs.map"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "url": "https://github.com/lidofinance/warehouse/issues"
8
8
  },
9
9
  "license": "MIT",
10
- "version": "0.54.0",
10
+ "version": "0.55.0",
11
11
  "files": [
12
12
  "dist"
13
13
  ],
@@ -33,7 +33,7 @@
33
33
  "test": "jest"
34
34
  },
35
35
  "devDependencies": {
36
- "@lidofinance/config-prettier": "~0.54.0",
36
+ "@lidofinance/config-prettier": "~0.55.0",
37
37
  "@types/jest": "^29.2.4",
38
38
  "jest": "^29.3.1",
39
39
  "jest-environment-jsdom": "^28.0.0",