@walkeros/web-destination-piwikpro 0.3.1 → 0.4.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.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,n=(e,a)=>{for(var r in a)t(e,r,{get:a[r],enumerable:!0})},i={};n(i,{DestinationPiwikPro:()=>p,default:()=>S,destinationPiwikPro:()=>x,examples:()=>s,schemas:()=>T}),module.exports=(e=i,((e,n,i,c)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let d of r(n))o.call(e,d)||d===i||t(e,d,{get:()=>n[d],enumerable:!(c=a(n,d))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core"),d=require("@walkeros/web-core"),p={},s={};n(s,{env:()=>u,events:()=>g,mapping:()=>b});var u={};n(u,{init:()=>l,push:()=>m});var l={window:{_paq:void 0},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},m={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},g={};n(g,{ecommerceAddToCart:()=>k,ecommerceCartUpdate:()=>h,ecommerceOrder:()=>y,ecommerceProductDetailView:()=>f});var v=require("@walkeros/core");function w(e){return{sku:e.data.id,name:e.data.name,price:e.data.price,quantity:1,variant:e.data.color,customDimensions:{1:e.data.size}}}function y(){const e=(0,v.getEvent)("order complete");return[["ecommerceOrder",e.nested.filter(e=>"product"===e.entity).map(w),{orderId:e.data.id,grandTotal:e.data.total,tax:e.data.taxes,shipping:e.data.shipping},{currencyCode:"EUR"}]]}function k(){return[["ecommerceAddToCart",[w((0,v.getEvent)("product add")),,],{currencyCode:"EUR"}]]}function f(){return[["ecommerceProductDetailView",[w((0,v.getEvent)("product view")),,],{currencyCode:"EUR"}]]}function h(){const e=(0,v.getEvent)("cart view");return[["ecommerceCartUpdate",e.nested.filter(e=>"product"===e.entity).map(w),e.data.value,{currencyCode:"EUR"}]]}var b={};n(b,{config:()=>U,ecommerceAddToCart:()=>q,ecommerceCartUpdate:()=>X,ecommerceOrder:()=>P,ecommerceProductDetailView:()=>O});var C=require("@walkeros/core"),E={sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}},P={name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>(0,C.isObject)(e)&&"product"===e.entity,map:E}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}},{map:{currencyCode:{value:"EUR"}}}]}},q={name:"ecommerceAddToCart",data:{set:[{set:[{map:E}]},{map:{currencyCode:{value:"EUR"}}}]}},O={name:"ecommerceProductDetailView",data:{set:[{set:[{map:E}]},{map:{currencyCode:{value:"EUR"}}}]}},X={name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>(0,C.isObject)(e)&&"product"===e.entity,map:E}]},"data.value",{map:{currencyCode:{value:"EUR"}}}]}},U={order:{complete:P},product:{add:q,view:O},cart:{view:X}},T={};n(T,{MappingSchema:()=>I,SettingsSchema:()=>D,mapping:()=>_,settings:()=>V});var j=require("@walkeros/core"),z=require("@walkeros/core"),D=z.z.object({appId:z.z.string().min(1).describe("ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX)"),url:z.z.string().url().describe("URL of your Piwik PRO account (like https://your_account_name.piwik.pro/)"),linkTracking:z.z.boolean().default(!1).describe("Enables/Disables download and outlink tracking")}),R=require("@walkeros/core"),I=R.z.object({goalId:R.z.string().describe("ID to count the event as a goal (like 1)"),goalValue:R.z.string().describe("Property to be used as the goal value (like data.value)").optional()}),V=(0,j.zodToSchema)(D),_=(0,j.zodToSchema)(I),x={type:"piwikpro",config:{},init({config:e,env:t}){const{window:a}=(0,d.getEnv)(t),r=a,{settings:o,loadScript:n}=e,{appId:i,url:c}=o||{};if(!i||!c)return!1;r._paq=r._paq||[];const p=r._paq.push;n&&(!function(e,t){const{document:a}=(0,d.getEnv)(t),r=a,o=r.createElement("script");o.type="text/javascript",o.src=e+"ppms.js",o.async=!0,o.defer=!0,r.head.appendChild(o)}(c,t),p(["setTrackerUrl",c+"ppms.php"]),p(["setSiteId",i])),!1!==(null==o?void 0:o.linkTracking)&&p(["enableLinkTracking"])},async push(e,{config:t,mapping:a={},data:r,env:o}){const{window:n}=(0,d.getEnv)(o),i=n._paq.push;if("page view"===e.name&&!a.settings)return void i(["trackPageView",await(0,c.getMappingValue)(e,"data.title")]);const p=a.settings||{},s=(0,c.isArray)(r)?r:[r];if(i([e.name,...s]),p.goalId){const t=p.goalValue?(0,c.getMappingValue)(e,p.goalValue):void 0;i(["trackGoal",p.goalId,t])}}};var S=x;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,i={};((e,a)=>{for(var n in a)t(e,n,{get:a[n],enumerable:!0})})(i,{DestinationPiwikPro:()=>s,default:()=>l,destinationPiwikPro:()=>c}),module.exports=(e=i,((e,i,o,p)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of n(i))r.call(e,s)||s===o||t(e,s,{get:()=>i[s],enumerable:!(p=a(i,s))||p.enumerable});return e})(t({},"__esModule",{value:!0}),e));var o=require("@walkeros/core"),p=require("@walkeros/web-core"),s={},c={type:"piwikpro",config:{},init({config:e,env:t}){const{window:a}=(0,p.getEnv)(t),n=a,{settings:r,loadScript:i}=e,{appId:o,url:s}=r||{};if(!o||!s)return!1;n._paq=n._paq||[];const c=n._paq.push;i&&(!function(e,t){const{document:a}=(0,p.getEnv)(t),n=a,r=n.createElement("script");r.type="text/javascript",r.src=e+"ppms.js",r.async=!0,r.defer=!0,n.head.appendChild(r)}(s,t),c(["setTrackerUrl",s+"ppms.php"]),c(["setSiteId",o])),!1!==(null==r?void 0:r.linkTracking)&&c(["enableLinkTracking"])},async push(e,{config:t,mapping:a={},data:n,env:r}){const{window:i}=(0,p.getEnv)(r),s=i._paq.push;if("page view"===e.name&&!a.settings)return void s(["trackPageView",await(0,o.getMappingValue)(e,"data.title")]);const c=a.settings||{},l=(0,o.isArray)(n)?n:[n];if(s([e.name,...l]),c.goalId){const t=c.goalValue?(0,o.getMappingValue)(e,c.goalValue):void 0;s(["trackGoal",c.goalId,t])}}};var l=c;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts"],"sourcesContent":["import type { Settings, 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 DestinationPiwikPro from './types';\n\n// Examples\nexport * as examples from './examples';\n\n// Schemas\nexport * as schemas from './schemas';\n\nexport const destinationPiwikPro: Destination = {\n type: 'piwikpro',\n\n config: {},\n\n init({ config, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { appId, url } = settings || {};\n\n // Required parameters\n if (!appId || !url) return false;\n\n // Set up the Piwik Pro interface _paq\n w._paq = w._paq || [];\n\n const paq = w._paq.push;\n if (loadScript) {\n // Load the JavaScript Tracking Client\n addScript(url, env);\n\n // Register the tracker url only with script loading\n paq(['setTrackerUrl', url + 'ppms.php']);\n\n // Register app id\n paq(['setSiteId', appId]);\n }\n\n // Enable download and outlink tracking if not disabled\n if (settings?.linkTracking !== false) paq(['enableLinkTracking']);\n },\n\n async push(event, { config, mapping = {}, data, env }) {\n const { window } = getEnv(env);\n const paq = (window as Window)._paq!.push;\n\n // Send pageviews if not disabled\n if (event.name === 'page view' && !mapping.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const eventMapping: Mapping = mapping.settings || {};\n\n const parameters = isArray(data) ? data : [data];\n\n paq([event.name, ...parameters]);\n\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? getMappingValue(event, eventMapping.goalValue)\n : undefined;\n\n paq([\n 'trackGoal',\n eventMapping.goalId,\n goalValue,\n // @TODO dimensions\n ]);\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 + 'ppms.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationPiwikPro;\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 appId: string;\n linkTracking?: boolean;\n url: string;\n}\n\nexport interface Mapping {\n goalId?: string;\n goalValue?: string;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\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>;\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\nexport interface Dimensions {\n [i: number]: string;\n}\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for PiwikPro destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\nexport const init: Env | undefined = {\n window: {\n _paq: undefined as unknown as Env['window']['_paq'],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n _paq: [] as unknown[],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n","import type { WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\nfunction getProduct(entity: WalkerOS.Entity | WalkerOS.Event) {\n return {\n sku: entity.data.id,\n name: entity.data.name,\n price: entity.data.price,\n quantity: 1,\n variant: entity.data.color,\n customDimensions: {\n 1: entity.data.size,\n },\n };\n}\n\nexport function ecommerceOrder(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n [\n 'ecommerceOrder',\n event.nested.filter((item) => item.entity === 'product').map(getProduct),\n {\n orderId: event.data.id,\n grandTotal: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n },\n { currencyCode: 'EUR' },\n ],\n ];\n}\n\nexport function ecommerceAddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n ['ecommerceAddToCart', [getProduct(event), ,], { currencyCode: 'EUR' }],\n ];\n}\n\nexport function ecommerceProductDetailView(): unknown[] {\n const event = getEvent('product view');\n\n return [\n [\n 'ecommerceProductDetailView',\n [getProduct(event), ,],\n { currencyCode: 'EUR' },\n ],\n ];\n}\n\nexport function ecommerceCartUpdate(): unknown[] {\n const event = getEvent('cart view');\n\n return [\n [\n 'ecommerceCartUpdate',\n event.nested.filter((item) => item.entity === 'product').map(getProduct),\n event.data.value,\n { currencyCode: 'EUR' },\n ],\n ];\n}\n","import type { DestinationPiwikPro } from '..';\nimport { isObject } from '@walkeros/core';\n\nconst productMap = {\n sku: 'data.id',\n name: 'data.name',\n price: 'data.price',\n quantity: { value: 1 },\n variant: { key: 'data.color' },\n customDimensions: {\n map: {\n 1: 'data.size',\n },\n },\n};\n\nexport const ecommerceOrder: DestinationPiwikPro.Rule = {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: productMap,\n },\n ],\n },\n {\n map: {\n orderId: 'data.id',\n grandTotal: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n },\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceAddToCart: DestinationPiwikPro.Rule = {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: productMap,\n },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceProductDetailView: DestinationPiwikPro.Rule = {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: productMap,\n },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceCartUpdate: DestinationPiwikPro.Rule = {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: productMap,\n },\n ],\n },\n 'data.value',\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const config = {\n order: { complete: ecommerceOrder },\n product: { add: ecommerceAddToCart, view: ecommerceProductDetailView },\n cart: { view: ecommerceCartUpdate },\n} satisfies DestinationPiwikPro.Rules;\n","import { zodToSchema } from '@walkeros/core';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core';\n\nexport const SettingsSchema = z.object({\n appId: z\n .string()\n .min(1)\n .describe('ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX)'),\n url: z\n .string()\n .url()\n .describe(\n 'URL of your Piwik PRO account (like https://your_account_name.piwik.pro/)',\n ),\n linkTracking: z\n .boolean()\n .default(false)\n .describe('Enables/Disables download and outlink tracking'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core';\n\nexport const MappingSchema = z.object({\n goalId: z.string().describe('ID to count the event as a goal (like 1)'),\n goalValue: z\n .string()\n .describe('Property to be used as the goal value (like data.value)')\n .optional(),\n});\n\nexport type Mapping = z.infer<typeof MappingSchema>;\n"],"mappings":"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","names":["import_core","ecommerceAddToCart","ecommerceCartUpdate","ecommerceOrder","ecommerceProductDetailView","import_core","import_core","import_core","import_core","config","settings","mapping"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types/index.ts"],"sourcesContent":["import type { Settings, 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 DestinationPiwikPro from './types';\n\nexport const destinationPiwikPro: Destination = {\n type: 'piwikpro',\n\n config: {},\n\n init({ config, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { appId, url } = settings || {};\n\n // Required parameters\n if (!appId || !url) return false;\n\n // Set up the Piwik Pro interface _paq\n w._paq = w._paq || [];\n\n const paq = w._paq.push;\n if (loadScript) {\n // Load the JavaScript Tracking Client\n addScript(url, env);\n\n // Register the tracker url only with script loading\n paq(['setTrackerUrl', url + 'ppms.php']);\n\n // Register app id\n paq(['setSiteId', appId]);\n }\n\n // Enable download and outlink tracking if not disabled\n if (settings?.linkTracking !== false) paq(['enableLinkTracking']);\n },\n\n async push(event, { config, mapping = {}, data, env }) {\n const { window } = getEnv(env);\n const paq = (window as Window)._paq!.push;\n\n // Send pageviews if not disabled\n if (event.name === 'page view' && !mapping.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const eventMapping: Mapping = mapping.settings || {};\n\n const parameters = isArray(data) ? data : [data];\n\n paq([event.name, ...parameters]);\n\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? getMappingValue(event, eventMapping.goalValue)\n : undefined;\n\n paq([\n 'trackGoal',\n eventMapping.goalId,\n goalValue,\n // @TODO dimensions\n ]);\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 + 'ppms.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationPiwikPro;\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 appId: string;\n linkTracking?: boolean;\n url: string;\n}\n\nexport interface Mapping {\n goalId?: string;\n goalValue?: string;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\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>;\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\nexport interface Dimensions {\n [i: number]: string;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,kBAAyC;AACzC,sBAAuB;;;ACHvB;;;ADQO,IAAM,sBAAmC;AAAA,EAC9C,MAAM;AAAA,EAEN,QAAQ,CAAC;AAAA,EAET,KAAK,EAAE,QAAQ,IAAI,GAAG;AACpB,UAAM,EAAE,OAAO,QAAI,wBAAO,GAAG;AAC7B,UAAM,IAAI;AACV,UAAM,EAAE,UAAU,WAAW,IAAI;AACjC,UAAM,EAAE,OAAO,IAAI,IAAI,YAAY,CAAC;AAGpC,QAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAG3B,MAAE,OAAO,EAAE,QAAQ,CAAC;AAEpB,UAAM,MAAM,EAAE,KAAK;AACnB,QAAI,YAAY;AAEd,gBAAU,KAAK,GAAG;AAGlB,UAAI,CAAC,iBAAiB,MAAM,UAAU,CAAC;AAGvC,UAAI,CAAC,aAAa,KAAK,CAAC;AAAA,IAC1B;AAGA,SAAI,qCAAU,kBAAiB,MAAO,KAAI,CAAC,oBAAoB,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,OAAO,EAAE,QAAQ,UAAU,CAAC,GAAG,MAAM,IAAI,GAAG;AACrD,UAAM,EAAE,OAAO,QAAI,wBAAO,GAAG;AAC7B,UAAM,MAAO,OAAkB,KAAM;AAGrC,QAAI,MAAM,SAAS,eAAe,CAAC,QAAQ,UAAU;AACnD,UAAI,CAAC,iBAAiB,UAAM,6BAAgB,OAAO,YAAY,CAAC,CAAC;AACjE;AAAA,IACF;AAEA,UAAM,eAAwB,QAAQ,YAAY,CAAC;AAEnD,UAAM,iBAAa,qBAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAE/C,QAAI,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAE/B,QAAI,aAAa,QAAQ;AACvB,YAAM,YAAY,aAAa,gBAC3B,6BAAgB,OAAO,aAAa,SAAS,IAC7C;AAEJ,UAAI;AAAA,QACF;AAAA,QACA,aAAa;AAAA,QACb;AAAA;AAAA,MAEF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAa,KAA0B;AACxD,QAAM,EAAE,SAAS,QAAI,wBAAO,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":[]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,a=(a,t)=>{for(var r in t)e(a,r,{get:t[r],enumerable:!0})};import{getMappingValue as t,isArray as r}from"@walkeros/core";import{getEnv as o}from"@walkeros/web-core";var i={},c={};a(c,{env:()=>n,events:()=>s,mapping:()=>f});var n={};a(n,{init:()=>d,push:()=>p});var d={window:{_paq:void 0},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},p={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},s={};a(s,{ecommerceAddToCart:()=>g,ecommerceCartUpdate:()=>w,ecommerceOrder:()=>u,ecommerceProductDetailView:()=>v});import{getEvent as m}from"@walkeros/core";function l(e){return{sku:e.data.id,name:e.data.name,price:e.data.price,quantity:1,variant:e.data.color,customDimensions:{1:e.data.size}}}function u(){const e=m("order complete");return[["ecommerceOrder",e.nested.filter(e=>"product"===e.entity).map(l),{orderId:e.data.id,grandTotal:e.data.total,tax:e.data.taxes,shipping:e.data.shipping},{currencyCode:"EUR"}]]}function g(){return[["ecommerceAddToCart",[l(m("product add")),,],{currencyCode:"EUR"}]]}function v(){return[["ecommerceProductDetailView",[l(m("product view")),,],{currencyCode:"EUR"}]]}function w(){const e=m("cart view");return[["ecommerceCartUpdate",e.nested.filter(e=>"product"===e.entity).map(l),e.data.value,{currencyCode:"EUR"}]]}var f={};a(f,{config:()=>U,ecommerceAddToCart:()=>C,ecommerceCartUpdate:()=>X,ecommerceOrder:()=>h,ecommerceProductDetailView:()=>b});import{isObject as k}from"@walkeros/core";var y={sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}},h={name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>k(e)&&"product"===e.entity,map:y}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}},{map:{currencyCode:{value:"EUR"}}}]}},C={name:"ecommerceAddToCart",data:{set:[{set:[{map:y}]},{map:{currencyCode:{value:"EUR"}}}]}},b={name:"ecommerceProductDetailView",data:{set:[{set:[{map:y}]},{map:{currencyCode:{value:"EUR"}}}]}},X={name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>k(e)&&"product"===e.entity,map:y}]},"data.value",{map:{currencyCode:{value:"EUR"}}}]}},U={order:{complete:h},product:{add:C,view:b},cart:{view:X}},P={};a(P,{MappingSchema:()=>T,SettingsSchema:()=>D,mapping:()=>V,settings:()=>q});import{zodToSchema as E}from"@walkeros/core";import{z as R}from"@walkeros/core";var D=R.object({appId:R.string().min(1).describe("ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX)"),url:R.string().url().describe("URL of your Piwik PRO account (like https://your_account_name.piwik.pro/)"),linkTracking:R.boolean().default(!1).describe("Enables/Disables download and outlink tracking")});import{z as I}from"@walkeros/core";var T=I.object({goalId:I.string().describe("ID to count the event as a goal (like 1)"),goalValue:I.string().describe("Property to be used as the goal value (like data.value)").optional()}),q=E(D),V=E(T),_={type:"piwikpro",config:{},init({config:e,env:a}){const{window:t}=o(a),r=t,{settings:i,loadScript:c}=e,{appId:n,url:d}=i||{};if(!n||!d)return!1;r._paq=r._paq||[];const p=r._paq.push;c&&(!function(e,a){const{document:t}=o(a),r=t,i=r.createElement("script");i.type="text/javascript",i.src=e+"ppms.js",i.async=!0,i.defer=!0,r.head.appendChild(i)}(d,a),p(["setTrackerUrl",d+"ppms.php"]),p(["setSiteId",n])),!1!==(null==i?void 0:i.linkTracking)&&p(["enableLinkTracking"])},async push(e,{config:a,mapping:i={},data:c,env:n}){const{window:d}=o(n),p=d._paq.push;if("page view"===e.name&&!i.settings)return void p(["trackPageView",await t(e,"data.title")]);const s=i.settings||{},m=r(c)?c:[c];if(p([e.name,...m]),s.goalId){const a=s.goalValue?t(e,s.goalValue):void 0;p(["trackGoal",s.goalId,a])}}};var x=_;export{i as DestinationPiwikPro,x as default,_ as destinationPiwikPro,c as examples,P as schemas};//# sourceMappingURL=index.mjs.map
1
+ import{getMappingValue as a,isArray as e}from"@walkeros/core";import{getEnv as t}from"@walkeros/web-core";var i={},n={type:"piwikpro",config:{},init({config:a,env:e}){const{window:i}=t(e),n=i,{settings:o,loadScript:r}=a,{appId:p,url:s}=o||{};if(!p||!s)return!1;n._paq=n._paq||[];const c=n._paq.push;r&&(!function(a,e){const{document:i}=t(e),n=i,o=n.createElement("script");o.type="text/javascript",o.src=a+"ppms.js",o.async=!0,o.defer=!0,n.head.appendChild(o)}(s,e),c(["setTrackerUrl",s+"ppms.php"]),c(["setSiteId",p])),!1!==(null==o?void 0:o.linkTracking)&&c(["enableLinkTracking"])},async push(i,{config:n,mapping:o={},data:r,env:p}){const{window:s}=t(p),c=s._paq.push;if("page view"===i.name&&!o.settings)return void c(["trackPageView",await a(i,"data.title")]);const l=o.settings||{},d=e(r)?r:[r];if(c([i.name,...d]),l.goalId){const e=l.goalValue?a(i,l.goalValue):void 0;c(["trackGoal",l.goalId,e])}}};var o=n;export{i as DestinationPiwikPro,o as default,n as destinationPiwikPro};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts"],"sourcesContent":["import type { Settings, 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 DestinationPiwikPro from './types';\n\n// Examples\nexport * as examples from './examples';\n\n// Schemas\nexport * as schemas from './schemas';\n\nexport const destinationPiwikPro: Destination = {\n type: 'piwikpro',\n\n config: {},\n\n init({ config, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { appId, url } = settings || {};\n\n // Required parameters\n if (!appId || !url) return false;\n\n // Set up the Piwik Pro interface _paq\n w._paq = w._paq || [];\n\n const paq = w._paq.push;\n if (loadScript) {\n // Load the JavaScript Tracking Client\n addScript(url, env);\n\n // Register the tracker url only with script loading\n paq(['setTrackerUrl', url + 'ppms.php']);\n\n // Register app id\n paq(['setSiteId', appId]);\n }\n\n // Enable download and outlink tracking if not disabled\n if (settings?.linkTracking !== false) paq(['enableLinkTracking']);\n },\n\n async push(event, { config, mapping = {}, data, env }) {\n const { window } = getEnv(env);\n const paq = (window as Window)._paq!.push;\n\n // Send pageviews if not disabled\n if (event.name === 'page view' && !mapping.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const eventMapping: Mapping = mapping.settings || {};\n\n const parameters = isArray(data) ? data : [data];\n\n paq([event.name, ...parameters]);\n\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? getMappingValue(event, eventMapping.goalValue)\n : undefined;\n\n paq([\n 'trackGoal',\n eventMapping.goalId,\n goalValue,\n // @TODO dimensions\n ]);\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 + 'ppms.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationPiwikPro;\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 appId: string;\n linkTracking?: boolean;\n url: string;\n}\n\nexport interface Mapping {\n goalId?: string;\n goalValue?: string;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\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>;\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\nexport interface Dimensions {\n [i: number]: string;\n}\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for PiwikPro destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\nexport const init: Env | undefined = {\n window: {\n _paq: undefined as unknown as Env['window']['_paq'],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n _paq: [] as unknown[],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n","import type { WalkerOS } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\n\nfunction getProduct(entity: WalkerOS.Entity | WalkerOS.Event) {\n return {\n sku: entity.data.id,\n name: entity.data.name,\n price: entity.data.price,\n quantity: 1,\n variant: entity.data.color,\n customDimensions: {\n 1: entity.data.size,\n },\n };\n}\n\nexport function ecommerceOrder(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n [\n 'ecommerceOrder',\n event.nested.filter((item) => item.entity === 'product').map(getProduct),\n {\n orderId: event.data.id,\n grandTotal: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n },\n { currencyCode: 'EUR' },\n ],\n ];\n}\n\nexport function ecommerceAddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n ['ecommerceAddToCart', [getProduct(event), ,], { currencyCode: 'EUR' }],\n ];\n}\n\nexport function ecommerceProductDetailView(): unknown[] {\n const event = getEvent('product view');\n\n return [\n [\n 'ecommerceProductDetailView',\n [getProduct(event), ,],\n { currencyCode: 'EUR' },\n ],\n ];\n}\n\nexport function ecommerceCartUpdate(): unknown[] {\n const event = getEvent('cart view');\n\n return [\n [\n 'ecommerceCartUpdate',\n event.nested.filter((item) => item.entity === 'product').map(getProduct),\n event.data.value,\n { currencyCode: 'EUR' },\n ],\n ];\n}\n","import type { DestinationPiwikPro } from '..';\nimport { isObject } from '@walkeros/core';\n\nconst productMap = {\n sku: 'data.id',\n name: 'data.name',\n price: 'data.price',\n quantity: { value: 1 },\n variant: { key: 'data.color' },\n customDimensions: {\n map: {\n 1: 'data.size',\n },\n },\n};\n\nexport const ecommerceOrder: DestinationPiwikPro.Rule = {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: productMap,\n },\n ],\n },\n {\n map: {\n orderId: 'data.id',\n grandTotal: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n },\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceAddToCart: DestinationPiwikPro.Rule = {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: productMap,\n },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceProductDetailView: DestinationPiwikPro.Rule = {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: productMap,\n },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const ecommerceCartUpdate: DestinationPiwikPro.Rule = {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: productMap,\n },\n ],\n },\n 'data.value',\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n};\n\nexport const config = {\n order: { complete: ecommerceOrder },\n product: { add: ecommerceAddToCart, view: ecommerceProductDetailView },\n cart: { view: ecommerceCartUpdate },\n} satisfies DestinationPiwikPro.Rules;\n","import { zodToSchema } from '@walkeros/core';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core';\n\nexport const SettingsSchema = z.object({\n appId: z\n .string()\n .min(1)\n .describe('ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX)'),\n url: z\n .string()\n .url()\n .describe(\n 'URL of your Piwik PRO account (like https://your_account_name.piwik.pro/)',\n ),\n linkTracking: z\n .boolean()\n .default(false)\n .describe('Enables/Disables download and outlink tracking'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core';\n\nexport const MappingSchema = z.object({\n goalId: z.string().describe('ID to count the event as a goal (like 1)'),\n goalValue: z\n .string()\n .describe('Property to be used as the goal value (like data.value)')\n .optional(),\n});\n\nexport type Mapping = z.infer<typeof MappingSchema>;\n"],"mappings":"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","names":["ecommerceAddToCart","ecommerceCartUpdate","ecommerceOrder","ecommerceProductDetailView","z","config","settings","mapping"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types/index.ts"],"sourcesContent":["import type { Settings, 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 DestinationPiwikPro from './types';\n\nexport const destinationPiwikPro: Destination = {\n type: 'piwikpro',\n\n config: {},\n\n init({ config, env }) {\n const { window } = getEnv(env);\n const w = window as Window;\n const { settings, loadScript } = config;\n const { appId, url } = settings || {};\n\n // Required parameters\n if (!appId || !url) return false;\n\n // Set up the Piwik Pro interface _paq\n w._paq = w._paq || [];\n\n const paq = w._paq.push;\n if (loadScript) {\n // Load the JavaScript Tracking Client\n addScript(url, env);\n\n // Register the tracker url only with script loading\n paq(['setTrackerUrl', url + 'ppms.php']);\n\n // Register app id\n paq(['setSiteId', appId]);\n }\n\n // Enable download and outlink tracking if not disabled\n if (settings?.linkTracking !== false) paq(['enableLinkTracking']);\n },\n\n async push(event, { config, mapping = {}, data, env }) {\n const { window } = getEnv(env);\n const paq = (window as Window)._paq!.push;\n\n // Send pageviews if not disabled\n if (event.name === 'page view' && !mapping.settings) {\n paq(['trackPageView', await getMappingValue(event, 'data.title')]);\n return;\n }\n\n const eventMapping: Mapping = mapping.settings || {};\n\n const parameters = isArray(data) ? data : [data];\n\n paq([event.name, ...parameters]);\n\n if (eventMapping.goalId) {\n const goalValue = eventMapping.goalValue\n ? getMappingValue(event, eventMapping.goalValue)\n : undefined;\n\n paq([\n 'trackGoal',\n eventMapping.goalId,\n goalValue,\n // @TODO dimensions\n ]);\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 + 'ppms.js';\n script.async = true;\n script.defer = true;\n doc.head.appendChild(script);\n}\n\nexport default destinationPiwikPro;\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 appId: string;\n linkTracking?: boolean;\n url: string;\n}\n\nexport interface Mapping {\n goalId?: string;\n goalValue?: string;\n}\n\nexport interface Env extends DestinationWeb.Env {\n window: {\n _paq: Array<unknown>;\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>;\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\nexport interface Dimensions {\n [i: number]: string;\n}\n"],"mappings":";AAEA,SAAS,iBAAiB,eAAe;AACzC,SAAS,cAAc;;;ACHvB;;;ADQO,IAAM,sBAAmC;AAAA,EAC9C,MAAM;AAAA,EAEN,QAAQ,CAAC;AAAA,EAET,KAAK,EAAE,QAAQ,IAAI,GAAG;AACpB,UAAM,EAAE,OAAO,IAAI,OAAO,GAAG;AAC7B,UAAM,IAAI;AACV,UAAM,EAAE,UAAU,WAAW,IAAI;AACjC,UAAM,EAAE,OAAO,IAAI,IAAI,YAAY,CAAC;AAGpC,QAAI,CAAC,SAAS,CAAC,IAAK,QAAO;AAG3B,MAAE,OAAO,EAAE,QAAQ,CAAC;AAEpB,UAAM,MAAM,EAAE,KAAK;AACnB,QAAI,YAAY;AAEd,gBAAU,KAAK,GAAG;AAGlB,UAAI,CAAC,iBAAiB,MAAM,UAAU,CAAC;AAGvC,UAAI,CAAC,aAAa,KAAK,CAAC;AAAA,IAC1B;AAGA,SAAI,qCAAU,kBAAiB,MAAO,KAAI,CAAC,oBAAoB,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,OAAO,EAAE,QAAQ,UAAU,CAAC,GAAG,MAAM,IAAI,GAAG;AACrD,UAAM,EAAE,OAAO,IAAI,OAAO,GAAG;AAC7B,UAAM,MAAO,OAAkB,KAAM;AAGrC,QAAI,MAAM,SAAS,eAAe,CAAC,QAAQ,UAAU;AACnD,UAAI,CAAC,iBAAiB,MAAM,gBAAgB,OAAO,YAAY,CAAC,CAAC;AACjE;AAAA,IACF;AAEA,UAAM,eAAwB,QAAQ,YAAY,CAAC;AAEnD,UAAM,aAAa,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAE/C,QAAI,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAE/B,QAAI,aAAa,QAAQ;AACvB,YAAM,YAAY,aAAa,YAC3B,gBAAgB,OAAO,aAAa,SAAS,IAC7C;AAEJ,UAAI;AAAA,QACF;AAAA,QACA,aAAa;AAAA,QACb;AAAA;AAAA,MAEF,CAAC;AAAA,IACH;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":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-destination-piwikpro",
3
3
  "description": "Piwik PRO destination for walkerOS",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -16,6 +16,11 @@
16
16
  "types": "./dist/examples/index.d.ts",
17
17
  "import": "./dist/examples/index.mjs",
18
18
  "require": "./dist/examples/index.js"
19
+ },
20
+ "./dev": {
21
+ "types": "./dist/dev.d.ts",
22
+ "import": "./dist/dev.mjs",
23
+ "require": "./dist/dev.js"
19
24
  }
20
25
  },
21
26
  "files": [
@@ -30,8 +35,8 @@
30
35
  "update": "npx npm-check-updates -u && npm update"
31
36
  },
32
37
  "dependencies": {
33
- "@walkeros/core": "0.3.1",
34
- "@walkeros/web-core": "0.3.1"
38
+ "@walkeros/core": "0.4.0",
39
+ "@walkeros/web-core": "0.4.0"
35
40
  },
36
41
  "devDependencies": {},
37
42
  "repository": {