{"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, collector }) {\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([\n        'trackPageView',\n        await getMappingValue(event, 'data.title', { collector }),\n      ]);\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, { collector });\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, { collector })\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":";AAEA,SAAS,iBAAiB,eAAe;AACzC,SAAS,cAAc;;;ACHvB;;;ADQO,IAAM,oBAAiC;AAAA,EAC5C,MAAM;AAAA,EAEN,QAAQ,CAAC;AAAA,EAET,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG;AAC5B,UAAM,EAAE,OAAO,IAAI,OAAO,GAAG;AAC7B,UAAM,IAAI;AACV,UAAM,EAAE,UAAU,WAAW,IAAI;AACjC,UAAM,EAAE,QAAQ,IAAI,IAAI,YAAY,CAAC;AAGrC,QAAI,CAAC,OAAQ,QAAO,MAAM,gCAAgC;AAC1D,QAAI,CAAC,IAAK,QAAO,MAAM,6BAA6B;AAGpD,MAAE,OAAO,EAAE,QAAQ,CAAC;AACpB,UAAM,MAAM,EAAE,KAAK,KAAK,KAAK,EAAE,IAAI;AAEnC,QAAI,YAAY;AAEd,gBAAU,KAAM,GAAG;AAGnB,UAAI,CAAC,iBAAiB,MAAM,YAAY,CAAC;AACzC,UAAI,CAAC,aAAa,MAAM,CAAC;AAAA,IAC3B;AAGA,QAAI,qCAAU,eAAgB,KAAI,CAAC,gBAAgB,CAAC;AAGpD,SAAI,qCAAU,wBAAuB,MAAO,KAAI,CAAC,oBAAoB,CAAC;AAGtE,QAAI,qCAAU;AACZ,UAAI,CAAC,wBAAwB,SAAS,oBAAoB,CAAC;AAG7D,QAAI,qCAAU,kBAAkB;AAC9B,iBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,SAAS,gBAAgB,GAAG;AACnE,YAAI,CAAC,sBAAsB,OAAO,EAAE,GAAG,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,KAAK,UAAU,GAAG;AACrD,UAAM,EAAE,OAAO,IAAI,OAAO,GAAG;AAC7B,UAAM,IAAI;AACV,UAAM,MAAM,EAAE,KAAM,KAAK,KAAK,EAAE,IAAK;AACrC,UAAM,eAAwB,KAAK,YAAY,CAAC;AAGhD,QAAI,MAAM,SAAS,eAAe,CAAC,KAAK,UAAU;AAChD,UAAI;AAAA,QACF;AAAA,QACA,MAAM,gBAAgB,OAAO,cAAc,EAAE,UAAU,CAAC;AAAA,MAC1D,CAAC;AACD;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAG/C,QAAI,aAAa,YAAY;AAC3B,UAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;AACtC;AAAA,IACF;AAGA,QAAI,aAAa,mBAAmB;AAClC,UAAI,CAAC,0BAA0B,GAAG,UAAU,CAAC;AAC7C;AAAA,IACF;AAGA,QAAI,aAAa,oBAAoB;AACnC,UAAI,CAAC,2BAA2B,GAAG,UAAU,CAAC;AAC9C;AAAA,IACF;AAGA,QAAI,aAAa,kBAAkB;AACjC,iBAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,aAAa,gBAAgB,GAAG;AACtE,cAAM,QAAQ,MAAM,gBAAgB,OAAO,MAAM,EAAE,UAAU,CAAC;AAC9D,YAAI,UAAU,QAAW;AACvB,cAAI,CAAC,sBAAsB,OAAO,EAAE,GAAG,KAAK,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAG/B,QAAI,aAAa,QAAQ;AACvB,YAAM,YAAY,aAAa,YAC3B,MAAM,gBAAgB,OAAO,aAAa,WAAW,EAAE,UAAU,CAAC,IAClE;AACJ,UAAI,CAAC,aAAa,aAAa,QAAQ,SAAS,CAAC;AAAA,IACnD;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,KAA0B;AACxD,QAAM,EAAE,SAAS,IAAI,OAAO,GAAG;AAC/B,QAAM,MAAM;AACZ,QAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,SAAO,OAAO;AACd,SAAO,MAAM,MAAM;AACnB,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,MAAI,KAAK,YAAY,MAAM;AAC7B;AAEA,IAAO,gBAAQ;","names":[]}