@walkeros/web-destination-matomo 3.4.0-next-1776749829492

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.
@@ -0,0 +1,78 @@
1
+ import { Destination as Destination$1, Mapping as Mapping$1 } from '@walkeros/core';
2
+ import { DestinationWeb } from '@walkeros/web-core';
3
+
4
+ declare global {
5
+ interface Window {
6
+ _paq?: Array<unknown>;
7
+ }
8
+ }
9
+ interface Settings {
10
+ /** Matomo Site ID (required). */
11
+ siteId: string;
12
+ /** Base URL of Matomo instance, e.g. https://analytics.example.com/ (required). */
13
+ url: string;
14
+ /** Disable all tracking cookies for cookie-free analytics. */
15
+ disableCookies?: boolean;
16
+ /** Enable automatic outlink and download tracking. Default: true. */
17
+ enableLinkTracking?: boolean;
18
+ /** Enable heart beat timer with interval in seconds for accurate time-on-page. */
19
+ enableHeartBeatTimer?: number;
20
+ /** Custom dimensions applied to all events. Keys are dimension IDs, values are property paths. */
21
+ customDimensions?: Record<string, string>;
22
+ }
23
+ type InitSettings = Partial<Settings>;
24
+ interface Mapping {
25
+ /** Goal ID to track a conversion alongside this event. */
26
+ goalId?: string;
27
+ /** Property path for goal revenue value (e.g. data.revenue). */
28
+ goalValue?: string;
29
+ /** Track as internal site search via trackSiteSearch. */
30
+ siteSearch?: boolean;
31
+ /** Track as content impression via trackContentImpression. */
32
+ contentImpression?: boolean;
33
+ /** Track as content interaction via trackContentInteraction. */
34
+ contentInteraction?: boolean;
35
+ /** Per-event custom dimensions. Keys are dimension IDs, values are property paths. */
36
+ customDimensions?: Record<string, string>;
37
+ }
38
+ interface Env extends DestinationWeb.Env {
39
+ window: {
40
+ _paq: Array<unknown>;
41
+ location?: {
42
+ href?: string;
43
+ };
44
+ };
45
+ document: {
46
+ createElement: (tagName: string) => {
47
+ type: string;
48
+ src: string;
49
+ async?: boolean;
50
+ defer?: boolean;
51
+ };
52
+ head: {
53
+ appendChild: (node: unknown) => void;
54
+ };
55
+ };
56
+ }
57
+ type Types = Destination$1.Types<Settings, Mapping, Env, InitSettings>;
58
+ type Destination = DestinationWeb.Destination<Types>;
59
+ type Config = DestinationWeb.Config<Types>;
60
+ type Rule = Mapping$1.Rule<Mapping>;
61
+ type Rules = Mapping$1.Rules<Rule>;
62
+
63
+ type index_Config = Config;
64
+ type index_Destination = Destination;
65
+ type index_Env = Env;
66
+ type index_InitSettings = InitSettings;
67
+ type index_Mapping = Mapping;
68
+ type index_Rule = Rule;
69
+ type index_Rules = Rules;
70
+ type index_Settings = Settings;
71
+ type index_Types = Types;
72
+ declare namespace index {
73
+ export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitSettings as InitSettings, index_Mapping as Mapping, index_Rule as Rule, index_Rules as Rules, index_Settings as Settings, index_Types as Types };
74
+ }
75
+
76
+ declare const destinationMatomo: Destination;
77
+
78
+ export { index as DestinationMatomo, destinationMatomo as default, destinationMatomo };
@@ -0,0 +1 @@
1
+ "use strict";function _array_like_to_array(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function _array_with_holes(e){if(Array.isArray(e))return e}function _array_without_holes(e){if(Array.isArray(e))return _array_like_to_array(e)}function asyncGeneratorStep(e,t,r,n,o,a,i){try{var c=e[a](i),u=c.value}catch(e){return void r(e)}c.done?t(u):Promise.resolve(u).then(n,o)}function _async_to_generator(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function i(e){asyncGeneratorStep(a,n,o,i,c,"next",e)}function c(e){asyncGeneratorStep(a,n,o,i,c,"throw",e)}i(void 0)})}}function _define_property(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _instanceof(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function _iterable_to_array(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _iterable_to_array_limit(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,a=[],i=!0,c=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){c=!0,o=e}finally{try{i||null==r.return||r.return()}finally{if(c)throw o}}return a}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_define_property(e,t,r[t])})}return e}function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function _object_spread_props(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function _sliced_to_array(e,t){return _array_with_holes(e)||_iterable_to_array_limit(e,t)||_unsupported_iterable_to_array(e,t)||_non_iterable_rest()}function _to_consumable_array(e){return _array_without_holes(e)||_iterable_to_array(e)||_unsupported_iterable_to_array(e)||_non_iterable_spread()}function _type_of(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function _unsupported_iterable_to_array(e,t){if(e){if("string"==typeof e)return _array_like_to_array(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(r):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_array_like_to_array(e,t):void 0}}function _ts_generator(e,t){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),c=Object.defineProperty;return c(i,"next",{value:u(0)}),c(i,"throw",{value:u(1)}),c(i,"return",{value:u(2)}),"function"==typeof Symbol&&c(i,Symbol.iterator,{value:function(){return this}}),i;function u(c){return function(u){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}var Destination=function(){var e=function(e){return Array.isArray(e)},t=function(e){return void 0!==e},r=function(t){return"object"==(void 0===t?"undefined":_type_of(t))&&null!==t&&!e(t)&&"[object Object]"===Object.prototype.toString.call(t)},n=function(e){return"string"==typeof e},o=function(e){return v(e)?e:void 0},a=function(e,t,r){return function(){for(var n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];return _async_to_generator(function(){var n;return _ts_generator(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,4,6]),[4,e.apply(void 0,_to_consumable_array(o))];case 1:case 3:return[2,a.sent()];case 2:return n=a.sent(),t?[4,t(n)]:[2];case 4:return[4,null==r?void 0:r()];case 5:return a.sent(),[7];case 6:return[2]}})})()}},i=function(n){return _async_to_generator(function(n){var o,i,c,u,l,s,f,y,_,b,p,d,v,h=arguments;return _ts_generator(this,function(g){switch(g.label){case 0:if(o=h.length>1&&void 0!==h[1]?h[1]:{},i=h.length>2&&void 0!==h[2]?h[2]:{},!t(n))return[2];u=r(n)&&n.consent||i.consent||(null===(c=i.collector)||void 0===c?void 0:c.consent),l=e(o)?o:[o],s=!0,f=!1,y=void 0,g.label=1;case 1:g.trys.push([1,6,7,8]),_=l[Symbol.iterator](),g.label=2;case 2:return(s=(b=_.next()).done)?[3,5]:(p=b.value,[4,a(m)(n,p,_object_spread_props(_object_spread({},i),{consent:u}))]);case 3:if(d=g.sent(),t(d))return[2,d];g.label=4;case 4:return s=!0,[3,2];case 5:return[3,8];case 6:return v=g.sent(),f=!0,y=v,[3,8];case 7:try{s||null==_.return||_.return()}finally{if(f)throw y}return[7];case 8:return[2]}})}).apply(this,arguments)},c=function(e){return _object_spread({window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document},e)},u=Object.defineProperty,l=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,f=Object.prototype.hasOwnProperty,y={};!function(e,t){for(var r in t)u(e,r,{get:t[r],enumerable:!0})}(y,{DestinationMatomo:function(){return g},default:function(){return O},destinationMatomo:function(){return w}});var _=Object.defineProperty;!function(e,t){for(var r in t)_(e,r,{get:t[r],enumerable:!0})}({},{Level:function(){return p}});var b,p=((b=p||{})[b.ERROR=0]="ERROR",b[b.WARN=1]="WARN",b[b.INFO=2]="INFO",b[b.DEBUG=3]="DEBUG",b);function d(r){for(var n=arguments.length>2?arguments[2]:void 0,o=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"").split("."),a=r,i=0;i<o.length;i++){var c=o[i];if("*"===c&&e(a)){var u=o.slice(i+1).join("."),l=[],s=!0,f=!1,y=void 0;try{for(var _,b=a[Symbol.iterator]();!(s=(_=b.next()).done);s=!0){var p=d(_.value,u,n);l.push(p)}}catch(e){f=!0,y=e}finally{try{s||null==b.return||b.return()}finally{if(f)throw y}}return l}if(void 0===(a=_instanceof(a,Object)?a[c]:void 0))break}return t(a)?a:n}function v(o){return function(e){return"boolean"==typeof e}(o)||n(o)||function(e){return"number"==typeof e&&!Number.isNaN(e)}(o)||!t(o)||e(o)&&o.every(v)||r(o)&&Object.values(o).every(v)}function m(r,c){return _async_to_generator(function(r,c){var u,l,s,f=arguments;return _ts_generator(this,function(y){return l=(u=f.length>2&&void 0!==f[2]?f[2]:{}).collector,s=u.consent,[2,(e(c)?c:[c]).reduce(function(c,f){return _async_to_generator(function(){var y,_,b,p,v,h,g,w,O,j,S,k,P,I,D,A,x,E,T,C,N;return _ts_generator(this,function(R){switch(R.label){case 0:return[4,c];case 1:return(y=R.sent())?[2,y]:(_=n(f)?{key:f}:f,Object.keys(_).length?(b=_.condition,p=_.consent,v=_.fn,h=_.key,g=_.loop,w=_.map,O=_.set,j=_.validate,S=_.value,(k=b)?[4,a(b)(r,f,l)]:[3,3]):[2]);case 2:k=!R.sent(),R.label=3;case 3:return k?[2]:p&&!function(e){var t=_object_spread({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}),r={},n=!e||0===Object.keys(e).length;return Object.keys(t).forEach(function(o){t[o]&&(r[o]=!0,e&&e[o]&&(n=!0))}),!!n&&r}(p,s)?[2,S]:(P=t(S)?S:r,v?[4,a(v)(r,f,u)]:[3,5]);case 4:P=R.sent(),R.label=5;case 5:return h&&(P=d(r,h,S)),g?(I=_sliced_to_array(g,2),D=I[0],A=I[1],"this"!==D?[3,6]:(E=[r],[3,8])):[3,11];case 6:return[4,i(r,D,u)];case 7:E=R.sent(),R.label=8;case 8:return e(x=E)?[4,Promise.all(x.map(function(e){return i(e,A,u)}))]:[3,10];case 9:P=R.sent().filter(t),R.label=10;case 10:return[3,17];case 11:return w?[4,Object.entries(w).reduce(function(e,n){var o=_sliced_to_array(n,2),a=o[0],c=o[1];return _async_to_generator(function(){var n,o;return _ts_generator(this,function(l){switch(l.label){case 0:return[4,e];case 1:return n=l.sent(),[4,i(r,c,u)];case 2:return o=l.sent(),[2,(t(o)&&(n[a]=o),n)]}})})()},Promise.resolve({}))]:[3,13];case 12:return P=R.sent(),[3,16];case 13:return(T=O)?[4,Promise.all(O.map(function(e){return m(r,e,u)}))]:[3,15];case 14:T=P=R.sent(),R.label=15;case 15:R.label=16;case 16:R.label=17;case 17:return(C=j)?[4,a(j)(P)]:[3,19];case 18:C=!R.sent(),R.label=19;case 19:return C&&(P=void 0),N=o(P),[2,t(N)?N:o(S)]}})})()},Promise.resolve(void 0))]})}).apply(this,arguments)}var h,g={},w={type:"matomo",config:{},init:function(e){var t=e.config,r=e.env,n=e.logger,o=c(r).window,a=t.settings,i=t.loadScript,u=a||{},l=u.siteId,s=u.url;l||n.throw("Config settings siteId missing"),s||n.throw("Config settings url missing"),o._paq=o._paq||[];var f=o._paq.push.bind(o._paq);if(i&&(!function(e,t){var r=c(t).document,n=r.createElement("script");n.type="text/javascript",n.src=e+"matomo.js",n.async=!0,n.defer=!0,r.head.appendChild(n)}(s,r),f(["setTrackerUrl",s+"matomo.php"]),f(["setSiteId",l])),(null==a?void 0:a.disableCookies)&&f(["disableCookies"]),!1!==(null==a?void 0:a.enableLinkTracking)&&f(["enableLinkTracking"]),(null==a?void 0:a.enableHeartBeatTimer)&&f(["enableHeartBeatTimer",a.enableHeartBeatTimer]),null==a?void 0:a.customDimensions){var y=!0,_=!1,b=void 0;try{for(var p,d=Object.entries(a.customDimensions)[Symbol.iterator]();!(y=(p=d.next()).done);y=!0){var v=_sliced_to_array(p.value,2),m=v[0],h=v[1];f(["setCustomDimension",Number(m),h])}}catch(e){_=!0,b=e}finally{try{y||null==d.return||d.return()}finally{if(_)throw b}}}},push:function(t,r){return _async_to_generator(function(t,r){var n,o,a,u,l,s,f,y,_,b,p,d,v,m,h,g,w,O,j,S,k,P,I;return _ts_generator(this,function(D){switch(D.label){case 0:return n=r.rule,o=void 0===n?{}:n,a=r.data,u=r.env,l=c(u),s=l.window,y=(f=s)._paq.push.bind(f._paq),_=o.settings||{},"page view"!==t.name||o.settings?[3,2]:(b=["trackPageView"],[4,i(t,"data.title")]);case 1:return y.apply(void 0,[b.concat([D.sent()])]),[2];case 2:if(p=e(a)?a:[a],_.siteSearch)return y(["trackSiteSearch"].concat(_to_consumable_array(p))),[2];if(_.contentImpression)return y(["trackContentImpression"].concat(_to_consumable_array(p))),[2];if(_.contentInteraction)return y(["trackContentInteraction"].concat(_to_consumable_array(p))),[2];if(!_.customDimensions)return[3,10];d=!0,v=!1,m=void 0,D.label=3;case 3:D.trys.push([3,8,9,10]),h=Object.entries(_.customDimensions)[Symbol.iterator](),D.label=4;case 4:return(d=(g=h.next()).done)?[3,7]:(w=_sliced_to_array(g.value,2),O=w[0],j=w[1],[4,i(t,j)]);case 5:void 0!==(S=D.sent())&&y(["setCustomDimension",Number(O),S]),D.label=6;case 6:return d=!0,[3,4];case 7:return[3,10];case 8:return k=D.sent(),v=!0,m=k,[3,10];case 9:try{d||null==h.return||h.return()}finally{if(v)throw m}return[7];case 10:return y([t.name].concat(_to_consumable_array(p))),_.goalId?_.goalValue?[4,i(t,_.goalValue)]:[3,12]:[3,14];case 11:return I=D.sent(),[3,13];case 12:I=void 0,D.label=13;case 13:P=I,y(["trackGoal",_.goalId,P]),D.label=14;case 14:return[2]}})}).apply(this,arguments)}},O=w;return h=y,function(e,t,r,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,i=void 0;try{for(var c,y=function(){var o=c.value;f.call(e,o)||o===r||u(e,o,{get:function(){return t[o]},enumerable:!(n=l(t,o))||n.enumerable})},_=s(t)[Symbol.iterator]();!(o=(c=_.next()).done);o=!0)y()}catch(e){a=!0,i=e}finally{try{o||null==_.return||_.return()}finally{if(a)throw i}}}return e}(u({},"__esModule",{value:!0}),h)}();
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,a={};((e,n)=>{for(var i in n)t(e,i,{get:n[i],enumerable:!0})})(a,{DestinationMatomo:()=>c,default:()=>m,destinationMatomo:()=>l}),module.exports=(e=a,((e,a,s,r)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of i(a))o.call(e,c)||c===s||t(e,c,{get:()=>a[c],enumerable:!(r=n(a,c))||r.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s=require("@walkeros/core"),r=require("@walkeros/web-core"),c={},l={type:"matomo",config:{},init({config:e,env:t,logger:n}){const{window:i}=(0,r.getEnv)(t),o=i,{settings:a,loadScript:s}=e,{siteId:c,url:l}=a||{};c||n.throw("Config settings siteId missing"),l||n.throw("Config settings url missing"),o._paq=o._paq||[];const m=o._paq.push.bind(o._paq);if(s&&(!function(e,t){const{document:n}=(0,r.getEnv)(t),i=n,o=i.createElement("script");o.type="text/javascript",o.src=e+"matomo.js",o.async=!0,o.defer=!0,i.head.appendChild(o)}(l,t),m(["setTrackerUrl",l+"matomo.php"]),m(["setSiteId",c])),(null==a?void 0:a.disableCookies)&&m(["disableCookies"]),!1!==(null==a?void 0:a.enableLinkTracking)&&m(["enableLinkTracking"]),(null==a?void 0:a.enableHeartBeatTimer)&&m(["enableHeartBeatTimer",a.enableHeartBeatTimer]),null==a?void 0:a.customDimensions)for(const[e,t]of Object.entries(a.customDimensions))m(["setCustomDimension",Number(e),t])},async push(e,{rule:t={},data:n,env:i}){const{window:o}=(0,r.getEnv)(i),a=o,c=a._paq.push.bind(a._paq),l=t.settings||{};if("page view"===e.name&&!t.settings)return void c(["trackPageView",await(0,s.getMappingValue)(e,"data.title")]);const m=(0,s.isArray)(n)?n:[n];if(l.siteSearch)c(["trackSiteSearch",...m]);else if(l.contentImpression)c(["trackContentImpression",...m]);else if(l.contentInteraction)c(["trackContentInteraction",...m]);else{if(l.customDimensions)for(const[t,n]of Object.entries(l.customDimensions)){const i=await(0,s.getMappingValue)(e,n);void 0!==i&&c(["setCustomDimension",Number(t),i])}if(c([e.name,...m]),l.goalId){const t=l.goalValue?await(0,s.getMappingValue)(e,l.goalValue):void 0;c(["trackGoal",l.goalId,t])}}}};var m=l;//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/types/index.ts"],"sourcesContent":["import type { Mapping, Destination } from './types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getMappingValue, isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationMatomo from './types';\n\nexport const destinationMatomo: Destination = {\n type: 'matomo',\n\n config: {},\n\n init({ config, env, logger }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { siteId, url } = settings || {};\n\n // Required parameters\n if (!siteId) logger.throw('Config settings siteId missing');\n if (!url) logger.throw('Config settings url missing');\n\n // Set up the Matomo command queue\n w._paq = w._paq || [];\n const paq = w._paq.push.bind(w._paq);\n\n if (loadScript) {\n // Load the Matomo tracking script\n addScript(url!, env);\n\n // Configure tracker URL and site ID\n paq(['setTrackerUrl', url + 'matomo.php']);\n paq(['setSiteId', siteId]);\n }\n\n // Cookie-free tracking\n if (settings?.disableCookies) paq(['disableCookies']);\n\n // Enable link tracking by default\n if (settings?.enableLinkTracking !== false) paq(['enableLinkTracking']);\n\n // Heart beat timer for accurate time-on-page\n if (settings?.enableHeartBeatTimer)\n paq(['enableHeartBeatTimer', settings.enableHeartBeatTimer]);\n\n // Settings-level custom dimensions (visit-scope, set once at init)\n if (settings?.customDimensions) {\n for (const [id, value] of Object.entries(settings.customDimensions)) {\n paq(['setCustomDimension', Number(id), value]);\n }\n }\n },\n\n async push(event, { rule = {}, data, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const paq = w._paq!.push.bind(w._paq!);\n const eventMapping: Mapping = rule.settings || {};\n\n // Default page view (no mapping settings)\n if (event.name === 'page view' && !rule.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const parameters = isArray(data) ? data : [data];\n\n // Site search\n if (eventMapping.siteSearch) {\n paq(['trackSiteSearch', ...parameters]);\n return;\n }\n\n // Content impression\n if (eventMapping.contentImpression) {\n paq(['trackContentImpression', ...parameters]);\n return;\n }\n\n // Content interaction\n if (eventMapping.contentInteraction) {\n paq(['trackContentInteraction', ...parameters]);\n return;\n }\n\n // Per-event custom dimensions (action-scope)\n if (eventMapping.customDimensions) {\n for (const [id, path] of Object.entries(eventMapping.customDimensions)) {\n const value = await getMappingValue(event, path);\n if (value !== undefined) {\n paq(['setCustomDimension', Number(id), value]);\n }\n }\n }\n\n // Default: pass through with mapped name and data\n paq([event.name, ...parameters]);\n\n // Goal tracking alongside event\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? await getMappingValue(event, eventMapping.goalValue)\n : undefined;\n paq(['trackGoal', eventMapping.goalId, goalValue]);\n }\n },\n};\n\nfunction addScript(url: string, env?: DestinationWeb.Env) {\n const { document } = getEnv(env);\n const doc = document as Document;\n const script = doc.createElement('script');\n script.type = 'text/javascript';\n script.src = url + 'matomo.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationMatomo;\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\ndeclare global {\n interface Window {\n _paq?: Array<unknown>;\n }\n}\n\nexport interface Settings {\n /** Matomo Site ID (required). */\n siteId: string;\n /** Base URL of Matomo instance, e.g. https://analytics.example.com/ (required). */\n url: string;\n /** Disable all tracking cookies for cookie-free analytics. */\n disableCookies?: boolean;\n /** Enable automatic outlink and download tracking. Default: true. */\n enableLinkTracking?: boolean;\n /** Enable heart beat timer with interval in seconds for accurate time-on-page. */\n enableHeartBeatTimer?: number;\n /** Custom dimensions applied to all events. Keys are dimension IDs, values are property paths. */\n customDimensions?: Record<string, string>;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n /** Goal ID to track a conversion alongside this event. */\n goalId?: string;\n /** Property path for goal revenue value (e.g. data.revenue). */\n goalValue?: string;\n /** Track as internal site search via trackSiteSearch. */\n siteSearch?: boolean;\n /** Track as content impression via trackContentImpression. */\n contentImpression?: boolean;\n /** Track as content interaction via trackContentInteraction. */\n contentInteraction?: boolean;\n /** Per-event custom dimensions. Keys are dimension IDs, values are property paths. */\n customDimensions?: Record<string, string>;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\n location?: { href?: string };\n };\n document: {\n createElement: (tagName: string) => {\n type: string;\n src: string;\n async?: boolean;\n defer?: boolean;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{getMappingValue as e,isArray as t}from"@walkeros/core";import{getEnv as i}from"@walkeros/web-core";var n={},o={type:"matomo",config:{},init({config:e,env:t,logger:n}){const{window:o}=i(t),s=o,{settings:a,loadScript:r}=e,{siteId:c,url:l}=a||{};c||n.throw("Config settings siteId missing"),l||n.throw("Config settings url missing"),s._paq=s._paq||[];const m=s._paq.push.bind(s._paq);if(r&&(!function(e,t){const{document:n}=i(t),o=n,s=o.createElement("script");s.type="text/javascript",s.src=e+"matomo.js",s.async=!0,s.defer=!0,o.head.appendChild(s)}(l,t),m(["setTrackerUrl",l+"matomo.php"]),m(["setSiteId",c])),(null==a?void 0:a.disableCookies)&&m(["disableCookies"]),!1!==(null==a?void 0:a.enableLinkTracking)&&m(["enableLinkTracking"]),(null==a?void 0:a.enableHeartBeatTimer)&&m(["enableHeartBeatTimer",a.enableHeartBeatTimer]),null==a?void 0:a.customDimensions)for(const[e,t]of Object.entries(a.customDimensions))m(["setCustomDimension",Number(e),t])},async push(n,{rule:o={},data:s,env:a}){const{window:r}=i(a),c=r,l=c._paq.push.bind(c._paq),m=o.settings||{};if("page view"===n.name&&!o.settings)return void l(["trackPageView",await e(n,"data.title")]);const d=t(s)?s:[s];if(m.siteSearch)l(["trackSiteSearch",...d]);else if(m.contentImpression)l(["trackContentImpression",...d]);else if(m.contentInteraction)l(["trackContentInteraction",...d]);else{if(m.customDimensions)for(const[t,i]of Object.entries(m.customDimensions)){const o=await e(n,i);void 0!==o&&l(["setCustomDimension",Number(t),o])}if(l([n.name,...d]),m.goalId){const t=m.goalValue?await e(n,m.goalValue):void 0;l(["trackGoal",m.goalId,t])}}}};var s=o;export{n as DestinationMatomo,s as default,o as destinationMatomo};//# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/types/index.ts"],"sourcesContent":["import type { Mapping, Destination } from './types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getMappingValue, isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationMatomo from './types';\n\nexport const destinationMatomo: Destination = {\n type: 'matomo',\n\n config: {},\n\n init({ config, env, logger }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { siteId, url } = settings || {};\n\n // Required parameters\n if (!siteId) logger.throw('Config settings siteId missing');\n if (!url) logger.throw('Config settings url missing');\n\n // Set up the Matomo command queue\n w._paq = w._paq || [];\n const paq = w._paq.push.bind(w._paq);\n\n if (loadScript) {\n // Load the Matomo tracking script\n addScript(url!, env);\n\n // Configure tracker URL and site ID\n paq(['setTrackerUrl', url + 'matomo.php']);\n paq(['setSiteId', siteId]);\n }\n\n // Cookie-free tracking\n if (settings?.disableCookies) paq(['disableCookies']);\n\n // Enable link tracking by default\n if (settings?.enableLinkTracking !== false) paq(['enableLinkTracking']);\n\n // Heart beat timer for accurate time-on-page\n if (settings?.enableHeartBeatTimer)\n paq(['enableHeartBeatTimer', settings.enableHeartBeatTimer]);\n\n // Settings-level custom dimensions (visit-scope, set once at init)\n if (settings?.customDimensions) {\n for (const [id, value] of Object.entries(settings.customDimensions)) {\n paq(['setCustomDimension', Number(id), value]);\n }\n }\n },\n\n async push(event, { rule = {}, data, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const paq = w._paq!.push.bind(w._paq!);\n const eventMapping: Mapping = rule.settings || {};\n\n // Default page view (no mapping settings)\n if (event.name === 'page view' && !rule.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const parameters = isArray(data) ? data : [data];\n\n // Site search\n if (eventMapping.siteSearch) {\n paq(['trackSiteSearch', ...parameters]);\n return;\n }\n\n // Content impression\n if (eventMapping.contentImpression) {\n paq(['trackContentImpression', ...parameters]);\n return;\n }\n\n // Content interaction\n if (eventMapping.contentInteraction) {\n paq(['trackContentInteraction', ...parameters]);\n return;\n }\n\n // Per-event custom dimensions (action-scope)\n if (eventMapping.customDimensions) {\n for (const [id, path] of Object.entries(eventMapping.customDimensions)) {\n const value = await getMappingValue(event, path);\n if (value !== undefined) {\n paq(['setCustomDimension', Number(id), value]);\n }\n }\n }\n\n // Default: pass through with mapped name and data\n paq([event.name, ...parameters]);\n\n // Goal tracking alongside event\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? await getMappingValue(event, eventMapping.goalValue)\n : undefined;\n paq(['trackGoal', eventMapping.goalId, goalValue]);\n }\n },\n};\n\nfunction addScript(url: string, env?: DestinationWeb.Env) {\n const { document } = getEnv(env);\n const doc = document as Document;\n const script = doc.createElement('script');\n script.type = 'text/javascript';\n script.src = url + 'matomo.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationMatomo;\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\ndeclare global {\n interface Window {\n _paq?: Array<unknown>;\n }\n}\n\nexport interface Settings {\n /** Matomo Site ID (required). */\n siteId: string;\n /** Base URL of Matomo instance, e.g. https://analytics.example.com/ (required). */\n url: string;\n /** Disable all tracking cookies for cookie-free analytics. */\n disableCookies?: boolean;\n /** Enable automatic outlink and download tracking. Default: true. */\n enableLinkTracking?: boolean;\n /** Enable heart beat timer with interval in seconds for accurate time-on-page. */\n enableHeartBeatTimer?: number;\n /** Custom dimensions applied to all events. Keys are dimension IDs, values are property paths. */\n customDimensions?: Record<string, string>;\n}\n\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n /** Goal ID to track a conversion alongside this event. */\n goalId?: string;\n /** Property path for goal revenue value (e.g. data.revenue). */\n goalValue?: string;\n /** Track as internal site search via trackSiteSearch. */\n siteSearch?: boolean;\n /** Track as content impression via trackContentImpression. */\n contentImpression?: boolean;\n /** Track as content interaction via trackContentInteraction. */\n contentInteraction?: boolean;\n /** Per-event custom dimensions. Keys are dimension IDs, values are property paths. */\n customDimensions?: Record<string, string>;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\n location?: { href?: string };\n };\n document: {\n createElement: (tagName: string) => {\n type: string;\n src: string;\n async?: boolean;\n defer?: boolean;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":[]}