@walkeros/server-destination-mixpanel 4.7.0-next-1790245733116 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,24 +1,35 @@
1
1
  # @walkeros/server-destination-mixpanel
2
2
 
3
- ## 4.7.0-next-1790245733116
3
+ ## 4.7.0
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Updated dependencies [57788bc]
7
+ - 74821ed: Simulate records every vendor call through one recorder, `observeEnv`
8
+ from `@walkeros/core`, and runs offline: BigQuery, Data Manager and the
9
+ Sheets, GCS and S3 stores reach the network through `env`. Client and `Env`
10
+ types of BigQuery, Firehose, PostHog, SQS and Pub/Sub are structural.
11
+ `@walkeros/cli` exports `resolveExportName` and `selectDevExamples` and drops
12
+ `findExample` and `compareOutput`.
13
+ - Updated dependencies [74821ed]
8
14
  - Updated dependencies [06b498a]
9
- - Updated dependencies [f5a1cfd]
10
- - Updated dependencies [ef02916]
15
+ - Updated dependencies [74821ed]
16
+ - Updated dependencies [64b06de]
17
+ - Updated dependencies [4b4937f]
18
+ - Updated dependencies [74821ed]
19
+ - Updated dependencies [74821ed]
20
+ - Updated dependencies [74821ed]
11
21
  - Updated dependencies [06b498a]
12
- - Updated dependencies [ef02916]
13
- - Updated dependencies [2aebc53]
14
- - Updated dependencies [f5a1cfd]
15
- - Updated dependencies [f5a1cfd]
16
- - Updated dependencies [2aebc53]
17
- - Updated dependencies [8f8aea6]
18
- - Updated dependencies [2aebc53]
19
- - Updated dependencies [2aebc53]
20
- - @walkeros/core@4.7.0-next-1790245733116
21
- - @walkeros/server-core@4.7.0-next-1790245733116
22
+ - Updated dependencies [74821ed]
23
+ - Updated dependencies [74821ed]
24
+ - Updated dependencies [74821ed]
25
+ - Updated dependencies [74821ed]
26
+ - Updated dependencies [74821ed]
27
+ - Updated dependencies [e860006]
28
+ - Updated dependencies [74821ed]
29
+ - Updated dependencies [74821ed]
30
+ - Updated dependencies [4f89234]
31
+ - @walkeros/core@4.7.0
32
+ - @walkeros/server-core@4.7.0
22
33
 
23
34
  ## 4.6.1
24
35
 
package/dist/dev.d.mts CHANGED
@@ -109,7 +109,10 @@ interface Env extends DestinationServer.Env {
109
109
  * The test runner clones this and replaces methods with spies.
110
110
  */
111
111
  declare const push: Env;
112
- /** Simulation tracking paths for CLI --simulate. */
112
+ /**
113
+ * Simulation tracking paths for CLI --simulate. `init` carries the token and is
114
+ * not recorded; the paths walk through its result to the request calls.
115
+ */
113
116
  declare const simulation: string[];
114
117
 
115
118
  declare const env_push: typeof push;
package/dist/dev.d.ts CHANGED
@@ -109,7 +109,10 @@ interface Env extends DestinationServer.Env {
109
109
  * The test runner clones this and replaces methods with spies.
110
110
  */
111
111
  declare const push: Env;
112
- /** Simulation tracking paths for CLI --simulate. */
112
+ /**
113
+ * Simulation tracking paths for CLI --simulate. `init` carries the token and is
114
+ * not recorded; the paths walk through its result to the request calls.
115
+ */
113
116
  declare const simulation: string[];
114
117
 
115
118
  declare const env_push: typeof push;
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,o=(e,i)=>{for(var a in i)t(e,a,{get:i[a],enumerable:!0})},p={};o(p,{examples:()=>v,schemas:()=>s}),module.exports=(e=p,((e,o,p,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let r of a(o))n.call(e,r)||r===p||t(e,r,{get:()=>o[r],enumerable:!(s=i(o,r))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};o(s,{MappingSchema:()=>m,SettingsSchema:()=>d,mapping:()=>g,settings:()=>u});var r=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),d=l.z.object({apiKey:l.z.string().min(1).describe("Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init()."),secret:l.z.string().describe("API secret for the /import endpoint (historical data). Required when useImport is true.").optional(),host:l.z.string().describe("Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).").optional(),protocol:l.z.string().describe("Protocol for API requests. Default: 'https'.").optional(),keepAlive:l.z.boolean().describe("Reuse HTTP connections. Default: true.").optional(),geolocate:l.z.boolean().describe("Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.").optional(),debug:l.z.boolean().describe("Enable SDK debug logging. Default: false.").optional(),verbose:l.z.boolean().describe("Enable verbose request logging. Default: false.").optional(),test:l.z.boolean().describe("Enable dry-run mode. Default: false.").optional(),useImport:l.z.boolean().describe("Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.").optional(),identify:l.z.unknown().describe("walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.").optional(),include:l.z.unknown().describe("Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).").optional()}),c=require("@walkeros/core/dev"),m=c.z.object({identify:c.z.unknown().describe("Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.").optional(),people:c.z.unknown().describe("Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.").optional(),group:c.z.unknown().describe("Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.").optional(),groupProfile:c.z.unknown().describe("Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.").optional(),useImport:c.z.unknown().describe("Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.").optional()}),u=(0,r.zodToSchema)(d),g=(0,r.zodToSchema)(m),v={};o(v,{env:()=>_,step:()=>w});var _={};o(_,{push:()=>k,simulation:()=>h});var f=()=>{},y={set:f,set_once:f,increment:f,append:f,union:f,remove:f,unset:f,delete_user:f},b={set:f,set_once:f,union:f,remove:f,unset:f,delete_group:f};var k={Mixpanel:{init:function(){return{track:f,import:f,alias:f,people:{...y},groups:{...b}}}}},h=["call:Mixpanel.init","call:mp.track","call:mp.import","call:mp.alias","call:mp.people.set","call:mp.people.set_once","call:mp.people.increment","call:mp.people.append","call:mp.people.union","call:mp.people.remove","call:mp.people.unset","call:mp.people.delete_user","call:mp.groups.set","call:mp.groups.set_once","call:mp.groups.union","call:mp.groups.remove","call:mp.groups.unset","call:mp.groups.delete_group"],w={};o(w,{aliasBeforeTrack:()=>j,allPeopleOperations:()=>S,companyGroupProfile:()=>D,defaultEventForwarding:()=>P,historicalImport:()=>M,perEventIdentify:()=>z,trackWithGroup:()=>E,trackWithInclude:()=>x,userLoginPeopleSet:()=>A,wildcardIgnored:()=>q});var I=require("@walkeros/core"),P={title:"Default track",description:"A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.",in:(0,I.getEvent)("product view",{timestamp:1700000100}),settings:{identify:{map:{distinctId:"user.id"}}},out:[["mp.track","product view",{distinct_id:"us3r"}]]},x={title:"Track with include",description:"A destination-level include flattens the event data section into prefixed Mixpanel track properties.",in:(0,I.getEvent)("product view",{timestamp:1700000101}),settings:{identify:{map:{distinctId:"user.id"}}},configInclude:["data"],out:[["mp.track","product view",{distinct_id:"us3r",data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420}]]},z={title:"Per-event identify",description:"A mapping-level identify overrides the destination default to resolve the distinct_id from event data.",in:(0,I.getEvent)("user login",{timestamp:1700000102,data:{user_id:"resolved-id",plan:"premium"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id"}}}},out:[["mp.track","user login",{distinct_id:"resolved-id"}]]},E={title:"Track with group",description:"A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.",in:(0,I.getEvent)("page view",{timestamp:1700000103,data:{company_id:"acme"}}),settings:{identify:{map:{distinctId:"user.id"}}},mapping:{settings:{group:{map:{key:{value:"company_id"},id:"data.company_id"}}}},out:[["mp.track","page view",{distinct_id:"us3r",company_id:"acme"}]]},A={title:"User login people",description:"A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.",in:(0,I.getEvent)("user login",{timestamp:1700000104,data:{user_id:"new-user-123",plan:"premium",company:"Acme",email:"user@acme.com"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"data.user_id"}},people:{map:{set:{map:{plan:"data.plan",company:"data.company",email:"data.email"}},set_once:{map:{first_login:"timestamp"}},increment:{map:{login_count:{value:1}}}}}}},out:[["mp.people.set","new-user-123",{plan:"premium",company:"Acme",email:"user@acme.com"}],["mp.people.set_once","new-user-123",{first_login:1700000104}],["mp.people.increment","new-user-123",{login_count:1}]]},S={title:"Common people operations",description:"A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.",in:(0,I.getEvent)("profile update",{timestamp:1700000105,data:{name:"Jane Doe",email:"jane@acme.com",page:"/docs/getting-started",removed_tag:"trial",source:"referral"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"user.id"}},people:{map:{set:{map:{name:"data.name",email:"data.email"}},set_once:{map:{signup_source:"data.source"}},increment:{map:{page_views:{value:1}}},append:{map:{visited_pages:"data.page"}},union:{map:{unique_tags:{value:["active"]}}},remove:{map:{tags:"data.removed_tag"}},unset:{value:["old_plan"]}}}}},out:[["mp.people.set","us3r",{name:"Jane Doe",email:"jane@acme.com"}],["mp.people.set_once","us3r",{signup_source:"referral"}],["mp.people.increment","us3r",{page_views:1}],["mp.people.append","us3r",{visited_pages:"/docs/getting-started"}],["mp.people.union","us3r",{unique_tags:["active"]}],["mp.people.remove","us3r",{tags:"trial"}],["mp.people.unset","us3r",["old_plan"]]]},D={title:"Group profile",description:"A company update sets Mixpanel group profile properties via groups.set and groups.set_once.",in:(0,I.getEvent)("company update",{timestamp:1700000106,data:{company_id:"acme-inc",company_name:"Acme, Inc.",plan:"enterprise",employee_count:250,founded_year:2010}}),mapping:{silent:!0,settings:{groupProfile:{map:{key:{value:"company_id"},id:"data.company_id",set:{map:{name:"data.company_name",plan:"data.plan",employee_count:"data.employee_count"}},set_once:{map:{founded:"data.founded_year"}}}}}},out:[["mp.groups.set","company_id","acme-inc",{name:"Acme, Inc.",plan:"enterprise",employee_count:250}],["mp.groups.set_once","company_id","acme-inc",{founded:2010}]]},M={title:"Historical import",description:"Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.",in:(0,I.getEvent)("order complete",{timestamp:1700000107,data:{total:99.99}}),settings:{useImport:!0,identify:{map:{distinctId:"user.id"}}},out:[["mp.import","order complete",1700000107,{distinct_id:"us3r"}]]},j={title:"Alias before track",description:"A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.",in:(0,I.getEvent)("user login",{timestamp:1700000108,data:{user_id:"new-user-456",anon_id:"anon-789"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id",alias:"data.anon_id"}}}},out:[["mp.alias","new-user-456","anon-789"],["mp.track","user login",{distinct_id:"new-user-456"}]]},q={public:!1,in:(0,I.getEvent)("debug noise",{timestamp:1700000109}),mapping:{ignore:!0},out:[]};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,o=(e,i)=>{for(var a in i)t(e,a,{get:i[a],enumerable:!0})},p={};o(p,{examples:()=>v,schemas:()=>s}),module.exports=(e=p,((e,o,p,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let r of a(o))n.call(e,r)||r===p||t(e,r,{get:()=>o[r],enumerable:!(s=i(o,r))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};o(s,{MappingSchema:()=>m,SettingsSchema:()=>d,mapping:()=>g,settings:()=>u});var r=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),d=l.z.object({apiKey:l.z.string().min(1).describe("Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init()."),secret:l.z.string().describe("API secret for the /import endpoint (historical data). Required when useImport is true.").optional(),host:l.z.string().describe("Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).").optional(),protocol:l.z.string().describe("Protocol for API requests. Default: 'https'.").optional(),keepAlive:l.z.boolean().describe("Reuse HTTP connections. Default: true.").optional(),geolocate:l.z.boolean().describe("Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.").optional(),debug:l.z.boolean().describe("Enable SDK debug logging. Default: false.").optional(),verbose:l.z.boolean().describe("Enable verbose request logging. Default: false.").optional(),test:l.z.boolean().describe("Enable dry-run mode. Default: false.").optional(),useImport:l.z.boolean().describe("Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.").optional(),identify:l.z.unknown().describe("walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.").optional(),include:l.z.unknown().describe("Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).").optional()}),c=require("@walkeros/core/dev"),m=c.z.object({identify:c.z.unknown().describe("Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.").optional(),people:c.z.unknown().describe("Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.").optional(),group:c.z.unknown().describe("Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.").optional(),groupProfile:c.z.unknown().describe("Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.").optional(),useImport:c.z.unknown().describe("Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.").optional()}),u=(0,r.zodToSchema)(d),g=(0,r.zodToSchema)(m),v={};o(v,{env:()=>_,step:()=>w});var _={};o(_,{push:()=>k,simulation:()=>h});var f=(...e)=>{const t=e[e.length-1];"function"==typeof t&&t()},y={set:f,set_once:f,increment:f,append:f,union:f,remove:f,unset:f,delete_user:f},b={set:f,set_once:f,union:f,remove:f,unset:f,delete_group:f};var k={Mixpanel:{init:function(){return{track:f,import:f,alias:f,people:{...y},groups:{...b}}}}},h=["call:Mixpanel.init.track","call:Mixpanel.init.import","call:Mixpanel.init.alias","call:Mixpanel.init.people.set","call:Mixpanel.init.people.set_once","call:Mixpanel.init.people.increment","call:Mixpanel.init.people.append","call:Mixpanel.init.people.union","call:Mixpanel.init.people.remove","call:Mixpanel.init.people.unset","call:Mixpanel.init.people.delete_user","call:Mixpanel.init.groups.set","call:Mixpanel.init.groups.set_once","call:Mixpanel.init.groups.union","call:Mixpanel.init.groups.remove","call:Mixpanel.init.groups.unset","call:Mixpanel.init.groups.delete_group"],w={};o(w,{aliasBeforeTrack:()=>j,allPeopleOperations:()=>A,companyGroupProfile:()=>S,defaultEventForwarding:()=>I,historicalImport:()=>D,perEventIdentify:()=>P,trackWithGroup:()=>z,trackWithInclude:()=>M,userLoginPeopleSet:()=>E,wildcardIgnored:()=>q});var x=require("@walkeros/core"),I={title:"Default track",description:"A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.",in:(0,x.getEvent)("product view",{timestamp:1700000100}),settings:{identify:{map:{distinctId:"user.id"}}},out:[["mp.track","product view",{distinct_id:"us3r"}]]},M={title:"Track with include",description:"A destination-level include flattens the event data section into prefixed Mixpanel track properties.",in:(0,x.getEvent)("product view",{timestamp:1700000101}),settings:{identify:{map:{distinctId:"user.id"}}},configInclude:["data"],out:[["mp.track","product view",{distinct_id:"us3r",data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420}]]},P={title:"Per-event identify",description:"A mapping-level identify overrides the destination default to resolve the distinct_id from event data.",in:(0,x.getEvent)("user login",{timestamp:1700000102,data:{user_id:"resolved-id",plan:"premium"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id"}}}},out:[["mp.track","user login",{distinct_id:"resolved-id"}]]},z={title:"Track with group",description:"A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.",in:(0,x.getEvent)("page view",{timestamp:1700000103,data:{company_id:"acme"}}),settings:{identify:{map:{distinctId:"user.id"}}},mapping:{settings:{group:{map:{key:{value:"company_id"},id:"data.company_id"}}}},out:[["mp.track","page view",{distinct_id:"us3r",company_id:"acme"}]]},E={title:"User login people",description:"A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.",in:(0,x.getEvent)("user login",{timestamp:1700000104,data:{user_id:"new-user-123",plan:"premium",company:"Acme",email:"user@acme.com"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"data.user_id"}},people:{map:{set:{map:{plan:"data.plan",company:"data.company",email:"data.email"}},set_once:{map:{first_login:"timestamp"}},increment:{map:{login_count:{value:1}}}}}}},out:[["mp.people.set","new-user-123",{plan:"premium",company:"Acme",email:"user@acme.com"}],["mp.people.set_once","new-user-123",{first_login:1700000104}],["mp.people.increment","new-user-123",{login_count:1}]]},A={title:"Common people operations",description:"A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.",in:(0,x.getEvent)("profile update",{timestamp:1700000105,data:{name:"Jane Doe",email:"jane@acme.com",page:"/docs/getting-started",removed_tag:"trial",source:"referral"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"user.id"}},people:{map:{set:{map:{name:"data.name",email:"data.email"}},set_once:{map:{signup_source:"data.source"}},increment:{map:{page_views:{value:1}}},append:{map:{visited_pages:"data.page"}},union:{map:{unique_tags:{value:["active"]}}},remove:{map:{tags:"data.removed_tag"}},unset:{value:["old_plan"]}}}}},out:[["mp.people.set","us3r",{name:"Jane Doe",email:"jane@acme.com"}],["mp.people.set_once","us3r",{signup_source:"referral"}],["mp.people.increment","us3r",{page_views:1}],["mp.people.append","us3r",{visited_pages:"/docs/getting-started"}],["mp.people.union","us3r",{unique_tags:["active"]}],["mp.people.remove","us3r",{tags:"trial"}],["mp.people.unset","us3r",["old_plan"]]]},S={title:"Group profile",description:"A company update sets Mixpanel group profile properties via groups.set and groups.set_once.",in:(0,x.getEvent)("company update",{timestamp:1700000106,data:{company_id:"acme-inc",company_name:"Acme, Inc.",plan:"enterprise",employee_count:250,founded_year:2010}}),mapping:{silent:!0,settings:{groupProfile:{map:{key:{value:"company_id"},id:"data.company_id",set:{map:{name:"data.company_name",plan:"data.plan",employee_count:"data.employee_count"}},set_once:{map:{founded:"data.founded_year"}}}}}},out:[["mp.groups.set","company_id","acme-inc",{name:"Acme, Inc.",plan:"enterprise",employee_count:250}],["mp.groups.set_once","company_id","acme-inc",{founded:2010}]]},D={title:"Historical import",description:"Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.",in:(0,x.getEvent)("order complete",{timestamp:1700000107,data:{total:99.99}}),settings:{useImport:!0,identify:{map:{distinctId:"user.id"}}},out:[["mp.import","order complete",1700000107,{distinct_id:"us3r"}]]},j={title:"Alias before track",description:"A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.",in:(0,x.getEvent)("user login",{timestamp:1700000108,data:{user_id:"new-user-456",anon_id:"anon-789"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id",alias:"data.anon_id"}}}},out:[["mp.alias","new-user-456","anon-789"],["mp.track","user login",{distinct_id:"new-user-456"}]]},q={public:!1,in:(0,x.getEvent)("debug noise",{timestamp:1700000109}),mapping:{ignore:!0},out:[]};//# 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 apiKey: z\n .string()\n .min(1)\n .describe(\n 'Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init().',\n ),\n secret: z\n .string()\n .describe(\n 'API secret for the /import endpoint (historical data). Required when useImport is true.',\n )\n .optional(),\n host: z\n .string()\n .describe(\n \"Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).\",\n )\n .optional(),\n protocol: z\n .string()\n .describe(\"Protocol for API requests. Default: 'https'.\")\n .optional(),\n keepAlive: z\n .boolean()\n .describe('Reuse HTTP connections. Default: true.')\n .optional(),\n geolocate: z\n .boolean()\n .describe(\n 'Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.',\n )\n .optional(),\n debug: z\n .boolean()\n .describe('Enable SDK debug logging. Default: false.')\n .optional(),\n verbose: z\n .boolean()\n .describe('Enable verbose request logging. Default: false.')\n .optional(),\n test: z.boolean().describe('Enable dry-run mode. Default: false.').optional(),\n useImport: z\n .boolean()\n .describe(\n 'Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.',\n )\n .optional(),\n include: z\n .unknown()\n .describe(\n \"Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).\",\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const MappingSchema = z.object({\n identify: z\n .unknown()\n .describe(\n 'Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.',\n )\n .optional(),\n people: z\n .unknown()\n .describe(\n 'Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.',\n )\n .optional(),\n group: z\n .unknown()\n .describe(\n 'Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.',\n )\n .optional(),\n groupProfile: z\n .unknown()\n .describe(\n 'Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.',\n )\n .optional(),\n useImport: z\n .unknown()\n .describe(\n 'Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.',\n )\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 {\n Env,\n MixpanelClient,\n MixpanelPeople,\n MixpanelGroups,\n} from '../types';\n\nconst noop = (() => {}) as (...args: unknown[]) => void;\n\nconst noopPeople: MixpanelPeople = {\n set: noop,\n set_once: noop,\n increment: noop,\n append: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_user: noop,\n};\n\nconst noopGroups: MixpanelGroups = {\n set: noop,\n set_once: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_group: noop,\n};\n\n/**\n * Mock Mixpanel factory that returns a no-op client instance.\n * Tests replace individual methods with spies.\n */\nfunction mockInit(): MixpanelClient {\n return {\n track: noop,\n import: noop,\n alias: noop,\n people: { ...noopPeople },\n groups: { ...noopGroups },\n };\n}\n\n/**\n * Standard mock environment for push operations.\n * The test runner clones this and replaces methods with spies.\n */\nexport const push: Env = {\n Mixpanel: { init: mockInit as (...args: unknown[]) => MixpanelClient },\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:Mixpanel.init',\n 'call:mp.track',\n 'call:mp.import',\n 'call:mp.alias',\n 'call:mp.people.set',\n 'call:mp.people.set_once',\n 'call:mp.people.increment',\n 'call:mp.people.append',\n 'call:mp.people.union',\n 'call:mp.people.remove',\n 'call:mp.people.unset',\n 'call:mp.people.delete_user',\n 'call:mp.groups.set',\n 'call:mp.groups.set_once',\n 'call:mp.groups.union',\n 'call:mp.groups.remove',\n 'call:mp.groups.unset',\n 'call:mp.groups.delete_group',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Mixpanel server SDK step examples.\n *\n * At push time, the destination calls the `mixpanel` Node SDK via the\n * client returned from `Mixpanel.init(...)`. Public method paths users\n * see on the client are:\n *\n * - `mp.track(eventName, properties)`\n * - `mp.import(eventName, time, properties)` (when `useImport: true`)\n * - `mp.alias(distinctId, alias)` (fires before track)\n * - `mp.people.{set,set_once,increment,append,union,remove,unset,delete_user}(...)`\n * - `mp.groups.{set,set_once,union,remove,unset,delete_group}(...)`\n *\n * Each `out` is `[[callable, ...args], ...]`. The test filters out the\n * one-time `Mixpanel.init` call (fired during destination init) so only\n * per-event SDK calls are compared.\n *\n * For events marked `silent: true` or `ignore: true`, `track()` does not\n * fire - only the side-effect calls (people/groups/alias) appear.\n */\n\n/**\n * Step examples may carry destination-level settings and configInclude.\n * The test runner reads these to configure the destination.\n */\nexport type MixpanelStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n configInclude?: string[];\n};\n\n/**\n * Default event forwarding - every walkerOS event becomes\n * mp.track(event.name, { distinct_id, ...properties }).\n * With default settings.identify resolving user.id.\n */\nexport const defaultEventForwarding: MixpanelStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.',\n in: getEvent('product view', { timestamp: 1700000100 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.track', 'product view', { distinct_id: 'us3r' }]],\n};\n\n/**\n * Track with include - flattens walkerOS `data` section into\n * prefixed track() properties.\n */\nexport const trackWithInclude: MixpanelStepExample = {\n title: 'Track with include',\n description:\n 'A destination-level include flattens the event data section into prefixed Mixpanel track properties.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n configInclude: ['data'],\n out: [\n [\n 'mp.track',\n 'product view',\n {\n distinct_id: 'us3r',\n data_id: 'ers',\n data_name: 'Everyday Ruck Snack',\n data_color: 'black',\n data_size: 'l',\n data_price: 420,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify - mapping-level settings.identify overrides\n * destination-level default.\n */\nexport const perEventIdentify: MixpanelStepExample = {\n title: 'Per-event identify',\n description:\n 'A mapping-level identify overrides the destination default to resolve the distinct_id from event data.',\n in: getEvent('user login', {\n timestamp: 1700000102,\n data: {\n user_id: 'resolved-id',\n plan: 'premium',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'user login',\n {\n distinct_id: 'resolved-id',\n },\n ],\n ],\n};\n\n/**\n * Track with group - group key/id attached as track property.\n */\nexport const trackWithGroup: MixpanelStepExample = {\n title: 'Track with group',\n description:\n 'A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.',\n in: getEvent('page view', {\n timestamp: 1700000103,\n data: {\n company_id: 'acme',\n },\n }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n mapping: {\n settings: {\n group: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'page view',\n {\n distinct_id: 'us3r',\n company_id: 'acme',\n },\n ],\n ],\n};\n\n/**\n * User login with people operations - silent: true suppresses track,\n * only identity + people side effects fire.\n */\nexport const userLoginPeopleSet: MixpanelStepExample = {\n title: 'User login people',\n description:\n 'A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.',\n in: getEvent('user login', {\n timestamp: 1700000104,\n data: {\n user_id: 'new-user-123',\n plan: 'premium',\n company: 'Acme',\n email: 'user@acme.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n plan: 'data.plan',\n company: 'data.company',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n first_login: 'timestamp',\n },\n },\n increment: {\n map: {\n login_count: { value: 1 },\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.people.set',\n 'new-user-123',\n { plan: 'premium', company: 'Acme', email: 'user@acme.com' },\n ],\n ['mp.people.set_once', 'new-user-123', { first_login: 1700000104 }],\n ['mp.people.increment', 'new-user-123', { login_count: 1 }],\n ],\n};\n\n/**\n * Common people operation vocabulary - exercises set, set_once, increment,\n * append, union, remove, unset. (delete_user is intentionally not covered\n * by this example.)\n */\nexport const allPeopleOperations: MixpanelStepExample = {\n title: 'Common people operations',\n description:\n 'A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n name: 'Jane Doe',\n email: 'jane@acme.com',\n page: '/docs/getting-started',\n removed_tag: 'trial',\n source: 'referral',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n name: 'data.name',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n signup_source: 'data.source',\n },\n },\n increment: {\n map: {\n page_views: { value: 1 },\n },\n },\n append: {\n map: {\n visited_pages: 'data.page',\n },\n },\n union: {\n map: {\n unique_tags: { value: ['active'] },\n },\n },\n remove: {\n map: {\n tags: 'data.removed_tag',\n },\n },\n unset: { value: ['old_plan'] },\n },\n },\n },\n },\n out: [\n ['mp.people.set', 'us3r', { name: 'Jane Doe', email: 'jane@acme.com' }],\n ['mp.people.set_once', 'us3r', { signup_source: 'referral' }],\n ['mp.people.increment', 'us3r', { page_views: 1 }],\n ['mp.people.append', 'us3r', { visited_pages: '/docs/getting-started' }],\n ['mp.people.union', 'us3r', { unique_tags: ['active'] }],\n ['mp.people.remove', 'us3r', { tags: 'trial' }],\n ['mp.people.unset', 'us3r', ['old_plan']],\n ],\n};\n\n/**\n * Group profile operations - settings.groupProfile with set and set_once.\n */\nexport const companyGroupProfile: MixpanelStepExample = {\n title: 'Group profile',\n description:\n 'A company update sets Mixpanel group profile properties via groups.set and groups.set_once.',\n in: getEvent('company update', {\n timestamp: 1700000106,\n data: {\n company_id: 'acme-inc',\n company_name: 'Acme, Inc.',\n plan: 'enterprise',\n employee_count: 250,\n founded_year: 2010,\n },\n }),\n mapping: {\n silent: true,\n settings: {\n groupProfile: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n set: {\n map: {\n name: 'data.company_name',\n plan: 'data.plan',\n employee_count: 'data.employee_count',\n },\n },\n set_once: {\n map: {\n founded: 'data.founded_year',\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.groups.set',\n 'company_id',\n 'acme-inc',\n { name: 'Acme, Inc.', plan: 'enterprise', employee_count: 250 },\n ],\n ['mp.groups.set_once', 'company_id', 'acme-inc', { founded: 2010 }],\n ],\n};\n\n/**\n * Historical import - useImport: true uses mp.import() instead of mp.track().\n */\nexport const historicalImport: MixpanelStepExample = {\n title: 'Historical import',\n description:\n 'Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.',\n in: getEvent('order complete', {\n timestamp: 1700000107,\n data: {\n total: 99.99,\n },\n }),\n settings: {\n useImport: true,\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.import', 'order complete', 1700000107, { distinct_id: 'us3r' }]],\n};\n\n/**\n * Alias - legacy identity merge. Fires mp.alias before track.\n */\nexport const aliasBeforeTrack: MixpanelStepExample = {\n title: 'Alias before track',\n description:\n 'A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.',\n in: getEvent('user login', {\n timestamp: 1700000108,\n data: {\n user_id: 'new-user-456',\n anon_id: 'anon-789',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n alias: 'data.anon_id',\n },\n },\n },\n },\n out: [\n ['mp.alias', 'new-user-456', 'anon-789'],\n ['mp.track', 'user login', { distinct_id: 'new-user-456' }],\n ],\n};\n\n/**\n * Wildcard ignore - the rule matches but does nothing.\n */\nexport const wildcardIgnored: MixpanelStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000109 }),\n mapping: { ignore: true },\n out: [],\n};\n"],"mappings":"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","names":["import_dev","import_dev"]}
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 apiKey: z\n .string()\n .min(1)\n .describe(\n 'Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init().',\n ),\n secret: z\n .string()\n .describe(\n 'API secret for the /import endpoint (historical data). Required when useImport is true.',\n )\n .optional(),\n host: z\n .string()\n .describe(\n \"Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).\",\n )\n .optional(),\n protocol: z\n .string()\n .describe(\"Protocol for API requests. Default: 'https'.\")\n .optional(),\n keepAlive: z\n .boolean()\n .describe('Reuse HTTP connections. Default: true.')\n .optional(),\n geolocate: z\n .boolean()\n .describe(\n 'Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.',\n )\n .optional(),\n debug: z\n .boolean()\n .describe('Enable SDK debug logging. Default: false.')\n .optional(),\n verbose: z\n .boolean()\n .describe('Enable verbose request logging. Default: false.')\n .optional(),\n test: z.boolean().describe('Enable dry-run mode. Default: false.').optional(),\n useImport: z\n .boolean()\n .describe(\n 'Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.',\n )\n .optional(),\n include: z\n .unknown()\n .describe(\n \"Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).\",\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const MappingSchema = z.object({\n identify: z\n .unknown()\n .describe(\n 'Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.',\n )\n .optional(),\n people: z\n .unknown()\n .describe(\n 'Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.',\n )\n .optional(),\n group: z\n .unknown()\n .describe(\n 'Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.',\n )\n .optional(),\n groupProfile: z\n .unknown()\n .describe(\n 'Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.',\n )\n .optional(),\n useImport: z\n .unknown()\n .describe(\n 'Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.',\n )\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 {\n Env,\n MixpanelClient,\n MixpanelPeople,\n MixpanelGroups,\n} from '../types';\n\n/**\n * The SDK reports completion through an optional trailing callback, which the\n * destination awaits; call it so a simulated push completes.\n */\nconst noop = (...args: unknown[]): void => {\n const callback = args[args.length - 1];\n if (typeof callback === 'function') callback();\n};\n\nconst noopPeople: MixpanelPeople = {\n set: noop,\n set_once: noop,\n increment: noop,\n append: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_user: noop,\n};\n\nconst noopGroups: MixpanelGroups = {\n set: noop,\n set_once: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_group: noop,\n};\n\n/**\n * Mock Mixpanel factory that returns a no-op client instance.\n * Tests replace individual methods with spies.\n */\nfunction mockInit(): MixpanelClient {\n return {\n track: noop,\n import: noop,\n alias: noop,\n people: { ...noopPeople },\n groups: { ...noopGroups },\n };\n}\n\n/**\n * Standard mock environment for push operations.\n * The test runner clones this and replaces methods with spies.\n */\nexport const push: Env = {\n Mixpanel: { init: mockInit },\n};\n\n/**\n * Simulation tracking paths for CLI --simulate. `init` carries the token and is\n * not recorded; the paths walk through its result to the request calls.\n */\nexport const simulation = [\n 'call:Mixpanel.init.track',\n 'call:Mixpanel.init.import',\n 'call:Mixpanel.init.alias',\n 'call:Mixpanel.init.people.set',\n 'call:Mixpanel.init.people.set_once',\n 'call:Mixpanel.init.people.increment',\n 'call:Mixpanel.init.people.append',\n 'call:Mixpanel.init.people.union',\n 'call:Mixpanel.init.people.remove',\n 'call:Mixpanel.init.people.unset',\n 'call:Mixpanel.init.people.delete_user',\n 'call:Mixpanel.init.groups.set',\n 'call:Mixpanel.init.groups.set_once',\n 'call:Mixpanel.init.groups.union',\n 'call:Mixpanel.init.groups.remove',\n 'call:Mixpanel.init.groups.unset',\n 'call:Mixpanel.init.groups.delete_group',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Mixpanel server SDK step examples.\n *\n * At push time, the destination calls the `mixpanel` Node SDK via the\n * client returned from `Mixpanel.init(...)`. Public method paths users\n * see on the client are:\n *\n * - `mp.track(eventName, properties)`\n * - `mp.import(eventName, time, properties)` (when `useImport: true`)\n * - `mp.alias(distinctId, alias)` (fires before track)\n * - `mp.people.{set,set_once,increment,append,union,remove,unset,delete_user}(...)`\n * - `mp.groups.{set,set_once,union,remove,unset,delete_group}(...)`\n *\n * Each `out` is `[[callable, ...args], ...]`. The test filters out the\n * one-time `Mixpanel.init` call (fired during destination init) so only\n * per-event SDK calls are compared.\n *\n * For events marked `silent: true` or `ignore: true`, `track()` does not\n * fire - only the side-effect calls (people/groups/alias) appear.\n */\n\n/**\n * Step examples may carry destination-level settings and configInclude.\n * The test runner reads these to configure the destination.\n */\nexport type MixpanelStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n configInclude?: string[];\n};\n\n/**\n * Default event forwarding - every walkerOS event becomes\n * mp.track(event.name, { distinct_id, ...properties }).\n * With default settings.identify resolving user.id.\n */\nexport const defaultEventForwarding: MixpanelStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.',\n in: getEvent('product view', { timestamp: 1700000100 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.track', 'product view', { distinct_id: 'us3r' }]],\n};\n\n/**\n * Track with include - flattens walkerOS `data` section into\n * prefixed track() properties.\n */\nexport const trackWithInclude: MixpanelStepExample = {\n title: 'Track with include',\n description:\n 'A destination-level include flattens the event data section into prefixed Mixpanel track properties.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n configInclude: ['data'],\n out: [\n [\n 'mp.track',\n 'product view',\n {\n distinct_id: 'us3r',\n data_id: 'ers',\n data_name: 'Everyday Ruck Snack',\n data_color: 'black',\n data_size: 'l',\n data_price: 420,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify - mapping-level settings.identify overrides\n * destination-level default.\n */\nexport const perEventIdentify: MixpanelStepExample = {\n title: 'Per-event identify',\n description:\n 'A mapping-level identify overrides the destination default to resolve the distinct_id from event data.',\n in: getEvent('user login', {\n timestamp: 1700000102,\n data: {\n user_id: 'resolved-id',\n plan: 'premium',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'user login',\n {\n distinct_id: 'resolved-id',\n },\n ],\n ],\n};\n\n/**\n * Track with group - group key/id attached as track property.\n */\nexport const trackWithGroup: MixpanelStepExample = {\n title: 'Track with group',\n description:\n 'A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.',\n in: getEvent('page view', {\n timestamp: 1700000103,\n data: {\n company_id: 'acme',\n },\n }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n mapping: {\n settings: {\n group: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'page view',\n {\n distinct_id: 'us3r',\n company_id: 'acme',\n },\n ],\n ],\n};\n\n/**\n * User login with people operations - silent: true suppresses track,\n * only identity + people side effects fire.\n */\nexport const userLoginPeopleSet: MixpanelStepExample = {\n title: 'User login people',\n description:\n 'A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.',\n in: getEvent('user login', {\n timestamp: 1700000104,\n data: {\n user_id: 'new-user-123',\n plan: 'premium',\n company: 'Acme',\n email: 'user@acme.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n plan: 'data.plan',\n company: 'data.company',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n first_login: 'timestamp',\n },\n },\n increment: {\n map: {\n login_count: { value: 1 },\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.people.set',\n 'new-user-123',\n { plan: 'premium', company: 'Acme', email: 'user@acme.com' },\n ],\n ['mp.people.set_once', 'new-user-123', { first_login: 1700000104 }],\n ['mp.people.increment', 'new-user-123', { login_count: 1 }],\n ],\n};\n\n/**\n * Common people operation vocabulary - exercises set, set_once, increment,\n * append, union, remove, unset. (delete_user is intentionally not covered\n * by this example.)\n */\nexport const allPeopleOperations: MixpanelStepExample = {\n title: 'Common people operations',\n description:\n 'A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n name: 'Jane Doe',\n email: 'jane@acme.com',\n page: '/docs/getting-started',\n removed_tag: 'trial',\n source: 'referral',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n name: 'data.name',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n signup_source: 'data.source',\n },\n },\n increment: {\n map: {\n page_views: { value: 1 },\n },\n },\n append: {\n map: {\n visited_pages: 'data.page',\n },\n },\n union: {\n map: {\n unique_tags: { value: ['active'] },\n },\n },\n remove: {\n map: {\n tags: 'data.removed_tag',\n },\n },\n unset: { value: ['old_plan'] },\n },\n },\n },\n },\n out: [\n ['mp.people.set', 'us3r', { name: 'Jane Doe', email: 'jane@acme.com' }],\n ['mp.people.set_once', 'us3r', { signup_source: 'referral' }],\n ['mp.people.increment', 'us3r', { page_views: 1 }],\n ['mp.people.append', 'us3r', { visited_pages: '/docs/getting-started' }],\n ['mp.people.union', 'us3r', { unique_tags: ['active'] }],\n ['mp.people.remove', 'us3r', { tags: 'trial' }],\n ['mp.people.unset', 'us3r', ['old_plan']],\n ],\n};\n\n/**\n * Group profile operations - settings.groupProfile with set and set_once.\n */\nexport const companyGroupProfile: MixpanelStepExample = {\n title: 'Group profile',\n description:\n 'A company update sets Mixpanel group profile properties via groups.set and groups.set_once.',\n in: getEvent('company update', {\n timestamp: 1700000106,\n data: {\n company_id: 'acme-inc',\n company_name: 'Acme, Inc.',\n plan: 'enterprise',\n employee_count: 250,\n founded_year: 2010,\n },\n }),\n mapping: {\n silent: true,\n settings: {\n groupProfile: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n set: {\n map: {\n name: 'data.company_name',\n plan: 'data.plan',\n employee_count: 'data.employee_count',\n },\n },\n set_once: {\n map: {\n founded: 'data.founded_year',\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.groups.set',\n 'company_id',\n 'acme-inc',\n { name: 'Acme, Inc.', plan: 'enterprise', employee_count: 250 },\n ],\n ['mp.groups.set_once', 'company_id', 'acme-inc', { founded: 2010 }],\n ],\n};\n\n/**\n * Historical import - useImport: true uses mp.import() instead of mp.track().\n */\nexport const historicalImport: MixpanelStepExample = {\n title: 'Historical import',\n description:\n 'Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.',\n in: getEvent('order complete', {\n timestamp: 1700000107,\n data: {\n total: 99.99,\n },\n }),\n settings: {\n useImport: true,\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.import', 'order complete', 1700000107, { distinct_id: 'us3r' }]],\n};\n\n/**\n * Alias - legacy identity merge. Fires mp.alias before track.\n */\nexport const aliasBeforeTrack: MixpanelStepExample = {\n title: 'Alias before track',\n description:\n 'A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.',\n in: getEvent('user login', {\n timestamp: 1700000108,\n data: {\n user_id: 'new-user-456',\n anon_id: 'anon-789',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n alias: 'data.anon_id',\n },\n },\n },\n },\n out: [\n ['mp.alias', 'new-user-456', 'anon-789'],\n ['mp.track', 'user login', { distinct_id: 'new-user-456' }],\n ],\n};\n\n/**\n * Wildcard ignore - the rule matches but does nothing.\n */\nexport const wildcardIgnored: MixpanelStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000109 }),\n mapping: { ignore: true },\n out: [],\n};\n"],"mappings":"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","names":["import_dev","import_dev"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,i)=>{for(var a in i)e(t,a,{get:i[a],enumerable:!0})},i={};t(i,{MappingSchema:()=>s,SettingsSchema:()=>o,mapping:()=>l,settings:()=>r});import{zodToSchema as a}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";var o=n.object({apiKey:n.string().min(1).describe("Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init()."),secret:n.string().describe("API secret for the /import endpoint (historical data). Required when useImport is true.").optional(),host:n.string().describe("Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).").optional(),protocol:n.string().describe("Protocol for API requests. Default: 'https'.").optional(),keepAlive:n.boolean().describe("Reuse HTTP connections. Default: true.").optional(),geolocate:n.boolean().describe("Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.").optional(),debug:n.boolean().describe("Enable SDK debug logging. Default: false.").optional(),verbose:n.boolean().describe("Enable verbose request logging. Default: false.").optional(),test:n.boolean().describe("Enable dry-run mode. Default: false.").optional(),useImport:n.boolean().describe("Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.").optional(),identify:n.unknown().describe("walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.").optional(),include:n.unknown().describe("Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).").optional()});import{z as p}from"@walkeros/core/dev";var s=p.object({identify:p.unknown().describe("Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.").optional(),people:p.unknown().describe("Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.").optional(),group:p.unknown().describe("Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.").optional(),groupProfile:p.unknown().describe("Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.").optional(),useImport:p.unknown().describe("Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.").optional()}),r=a(o),l=a(s),d={};t(d,{env:()=>c,step:()=>f});var c={};t(c,{push:()=>v,simulation:()=>_});var m=()=>{},u={set:m,set_once:m,increment:m,append:m,union:m,remove:m,unset:m,delete_user:m},g={set:m,set_once:m,union:m,remove:m,unset:m,delete_group:m};var v={Mixpanel:{init:function(){return{track:m,import:m,alias:m,people:{...u},groups:{...g}}}}},_=["call:Mixpanel.init","call:mp.track","call:mp.import","call:mp.alias","call:mp.people.set","call:mp.people.set_once","call:mp.people.increment","call:mp.people.append","call:mp.people.union","call:mp.people.remove","call:mp.people.unset","call:mp.people.delete_user","call:mp.groups.set","call:mp.groups.set_once","call:mp.groups.union","call:mp.groups.remove","call:mp.groups.unset","call:mp.groups.delete_group"],f={};t(f,{aliasBeforeTrack:()=>S,allPeopleOperations:()=>x,companyGroupProfile:()=>P,defaultEventForwarding:()=>k,historicalImport:()=>A,perEventIdentify:()=>h,trackWithGroup:()=>w,trackWithInclude:()=>b,userLoginPeopleSet:()=>I,wildcardIgnored:()=>D});import{getEvent as y}from"@walkeros/core";var k={title:"Default track",description:"A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.",in:y("product view",{timestamp:1700000100}),settings:{identify:{map:{distinctId:"user.id"}}},out:[["mp.track","product view",{distinct_id:"us3r"}]]},b={title:"Track with include",description:"A destination-level include flattens the event data section into prefixed Mixpanel track properties.",in:y("product view",{timestamp:1700000101}),settings:{identify:{map:{distinctId:"user.id"}}},configInclude:["data"],out:[["mp.track","product view",{distinct_id:"us3r",data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420}]]},h={title:"Per-event identify",description:"A mapping-level identify overrides the destination default to resolve the distinct_id from event data.",in:y("user login",{timestamp:1700000102,data:{user_id:"resolved-id",plan:"premium"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id"}}}},out:[["mp.track","user login",{distinct_id:"resolved-id"}]]},w={title:"Track with group",description:"A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.",in:y("page view",{timestamp:1700000103,data:{company_id:"acme"}}),settings:{identify:{map:{distinctId:"user.id"}}},mapping:{settings:{group:{map:{key:{value:"company_id"},id:"data.company_id"}}}},out:[["mp.track","page view",{distinct_id:"us3r",company_id:"acme"}]]},I={title:"User login people",description:"A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.",in:y("user login",{timestamp:1700000104,data:{user_id:"new-user-123",plan:"premium",company:"Acme",email:"user@acme.com"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"data.user_id"}},people:{map:{set:{map:{plan:"data.plan",company:"data.company",email:"data.email"}},set_once:{map:{first_login:"timestamp"}},increment:{map:{login_count:{value:1}}}}}}},out:[["mp.people.set","new-user-123",{plan:"premium",company:"Acme",email:"user@acme.com"}],["mp.people.set_once","new-user-123",{first_login:1700000104}],["mp.people.increment","new-user-123",{login_count:1}]]},x={title:"Common people operations",description:"A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.",in:y("profile update",{timestamp:1700000105,data:{name:"Jane Doe",email:"jane@acme.com",page:"/docs/getting-started",removed_tag:"trial",source:"referral"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"user.id"}},people:{map:{set:{map:{name:"data.name",email:"data.email"}},set_once:{map:{signup_source:"data.source"}},increment:{map:{page_views:{value:1}}},append:{map:{visited_pages:"data.page"}},union:{map:{unique_tags:{value:["active"]}}},remove:{map:{tags:"data.removed_tag"}},unset:{value:["old_plan"]}}}}},out:[["mp.people.set","us3r",{name:"Jane Doe",email:"jane@acme.com"}],["mp.people.set_once","us3r",{signup_source:"referral"}],["mp.people.increment","us3r",{page_views:1}],["mp.people.append","us3r",{visited_pages:"/docs/getting-started"}],["mp.people.union","us3r",{unique_tags:["active"]}],["mp.people.remove","us3r",{tags:"trial"}],["mp.people.unset","us3r",["old_plan"]]]},P={title:"Group profile",description:"A company update sets Mixpanel group profile properties via groups.set and groups.set_once.",in:y("company update",{timestamp:1700000106,data:{company_id:"acme-inc",company_name:"Acme, Inc.",plan:"enterprise",employee_count:250,founded_year:2010}}),mapping:{silent:!0,settings:{groupProfile:{map:{key:{value:"company_id"},id:"data.company_id",set:{map:{name:"data.company_name",plan:"data.plan",employee_count:"data.employee_count"}},set_once:{map:{founded:"data.founded_year"}}}}}},out:[["mp.groups.set","company_id","acme-inc",{name:"Acme, Inc.",plan:"enterprise",employee_count:250}],["mp.groups.set_once","company_id","acme-inc",{founded:2010}]]},A={title:"Historical import",description:"Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.",in:y("order complete",{timestamp:1700000107,data:{total:99.99}}),settings:{useImport:!0,identify:{map:{distinctId:"user.id"}}},out:[["mp.import","order complete",1700000107,{distinct_id:"us3r"}]]},S={title:"Alias before track",description:"A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.",in:y("user login",{timestamp:1700000108,data:{user_id:"new-user-456",anon_id:"anon-789"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id",alias:"data.anon_id"}}}},out:[["mp.alias","new-user-456","anon-789"],["mp.track","user login",{distinct_id:"new-user-456"}]]},D={public:!1,in:y("debug noise",{timestamp:1700000109}),mapping:{ignore:!0},out:[]};export{d as examples,i as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,i)=>{for(var a in i)e(t,a,{get:i[a],enumerable:!0})},i={};t(i,{MappingSchema:()=>s,SettingsSchema:()=>o,mapping:()=>l,settings:()=>r});import{zodToSchema as a}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";var o=n.object({apiKey:n.string().min(1).describe("Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init()."),secret:n.string().describe("API secret for the /import endpoint (historical data). Required when useImport is true.").optional(),host:n.string().describe("Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).").optional(),protocol:n.string().describe("Protocol for API requests. Default: 'https'.").optional(),keepAlive:n.boolean().describe("Reuse HTTP connections. Default: true.").optional(),geolocate:n.boolean().describe("Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.").optional(),debug:n.boolean().describe("Enable SDK debug logging. Default: false.").optional(),verbose:n.boolean().describe("Enable verbose request logging. Default: false.").optional(),test:n.boolean().describe("Enable dry-run mode. Default: false.").optional(),useImport:n.boolean().describe("Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.").optional(),identify:n.unknown().describe("walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.").optional(),include:n.unknown().describe("Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).").optional()});import{z as p}from"@walkeros/core/dev";var s=p.object({identify:p.unknown().describe("Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.").optional(),people:p.unknown().describe("Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.").optional(),group:p.unknown().describe("Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.").optional(),groupProfile:p.unknown().describe("Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.").optional(),useImport:p.unknown().describe("Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.").optional()}),r=a(o),l=a(s),d={};t(d,{env:()=>c,step:()=>f});var c={};t(c,{push:()=>v,simulation:()=>_});var m=(...e)=>{const t=e[e.length-1];"function"==typeof t&&t()},u={set:m,set_once:m,increment:m,append:m,union:m,remove:m,unset:m,delete_user:m},g={set:m,set_once:m,union:m,remove:m,unset:m,delete_group:m};var v={Mixpanel:{init:function(){return{track:m,import:m,alias:m,people:{...u},groups:{...g}}}}},_=["call:Mixpanel.init.track","call:Mixpanel.init.import","call:Mixpanel.init.alias","call:Mixpanel.init.people.set","call:Mixpanel.init.people.set_once","call:Mixpanel.init.people.increment","call:Mixpanel.init.people.append","call:Mixpanel.init.people.union","call:Mixpanel.init.people.remove","call:Mixpanel.init.people.unset","call:Mixpanel.init.people.delete_user","call:Mixpanel.init.groups.set","call:Mixpanel.init.groups.set_once","call:Mixpanel.init.groups.union","call:Mixpanel.init.groups.remove","call:Mixpanel.init.groups.unset","call:Mixpanel.init.groups.delete_group"],f={};t(f,{aliasBeforeTrack:()=>A,allPeopleOperations:()=>I,companyGroupProfile:()=>M,defaultEventForwarding:()=>k,historicalImport:()=>P,perEventIdentify:()=>h,trackWithGroup:()=>w,trackWithInclude:()=>b,userLoginPeopleSet:()=>x,wildcardIgnored:()=>S});import{getEvent as y}from"@walkeros/core";var k={title:"Default track",description:"A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.",in:y("product view",{timestamp:1700000100}),settings:{identify:{map:{distinctId:"user.id"}}},out:[["mp.track","product view",{distinct_id:"us3r"}]]},b={title:"Track with include",description:"A destination-level include flattens the event data section into prefixed Mixpanel track properties.",in:y("product view",{timestamp:1700000101}),settings:{identify:{map:{distinctId:"user.id"}}},configInclude:["data"],out:[["mp.track","product view",{distinct_id:"us3r",data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420}]]},h={title:"Per-event identify",description:"A mapping-level identify overrides the destination default to resolve the distinct_id from event data.",in:y("user login",{timestamp:1700000102,data:{user_id:"resolved-id",plan:"premium"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id"}}}},out:[["mp.track","user login",{distinct_id:"resolved-id"}]]},w={title:"Track with group",description:"A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.",in:y("page view",{timestamp:1700000103,data:{company_id:"acme"}}),settings:{identify:{map:{distinctId:"user.id"}}},mapping:{settings:{group:{map:{key:{value:"company_id"},id:"data.company_id"}}}},out:[["mp.track","page view",{distinct_id:"us3r",company_id:"acme"}]]},x={title:"User login people",description:"A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.",in:y("user login",{timestamp:1700000104,data:{user_id:"new-user-123",plan:"premium",company:"Acme",email:"user@acme.com"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"data.user_id"}},people:{map:{set:{map:{plan:"data.plan",company:"data.company",email:"data.email"}},set_once:{map:{first_login:"timestamp"}},increment:{map:{login_count:{value:1}}}}}}},out:[["mp.people.set","new-user-123",{plan:"premium",company:"Acme",email:"user@acme.com"}],["mp.people.set_once","new-user-123",{first_login:1700000104}],["mp.people.increment","new-user-123",{login_count:1}]]},I={title:"Common people operations",description:"A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.",in:y("profile update",{timestamp:1700000105,data:{name:"Jane Doe",email:"jane@acme.com",page:"/docs/getting-started",removed_tag:"trial",source:"referral"}}),mapping:{silent:!0,settings:{identify:{map:{distinctId:"user.id"}},people:{map:{set:{map:{name:"data.name",email:"data.email"}},set_once:{map:{signup_source:"data.source"}},increment:{map:{page_views:{value:1}}},append:{map:{visited_pages:"data.page"}},union:{map:{unique_tags:{value:["active"]}}},remove:{map:{tags:"data.removed_tag"}},unset:{value:["old_plan"]}}}}},out:[["mp.people.set","us3r",{name:"Jane Doe",email:"jane@acme.com"}],["mp.people.set_once","us3r",{signup_source:"referral"}],["mp.people.increment","us3r",{page_views:1}],["mp.people.append","us3r",{visited_pages:"/docs/getting-started"}],["mp.people.union","us3r",{unique_tags:["active"]}],["mp.people.remove","us3r",{tags:"trial"}],["mp.people.unset","us3r",["old_plan"]]]},M={title:"Group profile",description:"A company update sets Mixpanel group profile properties via groups.set and groups.set_once.",in:y("company update",{timestamp:1700000106,data:{company_id:"acme-inc",company_name:"Acme, Inc.",plan:"enterprise",employee_count:250,founded_year:2010}}),mapping:{silent:!0,settings:{groupProfile:{map:{key:{value:"company_id"},id:"data.company_id",set:{map:{name:"data.company_name",plan:"data.plan",employee_count:"data.employee_count"}},set_once:{map:{founded:"data.founded_year"}}}}}},out:[["mp.groups.set","company_id","acme-inc",{name:"Acme, Inc.",plan:"enterprise",employee_count:250}],["mp.groups.set_once","company_id","acme-inc",{founded:2010}]]},P={title:"Historical import",description:"Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.",in:y("order complete",{timestamp:1700000107,data:{total:99.99}}),settings:{useImport:!0,identify:{map:{distinctId:"user.id"}}},out:[["mp.import","order complete",1700000107,{distinct_id:"us3r"}]]},A={title:"Alias before track",description:"A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.",in:y("user login",{timestamp:1700000108,data:{user_id:"new-user-456",anon_id:"anon-789"}}),mapping:{settings:{identify:{map:{distinctId:"data.user_id",alias:"data.anon_id"}}}},out:[["mp.alias","new-user-456","anon-789"],["mp.track","user login",{distinct_id:"new-user-456"}]]},S={public:!1,in:y("debug noise",{timestamp:1700000109}),mapping:{ignore:!0},out:[]};export{d as examples,i 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 apiKey: z\n .string()\n .min(1)\n .describe(\n 'Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init().',\n ),\n secret: z\n .string()\n .describe(\n 'API secret for the /import endpoint (historical data). Required when useImport is true.',\n )\n .optional(),\n host: z\n .string()\n .describe(\n \"Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).\",\n )\n .optional(),\n protocol: z\n .string()\n .describe(\"Protocol for API requests. Default: 'https'.\")\n .optional(),\n keepAlive: z\n .boolean()\n .describe('Reuse HTTP connections. Default: true.')\n .optional(),\n geolocate: z\n .boolean()\n .describe(\n 'Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.',\n )\n .optional(),\n debug: z\n .boolean()\n .describe('Enable SDK debug logging. Default: false.')\n .optional(),\n verbose: z\n .boolean()\n .describe('Enable verbose request logging. Default: false.')\n .optional(),\n test: z.boolean().describe('Enable dry-run mode. Default: false.').optional(),\n useImport: z\n .boolean()\n .describe(\n 'Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.',\n )\n .optional(),\n include: z\n .unknown()\n .describe(\n \"Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).\",\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const MappingSchema = z.object({\n identify: z\n .unknown()\n .describe(\n 'Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.',\n )\n .optional(),\n people: z\n .unknown()\n .describe(\n 'Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.',\n )\n .optional(),\n group: z\n .unknown()\n .describe(\n 'Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.',\n )\n .optional(),\n groupProfile: z\n .unknown()\n .describe(\n 'Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.',\n )\n .optional(),\n useImport: z\n .unknown()\n .describe(\n 'Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.',\n )\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 {\n Env,\n MixpanelClient,\n MixpanelPeople,\n MixpanelGroups,\n} from '../types';\n\nconst noop = (() => {}) as (...args: unknown[]) => void;\n\nconst noopPeople: MixpanelPeople = {\n set: noop,\n set_once: noop,\n increment: noop,\n append: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_user: noop,\n};\n\nconst noopGroups: MixpanelGroups = {\n set: noop,\n set_once: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_group: noop,\n};\n\n/**\n * Mock Mixpanel factory that returns a no-op client instance.\n * Tests replace individual methods with spies.\n */\nfunction mockInit(): MixpanelClient {\n return {\n track: noop,\n import: noop,\n alias: noop,\n people: { ...noopPeople },\n groups: { ...noopGroups },\n };\n}\n\n/**\n * Standard mock environment for push operations.\n * The test runner clones this and replaces methods with spies.\n */\nexport const push: Env = {\n Mixpanel: { init: mockInit as (...args: unknown[]) => MixpanelClient },\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:Mixpanel.init',\n 'call:mp.track',\n 'call:mp.import',\n 'call:mp.alias',\n 'call:mp.people.set',\n 'call:mp.people.set_once',\n 'call:mp.people.increment',\n 'call:mp.people.append',\n 'call:mp.people.union',\n 'call:mp.people.remove',\n 'call:mp.people.unset',\n 'call:mp.people.delete_user',\n 'call:mp.groups.set',\n 'call:mp.groups.set_once',\n 'call:mp.groups.union',\n 'call:mp.groups.remove',\n 'call:mp.groups.unset',\n 'call:mp.groups.delete_group',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Mixpanel server SDK step examples.\n *\n * At push time, the destination calls the `mixpanel` Node SDK via the\n * client returned from `Mixpanel.init(...)`. Public method paths users\n * see on the client are:\n *\n * - `mp.track(eventName, properties)`\n * - `mp.import(eventName, time, properties)` (when `useImport: true`)\n * - `mp.alias(distinctId, alias)` (fires before track)\n * - `mp.people.{set,set_once,increment,append,union,remove,unset,delete_user}(...)`\n * - `mp.groups.{set,set_once,union,remove,unset,delete_group}(...)`\n *\n * Each `out` is `[[callable, ...args], ...]`. The test filters out the\n * one-time `Mixpanel.init` call (fired during destination init) so only\n * per-event SDK calls are compared.\n *\n * For events marked `silent: true` or `ignore: true`, `track()` does not\n * fire - only the side-effect calls (people/groups/alias) appear.\n */\n\n/**\n * Step examples may carry destination-level settings and configInclude.\n * The test runner reads these to configure the destination.\n */\nexport type MixpanelStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n configInclude?: string[];\n};\n\n/**\n * Default event forwarding - every walkerOS event becomes\n * mp.track(event.name, { distinct_id, ...properties }).\n * With default settings.identify resolving user.id.\n */\nexport const defaultEventForwarding: MixpanelStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.',\n in: getEvent('product view', { timestamp: 1700000100 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.track', 'product view', { distinct_id: 'us3r' }]],\n};\n\n/**\n * Track with include - flattens walkerOS `data` section into\n * prefixed track() properties.\n */\nexport const trackWithInclude: MixpanelStepExample = {\n title: 'Track with include',\n description:\n 'A destination-level include flattens the event data section into prefixed Mixpanel track properties.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n configInclude: ['data'],\n out: [\n [\n 'mp.track',\n 'product view',\n {\n distinct_id: 'us3r',\n data_id: 'ers',\n data_name: 'Everyday Ruck Snack',\n data_color: 'black',\n data_size: 'l',\n data_price: 420,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify - mapping-level settings.identify overrides\n * destination-level default.\n */\nexport const perEventIdentify: MixpanelStepExample = {\n title: 'Per-event identify',\n description:\n 'A mapping-level identify overrides the destination default to resolve the distinct_id from event data.',\n in: getEvent('user login', {\n timestamp: 1700000102,\n data: {\n user_id: 'resolved-id',\n plan: 'premium',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'user login',\n {\n distinct_id: 'resolved-id',\n },\n ],\n ],\n};\n\n/**\n * Track with group - group key/id attached as track property.\n */\nexport const trackWithGroup: MixpanelStepExample = {\n title: 'Track with group',\n description:\n 'A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.',\n in: getEvent('page view', {\n timestamp: 1700000103,\n data: {\n company_id: 'acme',\n },\n }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n mapping: {\n settings: {\n group: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'page view',\n {\n distinct_id: 'us3r',\n company_id: 'acme',\n },\n ],\n ],\n};\n\n/**\n * User login with people operations - silent: true suppresses track,\n * only identity + people side effects fire.\n */\nexport const userLoginPeopleSet: MixpanelStepExample = {\n title: 'User login people',\n description:\n 'A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.',\n in: getEvent('user login', {\n timestamp: 1700000104,\n data: {\n user_id: 'new-user-123',\n plan: 'premium',\n company: 'Acme',\n email: 'user@acme.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n plan: 'data.plan',\n company: 'data.company',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n first_login: 'timestamp',\n },\n },\n increment: {\n map: {\n login_count: { value: 1 },\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.people.set',\n 'new-user-123',\n { plan: 'premium', company: 'Acme', email: 'user@acme.com' },\n ],\n ['mp.people.set_once', 'new-user-123', { first_login: 1700000104 }],\n ['mp.people.increment', 'new-user-123', { login_count: 1 }],\n ],\n};\n\n/**\n * Common people operation vocabulary - exercises set, set_once, increment,\n * append, union, remove, unset. (delete_user is intentionally not covered\n * by this example.)\n */\nexport const allPeopleOperations: MixpanelStepExample = {\n title: 'Common people operations',\n description:\n 'A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n name: 'Jane Doe',\n email: 'jane@acme.com',\n page: '/docs/getting-started',\n removed_tag: 'trial',\n source: 'referral',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n name: 'data.name',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n signup_source: 'data.source',\n },\n },\n increment: {\n map: {\n page_views: { value: 1 },\n },\n },\n append: {\n map: {\n visited_pages: 'data.page',\n },\n },\n union: {\n map: {\n unique_tags: { value: ['active'] },\n },\n },\n remove: {\n map: {\n tags: 'data.removed_tag',\n },\n },\n unset: { value: ['old_plan'] },\n },\n },\n },\n },\n out: [\n ['mp.people.set', 'us3r', { name: 'Jane Doe', email: 'jane@acme.com' }],\n ['mp.people.set_once', 'us3r', { signup_source: 'referral' }],\n ['mp.people.increment', 'us3r', { page_views: 1 }],\n ['mp.people.append', 'us3r', { visited_pages: '/docs/getting-started' }],\n ['mp.people.union', 'us3r', { unique_tags: ['active'] }],\n ['mp.people.remove', 'us3r', { tags: 'trial' }],\n ['mp.people.unset', 'us3r', ['old_plan']],\n ],\n};\n\n/**\n * Group profile operations - settings.groupProfile with set and set_once.\n */\nexport const companyGroupProfile: MixpanelStepExample = {\n title: 'Group profile',\n description:\n 'A company update sets Mixpanel group profile properties via groups.set and groups.set_once.',\n in: getEvent('company update', {\n timestamp: 1700000106,\n data: {\n company_id: 'acme-inc',\n company_name: 'Acme, Inc.',\n plan: 'enterprise',\n employee_count: 250,\n founded_year: 2010,\n },\n }),\n mapping: {\n silent: true,\n settings: {\n groupProfile: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n set: {\n map: {\n name: 'data.company_name',\n plan: 'data.plan',\n employee_count: 'data.employee_count',\n },\n },\n set_once: {\n map: {\n founded: 'data.founded_year',\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.groups.set',\n 'company_id',\n 'acme-inc',\n { name: 'Acme, Inc.', plan: 'enterprise', employee_count: 250 },\n ],\n ['mp.groups.set_once', 'company_id', 'acme-inc', { founded: 2010 }],\n ],\n};\n\n/**\n * Historical import - useImport: true uses mp.import() instead of mp.track().\n */\nexport const historicalImport: MixpanelStepExample = {\n title: 'Historical import',\n description:\n 'Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.',\n in: getEvent('order complete', {\n timestamp: 1700000107,\n data: {\n total: 99.99,\n },\n }),\n settings: {\n useImport: true,\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.import', 'order complete', 1700000107, { distinct_id: 'us3r' }]],\n};\n\n/**\n * Alias - legacy identity merge. Fires mp.alias before track.\n */\nexport const aliasBeforeTrack: MixpanelStepExample = {\n title: 'Alias before track',\n description:\n 'A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.',\n in: getEvent('user login', {\n timestamp: 1700000108,\n data: {\n user_id: 'new-user-456',\n anon_id: 'anon-789',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n alias: 'data.anon_id',\n },\n },\n },\n },\n out: [\n ['mp.alias', 'new-user-456', 'anon-789'],\n ['mp.track', 'user login', { distinct_id: 'new-user-456' }],\n ],\n};\n\n/**\n * Wildcard ignore - the rule matches but does nothing.\n */\nexport const wildcardIgnored: MixpanelStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000109 }),\n mapping: { ignore: true },\n out: [],\n};\n"],"mappings":"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","names":["z"]}
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 apiKey: z\n .string()\n .min(1)\n .describe(\n 'Your Mixpanel project token. Find it in Project Settings > Access Keys. Passed as the first argument to Mixpanel.init().',\n ),\n secret: z\n .string()\n .describe(\n 'API secret for the /import endpoint (historical data). Required when useImport is true.',\n )\n .optional(),\n host: z\n .string()\n .describe(\n \"Mixpanel API host. Default: 'api.mixpanel.com' (US). Use 'api-eu.mixpanel.com' (EU) or 'api-in.mixpanel.com' (India).\",\n )\n .optional(),\n protocol: z\n .string()\n .describe(\"Protocol for API requests. Default: 'https'.\")\n .optional(),\n keepAlive: z\n .boolean()\n .describe('Reuse HTTP connections. Default: true.')\n .optional(),\n geolocate: z\n .boolean()\n .describe(\n 'Parse IP for geolocation. Default: false. Server IP caveat: all users map to server location unless $ip is overridden.',\n )\n .optional(),\n debug: z\n .boolean()\n .describe('Enable SDK debug logging. Default: false.')\n .optional(),\n verbose: z\n .boolean()\n .describe('Enable verbose request logging. Default: false.')\n .optional(),\n test: z.boolean().describe('Enable dry-run mode. Default: false.').optional(),\n useImport: z\n .boolean()\n .describe(\n 'Use /import endpoint instead of /track. Accepts events of any age (no 5-day limit). Requires secret for authentication.',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'walkerOS mapping value resolving to { distinctId, alias? }. distinctId is passed as distinct_id on every SDK call.',\n )\n .optional(),\n include: z\n .unknown()\n .describe(\n \"Event data sections to flatten into track() properties. Example: ['data', 'globals']. Sections are prefixed (data_, globals_, etc.).\",\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\nexport const MappingSchema = z.object({\n identify: z\n .unknown()\n .describe(\n 'Per-event identity mapping. Resolves to { distinctId, alias? }. distinctId is passed as distinct_id to all SDK calls.',\n )\n .optional(),\n people: z\n .unknown()\n .describe(\n 'Per-event people operations. Resolves to an object with any of: set, set_once, increment, append, union, remove, unset, delete_user. Each key fires a separate mp.people.* call with distinct_id as first arg.',\n )\n .optional(),\n group: z\n .unknown()\n .describe(\n 'Per-event group association. Resolves to { key, id }. The group key/id is added as a track() property.',\n )\n .optional(),\n groupProfile: z\n .unknown()\n .describe(\n 'Per-event group profile operations. Resolves to { key, id, set?, set_once?, union?, remove?, unset?, delete? }. Fires mp.groups.* calls.',\n )\n .optional(),\n useImport: z\n .unknown()\n .describe(\n 'Per-event import flag. When truthy, uses mp.import() instead of mp.track() for this rule.',\n )\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 {\n Env,\n MixpanelClient,\n MixpanelPeople,\n MixpanelGroups,\n} from '../types';\n\n/**\n * The SDK reports completion through an optional trailing callback, which the\n * destination awaits; call it so a simulated push completes.\n */\nconst noop = (...args: unknown[]): void => {\n const callback = args[args.length - 1];\n if (typeof callback === 'function') callback();\n};\n\nconst noopPeople: MixpanelPeople = {\n set: noop,\n set_once: noop,\n increment: noop,\n append: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_user: noop,\n};\n\nconst noopGroups: MixpanelGroups = {\n set: noop,\n set_once: noop,\n union: noop,\n remove: noop,\n unset: noop,\n delete_group: noop,\n};\n\n/**\n * Mock Mixpanel factory that returns a no-op client instance.\n * Tests replace individual methods with spies.\n */\nfunction mockInit(): MixpanelClient {\n return {\n track: noop,\n import: noop,\n alias: noop,\n people: { ...noopPeople },\n groups: { ...noopGroups },\n };\n}\n\n/**\n * Standard mock environment for push operations.\n * The test runner clones this and replaces methods with spies.\n */\nexport const push: Env = {\n Mixpanel: { init: mockInit },\n};\n\n/**\n * Simulation tracking paths for CLI --simulate. `init` carries the token and is\n * not recorded; the paths walk through its result to the request calls.\n */\nexport const simulation = [\n 'call:Mixpanel.init.track',\n 'call:Mixpanel.init.import',\n 'call:Mixpanel.init.alias',\n 'call:Mixpanel.init.people.set',\n 'call:Mixpanel.init.people.set_once',\n 'call:Mixpanel.init.people.increment',\n 'call:Mixpanel.init.people.append',\n 'call:Mixpanel.init.people.union',\n 'call:Mixpanel.init.people.remove',\n 'call:Mixpanel.init.people.unset',\n 'call:Mixpanel.init.people.delete_user',\n 'call:Mixpanel.init.groups.set',\n 'call:Mixpanel.init.groups.set_once',\n 'call:Mixpanel.init.groups.union',\n 'call:Mixpanel.init.groups.remove',\n 'call:Mixpanel.init.groups.unset',\n 'call:Mixpanel.init.groups.delete_group',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Mixpanel server SDK step examples.\n *\n * At push time, the destination calls the `mixpanel` Node SDK via the\n * client returned from `Mixpanel.init(...)`. Public method paths users\n * see on the client are:\n *\n * - `mp.track(eventName, properties)`\n * - `mp.import(eventName, time, properties)` (when `useImport: true`)\n * - `mp.alias(distinctId, alias)` (fires before track)\n * - `mp.people.{set,set_once,increment,append,union,remove,unset,delete_user}(...)`\n * - `mp.groups.{set,set_once,union,remove,unset,delete_group}(...)`\n *\n * Each `out` is `[[callable, ...args], ...]`. The test filters out the\n * one-time `Mixpanel.init` call (fired during destination init) so only\n * per-event SDK calls are compared.\n *\n * For events marked `silent: true` or `ignore: true`, `track()` does not\n * fire - only the side-effect calls (people/groups/alias) appear.\n */\n\n/**\n * Step examples may carry destination-level settings and configInclude.\n * The test runner reads these to configure the destination.\n */\nexport type MixpanelStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n configInclude?: string[];\n};\n\n/**\n * Default event forwarding - every walkerOS event becomes\n * mp.track(event.name, { distinct_id, ...properties }).\n * With default settings.identify resolving user.id.\n */\nexport const defaultEventForwarding: MixpanelStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Mixpanel as a track call with the user id as the distinct_id.',\n in: getEvent('product view', { timestamp: 1700000100 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.track', 'product view', { distinct_id: 'us3r' }]],\n};\n\n/**\n * Track with include - flattens walkerOS `data` section into\n * prefixed track() properties.\n */\nexport const trackWithInclude: MixpanelStepExample = {\n title: 'Track with include',\n description:\n 'A destination-level include flattens the event data section into prefixed Mixpanel track properties.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n configInclude: ['data'],\n out: [\n [\n 'mp.track',\n 'product view',\n {\n distinct_id: 'us3r',\n data_id: 'ers',\n data_name: 'Everyday Ruck Snack',\n data_color: 'black',\n data_size: 'l',\n data_price: 420,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify - mapping-level settings.identify overrides\n * destination-level default.\n */\nexport const perEventIdentify: MixpanelStepExample = {\n title: 'Per-event identify',\n description:\n 'A mapping-level identify overrides the destination default to resolve the distinct_id from event data.',\n in: getEvent('user login', {\n timestamp: 1700000102,\n data: {\n user_id: 'resolved-id',\n plan: 'premium',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'user login',\n {\n distinct_id: 'resolved-id',\n },\n ],\n ],\n};\n\n/**\n * Track with group - group key/id attached as track property.\n */\nexport const trackWithGroup: MixpanelStepExample = {\n title: 'Track with group',\n description:\n 'A group key and id are attached as a Mixpanel track property so the event is associated with a company or account.',\n in: getEvent('page view', {\n timestamp: 1700000103,\n data: {\n company_id: 'acme',\n },\n }),\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n mapping: {\n settings: {\n group: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n },\n },\n },\n },\n out: [\n [\n 'mp.track',\n 'page view',\n {\n distinct_id: 'us3r',\n company_id: 'acme',\n },\n ],\n ],\n};\n\n/**\n * User login with people operations - silent: true suppresses track,\n * only identity + people side effects fire.\n */\nexport const userLoginPeopleSet: MixpanelStepExample = {\n title: 'User login people',\n description:\n 'A user login fires Mixpanel people.set, set_once, and increment operations without sending a track event.',\n in: getEvent('user login', {\n timestamp: 1700000104,\n data: {\n user_id: 'new-user-123',\n plan: 'premium',\n company: 'Acme',\n email: 'user@acme.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n plan: 'data.plan',\n company: 'data.company',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n first_login: 'timestamp',\n },\n },\n increment: {\n map: {\n login_count: { value: 1 },\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.people.set',\n 'new-user-123',\n { plan: 'premium', company: 'Acme', email: 'user@acme.com' },\n ],\n ['mp.people.set_once', 'new-user-123', { first_login: 1700000104 }],\n ['mp.people.increment', 'new-user-123', { login_count: 1 }],\n ],\n};\n\n/**\n * Common people operation vocabulary - exercises set, set_once, increment,\n * append, union, remove, unset. (delete_user is intentionally not covered\n * by this example.)\n */\nexport const allPeopleOperations: MixpanelStepExample = {\n title: 'Common people operations',\n description:\n 'A profile update exercises the common Mixpanel people vocabulary: set, set_once, increment, append, union, remove, and unset. delete_user is not covered by this example.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n name: 'Jane Doe',\n email: 'jane@acme.com',\n page: '/docs/getting-started',\n removed_tag: 'trial',\n source: 'referral',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n people: {\n map: {\n set: {\n map: {\n name: 'data.name',\n email: 'data.email',\n },\n },\n set_once: {\n map: {\n signup_source: 'data.source',\n },\n },\n increment: {\n map: {\n page_views: { value: 1 },\n },\n },\n append: {\n map: {\n visited_pages: 'data.page',\n },\n },\n union: {\n map: {\n unique_tags: { value: ['active'] },\n },\n },\n remove: {\n map: {\n tags: 'data.removed_tag',\n },\n },\n unset: { value: ['old_plan'] },\n },\n },\n },\n },\n out: [\n ['mp.people.set', 'us3r', { name: 'Jane Doe', email: 'jane@acme.com' }],\n ['mp.people.set_once', 'us3r', { signup_source: 'referral' }],\n ['mp.people.increment', 'us3r', { page_views: 1 }],\n ['mp.people.append', 'us3r', { visited_pages: '/docs/getting-started' }],\n ['mp.people.union', 'us3r', { unique_tags: ['active'] }],\n ['mp.people.remove', 'us3r', { tags: 'trial' }],\n ['mp.people.unset', 'us3r', ['old_plan']],\n ],\n};\n\n/**\n * Group profile operations - settings.groupProfile with set and set_once.\n */\nexport const companyGroupProfile: MixpanelStepExample = {\n title: 'Group profile',\n description:\n 'A company update sets Mixpanel group profile properties via groups.set and groups.set_once.',\n in: getEvent('company update', {\n timestamp: 1700000106,\n data: {\n company_id: 'acme-inc',\n company_name: 'Acme, Inc.',\n plan: 'enterprise',\n employee_count: 250,\n founded_year: 2010,\n },\n }),\n mapping: {\n silent: true,\n settings: {\n groupProfile: {\n map: {\n key: { value: 'company_id' },\n id: 'data.company_id',\n set: {\n map: {\n name: 'data.company_name',\n plan: 'data.plan',\n employee_count: 'data.employee_count',\n },\n },\n set_once: {\n map: {\n founded: 'data.founded_year',\n },\n },\n },\n },\n },\n },\n out: [\n [\n 'mp.groups.set',\n 'company_id',\n 'acme-inc',\n { name: 'Acme, Inc.', plan: 'enterprise', employee_count: 250 },\n ],\n ['mp.groups.set_once', 'company_id', 'acme-inc', { founded: 2010 }],\n ],\n};\n\n/**\n * Historical import - useImport: true uses mp.import() instead of mp.track().\n */\nexport const historicalImport: MixpanelStepExample = {\n title: 'Historical import',\n description:\n 'Setting useImport routes the event through mp.import for backfilling historical Mixpanel data.',\n in: getEvent('order complete', {\n timestamp: 1700000107,\n data: {\n total: 99.99,\n },\n }),\n settings: {\n useImport: true,\n identify: {\n map: {\n distinctId: 'user.id',\n },\n },\n },\n out: [['mp.import', 'order complete', 1700000107, { distinct_id: 'us3r' }]],\n};\n\n/**\n * Alias - legacy identity merge. Fires mp.alias before track.\n */\nexport const aliasBeforeTrack: MixpanelStepExample = {\n title: 'Alias before track',\n description:\n 'A user login merges a prior anonymous id into the new user id via mp.alias before sending the track event.',\n in: getEvent('user login', {\n timestamp: 1700000108,\n data: {\n user_id: 'new-user-456',\n anon_id: 'anon-789',\n },\n }),\n mapping: {\n settings: {\n identify: {\n map: {\n distinctId: 'data.user_id',\n alias: 'data.anon_id',\n },\n },\n },\n },\n out: [\n ['mp.alias', 'new-user-456', 'anon-789'],\n ['mp.track', 'user login', { distinct_id: 'new-user-456' }],\n ],\n};\n\n/**\n * Wildcard ignore - the rule matches but does nothing.\n */\nexport const wildcardIgnored: MixpanelStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000109 }),\n mapping: { ignore: true },\n out: [],\n};\n"],"mappings":"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","names":["z"]}
@@ -70,7 +70,10 @@ interface Env extends DestinationServer.Env {
70
70
  * The test runner clones this and replaces methods with spies.
71
71
  */
72
72
  declare const push: Env;
73
- /** Simulation tracking paths for CLI --simulate. */
73
+ /**
74
+ * Simulation tracking paths for CLI --simulate. `init` carries the token and is
75
+ * not recorded; the paths walk through its result to the request calls.
76
+ */
74
77
  declare const simulation: string[];
75
78
 
76
79
  declare const env_push: typeof push;
@@ -70,7 +70,10 @@ interface Env extends DestinationServer.Env {
70
70
  * The test runner clones this and replaces methods with spies.
71
71
  */
72
72
  declare const push: Env;
73
- /** Simulation tracking paths for CLI --simulate. */
73
+ /**
74
+ * Simulation tracking paths for CLI --simulate. `init` carries the token and is
75
+ * not recorded; the paths walk through its result to the request calls.
76
+ */
74
77
  declare const simulation: string[];
75
78
 
76
79
  declare const env_push: typeof push;
@@ -31,8 +31,10 @@ __export(env_exports, {
31
31
  push: () => push,
32
32
  simulation: () => simulation
33
33
  });
34
- var noop = (() => {
35
- });
34
+ var noop = (...args) => {
35
+ const callback = args[args.length - 1];
36
+ if (typeof callback === "function") callback();
37
+ };
36
38
  var noopPeople = {
37
39
  set: noop,
38
40
  set_once: noop,
@@ -64,24 +66,23 @@ var push = {
64
66
  Mixpanel: { init: mockInit }
65
67
  };
66
68
  var simulation = [
67
- "call:Mixpanel.init",
68
- "call:mp.track",
69
- "call:mp.import",
70
- "call:mp.alias",
71
- "call:mp.people.set",
72
- "call:mp.people.set_once",
73
- "call:mp.people.increment",
74
- "call:mp.people.append",
75
- "call:mp.people.union",
76
- "call:mp.people.remove",
77
- "call:mp.people.unset",
78
- "call:mp.people.delete_user",
79
- "call:mp.groups.set",
80
- "call:mp.groups.set_once",
81
- "call:mp.groups.union",
82
- "call:mp.groups.remove",
83
- "call:mp.groups.unset",
84
- "call:mp.groups.delete_group"
69
+ "call:Mixpanel.init.track",
70
+ "call:Mixpanel.init.import",
71
+ "call:Mixpanel.init.alias",
72
+ "call:Mixpanel.init.people.set",
73
+ "call:Mixpanel.init.people.set_once",
74
+ "call:Mixpanel.init.people.increment",
75
+ "call:Mixpanel.init.people.append",
76
+ "call:Mixpanel.init.people.union",
77
+ "call:Mixpanel.init.people.remove",
78
+ "call:Mixpanel.init.people.unset",
79
+ "call:Mixpanel.init.people.delete_user",
80
+ "call:Mixpanel.init.groups.set",
81
+ "call:Mixpanel.init.groups.set_once",
82
+ "call:Mixpanel.init.groups.union",
83
+ "call:Mixpanel.init.groups.remove",
84
+ "call:Mixpanel.init.groups.unset",
85
+ "call:Mixpanel.init.groups.delete_group"
85
86
  ];
86
87
 
87
88
  // src/examples/step.ts
@@ -10,8 +10,10 @@ __export(env_exports, {
10
10
  push: () => push,
11
11
  simulation: () => simulation
12
12
  });
13
- var noop = (() => {
14
- });
13
+ var noop = (...args) => {
14
+ const callback = args[args.length - 1];
15
+ if (typeof callback === "function") callback();
16
+ };
15
17
  var noopPeople = {
16
18
  set: noop,
17
19
  set_once: noop,
@@ -43,24 +45,23 @@ var push = {
43
45
  Mixpanel: { init: mockInit }
44
46
  };
45
47
  var simulation = [
46
- "call:Mixpanel.init",
47
- "call:mp.track",
48
- "call:mp.import",
49
- "call:mp.alias",
50
- "call:mp.people.set",
51
- "call:mp.people.set_once",
52
- "call:mp.people.increment",
53
- "call:mp.people.append",
54
- "call:mp.people.union",
55
- "call:mp.people.remove",
56
- "call:mp.people.unset",
57
- "call:mp.people.delete_user",
58
- "call:mp.groups.set",
59
- "call:mp.groups.set_once",
60
- "call:mp.groups.union",
61
- "call:mp.groups.remove",
62
- "call:mp.groups.unset",
63
- "call:mp.groups.delete_group"
48
+ "call:Mixpanel.init.track",
49
+ "call:Mixpanel.init.import",
50
+ "call:Mixpanel.init.alias",
51
+ "call:Mixpanel.init.people.set",
52
+ "call:Mixpanel.init.people.set_once",
53
+ "call:Mixpanel.init.people.increment",
54
+ "call:Mixpanel.init.people.append",
55
+ "call:Mixpanel.init.people.union",
56
+ "call:Mixpanel.init.people.remove",
57
+ "call:Mixpanel.init.people.unset",
58
+ "call:Mixpanel.init.people.delete_user",
59
+ "call:Mixpanel.init.groups.set",
60
+ "call:Mixpanel.init.groups.set_once",
61
+ "call:Mixpanel.init.groups.union",
62
+ "call:Mixpanel.init.groups.remove",
63
+ "call:Mixpanel.init.groups.unset",
64
+ "call:Mixpanel.init.groups.delete_group"
64
65
  ];
65
66
 
66
67
  // src/examples/step.ts
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-destination-mixpanel",
4
- "version": "4.7.0-next-1790245733116",
4
+ "version": "4.7.0",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "server"
8
8
  ],
9
+ "exports": {},
9
10
  "docs": "https://www.walkeros.io/docs/destinations/server/mixpanel",
10
11
  "source": "https://github.com/elbwalker/walkerOS/tree/main/packages/server/destinations/mixpanel/src"
11
12
  },
@@ -100,24 +101,23 @@
100
101
  }
101
102
  },
102
103
  "simulation": [
103
- "call:Mixpanel.init",
104
- "call:mp.track",
105
- "call:mp.import",
106
- "call:mp.alias",
107
- "call:mp.people.set",
108
- "call:mp.people.set_once",
109
- "call:mp.people.increment",
110
- "call:mp.people.append",
111
- "call:mp.people.union",
112
- "call:mp.people.remove",
113
- "call:mp.people.unset",
114
- "call:mp.people.delete_user",
115
- "call:mp.groups.set",
116
- "call:mp.groups.set_once",
117
- "call:mp.groups.union",
118
- "call:mp.groups.remove",
119
- "call:mp.groups.unset",
120
- "call:mp.groups.delete_group"
104
+ "call:Mixpanel.init.track",
105
+ "call:Mixpanel.init.import",
106
+ "call:Mixpanel.init.alias",
107
+ "call:Mixpanel.init.people.set",
108
+ "call:Mixpanel.init.people.set_once",
109
+ "call:Mixpanel.init.people.increment",
110
+ "call:Mixpanel.init.people.append",
111
+ "call:Mixpanel.init.people.union",
112
+ "call:Mixpanel.init.people.remove",
113
+ "call:Mixpanel.init.people.unset",
114
+ "call:Mixpanel.init.people.delete_user",
115
+ "call:Mixpanel.init.groups.set",
116
+ "call:Mixpanel.init.groups.set_once",
117
+ "call:Mixpanel.init.groups.union",
118
+ "call:Mixpanel.init.groups.remove",
119
+ "call:Mixpanel.init.groups.unset",
120
+ "call:Mixpanel.init.groups.delete_group"
121
121
  ]
122
122
  },
123
123
  "step": {
@@ -158,7 +158,7 @@
158
158
  "consent": {
159
159
  "functional": true
160
160
  },
161
- "id": "b441e2b5dd4cd584",
161
+ "id": "1690b7377b5e4795",
162
162
  "trigger": "test",
163
163
  "entity": "user",
164
164
  "action": "login",
@@ -236,7 +236,7 @@
236
236
  "consent": {
237
237
  "functional": true
238
238
  },
239
- "id": "17b9e60cf9e7c1b1",
239
+ "id": "7e51b193d3d44b77",
240
240
  "trigger": "test",
241
241
  "entity": "profile",
242
242
  "action": "update",
@@ -400,7 +400,7 @@
400
400
  "consent": {
401
401
  "functional": true
402
402
  },
403
- "id": "92d8a74321a55f19",
403
+ "id": "c5c5161b949675ac",
404
404
  "trigger": "test",
405
405
  "entity": "company",
406
406
  "action": "update",
@@ -492,7 +492,7 @@
492
492
  "consent": {
493
493
  "functional": true
494
494
  },
495
- "id": "5bab771baa012d9e",
495
+ "id": "5448dabe6d871906",
496
496
  "trigger": "load",
497
497
  "entity": "product",
498
498
  "action": "view",
@@ -598,7 +598,7 @@
598
598
  "consent": {
599
599
  "functional": true
600
600
  },
601
- "id": "0a3e25190722c780",
601
+ "id": "44bbd35d81a15c35",
602
602
  "trigger": "load",
603
603
  "entity": "order",
604
604
  "action": "complete",
@@ -667,7 +667,7 @@
667
667
  "consent": {
668
668
  "functional": true
669
669
  },
670
- "id": "3baaee50e34a9ec7",
670
+ "id": "7ca2a169e682f704",
671
671
  "trigger": "test",
672
672
  "entity": "user",
673
673
  "action": "login",
@@ -735,7 +735,7 @@
735
735
  "consent": {
736
736
  "functional": true
737
737
  },
738
- "id": "c6217ac098b8a84b",
738
+ "id": "cee9656c2f183305",
739
739
  "trigger": "load",
740
740
  "entity": "page",
741
741
  "action": "view",
@@ -811,7 +811,7 @@
811
811
  "consent": {
812
812
  "functional": true
813
813
  },
814
- "id": "2949e362e0fddd71",
814
+ "id": "f6cf74f558ae8139",
815
815
  "trigger": "load",
816
816
  "entity": "product",
817
817
  "action": "view",
@@ -888,7 +888,7 @@
888
888
  "consent": {
889
889
  "functional": true
890
890
  },
891
- "id": "0f3b5c232d78ca64",
891
+ "id": "22b40931c4de5aca",
892
892
  "trigger": "test",
893
893
  "entity": "user",
894
894
  "action": "login",
@@ -1002,7 +1002,7 @@
1002
1002
  "consent": {
1003
1003
  "functional": true
1004
1004
  },
1005
- "id": "d0a7045e38aad229",
1005
+ "id": "d5bcae9e1a05dfc5",
1006
1006
  "trigger": "test",
1007
1007
  "entity": "debug",
1008
1008
  "action": "noise",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-destination-mixpanel",
3
3
  "description": "Mixpanel server destination for walkerOS",
4
- "version": "4.7.0-next-1790245733116",
4
+ "version": "4.7.0",
5
5
  "license": "MIT",
6
6
  "exports": {
7
7
  ".": {
@@ -35,12 +35,12 @@
35
35
  "update": "npx npm-check-updates -u && npm update"
36
36
  },
37
37
  "dependencies": {
38
- "@walkeros/core": "4.7.0-next-1790245733116",
39
- "@walkeros/server-core": "4.7.0-next-1790245733116",
38
+ "@walkeros/core": "4.7.0",
39
+ "@walkeros/server-core": "4.7.0",
40
40
  "mixpanel": "^0.22.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@walkeros/collector": "4.7.0-next-1790245733116"
43
+ "@walkeros/collector": "4.7.0"
44
44
  },
45
45
  "repository": {
46
46
  "url": "git+https://github.com/elbwalker/walkerOS.git",