@walkeros/web-destination-piwikpro 4.6.0 → 4.7.0-next-1790187973605

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @walkeros/web-destination-piwikpro
2
2
 
3
+ ## 4.7.0-next-1790187973605
4
+
5
+ ### Minor Changes
6
+
7
+ - 8a32978: Adds custom dimensions and an `identified` setting for cookieless
8
+ anonymous tracking. A page view rule with goal settings now still tracks the
9
+ page view, and goal values are resolved before sending. Unmapped events are
10
+ skipped with a warning instead of being pushed to `_paq`. Link tracking starts
11
+ after the first hit, and `url` and `appId` are required only with
12
+ `loadScript`.
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [57788bc]
17
+ - Updated dependencies [f5a1cfd]
18
+ - Updated dependencies [ef02916]
19
+ - Updated dependencies [ef02916]
20
+ - Updated dependencies [2aebc53]
21
+ - Updated dependencies [f5a1cfd]
22
+ - Updated dependencies [f5a1cfd]
23
+ - Updated dependencies [2aebc53]
24
+ - Updated dependencies [8f8aea6]
25
+ - Updated dependencies [2aebc53]
26
+ - Updated dependencies [2aebc53]
27
+ - @walkeros/core@4.7.0-next-1790187973605
28
+ - @walkeros/web-core@4.7.0-next-1790187973605
29
+
30
+ ## 4.6.1
31
+
32
+ ### Patch Changes
33
+
34
+ - @walkeros/core@4.6.1
35
+ - @walkeros/web-core@4.6.1
36
+
3
37
  ## 4.6.0
4
38
 
5
39
  ### Patch Changes
package/dist/dev.d.mts CHANGED
@@ -1,32 +1,31 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { z } from '@walkeros/core/dev';
3
3
  import { DestinationWeb } from '@walkeros/web-core';
4
- import { Flow } from '@walkeros/core';
4
+ import { Flow, Hint } from '@walkeros/core';
5
5
 
6
6
  declare const SettingsSchema: z.ZodObject<{
7
- appId: z.ZodString;
8
- url: z.ZodString;
7
+ appId: z.ZodOptional<z.ZodString>;
8
+ url: z.ZodOptional<z.ZodString>;
9
9
  linkTracking: z.ZodDefault<z.ZodBoolean>;
10
+ identified: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodRecord<z.ZodString, z.ZodBoolean>]>>;
11
+ customDimensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
10
12
  }, z.core.$strip>;
11
- type Settings = z.infer<typeof SettingsSchema>;
12
13
 
13
14
  declare const MappingSchema: z.ZodObject<{
14
- goalId: z.ZodString;
15
- goalValue: z.ZodOptional<z.ZodString>;
15
+ goalId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
16
+ goalValue: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
17
+ customDimensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
16
18
  }, z.core.$strip>;
17
- type Mapping = z.infer<typeof MappingSchema>;
18
19
 
19
20
  declare const settings: _walkeros_core_dev.JSONSchema;
20
21
  declare const mapping: _walkeros_core_dev.JSONSchema;
21
22
 
22
- type index$1_Mapping = Mapping;
23
23
  declare const index$1_MappingSchema: typeof MappingSchema;
24
- type index$1_Settings = Settings;
25
24
  declare const index$1_SettingsSchema: typeof SettingsSchema;
26
25
  declare const index$1_mapping: typeof mapping;
27
26
  declare const index$1_settings: typeof settings;
28
27
  declare namespace index$1 {
29
- export { type index$1_Mapping as Mapping, index$1_MappingSchema as MappingSchema, type index$1_Settings as Settings, index$1_SettingsSchema as SettingsSchema, index$1_mapping as mapping, index$1_settings as settings };
28
+ export { index$1_MappingSchema as MappingSchema, index$1_SettingsSchema as SettingsSchema, index$1_mapping as mapping, index$1_settings as settings };
30
29
  }
31
30
 
32
31
  declare global {
@@ -74,26 +73,49 @@ declare namespace env {
74
73
  /**
75
74
  * Destination bootstrap.
76
75
  * Given the canonical settings, init loads the PiwikPro script and configures
77
- * the tracker URL, app id, and link tracking. Reproduce by passing the same
78
- * settings to `startFlow` as the destination config.
76
+ * the tracker URL and app id. Link tracking follows the first hit instead
77
+ * (see `linkTrackingAfterFirstHit`). Reproduce by passing the same settings to
78
+ * `startFlow` as the destination config.
79
79
  */
80
80
  declare const init: Flow.StepExample;
81
+ /**
82
+ * Runs with the default settings (linkTracking on). The other event examples
83
+ * run with `linkTracking: false`, so their `out` holds only their own commands.
84
+ */
85
+ declare const linkTrackingAfterFirstHit: Flow.StepExample;
81
86
  declare const ecommerceOrder: Flow.StepExample;
82
87
  declare const ecommerceAddToCart: Flow.StepExample;
83
88
  declare const productDetailView: Flow.StepExample;
84
89
  declare const cartUpdate: Flow.StepExample;
85
90
  declare const customEvent: Flow.StepExample;
86
91
  declare const pageViewWithTitle: Flow.StepExample;
92
+ declare const pageViewWithGoal: Flow.StepExample;
93
+ declare const eventWithGoalValue: Flow.StepExample;
94
+ declare const ecommerceRemoveFromCart: Flow.StepExample;
95
+ declare const siteSearch: Flow.StepExample;
96
+ declare const linkDownload: Flow.StepExample;
97
+ declare const ping: Flow.StepExample;
98
+ declare const customDimensionsEvent: Flow.StepExample;
99
+ declare const customDimensionsPageView: Flow.StepExample;
87
100
 
88
101
  declare const step_cartUpdate: typeof cartUpdate;
102
+ declare const step_customDimensionsEvent: typeof customDimensionsEvent;
103
+ declare const step_customDimensionsPageView: typeof customDimensionsPageView;
89
104
  declare const step_customEvent: typeof customEvent;
90
105
  declare const step_ecommerceAddToCart: typeof ecommerceAddToCart;
91
106
  declare const step_ecommerceOrder: typeof ecommerceOrder;
107
+ declare const step_ecommerceRemoveFromCart: typeof ecommerceRemoveFromCart;
108
+ declare const step_eventWithGoalValue: typeof eventWithGoalValue;
92
109
  declare const step_init: typeof init;
110
+ declare const step_linkDownload: typeof linkDownload;
111
+ declare const step_linkTrackingAfterFirstHit: typeof linkTrackingAfterFirstHit;
112
+ declare const step_pageViewWithGoal: typeof pageViewWithGoal;
93
113
  declare const step_pageViewWithTitle: typeof pageViewWithTitle;
114
+ declare const step_ping: typeof ping;
94
115
  declare const step_productDetailView: typeof productDetailView;
116
+ declare const step_siteSearch: typeof siteSearch;
95
117
  declare namespace step {
96
- export { step_cartUpdate as cartUpdate, step_customEvent as customEvent, step_ecommerceAddToCart as ecommerceAddToCart, step_ecommerceOrder as ecommerceOrder, step_init as init, step_pageViewWithTitle as pageViewWithTitle, step_productDetailView as productDetailView };
118
+ export { step_cartUpdate as cartUpdate, step_customDimensionsEvent as customDimensionsEvent, step_customDimensionsPageView as customDimensionsPageView, step_customEvent as customEvent, step_ecommerceAddToCart as ecommerceAddToCart, step_ecommerceOrder as ecommerceOrder, step_ecommerceRemoveFromCart as ecommerceRemoveFromCart, step_eventWithGoalValue as eventWithGoalValue, step_init as init, step_linkDownload as linkDownload, step_linkTrackingAfterFirstHit as linkTrackingAfterFirstHit, step_pageViewWithGoal as pageViewWithGoal, step_pageViewWithTitle as pageViewWithTitle, step_ping as ping, step_productDetailView as productDetailView, step_siteSearch as siteSearch };
97
119
  }
98
120
 
99
121
  declare const index_env: typeof env;
@@ -102,4 +124,6 @@ declare namespace index {
102
124
  export { index_env as env, index_step as step };
103
125
  }
104
126
 
105
- export { index as examples, index$1 as schemas };
127
+ declare const hints: Hint.Hints;
128
+
129
+ export { index as examples, hints, index$1 as schemas };
package/dist/dev.d.ts CHANGED
@@ -1,32 +1,31 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { z } from '@walkeros/core/dev';
3
3
  import { DestinationWeb } from '@walkeros/web-core';
4
- import { Flow } from '@walkeros/core';
4
+ import { Flow, Hint } from '@walkeros/core';
5
5
 
6
6
  declare const SettingsSchema: z.ZodObject<{
7
- appId: z.ZodString;
8
- url: z.ZodString;
7
+ appId: z.ZodOptional<z.ZodString>;
8
+ url: z.ZodOptional<z.ZodString>;
9
9
  linkTracking: z.ZodDefault<z.ZodBoolean>;
10
+ identified: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodRecord<z.ZodString, z.ZodBoolean>]>>;
11
+ customDimensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
10
12
  }, z.core.$strip>;
11
- type Settings = z.infer<typeof SettingsSchema>;
12
13
 
13
14
  declare const MappingSchema: z.ZodObject<{
14
- goalId: z.ZodString;
15
- goalValue: z.ZodOptional<z.ZodString>;
15
+ goalId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
16
+ goalValue: z.ZodOptional<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
17
+ customDimensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>;
16
18
  }, z.core.$strip>;
17
- type Mapping = z.infer<typeof MappingSchema>;
18
19
 
19
20
  declare const settings: _walkeros_core_dev.JSONSchema;
20
21
  declare const mapping: _walkeros_core_dev.JSONSchema;
21
22
 
22
- type index$1_Mapping = Mapping;
23
23
  declare const index$1_MappingSchema: typeof MappingSchema;
24
- type index$1_Settings = Settings;
25
24
  declare const index$1_SettingsSchema: typeof SettingsSchema;
26
25
  declare const index$1_mapping: typeof mapping;
27
26
  declare const index$1_settings: typeof settings;
28
27
  declare namespace index$1 {
29
- export { type index$1_Mapping as Mapping, index$1_MappingSchema as MappingSchema, type index$1_Settings as Settings, index$1_SettingsSchema as SettingsSchema, index$1_mapping as mapping, index$1_settings as settings };
28
+ export { index$1_MappingSchema as MappingSchema, index$1_SettingsSchema as SettingsSchema, index$1_mapping as mapping, index$1_settings as settings };
30
29
  }
31
30
 
32
31
  declare global {
@@ -74,26 +73,49 @@ declare namespace env {
74
73
  /**
75
74
  * Destination bootstrap.
76
75
  * Given the canonical settings, init loads the PiwikPro script and configures
77
- * the tracker URL, app id, and link tracking. Reproduce by passing the same
78
- * settings to `startFlow` as the destination config.
76
+ * the tracker URL and app id. Link tracking follows the first hit instead
77
+ * (see `linkTrackingAfterFirstHit`). Reproduce by passing the same settings to
78
+ * `startFlow` as the destination config.
79
79
  */
80
80
  declare const init: Flow.StepExample;
81
+ /**
82
+ * Runs with the default settings (linkTracking on). The other event examples
83
+ * run with `linkTracking: false`, so their `out` holds only their own commands.
84
+ */
85
+ declare const linkTrackingAfterFirstHit: Flow.StepExample;
81
86
  declare const ecommerceOrder: Flow.StepExample;
82
87
  declare const ecommerceAddToCart: Flow.StepExample;
83
88
  declare const productDetailView: Flow.StepExample;
84
89
  declare const cartUpdate: Flow.StepExample;
85
90
  declare const customEvent: Flow.StepExample;
86
91
  declare const pageViewWithTitle: Flow.StepExample;
92
+ declare const pageViewWithGoal: Flow.StepExample;
93
+ declare const eventWithGoalValue: Flow.StepExample;
94
+ declare const ecommerceRemoveFromCart: Flow.StepExample;
95
+ declare const siteSearch: Flow.StepExample;
96
+ declare const linkDownload: Flow.StepExample;
97
+ declare const ping: Flow.StepExample;
98
+ declare const customDimensionsEvent: Flow.StepExample;
99
+ declare const customDimensionsPageView: Flow.StepExample;
87
100
 
88
101
  declare const step_cartUpdate: typeof cartUpdate;
102
+ declare const step_customDimensionsEvent: typeof customDimensionsEvent;
103
+ declare const step_customDimensionsPageView: typeof customDimensionsPageView;
89
104
  declare const step_customEvent: typeof customEvent;
90
105
  declare const step_ecommerceAddToCart: typeof ecommerceAddToCart;
91
106
  declare const step_ecommerceOrder: typeof ecommerceOrder;
107
+ declare const step_ecommerceRemoveFromCart: typeof ecommerceRemoveFromCart;
108
+ declare const step_eventWithGoalValue: typeof eventWithGoalValue;
92
109
  declare const step_init: typeof init;
110
+ declare const step_linkDownload: typeof linkDownload;
111
+ declare const step_linkTrackingAfterFirstHit: typeof linkTrackingAfterFirstHit;
112
+ declare const step_pageViewWithGoal: typeof pageViewWithGoal;
93
113
  declare const step_pageViewWithTitle: typeof pageViewWithTitle;
114
+ declare const step_ping: typeof ping;
94
115
  declare const step_productDetailView: typeof productDetailView;
116
+ declare const step_siteSearch: typeof siteSearch;
95
117
  declare namespace step {
96
- export { step_cartUpdate as cartUpdate, step_customEvent as customEvent, step_ecommerceAddToCart as ecommerceAddToCart, step_ecommerceOrder as ecommerceOrder, step_init as init, step_pageViewWithTitle as pageViewWithTitle, step_productDetailView as productDetailView };
118
+ export { step_cartUpdate as cartUpdate, step_customDimensionsEvent as customDimensionsEvent, step_customDimensionsPageView as customDimensionsPageView, step_customEvent as customEvent, step_ecommerceAddToCart as ecommerceAddToCart, step_ecommerceOrder as ecommerceOrder, step_ecommerceRemoveFromCart as ecommerceRemoveFromCart, step_eventWithGoalValue as eventWithGoalValue, step_init as init, step_linkDownload as linkDownload, step_linkTrackingAfterFirstHit as linkTrackingAfterFirstHit, step_pageViewWithGoal as pageViewWithGoal, step_pageViewWithTitle as pageViewWithTitle, step_ping as ping, step_productDetailView as productDetailView, step_siteSearch as siteSearch };
97
119
  }
98
120
 
99
121
  declare const index_env: typeof env;
@@ -102,4 +124,6 @@ declare namespace index {
102
124
  export { index_env as env, index_step as step };
103
125
  }
104
126
 
105
- export { index as examples, index$1 as schemas };
127
+ declare const hints: Hint.Hints;
128
+
129
+ export { index as examples, hints, index$1 as schemas };
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,o=(e,a)=>{for(var i in a)t(e,i,{get:a[i],enumerable:!0})},n={};o(n,{examples:()=>k,schemas:()=>c}),module.exports=(e=n,((e,o,n,c)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let d of i(o))r.call(e,d)||d===n||t(e,d,{get:()=>o[d],enumerable:!(c=a(o,d))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c={};o(c,{MappingSchema:()=>u,SettingsSchema:()=>p,mapping:()=>v,settings:()=>l});var d=require("@walkeros/core/dev"),s=require("@walkeros/core/dev"),p=s.z.object({appId:s.z.string().min(1).describe("ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX)"),url:s.z.string().url().describe("URL of your Piwik PRO account (like https://your_account_name.piwik.pro/)"),linkTracking:s.z.boolean().default(!1).describe("Enables/Disables download and outlink tracking")}),m=require("@walkeros/core/dev"),u=m.z.object({goalId:m.z.string().describe("ID to count the event as a goal (like 1)"),goalValue:m.z.string().describe("Property to be used as the goal value (like data.value)").optional()}),l=(0,d.zodToSchema)(p),v=(0,d.zodToSchema)(u),k={};o(k,{env:()=>g,step:()=>h});var g={};o(g,{init:()=>y,push:()=>w,simulation:()=>X});var y={window:{},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},w={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},X=["call:window._paq.push"],h={};o(h,{cartUpdate:()=>C,customEvent:()=>f,ecommerceAddToCart:()=>O,ecommerceOrder:()=>E,init:()=>b,pageViewWithTitle:()=>q,productDetailView:()=>R});var P=require("@walkeros/core"),b={title:"Initialization",description:"Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.",in:{loadScript:!0,settings:{appId:"XXX-XXX-XXX-XXX-XXX",url:"https://your_account_name.piwik.pro/"}},out:[["_paq.push",["setTrackerUrl","https://your_account_name.piwik.pro/ppms.php"]],["_paq.push",["setSiteId","XXX-XXX-XXX-XXX-XXX"]],["_paq.push",["enableLinkTracking"]]]},E={title:"Ecommerce order",description:"A completed order calls Piwik PRO ecommerceOrder with line items, order totals, and currency code.",in:(0,P.getEvent)("order complete",{timestamp:1700000300}),mapping:{name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>(0,P.isObject)(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceOrder",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}},{sku:"cc",name:"Cool Cap",price:42,quantity:1,variant:void 0,customDimensions:{1:"one size"}}],{orderId:"0rd3r1d",grandTotal:555,tax:73.76,shipping:5.22},{currencyCode:"EUR"}]]},O={title:"Add to cart",description:"A product add fires Piwik PRO ecommerceAddToCart with the added item and currency code.",in:(0,P.getEvent)("product add",{timestamp:1700000301}),mapping:{name:"ecommerceAddToCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceAddToCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],{currencyCode:"EUR"}]]},R={title:"Product detail view",description:"A product view fires Piwik PRO ecommerceProductDetailView with a single-item array and currency code.",in:(0,P.getEvent)("product view",{timestamp:1700000302}),mapping:{name:"ecommerceProductDetailView",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceProductDetailView",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],{currencyCode:"EUR"}]]},C={title:"Cart update",description:"A cart view fires Piwik PRO ecommerceCartUpdate with nested products, total value, and currency code.",in:(0,P.getEvent)("cart view",{timestamp:1700000303}),mapping:{name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>(0,P.isObject)(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},"data.value",{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceCartUpdate",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],840,{currencyCode:"EUR"}]]},f={title:"Custom event with goal",description:"A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.",in:(0,P.getEvent)("promotion visible",{timestamp:1700000304}),mapping:{name:"trackEvent",settings:{goalId:"goal_1"},data:{set:["data.name","data.position"]}},out:[["trackEvent","Setting up tracking easily","hero"],["trackGoal","goal_1",void 0]]},q={title:"Page view",description:"A page view fires Piwik PRO trackPageView with the page title resolved from event data.",in:(0,P.getEvent)("page view",{timestamp:1700000305}),mapping:{data:"data.title"},out:[["trackPageView","walkerOS documentation"]]};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,o=(e,a)=>{for(var i in a)t(e,i,{get:a[i],enumerable:!0})},r={};o(r,{examples:()=>v,hints:()=>G,schemas:()=>s}),module.exports=(e=r,((e,o,r,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let d of i(o))n.call(e,d)||d===r||t(e,d,{get:()=>o[d],enumerable:!(s=a(o,d))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};o(s,{MappingSchema:()=>g,SettingsSchema:()=>p,mapping:()=>h,settings:()=>k});var d=require("@walkeros/core/dev"),c=require("@walkeros/core/dev"),{ValueSchema:m}=c.schemas,l=c.z.record(c.z.string().regex(/^\d+$/,'Dimension keys are bare numeric ids like "1"'),m),p=c.z.object({appId:c.z.string().min(1).describe("ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX). Required when loadScript is true").optional(),url:c.z.string().url().describe("URL of your Piwik PRO account, normalized to one trailing slash (like https://your_account_name.piwik.pro/). Required when loadScript is true").optional(),linkTracking:c.z.boolean().default(!0).describe("Automatic outlink and download tracking, enabled right after the first hit this destination sends. Default: true"),identified:c.z.union([c.z.boolean(),c.z.record(c.z.string(),c.z.boolean())]).describe("Identified or anonymous tracking. true (default) identifies every hit, false switches the tracker to anonymous mode without cookies (disableCookies, deleteCookies, setUserIsAnonymous) at init. A consent object like { marketing: true } identifies only while that consent is granted and calls enableCookies and deanonymizeUser once it is. Do not repeat these states in config.consent, or events are queued and never reach the destination.").optional(),customDimensions:l.describe('Custom dimensions applied to every hit, keyed by bare dimension id (like { "1": "data.size" }). Rule-level customDimensions win per key.').optional()}),u=require("@walkeros/core/dev"),g=u.z.object({goalId:u.z.union([u.z.string(),u.z.number()]).describe("Piwik PRO goal id (UUID or legacy integer). Adds a second hit, trackGoal.").optional(),goalValue:u.schemas.ValueSchema.describe('Goal revenue, resolved from the event (like "data.total"), passed as the trackGoal conversion value').optional(),customDimensions:l.describe('Custom dimensions for this rule, keyed by bare dimension id (like { "1": "data.size" }). Wins per key over the destination customDimensions.').optional()}),k=(0,d.zodToSchema)(p),h=(0,d.zodToSchema)(g),v={};o(v,{env:()=>w,step:()=>P});var w={};o(w,{init:()=>y,push:()=>b,simulation:()=>f});var y={window:{},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},b={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},f=["call:window._paq.push"],P={};o(P,{cartUpdate:()=>C,customDimensionsEvent:()=>U,customDimensionsPageView:()=>x,customEvent:()=>z,ecommerceAddToCart:()=>O,ecommerceOrder:()=>D,ecommerceRemoveFromCart:()=>I,eventWithGoalValue:()=>V,init:()=>E,linkDownload:()=>T,linkTrackingAfterFirstHit:()=>R,pageViewWithGoal:()=>q,pageViewWithTitle:()=>A,ping:()=>j,productDetailView:()=>S,siteSearch:()=>_});var X=require("@walkeros/core"),E={title:"Initialization",description:"Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.",in:{loadScript:!0,settings:{appId:"XXX-XXX-XXX-XXX-XXX",url:"https://your_account_name.piwik.pro/"}},out:[["_paq.push",["setTrackerUrl","https://your_account_name.piwik.pro/ppms.php"]],["_paq.push",["setSiteId","XXX-XXX-XXX-XXX-XXX"]]]},R={title:"Link tracking after the first hit",description:"With the default linkTracking setting, the first hit is followed by enableLinkTracking for automatic outlink and download tracking.",in:(0,X.getEvent)("page view",{timestamp:1700000312}),out:[["trackPageView","walkerOS documentation"],["enableLinkTracking"]]},D={title:"Ecommerce order",description:"A completed order calls Piwik PRO ecommerceOrder with line items and order totals.",in:(0,X.getEvent)("order complete",{timestamp:1700000300}),mapping:{name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>(0,X.isObject)(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}}]}},out:[["ecommerceOrder",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}},{sku:"cc",name:"Cool Cap",price:42,quantity:1,customDimensions:{1:"one size"}}],{orderId:"0rd3r1d",grandTotal:555,tax:73.76,shipping:5.22}]]},O={title:"Add to cart",description:"A product add fires Piwik PRO ecommerceAddToCart with the added item.",in:(0,X.getEvent)("product add",{timestamp:1700000301}),mapping:{name:"ecommerceAddToCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]}]}},out:[["ecommerceAddToCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}]]]},S={title:"Product detail view",description:"A product view fires Piwik PRO ecommerceProductDetailView with a single-item array.",in:(0,X.getEvent)("product view",{timestamp:1700000302}),mapping:{name:"ecommerceProductDetailView",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]}]}},out:[["ecommerceProductDetailView",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}]]]},C={title:"Cart update",description:"A cart view fires Piwik PRO ecommerceCartUpdate with nested products and the cart total.",in:(0,X.getEvent)("cart view",{timestamp:1700000303}),mapping:{name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>(0,X.isObject)(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},"data.value"]}},out:[["ecommerceCartUpdate",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],840]]},z={title:"Custom event with goal",description:"A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.",in:(0,X.getEvent)("promotion visible",{timestamp:1700000304}),mapping:{name:"trackEvent",settings:{goalId:"goal_1"},data:{set:["data.name","data.position"]}},out:[["trackEvent","Setting up tracking easily","hero"],["trackGoal","goal_1"]]},A={title:"Page view",description:"A page view fires Piwik PRO trackPageView with the page title resolved from event data.",in:(0,X.getEvent)("page view",{timestamp:1700000305}),mapping:{data:"data.title"},out:[["trackPageView","walkerOS documentation"]]},q={title:"Page view with goal",description:"A page view rule with a goal keeps the default trackPageView and adds a trackGoal conversion.",in:(0,X.getEvent)("page view",{timestamp:1700000306}),mapping:{settings:{goalId:"goal_1"}},out:[["trackPageView","walkerOS documentation"],["trackGoal","goal_1"]]},V={title:"Event with goal value",description:"An order complete fires Piwik PRO trackEvent and then trackGoal with the order total as the conversion value.",in:(0,X.getEvent)("order complete",{timestamp:1700000307}),mapping:{name:"trackEvent",data:{set:[{value:"order"},{value:"complete"},"data.id"]},settings:{goalId:"goal_1",goalValue:"data.total"}},out:[["trackEvent","order","complete","0rd3r1d"],["trackGoal","goal_1",555]]},I={title:"Remove from cart",description:"A product remove fires Piwik PRO ecommerceRemoveFromCart with the removed item.",in:(0,X.getEvent)("product remove",{timestamp:1700000308,data:{id:"ers",name:"Everyday Ruck Snack",color:"black",size:"l",price:420}}),mapping:{name:"ecommerceRemoveFromCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"}}}]}]}},out:[["ecommerceRemoveFromCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black"}]]]},_={title:"Site search",description:"A search submit fires Piwik PRO trackSiteSearch with the keyword, category, and result count.",in:(0,X.getEvent)("search submit",{timestamp:1700000309,data:{query:"rucksack",category:"bags",results:12}}),mapping:{name:"trackSiteSearch",data:{set:["data.query","data.category","data.results"]}},out:[["trackSiteSearch","rucksack","bags",12]]},T={title:"Download link",description:"A file download fires Piwik PRO trackLink with the file URL and the download link type.",in:(0,X.getEvent)("file download",{timestamp:1700000310,data:{url:"https://www.example.com/whitepaper.pdf"}}),mapping:{name:"trackLink",data:{set:["data.url",{value:"download"}]}},out:[["trackLink","https://www.example.com/whitepaper.pdf","download"]]},j={title:"Ping",description:"A pulse-triggered event fires Piwik PRO ping to extend the time spent on the page.",in:(0,X.getEvent)("page ping",{timestamp:1700000311,trigger:"pulse"}),mapping:{name:"ping"},out:[["ping"]]},U={title:"Event with custom dimensions",description:"A product add fires Piwik PRO trackEvent with rule-level custom dimensions as its dimensions argument, values percent-encoded.",in:(0,X.getEvent)("product add",{timestamp:1700000313}),mapping:{name:"trackEvent",data:{set:["entity","action","data.name","data.price"]},settings:{customDimensions:{1:"data.size",2:"data.name"}}},out:[["trackEvent","product","add","Everyday Ruck Snack",420,{dimension1:"l",dimension2:"Everyday%20Ruck%20Snack"}]]},x={title:"Page view with custom dimensions",description:"trackPageView has no dimensions argument, so rule-level custom dimensions are set right before the hit and deleted right after it.",in:(0,X.getEvent)("page view",{timestamp:1700000314}),mapping:{settings:{customDimensions:{1:"globals.pagegroup"}}},out:[["setCustomDimensionValue",1,"docs"],["trackPageView","walkerOS documentation"],["deleteCustomDimension",1]]},G={"identified-consent":{text:'settings.identified controls identified or anonymous tracking. Absent or true: identified, the Piwik PRO default. false: anonymous from init, without tracker cookies (disableCookies, deleteCookies, setUserIsAnonymous(true)). A consent object like { "marketing": true }: anonymous and cookieless until that consent is granted, then enableCookies and deanonymizeUser merge the anonymous session into the identified visitor. Keep config.consent for the states that gate tracking at all; do not repeat the identified states there, or events are queued and never reach the destination.',code:[{lang:"json",code:'{ "consent": { "analytics": true }, "settings": { "identified": { "marketing": true } } }'}]},"custom-dimensions":{text:'customDimensions maps bare dimension ids to Mapping Values, at destination level (every hit) and at rule level (wins per key); a dimensions object the mapping passes as the method argument wins over both. trackEvent, trackGoal, trackSiteSearch and trackLink get { "dimension<id>": value } as their dimensions argument, values percent-encoded. Every other portable method (trackPageView, the content and ecommerce methods, ping) is wrapped: setCustomDimensionValue before the hit, then rule-only dimensions are deleted and destination values set again, so rule values never leak into automatic hits such as outlinks. Requires Piwik PRO tracker 15.3 or later.',code:[{lang:"json",code:'{ "settings": { "customDimensions": { "1": "globals.pagegroup" } }, "mapping": { "product": { "add": { "name": "trackEvent", "data": { "set": ["entity", "action", "data.name"] }, "settings": { "customDimensions": { "2": "data.size" } } } } } }'}]},"portable-methods":{text:"rule.name is a Piwik PRO JS API method and data resolves to its positional arguments (an array built with set is spread). The 13 portable methods (trackPageView, trackEvent, trackGoal, trackSiteSearch, trackLink, trackContentImpression, trackContentInteraction, ecommerceProductDetailView, ecommerceAddToCart, ecommerceRemoveFromCart, ecommerceCartUpdate, ecommerceOrder, ping) copy unchanged to the server destination @walkeros/server-destination-piwikpro. Any other _paq command, such as setUserId, works on web by explicit name but is web-only.",code:[{lang:"json",code:'{ "order": { "complete": { "name": "trackEvent", "data": { "set": ["entity", "action", "data.id"] }, "settings": { "goalId": "goal-uuid", "goalValue": "data.total" } } } }'}]},"unmapped-events":{text:"An event without a rule name that is not a page view sends only its goal when the rule has settings.goalId, and is otherwise skipped with a warning (once per event name, then at debug level). A named rule with silent: true also sends only its goal. To keep other events out of the destination entirely, ignore everything with a wildcard and keep the page view explicitly.",code:[{lang:"json",code:'{ "mapping": { "*": { "*": { "ignore": true } }, "page": { "view": {} } } }'}]}};//# sourceMappingURL=dev.js.map
package/dist/dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\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 absent: init() is expected to install the queue.\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: [],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\n/**\n * Simulation tracking paths\n * Specifies which function calls to track during simulation\n */\nexport const simulation = [\n 'call:window._paq.push', // Track _paq.push calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent, isObject } from '@walkeros/core';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init loads the PiwikPro script and configures\n * the tracker URL, app id, and link tracking. Reproduce by passing the same\n * settings to `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.',\n in: {\n loadScript: true,\n settings: {\n appId: 'XXX-XXX-XXX-XXX-XXX',\n url: 'https://your_account_name.piwik.pro/',\n },\n },\n out: [\n [\n '_paq.push',\n ['setTrackerUrl', 'https://your_account_name.piwik.pro/ppms.php'],\n ],\n ['_paq.push', ['setSiteId', 'XXX-XXX-XXX-XXX-XXX']],\n ['_paq.push', ['enableLinkTracking']],\n ],\n};\n\nexport const ecommerceOrder: Flow.StepExample = {\n title: 'Ecommerce order',\n description:\n 'A completed order calls Piwik PRO ecommerceOrder with line items, order totals, and currency code.',\n in: getEvent('order complete', { timestamp: 1700000300 }),\n mapping: {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\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 out: [\n [\n 'ecommerceOrder',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n {\n sku: 'cc',\n name: 'Cool Cap',\n price: 42,\n quantity: 1,\n variant: undefined,\n customDimensions: { 1: 'one size' },\n },\n ],\n {\n orderId: '0rd3r1d',\n grandTotal: 555,\n tax: 73.76,\n shipping: 5.22,\n },\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const ecommerceAddToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires Piwik PRO ecommerceAddToCart with the added item and currency code.',\n in: getEvent('product add', { timestamp: 1700000301 }),\n mapping: {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceAddToCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const productDetailView: Flow.StepExample = {\n title: 'Product detail view',\n description:\n 'A product view fires Piwik PRO ecommerceProductDetailView with a single-item array and currency code.',\n in: getEvent('product view', { timestamp: 1700000302 }),\n mapping: {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceProductDetailView',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const cartUpdate: Flow.StepExample = {\n title: 'Cart update',\n description:\n 'A cart view fires Piwik PRO ecommerceCartUpdate with nested products, total value, and currency code.',\n in: getEvent('cart view', { timestamp: 1700000303 }),\n mapping: {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\n ],\n },\n 'data.value',\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceCartUpdate',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n 840,\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const customEvent: Flow.StepExample = {\n title: 'Custom event with goal',\n description:\n 'A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.',\n in: getEvent('promotion visible', { timestamp: 1700000304 }),\n mapping: {\n name: 'trackEvent',\n settings: {\n goalId: 'goal_1',\n },\n data: {\n set: ['data.name', 'data.position'],\n },\n },\n out: [\n ['trackEvent', 'Setting up tracking easily', 'hero'],\n ['trackGoal', 'goal_1', undefined],\n ],\n};\n\nexport const pageViewWithTitle: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view fires Piwik PRO trackPageView with the page title resolved from event data.',\n in: getEvent('page view', { timestamp: 1700000305 }),\n mapping: {\n data: 'data.title',\n },\n out: [['trackPageView', 'walkerOS documentation']],\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,cAA4B;;;ACA5B,iBAAkB;AAEX,IAAM,iBAAiB,aAAE,OAAO;AAAA,EACrC,OAAO,aACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,qDAAqD;AAAA,EACjE,KAAK,aACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,cAAc,aACX,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,gDAAgD;AAC9D,CAAC;;;ACjBD,IAAAC,cAAkB;AAEX,IAAM,gBAAgB,cAAE,OAAO;AAAA,EACpC,QAAQ,cAAE,OAAO,EAAE,SAAS,0CAA0C;AAAA,EACtE,WAAW,cACR,OAAO,EACP,SAAS,yDAAyD,EAClE,SAAS;AACd,CAAC;;;AFAM,IAAM,eAAW,yBAAY,cAAc;AAC3C,IAAM,cAAU,yBAAY,aAAa;;;AGThD;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,IAAM,OAAwB;AAAA,EACnC,QAAQ;AAAA;AAAA,EAER;AAAA,EACA,UAAU;AAAA,IACR,eAAe,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,MAAM,EAAE,aAAa,MAAM;AAAA,IAAC,EAAE;AAAA,EAChC;AACF;AAEO,IAAM,OAAY;AAAA,EACvB,QAAQ;AAAA,IACN,MAAM,CAAC;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,eAAe,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,MAAM,EAAE,aAAa,MAAM;AAAA,IAAC,EAAE;AAAA,EAChC;AACF;AAMO,IAAM,aAAa;AAAA,EACxB;AAAA;AACF;;;AC7CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAAC;AAAA,EAAA;AAAA;AAAA;AACA,kBAAmC;AAQ5B,IAAMA,QAAyB;AAAA,EACpC,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI;AAAA,IACF,YAAY;AAAA,IACZ,UAAU;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA,CAAC,iBAAiB,8CAA8C;AAAA,IAClE;AAAA,IACA,CAAC,aAAa,CAAC,aAAa,qBAAqB,CAAC;AAAA,IAClD,CAAC,aAAa,CAAC,oBAAoB,CAAC;AAAA,EACtC;AACF;AAEO,IAAM,iBAAmC;AAAA,EAC9C,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,kBAAkB,EAAE,WAAW,WAAW,CAAC;AAAA,EACxD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,KAAK;AAAA,QACH;AAAA,UACE,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,cACE,WAAW,CAAC,eACV,sBAAS,MAAM,KAAK,OAAO,WAAW;AAAA,cACxC,KAAK;AAAA,gBACH,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU,EAAE,OAAO,EAAE;AAAA,gBACrB,SAAS,EAAE,KAAK,aAAa;AAAA,gBAC7B,kBAAkB;AAAA,kBAChB,KAAK;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,KAAK;AAAA,YACH,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,QACA;AAAA,UACE,KAAK;AAAA,YACH,cAAc,EAAE,OAAO,MAAM;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,kBAAkB,EAAE,GAAG,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,kBAAkB,EAAE,GAAG,WAAW;AAAA,QACpC;AAAA,MACF;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MACA,EAAE,cAAc,MAAM;AAAA,IACxB;AAAA,EACF;AACF;AAEO,IAAM,qBAAuC;AAAA,EAClD,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,eAAe,EAAE,WAAW,WAAW,CAAC;AAAA,EACrD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,KAAK;AAAA,QACH;AAAA,UACE,KAAK;AAAA,YACH;AAAA,cACE,KAAK;AAAA,gBACH,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU,EAAE,OAAO,EAAE;AAAA,gBACrB,SAAS,EAAE,KAAK,aAAa;AAAA,gBAC7B,kBAAkB;AAAA,kBAChB,KAAK;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,KAAK;AAAA,YACH,cAAc,EAAE,OAAO,MAAM;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,kBAAkB,EAAE,GAAG,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,EAAE,cAAc,MAAM;AAAA,IACxB;AAAA,EACF;AACF;AAEO,IAAM,oBAAsC;AAAA,EACjD,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,gBAAgB,EAAE,WAAW,WAAW,CAAC;AAAA,EACtD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,KAAK;AAAA,QACH;AAAA,UACE,KAAK;AAAA,YACH;AAAA,cACE,KAAK;AAAA,gBACH,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU,EAAE,OAAO,EAAE;AAAA,gBACrB,SAAS,EAAE,KAAK,aAAa;AAAA,gBAC7B,kBAAkB;AAAA,kBAChB,KAAK;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,KAAK;AAAA,YACH,cAAc,EAAE,OAAO,MAAM;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,kBAAkB,EAAE,GAAG,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,EAAE,cAAc,MAAM;AAAA,IACxB;AAAA,EACF;AACF;AAEO,IAAM,aAA+B;AAAA,EAC1C,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,aAAa,EAAE,WAAW,WAAW,CAAC;AAAA,EACnD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,KAAK;AAAA,QACH;AAAA,UACE,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,cACE,WAAW,CAAC,eACV,sBAAS,MAAM,KAAK,OAAO,WAAW;AAAA,cACxC,KAAK;AAAA,gBACH,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU,EAAE,OAAO,EAAE;AAAA,gBACrB,SAAS,EAAE,KAAK,aAAa;AAAA,gBAC7B,kBAAkB;AAAA,kBAChB,KAAK;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,UACE,KAAK;AAAA,YACH,cAAc,EAAE,OAAO,MAAM;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,kBAAkB,EAAE,GAAG,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,cAAc,MAAM;AAAA,IACxB;AAAA,EACF;AACF;AAEO,IAAM,cAAgC;AAAA,EAC3C,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,qBAAqB,EAAE,WAAW,WAAW,CAAC;AAAA,EAC3D,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA,MAAM;AAAA,MACJ,KAAK,CAAC,aAAa,eAAe;AAAA,IACpC;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,cAAc,8BAA8B,MAAM;AAAA,IACnD,CAAC,aAAa,UAAU,MAAS;AAAA,EACnC;AACF;AAEO,IAAM,oBAAsC;AAAA,EACjD,OAAO;AAAA,EACP,aACE;AAAA,EACF,QAAI,sBAAS,aAAa,EAAE,WAAW,WAAW,CAAC;AAAA,EACnD,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,KAAK,CAAC,CAAC,iBAAiB,wBAAwB,CAAC;AACnD;","names":["import_dev","import_dev","init"]}
1
+ {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/hints.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\nexport { hints } from './hints';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\n// Types of record live in ../types; the zod types loosen through core's ValueSchema\nexport { SettingsSchema } from './settings';\nexport { MappingSchema } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { schemas, z } from '@walkeros/core/dev';\n\nconst { ValueSchema } = schemas;\n\nexport const CustomDimensionsSchema = z.record(\n z.string().regex(/^\\d+$/, 'Dimension keys are bare numeric ids like \"1\"'),\n ValueSchema,\n);\n\nexport const SettingsSchema = z.object({\n appId: z\n .string()\n .min(1)\n .describe(\n 'ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX). Required when loadScript is true',\n )\n .optional(),\n url: z\n .string()\n .url()\n .describe(\n 'URL of your Piwik PRO account, normalized to one trailing slash (like https://your_account_name.piwik.pro/). Required when loadScript is true',\n )\n .optional(),\n linkTracking: z\n .boolean()\n .default(true)\n .describe(\n 'Automatic outlink and download tracking, enabled right after the first hit this destination sends. Default: true',\n ),\n identified: z\n .union([z.boolean(), z.record(z.string(), z.boolean())])\n .describe(\n 'Identified or anonymous tracking. true (default) identifies every hit, false switches the tracker to anonymous mode without cookies (disableCookies, deleteCookies, setUserIsAnonymous) at init. A consent object like { marketing: true } identifies only while that consent is granted and calls enableCookies and deanonymizeUser once it is. Do not repeat these states in config.consent, or events are queued and never reach the destination.',\n )\n .optional(),\n customDimensions: CustomDimensionsSchema.describe(\n 'Custom dimensions applied to every hit, keyed by bare dimension id (like { \"1\": \"data.size\" }). Rule-level customDimensions win per key.',\n ).optional(),\n});\n","import { schemas, z } from '@walkeros/core/dev';\nimport { CustomDimensionsSchema } from './settings';\n\nexport const MappingSchema = z.object({\n goalId: z\n .union([z.string(), z.number()])\n .describe(\n 'Piwik PRO goal id (UUID or legacy integer). Adds a second hit, trackGoal.',\n )\n .optional(),\n goalValue: schemas.ValueSchema.describe(\n 'Goal revenue, resolved from the event (like \"data.total\"), passed as the trackGoal conversion value',\n ).optional(),\n customDimensions: CustomDimensionsSchema.describe(\n 'Custom dimensions for this rule, keyed by bare dimension id (like { \"1\": \"data.size\" }). Wins per key over the destination customDimensions.',\n ).optional(),\n});\n","export * as env from './env';\nexport * as step from './step';\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 absent: init() is expected to install the queue.\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: [],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\n/**\n * Simulation tracking paths\n * Specifies which function calls to track during simulation\n */\nexport const simulation = [\n 'call:window._paq.push', // Track _paq.push calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent, isObject } from '@walkeros/core';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init loads the PiwikPro script and configures\n * the tracker URL and app id. Link tracking follows the first hit instead\n * (see `linkTrackingAfterFirstHit`). Reproduce by passing the same settings to\n * `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.',\n in: {\n loadScript: true,\n settings: {\n appId: 'XXX-XXX-XXX-XXX-XXX',\n url: 'https://your_account_name.piwik.pro/',\n },\n },\n out: [\n [\n '_paq.push',\n ['setTrackerUrl', 'https://your_account_name.piwik.pro/ppms.php'],\n ],\n ['_paq.push', ['setSiteId', 'XXX-XXX-XXX-XXX-XXX']],\n ],\n};\n\n/**\n * Runs with the default settings (linkTracking on). The other event examples\n * run with `linkTracking: false`, so their `out` holds only their own commands.\n */\nexport const linkTrackingAfterFirstHit: Flow.StepExample = {\n title: 'Link tracking after the first hit',\n description:\n 'With the default linkTracking setting, the first hit is followed by enableLinkTracking for automatic outlink and download tracking.',\n in: getEvent('page view', { timestamp: 1700000312 }),\n out: [['trackPageView', 'walkerOS documentation'], ['enableLinkTracking']],\n};\n\nexport const ecommerceOrder: Flow.StepExample = {\n title: 'Ecommerce order',\n description:\n 'A completed order calls Piwik PRO ecommerceOrder with line items and order totals.',\n in: getEvent('order complete', { timestamp: 1700000300 }),\n mapping: {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\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 },\n },\n out: [\n [\n 'ecommerceOrder',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n {\n sku: 'cc',\n name: 'Cool Cap',\n price: 42,\n quantity: 1,\n customDimensions: { 1: 'one size' },\n },\n ],\n {\n orderId: '0rd3r1d',\n grandTotal: 555,\n tax: 73.76,\n shipping: 5.22,\n },\n ],\n ],\n};\n\nexport const ecommerceAddToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires Piwik PRO ecommerceAddToCart with the added item.',\n in: getEvent('product add', { timestamp: 1700000301 }),\n mapping: {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceAddToCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n ],\n ],\n};\n\nexport const productDetailView: Flow.StepExample = {\n title: 'Product detail view',\n description:\n 'A product view fires Piwik PRO ecommerceProductDetailView with a single-item array.',\n in: getEvent('product view', { timestamp: 1700000302 }),\n mapping: {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceProductDetailView',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n ],\n ],\n};\n\nexport const cartUpdate: Flow.StepExample = {\n title: 'Cart update',\n description:\n 'A cart view fires Piwik PRO ecommerceCartUpdate with nested products and the cart total.',\n in: getEvent('cart view', { timestamp: 1700000303 }),\n mapping: {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\n ],\n },\n 'data.value',\n ],\n },\n },\n out: [\n [\n 'ecommerceCartUpdate',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n 840,\n ],\n ],\n};\n\nexport const customEvent: Flow.StepExample = {\n title: 'Custom event with goal',\n description:\n 'A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.',\n in: getEvent('promotion visible', { timestamp: 1700000304 }),\n mapping: {\n name: 'trackEvent',\n settings: {\n goalId: 'goal_1',\n },\n data: {\n set: ['data.name', 'data.position'],\n },\n },\n out: [\n ['trackEvent', 'Setting up tracking easily', 'hero'],\n ['trackGoal', 'goal_1'],\n ],\n};\n\nexport const pageViewWithTitle: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view fires Piwik PRO trackPageView with the page title resolved from event data.',\n in: getEvent('page view', { timestamp: 1700000305 }),\n mapping: {\n data: 'data.title',\n },\n out: [['trackPageView', 'walkerOS documentation']],\n};\n\nexport const pageViewWithGoal: Flow.StepExample = {\n title: 'Page view with goal',\n description:\n 'A page view rule with a goal keeps the default trackPageView and adds a trackGoal conversion.',\n in: getEvent('page view', { timestamp: 1700000306 }),\n mapping: {\n settings: {\n goalId: 'goal_1',\n },\n },\n out: [\n ['trackPageView', 'walkerOS documentation'],\n ['trackGoal', 'goal_1'],\n ],\n};\n\nexport const eventWithGoalValue: Flow.StepExample = {\n title: 'Event with goal value',\n description:\n 'An order complete fires Piwik PRO trackEvent and then trackGoal with the order total as the conversion value.',\n in: getEvent('order complete', { timestamp: 1700000307 }),\n mapping: {\n name: 'trackEvent',\n data: {\n set: [{ value: 'order' }, { value: 'complete' }, 'data.id'],\n },\n settings: {\n goalId: 'goal_1',\n goalValue: 'data.total',\n },\n },\n out: [\n ['trackEvent', 'order', 'complete', '0rd3r1d'],\n ['trackGoal', 'goal_1', 555],\n ],\n};\n\nexport const ecommerceRemoveFromCart: Flow.StepExample = {\n title: 'Remove from cart',\n description:\n 'A product remove fires Piwik PRO ecommerceRemoveFromCart with the removed item.',\n in: getEvent('product remove', {\n timestamp: 1700000308,\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n color: 'black',\n size: 'l',\n price: 420,\n },\n }),\n mapping: {\n name: 'ecommerceRemoveFromCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\n sku: 'data.id',\n name: 'data.name',\n price: 'data.price',\n quantity: { value: 1 },\n variant: { key: 'data.color' },\n },\n },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceRemoveFromCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n },\n ],\n ],\n ],\n};\n\nexport const siteSearch: Flow.StepExample = {\n title: 'Site search',\n description:\n 'A search submit fires Piwik PRO trackSiteSearch with the keyword, category, and result count.',\n in: getEvent('search submit', {\n timestamp: 1700000309,\n data: { query: 'rucksack', category: 'bags', results: 12 },\n }),\n mapping: {\n name: 'trackSiteSearch',\n data: {\n set: ['data.query', 'data.category', 'data.results'],\n },\n },\n out: [['trackSiteSearch', 'rucksack', 'bags', 12]],\n};\n\nexport const linkDownload: Flow.StepExample = {\n title: 'Download link',\n description:\n 'A file download fires Piwik PRO trackLink with the file URL and the download link type.',\n in: getEvent('file download', {\n timestamp: 1700000310,\n data: { url: 'https://www.example.com/whitepaper.pdf' },\n }),\n mapping: {\n name: 'trackLink',\n data: {\n set: ['data.url', { value: 'download' }],\n },\n },\n out: [['trackLink', 'https://www.example.com/whitepaper.pdf', 'download']],\n};\n\nexport const ping: Flow.StepExample = {\n title: 'Ping',\n description:\n 'A pulse-triggered event fires Piwik PRO ping to extend the time spent on the page.',\n in: getEvent('page ping', { timestamp: 1700000311, trigger: 'pulse' }),\n mapping: {\n name: 'ping',\n },\n out: [['ping']],\n};\n\nexport const customDimensionsEvent: Flow.StepExample = {\n title: 'Event with custom dimensions',\n description:\n 'A product add fires Piwik PRO trackEvent with rule-level custom dimensions as its dimensions argument, values percent-encoded.',\n in: getEvent('product add', { timestamp: 1700000313 }),\n mapping: {\n name: 'trackEvent',\n data: {\n set: ['entity', 'action', 'data.name', 'data.price'],\n },\n settings: {\n customDimensions: {\n 1: 'data.size',\n 2: 'data.name',\n },\n },\n },\n out: [\n [\n 'trackEvent',\n 'product',\n 'add',\n 'Everyday Ruck Snack',\n 420,\n { dimension1: 'l', dimension2: 'Everyday%20Ruck%20Snack' },\n ],\n ],\n};\n\nexport const customDimensionsPageView: Flow.StepExample = {\n title: 'Page view with custom dimensions',\n description:\n 'trackPageView has no dimensions argument, so rule-level custom dimensions are set right before the hit and deleted right after it.',\n in: getEvent('page view', { timestamp: 1700000314 }),\n mapping: {\n settings: {\n customDimensions: {\n 1: 'globals.pagegroup',\n },\n },\n },\n out: [\n ['setCustomDimensionValue', 1, 'docs'],\n ['trackPageView', 'walkerOS documentation'],\n ['deleteCustomDimension', 1],\n ],\n};\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'identified-consent': {\n text: 'settings.identified controls identified or anonymous tracking. Absent or true: identified, the Piwik PRO default. false: anonymous from init, without tracker cookies (disableCookies, deleteCookies, setUserIsAnonymous(true)). A consent object like { \"marketing\": true }: anonymous and cookieless until that consent is granted, then enableCookies and deanonymizeUser merge the anonymous session into the identified visitor. Keep config.consent for the states that gate tracking at all; do not repeat the identified states there, or events are queued and never reach the destination.',\n code: [\n {\n lang: 'json',\n code: '{ \"consent\": { \"analytics\": true }, \"settings\": { \"identified\": { \"marketing\": true } } }',\n },\n ],\n },\n 'custom-dimensions': {\n text: 'customDimensions maps bare dimension ids to Mapping Values, at destination level (every hit) and at rule level (wins per key); a dimensions object the mapping passes as the method argument wins over both. trackEvent, trackGoal, trackSiteSearch and trackLink get { \"dimension<id>\": value } as their dimensions argument, values percent-encoded. Every other portable method (trackPageView, the content and ecommerce methods, ping) is wrapped: setCustomDimensionValue before the hit, then rule-only dimensions are deleted and destination values set again, so rule values never leak into automatic hits such as outlinks. Requires Piwik PRO tracker 15.3 or later.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"customDimensions\": { \"1\": \"globals.pagegroup\" } }, \"mapping\": { \"product\": { \"add\": { \"name\": \"trackEvent\", \"data\": { \"set\": [\"entity\", \"action\", \"data.name\"] }, \"settings\": { \"customDimensions\": { \"2\": \"data.size\" } } } } } }',\n },\n ],\n },\n 'portable-methods': {\n text: 'rule.name is a Piwik PRO JS API method and data resolves to its positional arguments (an array built with set is spread). The 13 portable methods (trackPageView, trackEvent, trackGoal, trackSiteSearch, trackLink, trackContentImpression, trackContentInteraction, ecommerceProductDetailView, ecommerceAddToCart, ecommerceRemoveFromCart, ecommerceCartUpdate, ecommerceOrder, ping) copy unchanged to the server destination @walkeros/server-destination-piwikpro. Any other _paq command, such as setUserId, works on web by explicit name but is web-only.',\n code: [\n {\n lang: 'json',\n code: '{ \"order\": { \"complete\": { \"name\": \"trackEvent\", \"data\": { \"set\": [\"entity\", \"action\", \"data.id\"] }, \"settings\": { \"goalId\": \"goal-uuid\", \"goalValue\": \"data.total\" } } } }',\n },\n ],\n },\n 'unmapped-events': {\n text: 'An event without a rule name that is not a page view sends only its goal when the rule has settings.goalId, and is otherwise skipped with a warning (once per event name, then at debug level). A named rule with silent: true also sends only its goal. To keep other events out of the destination entirely, ignore everything with a wildcard and keep the page view explicitly.',\n code: [\n {\n lang: 'json',\n code: '{ \"mapping\": { \"*\": { \"*\": { \"ignore\": true } }, \"page\": { \"view\": {} } } }',\n },\n ],\n },\n};\n"],"mappings":"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","names":["import_dev","import_dev","init"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,a=(a,t)=>{for(var i in t)e(a,i,{get:t[i],enumerable:!0})},t={};a(t,{MappingSchema:()=>c,SettingsSchema:()=>o,mapping:()=>s,settings:()=>d});import{zodToSchema as i}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var o=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 n}from"@walkeros/core/dev";var c=n.object({goalId:n.string().describe("ID to count the event as a goal (like 1)"),goalValue:n.string().describe("Property to be used as the goal value (like data.value)").optional()}),d=i(o),s=i(c),p={};a(p,{env:()=>m,step:()=>v});var m={};a(m,{init:()=>u,push:()=>l,simulation:()=>k});var u={window:{},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},l={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},k=["call:window._paq.push"],v={};a(v,{cartUpdate:()=>R,customEvent:()=>b,ecommerceAddToCart:()=>h,ecommerceOrder:()=>X,init:()=>w,pageViewWithTitle:()=>C,productDetailView:()=>P});import{getEvent as y,isObject as g}from"@walkeros/core";var w={title:"Initialization",description:"Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.",in:{loadScript:!0,settings:{appId:"XXX-XXX-XXX-XXX-XXX",url:"https://your_account_name.piwik.pro/"}},out:[["_paq.push",["setTrackerUrl","https://your_account_name.piwik.pro/ppms.php"]],["_paq.push",["setSiteId","XXX-XXX-XXX-XXX-XXX"]],["_paq.push",["enableLinkTracking"]]]},X={title:"Ecommerce order",description:"A completed order calls Piwik PRO ecommerceOrder with line items, order totals, and currency code.",in:y("order complete",{timestamp:1700000300}),mapping:{name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>g(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceOrder",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}},{sku:"cc",name:"Cool Cap",price:42,quantity:1,variant:void 0,customDimensions:{1:"one size"}}],{orderId:"0rd3r1d",grandTotal:555,tax:73.76,shipping:5.22},{currencyCode:"EUR"}]]},h={title:"Add to cart",description:"A product add fires Piwik PRO ecommerceAddToCart with the added item and currency code.",in:y("product add",{timestamp:1700000301}),mapping:{name:"ecommerceAddToCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceAddToCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],{currencyCode:"EUR"}]]},P={title:"Product detail view",description:"A product view fires Piwik PRO ecommerceProductDetailView with a single-item array and currency code.",in:y("product view",{timestamp:1700000302}),mapping:{name:"ecommerceProductDetailView",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceProductDetailView",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],{currencyCode:"EUR"}]]},R={title:"Cart update",description:"A cart view fires Piwik PRO ecommerceCartUpdate with nested products, total value, and currency code.",in:y("cart view",{timestamp:1700000303}),mapping:{name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>g(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},"data.value",{map:{currencyCode:{value:"EUR"}}}]}},out:[["ecommerceCartUpdate",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],840,{currencyCode:"EUR"}]]},b={title:"Custom event with goal",description:"A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.",in:y("promotion visible",{timestamp:1700000304}),mapping:{name:"trackEvent",settings:{goalId:"goal_1"},data:{set:["data.name","data.position"]}},out:[["trackEvent","Setting up tracking easily","hero"],["trackGoal","goal_1",void 0]]},C={title:"Page view",description:"A page view fires Piwik PRO trackPageView with the page title resolved from event data.",in:y("page view",{timestamp:1700000305}),mapping:{data:"data.title"},out:[["trackPageView","walkerOS documentation"]]};export{p as examples,t as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,a)=>{for(var i in a)e(t,i,{get:a[i],enumerable:!0})},a={};t(a,{MappingSchema:()=>l,SettingsSchema:()=>d,mapping:()=>u,settings:()=>p});import{zodToSchema as i}from"@walkeros/core/dev";import{schemas as n,z as o}from"@walkeros/core/dev";var{ValueSchema:r}=n,s=o.record(o.string().regex(/^\d+$/,'Dimension keys are bare numeric ids like "1"'),r),d=o.object({appId:o.string().min(1).describe("ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX). Required when loadScript is true").optional(),url:o.string().url().describe("URL of your Piwik PRO account, normalized to one trailing slash (like https://your_account_name.piwik.pro/). Required when loadScript is true").optional(),linkTracking:o.boolean().default(!0).describe("Automatic outlink and download tracking, enabled right after the first hit this destination sends. Default: true"),identified:o.union([o.boolean(),o.record(o.string(),o.boolean())]).describe("Identified or anonymous tracking. true (default) identifies every hit, false switches the tracker to anonymous mode without cookies (disableCookies, deleteCookies, setUserIsAnonymous) at init. A consent object like { marketing: true } identifies only while that consent is granted and calls enableCookies and deanonymizeUser once it is. Do not repeat these states in config.consent, or events are queued and never reach the destination.").optional(),customDimensions:s.describe('Custom dimensions applied to every hit, keyed by bare dimension id (like { "1": "data.size" }). Rule-level customDimensions win per key.').optional()});import{schemas as c,z as m}from"@walkeros/core/dev";var l=m.object({goalId:m.union([m.string(),m.number()]).describe("Piwik PRO goal id (UUID or legacy integer). Adds a second hit, trackGoal.").optional(),goalValue:c.ValueSchema.describe('Goal revenue, resolved from the event (like "data.total"), passed as the trackGoal conversion value').optional(),customDimensions:s.describe('Custom dimensions for this rule, keyed by bare dimension id (like { "1": "data.size" }). Wins per key over the destination customDimensions.').optional()}),p=i(d),u=i(l),k={};t(k,{env:()=>g,step:()=>y});var g={};t(g,{init:()=>h,push:()=>v,simulation:()=>w});var h={window:{},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},v={window:{_paq:[]},document:{createElement:()=>({type:"",src:"",async:!1,defer:!1}),head:{appendChild:()=>{}}}},w=["call:window._paq.push"],y={};t(y,{cartUpdate:()=>C,customDimensionsEvent:()=>U,customDimensionsPageView:()=>x,customEvent:()=>A,ecommerceAddToCart:()=>D,ecommerceOrder:()=>R,ecommerceRemoveFromCart:()=>q,eventWithGoalValue:()=>V,init:()=>P,linkDownload:()=>_,linkTrackingAfterFirstHit:()=>X,pageViewWithGoal:()=>O,pageViewWithTitle:()=>E,ping:()=>T,productDetailView:()=>S,siteSearch:()=>I});import{getEvent as f,isObject as b}from"@walkeros/core";var P={title:"Initialization",description:"Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.",in:{loadScript:!0,settings:{appId:"XXX-XXX-XXX-XXX-XXX",url:"https://your_account_name.piwik.pro/"}},out:[["_paq.push",["setTrackerUrl","https://your_account_name.piwik.pro/ppms.php"]],["_paq.push",["setSiteId","XXX-XXX-XXX-XXX-XXX"]]]},X={title:"Link tracking after the first hit",description:"With the default linkTracking setting, the first hit is followed by enableLinkTracking for automatic outlink and download tracking.",in:f("page view",{timestamp:1700000312}),out:[["trackPageView","walkerOS documentation"],["enableLinkTracking"]]},R={title:"Ecommerce order",description:"A completed order calls Piwik PRO ecommerceOrder with line items and order totals.",in:f("order complete",{timestamp:1700000300}),mapping:{name:"ecommerceOrder",data:{set:[{loop:["nested",{condition:e=>b(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},{map:{orderId:"data.id",grandTotal:"data.total",tax:"data.taxes",shipping:"data.shipping"}}]}},out:[["ecommerceOrder",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}},{sku:"cc",name:"Cool Cap",price:42,quantity:1,customDimensions:{1:"one size"}}],{orderId:"0rd3r1d",grandTotal:555,tax:73.76,shipping:5.22}]]},D={title:"Add to cart",description:"A product add fires Piwik PRO ecommerceAddToCart with the added item.",in:f("product add",{timestamp:1700000301}),mapping:{name:"ecommerceAddToCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]}]}},out:[["ecommerceAddToCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}]]]},S={title:"Product detail view",description:"A product view fires Piwik PRO ecommerceProductDetailView with a single-item array.",in:f("product view",{timestamp:1700000302}),mapping:{name:"ecommerceProductDetailView",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]}]}},out:[["ecommerceProductDetailView",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}]]]},C={title:"Cart update",description:"A cart view fires Piwik PRO ecommerceCartUpdate with nested products and the cart total.",in:f("cart view",{timestamp:1700000303}),mapping:{name:"ecommerceCartUpdate",data:{set:[{loop:["nested",{condition:e=>b(e)&&"product"===e.entity,map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"},customDimensions:{map:{1:"data.size"}}}}]},"data.value"]}},out:[["ecommerceCartUpdate",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black",customDimensions:{1:"l"}}],840]]},A={title:"Custom event with goal",description:"A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.",in:f("promotion visible",{timestamp:1700000304}),mapping:{name:"trackEvent",settings:{goalId:"goal_1"},data:{set:["data.name","data.position"]}},out:[["trackEvent","Setting up tracking easily","hero"],["trackGoal","goal_1"]]},E={title:"Page view",description:"A page view fires Piwik PRO trackPageView with the page title resolved from event data.",in:f("page view",{timestamp:1700000305}),mapping:{data:"data.title"},out:[["trackPageView","walkerOS documentation"]]},O={title:"Page view with goal",description:"A page view rule with a goal keeps the default trackPageView and adds a trackGoal conversion.",in:f("page view",{timestamp:1700000306}),mapping:{settings:{goalId:"goal_1"}},out:[["trackPageView","walkerOS documentation"],["trackGoal","goal_1"]]},V={title:"Event with goal value",description:"An order complete fires Piwik PRO trackEvent and then trackGoal with the order total as the conversion value.",in:f("order complete",{timestamp:1700000307}),mapping:{name:"trackEvent",data:{set:[{value:"order"},{value:"complete"},"data.id"]},settings:{goalId:"goal_1",goalValue:"data.total"}},out:[["trackEvent","order","complete","0rd3r1d"],["trackGoal","goal_1",555]]},q={title:"Remove from cart",description:"A product remove fires Piwik PRO ecommerceRemoveFromCart with the removed item.",in:f("product remove",{timestamp:1700000308,data:{id:"ers",name:"Everyday Ruck Snack",color:"black",size:"l",price:420}}),mapping:{name:"ecommerceRemoveFromCart",data:{set:[{set:[{map:{sku:"data.id",name:"data.name",price:"data.price",quantity:{value:1},variant:{key:"data.color"}}}]}]}},out:[["ecommerceRemoveFromCart",[{sku:"ers",name:"Everyday Ruck Snack",price:420,quantity:1,variant:"black"}]]]},I={title:"Site search",description:"A search submit fires Piwik PRO trackSiteSearch with the keyword, category, and result count.",in:f("search submit",{timestamp:1700000309,data:{query:"rucksack",category:"bags",results:12}}),mapping:{name:"trackSiteSearch",data:{set:["data.query","data.category","data.results"]}},out:[["trackSiteSearch","rucksack","bags",12]]},_={title:"Download link",description:"A file download fires Piwik PRO trackLink with the file URL and the download link type.",in:f("file download",{timestamp:1700000310,data:{url:"https://www.example.com/whitepaper.pdf"}}),mapping:{name:"trackLink",data:{set:["data.url",{value:"download"}]}},out:[["trackLink","https://www.example.com/whitepaper.pdf","download"]]},T={title:"Ping",description:"A pulse-triggered event fires Piwik PRO ping to extend the time spent on the page.",in:f("page ping",{timestamp:1700000311,trigger:"pulse"}),mapping:{name:"ping"},out:[["ping"]]},U={title:"Event with custom dimensions",description:"A product add fires Piwik PRO trackEvent with rule-level custom dimensions as its dimensions argument, values percent-encoded.",in:f("product add",{timestamp:1700000313}),mapping:{name:"trackEvent",data:{set:["entity","action","data.name","data.price"]},settings:{customDimensions:{1:"data.size",2:"data.name"}}},out:[["trackEvent","product","add","Everyday Ruck Snack",420,{dimension1:"l",dimension2:"Everyday%20Ruck%20Snack"}]]},x={title:"Page view with custom dimensions",description:"trackPageView has no dimensions argument, so rule-level custom dimensions are set right before the hit and deleted right after it.",in:f("page view",{timestamp:1700000314}),mapping:{settings:{customDimensions:{1:"globals.pagegroup"}}},out:[["setCustomDimensionValue",1,"docs"],["trackPageView","walkerOS documentation"],["deleteCustomDimension",1]]},z={"identified-consent":{text:'settings.identified controls identified or anonymous tracking. Absent or true: identified, the Piwik PRO default. false: anonymous from init, without tracker cookies (disableCookies, deleteCookies, setUserIsAnonymous(true)). A consent object like { "marketing": true }: anonymous and cookieless until that consent is granted, then enableCookies and deanonymizeUser merge the anonymous session into the identified visitor. Keep config.consent for the states that gate tracking at all; do not repeat the identified states there, or events are queued and never reach the destination.',code:[{lang:"json",code:'{ "consent": { "analytics": true }, "settings": { "identified": { "marketing": true } } }'}]},"custom-dimensions":{text:'customDimensions maps bare dimension ids to Mapping Values, at destination level (every hit) and at rule level (wins per key); a dimensions object the mapping passes as the method argument wins over both. trackEvent, trackGoal, trackSiteSearch and trackLink get { "dimension<id>": value } as their dimensions argument, values percent-encoded. Every other portable method (trackPageView, the content and ecommerce methods, ping) is wrapped: setCustomDimensionValue before the hit, then rule-only dimensions are deleted and destination values set again, so rule values never leak into automatic hits such as outlinks. Requires Piwik PRO tracker 15.3 or later.',code:[{lang:"json",code:'{ "settings": { "customDimensions": { "1": "globals.pagegroup" } }, "mapping": { "product": { "add": { "name": "trackEvent", "data": { "set": ["entity", "action", "data.name"] }, "settings": { "customDimensions": { "2": "data.size" } } } } } }'}]},"portable-methods":{text:"rule.name is a Piwik PRO JS API method and data resolves to its positional arguments (an array built with set is spread). The 13 portable methods (trackPageView, trackEvent, trackGoal, trackSiteSearch, trackLink, trackContentImpression, trackContentInteraction, ecommerceProductDetailView, ecommerceAddToCart, ecommerceRemoveFromCart, ecommerceCartUpdate, ecommerceOrder, ping) copy unchanged to the server destination @walkeros/server-destination-piwikpro. Any other _paq command, such as setUserId, works on web by explicit name but is web-only.",code:[{lang:"json",code:'{ "order": { "complete": { "name": "trackEvent", "data": { "set": ["entity", "action", "data.id"] }, "settings": { "goalId": "goal-uuid", "goalValue": "data.total" } } } }'}]},"unmapped-events":{text:"An event without a rule name that is not a page view sends only its goal when the rule has settings.goalId, and is otherwise skipped with a warning (once per event name, then at debug level). A named rule with silent: true also sends only its goal. To keep other events out of the destination entirely, ignore everything with a wildcard and keep the page view explicitly.",code:[{lang:"json",code:'{ "mapping": { "*": { "*": { "ignore": true } }, "page": { "view": {} } } }'}]}};export{k as examples,z as hints,a as schemas};//# sourceMappingURL=dev.mjs.map
package/dist/dev.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\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 absent: init() is expected to install the queue.\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: [],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\n/**\n * Simulation tracking paths\n * Specifies which function calls to track during simulation\n */\nexport const simulation = [\n 'call:window._paq.push', // Track _paq.push calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent, isObject } from '@walkeros/core';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init loads the PiwikPro script and configures\n * the tracker URL, app id, and link tracking. Reproduce by passing the same\n * settings to `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.',\n in: {\n loadScript: true,\n settings: {\n appId: 'XXX-XXX-XXX-XXX-XXX',\n url: 'https://your_account_name.piwik.pro/',\n },\n },\n out: [\n [\n '_paq.push',\n ['setTrackerUrl', 'https://your_account_name.piwik.pro/ppms.php'],\n ],\n ['_paq.push', ['setSiteId', 'XXX-XXX-XXX-XXX-XXX']],\n ['_paq.push', ['enableLinkTracking']],\n ],\n};\n\nexport const ecommerceOrder: Flow.StepExample = {\n title: 'Ecommerce order',\n description:\n 'A completed order calls Piwik PRO ecommerceOrder with line items, order totals, and currency code.',\n in: getEvent('order complete', { timestamp: 1700000300 }),\n mapping: {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\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 out: [\n [\n 'ecommerceOrder',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n {\n sku: 'cc',\n name: 'Cool Cap',\n price: 42,\n quantity: 1,\n variant: undefined,\n customDimensions: { 1: 'one size' },\n },\n ],\n {\n orderId: '0rd3r1d',\n grandTotal: 555,\n tax: 73.76,\n shipping: 5.22,\n },\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const ecommerceAddToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires Piwik PRO ecommerceAddToCart with the added item and currency code.',\n in: getEvent('product add', { timestamp: 1700000301 }),\n mapping: {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceAddToCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const productDetailView: Flow.StepExample = {\n title: 'Product detail view',\n description:\n 'A product view fires Piwik PRO ecommerceProductDetailView with a single-item array and currency code.',\n in: getEvent('product view', { timestamp: 1700000302 }),\n mapping: {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceProductDetailView',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const cartUpdate: Flow.StepExample = {\n title: 'Cart update',\n description:\n 'A cart view fires Piwik PRO ecommerceCartUpdate with nested products, total value, and currency code.',\n in: getEvent('cart view', { timestamp: 1700000303 }),\n mapping: {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\n ],\n },\n 'data.value',\n {\n map: {\n currencyCode: { value: 'EUR' },\n },\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceCartUpdate',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n 840,\n { currencyCode: 'EUR' },\n ],\n ],\n};\n\nexport const customEvent: Flow.StepExample = {\n title: 'Custom event with goal',\n description:\n 'A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.',\n in: getEvent('promotion visible', { timestamp: 1700000304 }),\n mapping: {\n name: 'trackEvent',\n settings: {\n goalId: 'goal_1',\n },\n data: {\n set: ['data.name', 'data.position'],\n },\n },\n out: [\n ['trackEvent', 'Setting up tracking easily', 'hero'],\n ['trackGoal', 'goal_1', undefined],\n ],\n};\n\nexport const pageViewWithTitle: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view fires Piwik PRO trackPageView with the page title resolved from event data.',\n in: getEvent('page view', { timestamp: 1700000305 }),\n mapping: {\n data: 'data.title',\n },\n out: [['trackPageView', 'walkerOS documentation']],\n};\n"],"mappings":"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","names":["z","init"]}
1
+ {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/hints.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\n// Types of record live in ../types; the zod types loosen through core's ValueSchema\nexport { SettingsSchema } from './settings';\nexport { MappingSchema } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { schemas, z } from '@walkeros/core/dev';\n\nconst { ValueSchema } = schemas;\n\nexport const CustomDimensionsSchema = z.record(\n z.string().regex(/^\\d+$/, 'Dimension keys are bare numeric ids like \"1\"'),\n ValueSchema,\n);\n\nexport const SettingsSchema = z.object({\n appId: z\n .string()\n .min(1)\n .describe(\n 'ID of the Piwik PRO site (like XXX-XXX-XXX-XXX-XXX). Required when loadScript is true',\n )\n .optional(),\n url: z\n .string()\n .url()\n .describe(\n 'URL of your Piwik PRO account, normalized to one trailing slash (like https://your_account_name.piwik.pro/). Required when loadScript is true',\n )\n .optional(),\n linkTracking: z\n .boolean()\n .default(true)\n .describe(\n 'Automatic outlink and download tracking, enabled right after the first hit this destination sends. Default: true',\n ),\n identified: z\n .union([z.boolean(), z.record(z.string(), z.boolean())])\n .describe(\n 'Identified or anonymous tracking. true (default) identifies every hit, false switches the tracker to anonymous mode without cookies (disableCookies, deleteCookies, setUserIsAnonymous) at init. A consent object like { marketing: true } identifies only while that consent is granted and calls enableCookies and deanonymizeUser once it is. Do not repeat these states in config.consent, or events are queued and never reach the destination.',\n )\n .optional(),\n customDimensions: CustomDimensionsSchema.describe(\n 'Custom dimensions applied to every hit, keyed by bare dimension id (like { \"1\": \"data.size\" }). Rule-level customDimensions win per key.',\n ).optional(),\n});\n","import { schemas, z } from '@walkeros/core/dev';\nimport { CustomDimensionsSchema } from './settings';\n\nexport const MappingSchema = z.object({\n goalId: z\n .union([z.string(), z.number()])\n .describe(\n 'Piwik PRO goal id (UUID or legacy integer). Adds a second hit, trackGoal.',\n )\n .optional(),\n goalValue: schemas.ValueSchema.describe(\n 'Goal revenue, resolved from the event (like \"data.total\"), passed as the trackGoal conversion value',\n ).optional(),\n customDimensions: CustomDimensionsSchema.describe(\n 'Custom dimensions for this rule, keyed by bare dimension id (like { \"1\": \"data.size\" }). Wins per key over the destination customDimensions.',\n ).optional(),\n});\n","export * as env from './env';\nexport * as step from './step';\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 absent: init() is expected to install the queue.\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: [],\n },\n document: {\n createElement: () => ({\n type: '',\n src: '',\n async: false,\n defer: false,\n }),\n head: { appendChild: () => {} },\n },\n};\n\n/**\n * Simulation tracking paths\n * Specifies which function calls to track during simulation\n */\nexport const simulation = [\n 'call:window._paq.push', // Track _paq.push calls\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent, isObject } from '@walkeros/core';\n\n/**\n * Destination bootstrap.\n * Given the canonical settings, init loads the PiwikPro script and configures\n * the tracker URL and app id. Link tracking follows the first hit instead\n * (see `linkTrackingAfterFirstHit`). Reproduce by passing the same settings to\n * `startFlow` as the destination config.\n */\nexport const init: Flow.StepExample = {\n title: 'Initialization',\n description:\n 'Destination bootstrap loads the Piwik PRO tracker and configures the tracker URL and app id.',\n in: {\n loadScript: true,\n settings: {\n appId: 'XXX-XXX-XXX-XXX-XXX',\n url: 'https://your_account_name.piwik.pro/',\n },\n },\n out: [\n [\n '_paq.push',\n ['setTrackerUrl', 'https://your_account_name.piwik.pro/ppms.php'],\n ],\n ['_paq.push', ['setSiteId', 'XXX-XXX-XXX-XXX-XXX']],\n ],\n};\n\n/**\n * Runs with the default settings (linkTracking on). The other event examples\n * run with `linkTracking: false`, so their `out` holds only their own commands.\n */\nexport const linkTrackingAfterFirstHit: Flow.StepExample = {\n title: 'Link tracking after the first hit',\n description:\n 'With the default linkTracking setting, the first hit is followed by enableLinkTracking for automatic outlink and download tracking.',\n in: getEvent('page view', { timestamp: 1700000312 }),\n out: [['trackPageView', 'walkerOS documentation'], ['enableLinkTracking']],\n};\n\nexport const ecommerceOrder: Flow.StepExample = {\n title: 'Ecommerce order',\n description:\n 'A completed order calls Piwik PRO ecommerceOrder with line items and order totals.',\n in: getEvent('order complete', { timestamp: 1700000300 }),\n mapping: {\n name: 'ecommerceOrder',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\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 },\n },\n out: [\n [\n 'ecommerceOrder',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n {\n sku: 'cc',\n name: 'Cool Cap',\n price: 42,\n quantity: 1,\n customDimensions: { 1: 'one size' },\n },\n ],\n {\n orderId: '0rd3r1d',\n grandTotal: 555,\n tax: 73.76,\n shipping: 5.22,\n },\n ],\n ],\n};\n\nexport const ecommerceAddToCart: Flow.StepExample = {\n title: 'Add to cart',\n description:\n 'A product add fires Piwik PRO ecommerceAddToCart with the added item.',\n in: getEvent('product add', { timestamp: 1700000301 }),\n mapping: {\n name: 'ecommerceAddToCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceAddToCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n ],\n ],\n};\n\nexport const productDetailView: Flow.StepExample = {\n title: 'Product detail view',\n description:\n 'A product view fires Piwik PRO ecommerceProductDetailView with a single-item array.',\n in: getEvent('product view', { timestamp: 1700000302 }),\n mapping: {\n name: 'ecommerceProductDetailView',\n data: {\n set: [\n {\n set: [\n {\n map: {\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 },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceProductDetailView',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n ],\n ],\n};\n\nexport const cartUpdate: Flow.StepExample = {\n title: 'Cart update',\n description:\n 'A cart view fires Piwik PRO ecommerceCartUpdate with nested products and the cart total.',\n in: getEvent('cart view', { timestamp: 1700000303 }),\n mapping: {\n name: 'ecommerceCartUpdate',\n data: {\n set: [\n {\n loop: [\n 'nested',\n {\n condition: (entity: unknown) =>\n isObject(entity) && entity.entity === 'product',\n map: {\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 },\n ],\n },\n 'data.value',\n ],\n },\n },\n out: [\n [\n 'ecommerceCartUpdate',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n customDimensions: { 1: 'l' },\n },\n ],\n 840,\n ],\n ],\n};\n\nexport const customEvent: Flow.StepExample = {\n title: 'Custom event with goal',\n description:\n 'A promotion visible event fires Piwik PRO trackEvent and then trackGoal to record a goal conversion.',\n in: getEvent('promotion visible', { timestamp: 1700000304 }),\n mapping: {\n name: 'trackEvent',\n settings: {\n goalId: 'goal_1',\n },\n data: {\n set: ['data.name', 'data.position'],\n },\n },\n out: [\n ['trackEvent', 'Setting up tracking easily', 'hero'],\n ['trackGoal', 'goal_1'],\n ],\n};\n\nexport const pageViewWithTitle: Flow.StepExample = {\n title: 'Page view',\n description:\n 'A page view fires Piwik PRO trackPageView with the page title resolved from event data.',\n in: getEvent('page view', { timestamp: 1700000305 }),\n mapping: {\n data: 'data.title',\n },\n out: [['trackPageView', 'walkerOS documentation']],\n};\n\nexport const pageViewWithGoal: Flow.StepExample = {\n title: 'Page view with goal',\n description:\n 'A page view rule with a goal keeps the default trackPageView and adds a trackGoal conversion.',\n in: getEvent('page view', { timestamp: 1700000306 }),\n mapping: {\n settings: {\n goalId: 'goal_1',\n },\n },\n out: [\n ['trackPageView', 'walkerOS documentation'],\n ['trackGoal', 'goal_1'],\n ],\n};\n\nexport const eventWithGoalValue: Flow.StepExample = {\n title: 'Event with goal value',\n description:\n 'An order complete fires Piwik PRO trackEvent and then trackGoal with the order total as the conversion value.',\n in: getEvent('order complete', { timestamp: 1700000307 }),\n mapping: {\n name: 'trackEvent',\n data: {\n set: [{ value: 'order' }, { value: 'complete' }, 'data.id'],\n },\n settings: {\n goalId: 'goal_1',\n goalValue: 'data.total',\n },\n },\n out: [\n ['trackEvent', 'order', 'complete', '0rd3r1d'],\n ['trackGoal', 'goal_1', 555],\n ],\n};\n\nexport const ecommerceRemoveFromCart: Flow.StepExample = {\n title: 'Remove from cart',\n description:\n 'A product remove fires Piwik PRO ecommerceRemoveFromCart with the removed item.',\n in: getEvent('product remove', {\n timestamp: 1700000308,\n data: {\n id: 'ers',\n name: 'Everyday Ruck Snack',\n color: 'black',\n size: 'l',\n price: 420,\n },\n }),\n mapping: {\n name: 'ecommerceRemoveFromCart',\n data: {\n set: [\n {\n set: [\n {\n map: {\n sku: 'data.id',\n name: 'data.name',\n price: 'data.price',\n quantity: { value: 1 },\n variant: { key: 'data.color' },\n },\n },\n ],\n },\n ],\n },\n },\n out: [\n [\n 'ecommerceRemoveFromCart',\n [\n {\n sku: 'ers',\n name: 'Everyday Ruck Snack',\n price: 420,\n quantity: 1,\n variant: 'black',\n },\n ],\n ],\n ],\n};\n\nexport const siteSearch: Flow.StepExample = {\n title: 'Site search',\n description:\n 'A search submit fires Piwik PRO trackSiteSearch with the keyword, category, and result count.',\n in: getEvent('search submit', {\n timestamp: 1700000309,\n data: { query: 'rucksack', category: 'bags', results: 12 },\n }),\n mapping: {\n name: 'trackSiteSearch',\n data: {\n set: ['data.query', 'data.category', 'data.results'],\n },\n },\n out: [['trackSiteSearch', 'rucksack', 'bags', 12]],\n};\n\nexport const linkDownload: Flow.StepExample = {\n title: 'Download link',\n description:\n 'A file download fires Piwik PRO trackLink with the file URL and the download link type.',\n in: getEvent('file download', {\n timestamp: 1700000310,\n data: { url: 'https://www.example.com/whitepaper.pdf' },\n }),\n mapping: {\n name: 'trackLink',\n data: {\n set: ['data.url', { value: 'download' }],\n },\n },\n out: [['trackLink', 'https://www.example.com/whitepaper.pdf', 'download']],\n};\n\nexport const ping: Flow.StepExample = {\n title: 'Ping',\n description:\n 'A pulse-triggered event fires Piwik PRO ping to extend the time spent on the page.',\n in: getEvent('page ping', { timestamp: 1700000311, trigger: 'pulse' }),\n mapping: {\n name: 'ping',\n },\n out: [['ping']],\n};\n\nexport const customDimensionsEvent: Flow.StepExample = {\n title: 'Event with custom dimensions',\n description:\n 'A product add fires Piwik PRO trackEvent with rule-level custom dimensions as its dimensions argument, values percent-encoded.',\n in: getEvent('product add', { timestamp: 1700000313 }),\n mapping: {\n name: 'trackEvent',\n data: {\n set: ['entity', 'action', 'data.name', 'data.price'],\n },\n settings: {\n customDimensions: {\n 1: 'data.size',\n 2: 'data.name',\n },\n },\n },\n out: [\n [\n 'trackEvent',\n 'product',\n 'add',\n 'Everyday Ruck Snack',\n 420,\n { dimension1: 'l', dimension2: 'Everyday%20Ruck%20Snack' },\n ],\n ],\n};\n\nexport const customDimensionsPageView: Flow.StepExample = {\n title: 'Page view with custom dimensions',\n description:\n 'trackPageView has no dimensions argument, so rule-level custom dimensions are set right before the hit and deleted right after it.',\n in: getEvent('page view', { timestamp: 1700000314 }),\n mapping: {\n settings: {\n customDimensions: {\n 1: 'globals.pagegroup',\n },\n },\n },\n out: [\n ['setCustomDimensionValue', 1, 'docs'],\n ['trackPageView', 'walkerOS documentation'],\n ['deleteCustomDimension', 1],\n ],\n};\n","import type { Hint } from '@walkeros/core';\n\nexport const hints: Hint.Hints = {\n 'identified-consent': {\n text: 'settings.identified controls identified or anonymous tracking. Absent or true: identified, the Piwik PRO default. false: anonymous from init, without tracker cookies (disableCookies, deleteCookies, setUserIsAnonymous(true)). A consent object like { \"marketing\": true }: anonymous and cookieless until that consent is granted, then enableCookies and deanonymizeUser merge the anonymous session into the identified visitor. Keep config.consent for the states that gate tracking at all; do not repeat the identified states there, or events are queued and never reach the destination.',\n code: [\n {\n lang: 'json',\n code: '{ \"consent\": { \"analytics\": true }, \"settings\": { \"identified\": { \"marketing\": true } } }',\n },\n ],\n },\n 'custom-dimensions': {\n text: 'customDimensions maps bare dimension ids to Mapping Values, at destination level (every hit) and at rule level (wins per key); a dimensions object the mapping passes as the method argument wins over both. trackEvent, trackGoal, trackSiteSearch and trackLink get { \"dimension<id>\": value } as their dimensions argument, values percent-encoded. Every other portable method (trackPageView, the content and ecommerce methods, ping) is wrapped: setCustomDimensionValue before the hit, then rule-only dimensions are deleted and destination values set again, so rule values never leak into automatic hits such as outlinks. Requires Piwik PRO tracker 15.3 or later.',\n code: [\n {\n lang: 'json',\n code: '{ \"settings\": { \"customDimensions\": { \"1\": \"globals.pagegroup\" } }, \"mapping\": { \"product\": { \"add\": { \"name\": \"trackEvent\", \"data\": { \"set\": [\"entity\", \"action\", \"data.name\"] }, \"settings\": { \"customDimensions\": { \"2\": \"data.size\" } } } } } }',\n },\n ],\n },\n 'portable-methods': {\n text: 'rule.name is a Piwik PRO JS API method and data resolves to its positional arguments (an array built with set is spread). The 13 portable methods (trackPageView, trackEvent, trackGoal, trackSiteSearch, trackLink, trackContentImpression, trackContentInteraction, ecommerceProductDetailView, ecommerceAddToCart, ecommerceRemoveFromCart, ecommerceCartUpdate, ecommerceOrder, ping) copy unchanged to the server destination @walkeros/server-destination-piwikpro. Any other _paq command, such as setUserId, works on web by explicit name but is web-only.',\n code: [\n {\n lang: 'json',\n code: '{ \"order\": { \"complete\": { \"name\": \"trackEvent\", \"data\": { \"set\": [\"entity\", \"action\", \"data.id\"] }, \"settings\": { \"goalId\": \"goal-uuid\", \"goalValue\": \"data.total\" } } } }',\n },\n ],\n },\n 'unmapped-events': {\n text: 'An event without a rule name that is not a page view sends only its goal when the rule has settings.goalId, and is otherwise skipped with a warning (once per event name, then at debug level). A named rule with silent: true also sends only its goal. To keep other events out of the destination entirely, ignore everything with a wildcard and keep the page view explicitly.',\n code: [\n {\n lang: 'json',\n code: '{ \"mapping\": { \"*\": { \"*\": { \"ignore\": true } }, \"page\": { \"view\": {} } } }',\n },\n ],\n },\n};\n"],"mappings":"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","names":["schemas","z","z","schemas","init"]}