@walkeros/server-destination-customerio 3.4.1 → 4.0.0-next-1777463920154

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/README.md CHANGED
@@ -48,18 +48,18 @@ npm install @walkeros/server-destination-customerio
48
48
 
49
49
  Per-event mapping settings control which Customer.io methods are called:
50
50
 
51
- | Setting | Effect | Use with `skip: true` |
52
- | -------------- | ---------------------------------------------- | --------------------- |
53
- | `identify` | Calls `identify()` with attributes | Yes, for login events |
54
- | `page` | Calls `trackPageView()` with url | Yes, for page views |
55
- | `destroy` | Permanently deletes person | Yes |
56
- | `suppress` | Stops messaging (keeps data) | Yes |
57
- | `unsuppress` | Resumes messaging | Yes |
58
- | `addDevice` | Registers push device | Yes |
59
- | `deleteDevice` | Removes push device | Yes |
60
- | `merge` | Merges duplicate profiles | Yes |
61
- | `sendEmail` | Sends transactional email (requires appApiKey) | Yes |
62
- | `sendPush` | Sends transactional push (requires appApiKey) | Yes |
51
+ | Setting | Effect | Use with `silent: true` |
52
+ | -------------- | ---------------------------------------------- | ----------------------- |
53
+ | `identify` | Calls `identify()` with attributes | Yes, for login events |
54
+ | `page` | Calls `trackPageView()` with url | Yes, for page views |
55
+ | `destroy` | Permanently deletes person | Yes |
56
+ | `suppress` | Stops messaging (keeps data) | Yes |
57
+ | `unsuppress` | Resumes messaging | Yes |
58
+ | `addDevice` | Registers push device | Yes |
59
+ | `deleteDevice` | Removes push device | Yes |
60
+ | `merge` | Merges duplicate profiles | Yes |
61
+ | `sendEmail` | Sends transactional email (requires appApiKey) | Yes |
62
+ | `sendPush` | Sends transactional push (requires appApiKey) | Yes |
63
63
 
64
64
  ## Identity
65
65
 
package/dist/dev.d.mts CHANGED
@@ -154,12 +154,12 @@ declare const anonymousTrack: CustomerIoStepExample;
154
154
  */
155
155
  declare const destinationIdentify: CustomerIoStepExample;
156
156
  /**
157
- * Per-event identify with skip -- user login fires identify() only.
157
+ * Per-event identify with silent -- user login fires identify() only.
158
158
  */
159
159
  declare const userLoginIdentify: CustomerIoStepExample;
160
160
  /**
161
161
  * Page view -- fires trackClient.trackPageView() with url.
162
- * skip: true suppresses track(); settings.page fires trackPageView().
162
+ * silent: true suppresses track(); settings.page fires trackPageView().
163
163
  */
164
164
  declare const pageView: CustomerIoStepExample;
165
165
  /**
package/dist/dev.d.ts CHANGED
@@ -154,12 +154,12 @@ declare const anonymousTrack: CustomerIoStepExample;
154
154
  */
155
155
  declare const destinationIdentify: CustomerIoStepExample;
156
156
  /**
157
- * Per-event identify with skip -- user login fires identify() only.
157
+ * Per-event identify with silent -- user login fires identify() only.
158
158
  */
159
159
  declare const userLoginIdentify: CustomerIoStepExample;
160
160
  /**
161
161
  * Page view -- fires trackClient.trackPageView() with url.
162
- * skip: true suppresses track(); settings.page fires trackPageView().
162
+ * silent: true suppresses track(); settings.page fires trackPageView().
163
163
  */
164
164
  declare const pageView: CustomerIoStepExample;
165
165
  /**
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,s=Object.defineProperty,t=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a=(e,t)=>{for(var i in t)s(e,i,{get:t[i],enumerable:!0})},n={};a(n,{examples:()=>v,schemas:()=>o}),module.exports=(e=n,((e,a,n,o)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let p of i(a))r.call(e,p)||p===n||s(e,p,{get:()=>a[p],enumerable:!(o=t(a,p))||o.enumerable});return e})(s({},"__esModule",{value:!0}),e));var o={};a(o,{MappingSchema:()=>m,SettingsSchema:()=>u,mapping:()=>g,settings:()=>c});var p=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.object({siteId:l.z.string().min(1).describe("Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials."),apiKey:l.z.string().min(1).describe("Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials."),appApiKey:l.z.string().describe("App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.").optional(),region:l.z.enum(["us","eu"]).describe("Data center region. Must match where your Customer.io workspace was created. Default: us.").optional(),timeout:l.z.number().int().positive().describe("HTTP request timeout in milliseconds. Default: 10000.").optional(),customerId:l.z.string().describe("walkerOS mapping value path to resolve customerId from each event (like user.id).").optional(),anonymousId:l.z.string().describe("walkerOS mapping value path to resolve anonymousId from each event (like user.session).").optional(),identify:l.z.unknown().describe("Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.").optional()}),d=require("@walkeros/core/dev"),m=d.z.object({identify:d.z.unknown().describe("Per-event identify attributes. Resolves to { email?, first_name?, ... }. Use with skip: true on login/identify events.").optional(),page:d.z.unknown().describe("Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with skip: true.").optional(),destroy:d.z.boolean().describe("Permanently delete person from Customer.io. Set true on delete events with skip: true.").optional(),suppress:d.z.boolean().describe("Suppress person (stop messaging without deleting data). Set true with skip: true.").optional(),unsuppress:d.z.boolean().describe("Unsuppress person (resume messaging). Set true with skip: true.").optional(),addDevice:d.z.unknown().describe("Register push device. Resolves to { deviceId, platform, data? }. Use with skip: true.").optional(),deleteDevice:d.z.unknown().describe("Remove push device. Resolves to { deviceId, platform }. Use with skip: true.").optional(),merge:d.z.unknown().describe("Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with skip: true.").optional(),sendEmail:d.z.unknown().describe("Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.").optional(),sendPush:d.z.unknown().describe("Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.").optional()}),c=(0,p.zodToSchema)(u),g=(0,p.zodToSchema)(m),v={};a(v,{env:()=>k,step:()=>C});var k={};a(k,{push:()=>h,simulation:()=>w});var y=()=>Promise.resolve(),f=()=>Promise.resolve();var h={trackClient:{identify:()=>Promise.resolve(),track:()=>Promise.resolve(),trackAnonymous:()=>Promise.resolve(),trackPageView:()=>Promise.resolve(),destroy:y,suppress:y,unsuppress:y,addDevice:()=>Promise.resolve(),deleteDevice:()=>Promise.resolve(),mergeCustomers:()=>Promise.resolve()},apiClient:{sendEmail:f,sendPush:f}},w=["call:trackClient.identify","call:trackClient.track","call:trackClient.trackAnonymous","call:trackClient.trackPageView","call:trackClient.destroy","call:trackClient.suppress","call:trackClient.unsuppress","call:trackClient.addDevice","call:trackClient.deleteDevice","call:trackClient.mergeCustomers","call:apiClient.sendEmail","call:apiClient.sendPush"],C={};a(C,{anonymousTrack:()=>S,defaultTrack:()=>P,destinationIdentify:()=>I,destroyPerson:()=>R,mappedData:()=>z,mappedEventName:()=>A,pageView:()=>D,suppressPerson:()=>_,unsuppressPerson:()=>U,userLoginIdentify:()=>E,wildcardIgnored:()=>O});var b=require("@walkeros/core"),P={title:"Default track",description:"A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",in:(0,b.getEvent)("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},A={title:"Rename event",description:"A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",in:(0,b.getEvent)("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},z={title:"Mapped properties",description:"A data mapping transforms the event payload into Customer.io track properties for an order.",in:(0,b.getEvent)("order complete",{timestamp:1700000102,user:{id:"us3r",session:"s3ss10n"},data:{id:"0rd3r1d",total:555,currency:"EUR"}}),mapping:{name:"purchase",data:{map:{order_id:"data.id",value:"data.total",currency:"data.currency"}}},out:[["trackClient.track","us3r",{name:"purchase",data:{order_id:"0rd3r1d",value:555,currency:"EUR"},timestamp:17e5}]]},S={title:"Anonymous track",description:"When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",in:(0,b.getEvent)("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},I={title:"Destination identify",description:"Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",in:(0,b.getEvent)("page view",{timestamp:1700000104,user:{id:"us3r",session:"s3ss10n",email:"user@example.com"}}),settings:{identify:{map:{email:"user.email"}}},out:[["trackClient.identify","us3r",{email:"user@example.com"}],["trackClient.track","us3r",{name:"page view",data:{},timestamp:17e5}]]},E={title:"User login identify",description:"A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",in:(0,b.getEvent)("user login",{timestamp:1700000105,user:{id:"us3r",session:"s3ss10n"},data:{email:"user@acme.com",first_name:"Jane",plan:"premium"}}),mapping:{skip:!0,settings:{identify:{map:{email:"data.email",first_name:"data.first_name",plan:"data.plan"}}}},out:[["trackClient.identify","us3r",{email:"user@acme.com",first_name:"Jane",plan:"premium"}]]},D={title:"Page view",description:"A page view fires trackPageView with the URL and referrer instead of a generic track call.",in:(0,b.getEvent)("page view",{timestamp:1700000106,user:{id:"us3r",session:"s3ss10n"},data:{url:"https://example.com/pricing",referrer:"https://google.com"}}),mapping:{skip:!0,settings:{page:{map:{url:"data.url",referrer:"data.referrer"}}}},out:[["trackClient.trackPageView","us3r","https://example.com/pricing",{referrer:"https://google.com"}]]},R={title:"Destroy person",description:"A user delete event permanently removes the person from Customer.io via trackClient.destroy.",in:(0,b.getEvent)("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},_={title:"Suppress person",description:"A user suppress event stops messaging for the person without deleting their profile data.",in:(0,b.getEvent)("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},U={title:"Unsuppress person",description:"A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",in:(0,b.getEvent)("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},O={public:!1,in:(0,b.getEvent)("debug noise",{timestamp:1700000110,user:{id:"us3r",session:"s3ss10n"}}),mapping:{ignore:!0},out:[]};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,s=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,n=(e,s)=>{for(var i in s)t(e,i,{get:s[i],enumerable:!0})},a={};n(a,{examples:()=>v,schemas:()=>o}),module.exports=(e=a,((e,n,a,o)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let p of i(n))r.call(e,p)||p===a||t(e,p,{get:()=>n[p],enumerable:!(o=s(n,p))||o.enumerable});return e})(t({},"__esModule",{value:!0}),e));var o={};n(o,{MappingSchema:()=>m,SettingsSchema:()=>u,mapping:()=>g,settings:()=>c});var p=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.object({siteId:l.z.string().min(1).describe("Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials."),apiKey:l.z.string().min(1).describe("Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials."),appApiKey:l.z.string().describe("App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.").optional(),region:l.z.enum(["us","eu"]).describe("Data center region. Must match where your Customer.io workspace was created. Default: us.").optional(),timeout:l.z.number().int().positive().describe("HTTP request timeout in milliseconds. Default: 10000.").optional(),customerId:l.z.string().describe("walkerOS mapping value path to resolve customerId from each event (like user.id).").optional(),anonymousId:l.z.string().describe("walkerOS mapping value path to resolve anonymousId from each event (like user.session).").optional(),identify:l.z.unknown().describe("Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.").optional()}),d=require("@walkeros/core/dev"),m=d.z.object({identify:d.z.unknown().describe("Per-event identify attributes. Resolves to { email?, first_name?, ... }. Use with silent: true on login/identify events.").optional(),page:d.z.unknown().describe("Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with silent: true.").optional(),destroy:d.z.boolean().describe("Permanently delete person from Customer.io. Set true on delete events with silent: true.").optional(),suppress:d.z.boolean().describe("Suppress person (stop messaging without deleting data). Set true with silent: true.").optional(),unsuppress:d.z.boolean().describe("Unsuppress person (resume messaging). Set true with silent: true.").optional(),addDevice:d.z.unknown().describe("Register push device. Resolves to { deviceId, platform, data? }. Use with silent: true.").optional(),deleteDevice:d.z.unknown().describe("Remove push device. Resolves to { deviceId, platform }. Use with silent: true.").optional(),merge:d.z.unknown().describe("Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with silent: true.").optional(),sendEmail:d.z.unknown().describe("Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.").optional(),sendPush:d.z.unknown().describe("Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.").optional()}),c=(0,p.zodToSchema)(u),g=(0,p.zodToSchema)(m),v={};n(v,{env:()=>k,step:()=>C});var k={};n(k,{push:()=>h,simulation:()=>w});var y=()=>Promise.resolve(),f=()=>Promise.resolve();var h={trackClient:{identify:()=>Promise.resolve(),track:()=>Promise.resolve(),trackAnonymous:()=>Promise.resolve(),trackPageView:()=>Promise.resolve(),destroy:y,suppress:y,unsuppress:y,addDevice:()=>Promise.resolve(),deleteDevice:()=>Promise.resolve(),mergeCustomers:()=>Promise.resolve()},apiClient:{sendEmail:f,sendPush:f}},w=["call:trackClient.identify","call:trackClient.track","call:trackClient.trackAnonymous","call:trackClient.trackPageView","call:trackClient.destroy","call:trackClient.suppress","call:trackClient.unsuppress","call:trackClient.addDevice","call:trackClient.deleteDevice","call:trackClient.mergeCustomers","call:apiClient.sendEmail","call:apiClient.sendPush"],C={};n(C,{anonymousTrack:()=>S,defaultTrack:()=>P,destinationIdentify:()=>I,destroyPerson:()=>R,mappedData:()=>z,mappedEventName:()=>A,pageView:()=>D,suppressPerson:()=>_,unsuppressPerson:()=>U,userLoginIdentify:()=>E,wildcardIgnored:()=>O});var b=require("@walkeros/core"),P={title:"Default track",description:"A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",in:(0,b.getEvent)("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},A={title:"Rename event",description:"A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",in:(0,b.getEvent)("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},z={title:"Mapped properties",description:"A data mapping transforms the event payload into Customer.io track properties for an order.",in:(0,b.getEvent)("order complete",{timestamp:1700000102,user:{id:"us3r",session:"s3ss10n"},data:{id:"0rd3r1d",total:555,currency:"EUR"}}),mapping:{name:"purchase",data:{map:{order_id:"data.id",value:"data.total",currency:"data.currency"}}},out:[["trackClient.track","us3r",{name:"purchase",data:{order_id:"0rd3r1d",value:555,currency:"EUR"},timestamp:17e5}]]},S={title:"Anonymous track",description:"When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",in:(0,b.getEvent)("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},I={title:"Destination identify",description:"Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",in:(0,b.getEvent)("page view",{timestamp:1700000104,user:{id:"us3r",session:"s3ss10n",email:"user@example.com"}}),settings:{identify:{map:{email:"user.email"}}},out:[["trackClient.identify","us3r",{email:"user@example.com"}],["trackClient.track","us3r",{name:"page view",data:{},timestamp:17e5}]]},E={title:"User login identify",description:"A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",in:(0,b.getEvent)("user login",{timestamp:1700000105,user:{id:"us3r",session:"s3ss10n"},data:{email:"user@acme.com",first_name:"Jane",plan:"premium"}}),mapping:{silent:!0,settings:{identify:{map:{email:"data.email",first_name:"data.first_name",plan:"data.plan"}}}},out:[["trackClient.identify","us3r",{email:"user@acme.com",first_name:"Jane",plan:"premium"}]]},D={title:"Page view",description:"A page view fires trackPageView with the URL and referrer instead of a generic track call.",in:(0,b.getEvent)("page view",{timestamp:1700000106,user:{id:"us3r",session:"s3ss10n"},data:{url:"https://example.com/pricing",referrer:"https://google.com"}}),mapping:{silent:!0,settings:{page:{map:{url:"data.url",referrer:"data.referrer"}}}},out:[["trackClient.trackPageView","us3r","https://example.com/pricing",{referrer:"https://google.com"}]]},R={title:"Destroy person",description:"A user delete event permanently removes the person from Customer.io via trackClient.destroy.",in:(0,b.getEvent)("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},_={title:"Suppress person",description:"A user suppress event stops messaging for the person without deleting their profile data.",in:(0,b.getEvent)("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},U={title:"Unsuppress person",description:"A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",in:(0,b.getEvent)("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},O={public:!1,in:(0,b.getEvent)("debug noise",{timestamp:1700000110,user:{id:"us3r",session:"s3ss10n"}}),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 siteId: z\n .string()\n .min(1)\n .describe(\n 'Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n apiKey: z\n .string()\n .min(1)\n .describe(\n 'Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n appApiKey: z\n .string()\n .describe(\n 'App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.',\n )\n .optional(),\n region: z\n .enum(['us', 'eu'])\n .describe(\n 'Data center region. Must match where your Customer.io workspace was created. Default: us.',\n )\n .optional(),\n timeout: z\n .number()\n .int()\n .positive()\n .describe('HTTP request timeout in milliseconds. Default: 10000.')\n .optional(),\n customerId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve customerId from each event (like user.id).',\n )\n .optional(),\n anonymousId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve anonymousId from each event (like user.session).',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.',\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 identify attributes. Resolves to { email?, first_name?, ... }. Use with skip: true on login/identify events.',\n )\n .optional(),\n page: z\n .unknown()\n .describe(\n 'Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with skip: true.',\n )\n .optional(),\n destroy: z\n .boolean()\n .describe(\n 'Permanently delete person from Customer.io. Set true on delete events with skip: true.',\n )\n .optional(),\n suppress: z\n .boolean()\n .describe(\n 'Suppress person (stop messaging without deleting data). Set true with skip: true.',\n )\n .optional(),\n unsuppress: z\n .boolean()\n .describe('Unsuppress person (resume messaging). Set true with skip: true.')\n .optional(),\n addDevice: z\n .unknown()\n .describe(\n 'Register push device. Resolves to { deviceId, platform, data? }. Use with skip: true.',\n )\n .optional(),\n deleteDevice: z\n .unknown()\n .describe(\n 'Remove push device. Resolves to { deviceId, platform }. Use with skip: true.',\n )\n .optional(),\n merge: z\n .unknown()\n .describe(\n 'Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with skip: true.',\n )\n .optional(),\n sendEmail: z\n .unknown()\n .describe(\n 'Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.',\n )\n .optional(),\n sendPush: z\n .unknown()\n .describe(\n 'Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.',\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 CustomerIoTrackClientMock,\n CustomerIoApiClientMock,\n} from '../types';\n\ntype TrackNoArg = () => Promise<void>;\ntype TrackOne = (_id: string | number) => Promise<void>;\ntype TrackIdentify = (\n _id: string | number,\n _attrs: Record<string, unknown>,\n) => Promise<void>;\ntype TrackEvent = (\n _id: string | number,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackAnonymous = (\n _id: string,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackPage = (\n _id: string | number,\n _url: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackAddDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackDeleteDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n) => Promise<void>;\ntype TrackMerge = (\n _pt: string,\n _pi: string,\n _st: string,\n _si: string,\n) => Promise<void>;\ntype ApiSend = (_request: unknown) => Promise<void>;\n\nconst asyncIdentify: TrackIdentify = () => Promise.resolve();\nconst asyncEvent: TrackEvent = () => Promise.resolve();\nconst asyncAnonymous: TrackAnonymous = () => Promise.resolve();\nconst asyncPage: TrackPage = () => Promise.resolve();\nconst asyncOne: TrackOne = () => Promise.resolve();\nconst asyncAddDevice: TrackAddDevice = () => Promise.resolve();\nconst asyncDeleteDevice: TrackDeleteDevice = () => Promise.resolve();\nconst asyncMerge: TrackMerge = () => Promise.resolve();\nconst asyncSend: ApiSend = () => Promise.resolve();\n\n// Suppress unused warning for narrow helper aliases used below.\nvoid (null as unknown as TrackNoArg);\n\nfunction createMockTrackClient(): CustomerIoTrackClientMock {\n return {\n identify: asyncIdentify,\n track: asyncEvent,\n trackAnonymous: asyncAnonymous,\n trackPageView: asyncPage,\n destroy: asyncOne,\n suppress: asyncOne,\n unsuppress: asyncOne,\n addDevice: asyncAddDevice,\n deleteDevice: asyncDeleteDevice,\n mergeCustomers: asyncMerge,\n };\n}\n\nfunction createMockApiClient(): CustomerIoApiClientMock {\n return {\n sendEmail: asyncSend,\n sendPush: asyncSend,\n };\n}\n\nexport const push: Env = {\n trackClient: createMockTrackClient(),\n apiClient: createMockApiClient(),\n};\n\nexport const simulation = [\n 'call:trackClient.identify',\n 'call:trackClient.track',\n 'call:trackClient.trackAnonymous',\n 'call:trackClient.trackPageView',\n 'call:trackClient.destroy',\n 'call:trackClient.suppress',\n 'call:trackClient.unsuppress',\n 'call:trackClient.addDevice',\n 'call:trackClient.deleteDevice',\n 'call:trackClient.mergeCustomers',\n 'call:apiClient.sendEmail',\n 'call:apiClient.sendPush',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Extended step example that may carry destination-level settings overrides.\n */\nexport type CustomerIoStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- trackClient.track() with event name and data.\n * customerId resolved from default settings.customerId = 'user.id'.\n */\nexport const defaultTrack: CustomerIoStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.',\n in: getEvent('product view', {\n timestamp: 1700000100,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event for Customer.io.\n */\nexport const mappedEventName: CustomerIoStepExample = {\n title: 'Rename event',\n description:\n 'A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.',\n in: getEvent('order complete', {\n timestamp: 1700000101,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n name: 'purchase',\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Track with mapped data properties.\n */\nexport const mappedData: CustomerIoStepExample = {\n title: 'Mapped properties',\n description:\n 'A data mapping transforms the event payload into Customer.io track properties for an order.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n user: { id: 'us3r', session: 's3ss10n' },\n data: { id: '0rd3r1d', total: 555, currency: 'EUR' },\n }),\n mapping: {\n name: 'purchase',\n data: {\n map: {\n order_id: 'data.id',\n value: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: { order_id: '0rd3r1d', value: 555, currency: 'EUR' },\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Anonymous event -- no customerId resolved, falls back to trackAnonymous().\n */\nexport const anonymousTrack: CustomerIoStepExample = {\n title: 'Anonymous track',\n description:\n 'When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.',\n in: getEvent('product view', {\n timestamp: 1700000103,\n user: { session: 's3ss10n' },\n }),\n settings: {\n customerId: undefined,\n },\n out: [\n [\n 'trackClient.trackAnonymous',\n 's3ss10n',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Destination-level identify -- fires trackClient.identify() on first push\n * when settings.identify mapping resolves. Then fires trackClient.track().\n */\nexport const destinationIdentify: CustomerIoStepExample = {\n title: 'Destination identify',\n description:\n 'Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.',\n in: getEvent('page view', {\n timestamp: 1700000104,\n user: { id: 'us3r', session: 's3ss10n', email: 'user@example.com' },\n }),\n settings: {\n identify: {\n map: {\n email: 'user.email',\n },\n },\n },\n out: [\n ['trackClient.identify', 'us3r', { email: 'user@example.com' }],\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'page view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify with skip -- user login fires identify() only.\n */\nexport const userLoginIdentify: CustomerIoStepExample = {\n title: 'User login identify',\n description:\n 'A user login triggers only a Customer.io identify call with profile attributes, skipping the track.',\n in: getEvent('user login', {\n timestamp: 1700000105,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n email: 'user@acme.com',\n first_name: 'Jane',\n plan: 'premium',\n },\n }),\n mapping: {\n skip: true,\n settings: {\n identify: {\n map: {\n email: 'data.email',\n first_name: 'data.first_name',\n plan: 'data.plan',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.identify',\n 'us3r',\n { email: 'user@acme.com', first_name: 'Jane', plan: 'premium' },\n ],\n ],\n};\n\n/**\n * Page view -- fires trackClient.trackPageView() with url.\n * skip: true suppresses track(); settings.page fires trackPageView().\n */\nexport const pageView: CustomerIoStepExample = {\n title: 'Page view',\n description:\n 'A page view fires trackPageView with the URL and referrer instead of a generic track call.',\n in: getEvent('page view', {\n timestamp: 1700000106,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n url: 'https://example.com/pricing',\n referrer: 'https://google.com',\n },\n }),\n mapping: {\n skip: true,\n settings: {\n page: {\n map: {\n url: 'data.url',\n referrer: 'data.referrer',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.trackPageView',\n 'us3r',\n 'https://example.com/pricing',\n { referrer: 'https://google.com' },\n ],\n ],\n};\n\n/**\n * Destroy -- permanently deletes a person from Customer.io.\n */\nexport const destroyPerson: CustomerIoStepExample = {\n title: 'Destroy person',\n description:\n 'A user delete event permanently removes the person from Customer.io via trackClient.destroy.',\n in: getEvent('user delete', {\n timestamp: 1700000107,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n destroy: true,\n },\n },\n out: [['trackClient.destroy', 'us3r']],\n};\n\n/**\n * Suppress -- stops messaging without deleting data.\n */\nexport const suppressPerson: CustomerIoStepExample = {\n title: 'Suppress person',\n description:\n 'A user suppress event stops messaging for the person without deleting their profile data.',\n in: getEvent('user suppress', {\n timestamp: 1700000108,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n suppress: true,\n },\n },\n out: [['trackClient.suppress', 'us3r']],\n};\n\n/**\n * Unsuppress -- resumes messaging for a suppressed person.\n */\nexport const unsuppressPerson: CustomerIoStepExample = {\n title: 'Unsuppress person',\n description:\n 'A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.',\n in: getEvent('user unsuppress', {\n timestamp: 1700000109,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n unsuppress: true,\n },\n },\n out: [['trackClient.unsuppress', 'us3r']],\n};\n\n/**\n * Wildcard ignore -- the event matches a mapping rule with ignore: true.\n * The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: CustomerIoStepExample = {\n public: false,\n in: getEvent('debug noise', {\n timestamp: 1700000110,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\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 siteId: z\n .string()\n .min(1)\n .describe(\n 'Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n apiKey: z\n .string()\n .min(1)\n .describe(\n 'Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n appApiKey: z\n .string()\n .describe(\n 'App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.',\n )\n .optional(),\n region: z\n .enum(['us', 'eu'])\n .describe(\n 'Data center region. Must match where your Customer.io workspace was created. Default: us.',\n )\n .optional(),\n timeout: z\n .number()\n .int()\n .positive()\n .describe('HTTP request timeout in milliseconds. Default: 10000.')\n .optional(),\n customerId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve customerId from each event (like user.id).',\n )\n .optional(),\n anonymousId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve anonymousId from each event (like user.session).',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.',\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 identify attributes. Resolves to { email?, first_name?, ... }. Use with silent: true on login/identify events.',\n )\n .optional(),\n page: z\n .unknown()\n .describe(\n 'Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with silent: true.',\n )\n .optional(),\n destroy: z\n .boolean()\n .describe(\n 'Permanently delete person from Customer.io. Set true on delete events with silent: true.',\n )\n .optional(),\n suppress: z\n .boolean()\n .describe(\n 'Suppress person (stop messaging without deleting data). Set true with silent: true.',\n )\n .optional(),\n unsuppress: z\n .boolean()\n .describe(\n 'Unsuppress person (resume messaging). Set true with silent: true.',\n )\n .optional(),\n addDevice: z\n .unknown()\n .describe(\n 'Register push device. Resolves to { deviceId, platform, data? }. Use with silent: true.',\n )\n .optional(),\n deleteDevice: z\n .unknown()\n .describe(\n 'Remove push device. Resolves to { deviceId, platform }. Use with silent: true.',\n )\n .optional(),\n merge: z\n .unknown()\n .describe(\n 'Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with silent: true.',\n )\n .optional(),\n sendEmail: z\n .unknown()\n .describe(\n 'Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.',\n )\n .optional(),\n sendPush: z\n .unknown()\n .describe(\n 'Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.',\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 CustomerIoTrackClientMock,\n CustomerIoApiClientMock,\n} from '../types';\n\ntype TrackNoArg = () => Promise<void>;\ntype TrackOne = (_id: string | number) => Promise<void>;\ntype TrackIdentify = (\n _id: string | number,\n _attrs: Record<string, unknown>,\n) => Promise<void>;\ntype TrackEvent = (\n _id: string | number,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackAnonymous = (\n _id: string,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackPage = (\n _id: string | number,\n _url: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackAddDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackDeleteDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n) => Promise<void>;\ntype TrackMerge = (\n _pt: string,\n _pi: string,\n _st: string,\n _si: string,\n) => Promise<void>;\ntype ApiSend = (_request: unknown) => Promise<void>;\n\nconst asyncIdentify: TrackIdentify = () => Promise.resolve();\nconst asyncEvent: TrackEvent = () => Promise.resolve();\nconst asyncAnonymous: TrackAnonymous = () => Promise.resolve();\nconst asyncPage: TrackPage = () => Promise.resolve();\nconst asyncOne: TrackOne = () => Promise.resolve();\nconst asyncAddDevice: TrackAddDevice = () => Promise.resolve();\nconst asyncDeleteDevice: TrackDeleteDevice = () => Promise.resolve();\nconst asyncMerge: TrackMerge = () => Promise.resolve();\nconst asyncSend: ApiSend = () => Promise.resolve();\n\n// Suppress unused warning for narrow helper aliases used below.\nvoid (null as unknown as TrackNoArg);\n\nfunction createMockTrackClient(): CustomerIoTrackClientMock {\n return {\n identify: asyncIdentify,\n track: asyncEvent,\n trackAnonymous: asyncAnonymous,\n trackPageView: asyncPage,\n destroy: asyncOne,\n suppress: asyncOne,\n unsuppress: asyncOne,\n addDevice: asyncAddDevice,\n deleteDevice: asyncDeleteDevice,\n mergeCustomers: asyncMerge,\n };\n}\n\nfunction createMockApiClient(): CustomerIoApiClientMock {\n return {\n sendEmail: asyncSend,\n sendPush: asyncSend,\n };\n}\n\nexport const push: Env = {\n trackClient: createMockTrackClient(),\n apiClient: createMockApiClient(),\n};\n\nexport const simulation = [\n 'call:trackClient.identify',\n 'call:trackClient.track',\n 'call:trackClient.trackAnonymous',\n 'call:trackClient.trackPageView',\n 'call:trackClient.destroy',\n 'call:trackClient.suppress',\n 'call:trackClient.unsuppress',\n 'call:trackClient.addDevice',\n 'call:trackClient.deleteDevice',\n 'call:trackClient.mergeCustomers',\n 'call:apiClient.sendEmail',\n 'call:apiClient.sendPush',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Extended step example that may carry destination-level settings overrides.\n */\nexport type CustomerIoStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- trackClient.track() with event name and data.\n * customerId resolved from default settings.customerId = 'user.id'.\n */\nexport const defaultTrack: CustomerIoStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.',\n in: getEvent('product view', {\n timestamp: 1700000100,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event for Customer.io.\n */\nexport const mappedEventName: CustomerIoStepExample = {\n title: 'Rename event',\n description:\n 'A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.',\n in: getEvent('order complete', {\n timestamp: 1700000101,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n name: 'purchase',\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Track with mapped data properties.\n */\nexport const mappedData: CustomerIoStepExample = {\n title: 'Mapped properties',\n description:\n 'A data mapping transforms the event payload into Customer.io track properties for an order.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n user: { id: 'us3r', session: 's3ss10n' },\n data: { id: '0rd3r1d', total: 555, currency: 'EUR' },\n }),\n mapping: {\n name: 'purchase',\n data: {\n map: {\n order_id: 'data.id',\n value: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: { order_id: '0rd3r1d', value: 555, currency: 'EUR' },\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Anonymous event -- no customerId resolved, falls back to trackAnonymous().\n */\nexport const anonymousTrack: CustomerIoStepExample = {\n title: 'Anonymous track',\n description:\n 'When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.',\n in: getEvent('product view', {\n timestamp: 1700000103,\n user: { session: 's3ss10n' },\n }),\n settings: {\n customerId: undefined,\n },\n out: [\n [\n 'trackClient.trackAnonymous',\n 's3ss10n',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Destination-level identify -- fires trackClient.identify() on first push\n * when settings.identify mapping resolves. Then fires trackClient.track().\n */\nexport const destinationIdentify: CustomerIoStepExample = {\n title: 'Destination identify',\n description:\n 'Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.',\n in: getEvent('page view', {\n timestamp: 1700000104,\n user: { id: 'us3r', session: 's3ss10n', email: 'user@example.com' },\n }),\n settings: {\n identify: {\n map: {\n email: 'user.email',\n },\n },\n },\n out: [\n ['trackClient.identify', 'us3r', { email: 'user@example.com' }],\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'page view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify with silent -- user login fires identify() only.\n */\nexport const userLoginIdentify: CustomerIoStepExample = {\n title: 'User login identify',\n description:\n 'A user login triggers only a Customer.io identify call with profile attributes, skipping the track.',\n in: getEvent('user login', {\n timestamp: 1700000105,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n email: 'user@acme.com',\n first_name: 'Jane',\n plan: 'premium',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n email: 'data.email',\n first_name: 'data.first_name',\n plan: 'data.plan',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.identify',\n 'us3r',\n { email: 'user@acme.com', first_name: 'Jane', plan: 'premium' },\n ],\n ],\n};\n\n/**\n * Page view -- fires trackClient.trackPageView() with url.\n * silent: true suppresses track(); settings.page fires trackPageView().\n */\nexport const pageView: CustomerIoStepExample = {\n title: 'Page view',\n description:\n 'A page view fires trackPageView with the URL and referrer instead of a generic track call.',\n in: getEvent('page view', {\n timestamp: 1700000106,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n url: 'https://example.com/pricing',\n referrer: 'https://google.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n page: {\n map: {\n url: 'data.url',\n referrer: 'data.referrer',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.trackPageView',\n 'us3r',\n 'https://example.com/pricing',\n { referrer: 'https://google.com' },\n ],\n ],\n};\n\n/**\n * Destroy -- permanently deletes a person from Customer.io.\n */\nexport const destroyPerson: CustomerIoStepExample = {\n title: 'Destroy person',\n description:\n 'A user delete event permanently removes the person from Customer.io via trackClient.destroy.',\n in: getEvent('user delete', {\n timestamp: 1700000107,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n destroy: true,\n },\n },\n out: [['trackClient.destroy', 'us3r']],\n};\n\n/**\n * Suppress -- stops messaging without deleting data.\n */\nexport const suppressPerson: CustomerIoStepExample = {\n title: 'Suppress person',\n description:\n 'A user suppress event stops messaging for the person without deleting their profile data.',\n in: getEvent('user suppress', {\n timestamp: 1700000108,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n suppress: true,\n },\n },\n out: [['trackClient.suppress', 'us3r']],\n};\n\n/**\n * Unsuppress -- resumes messaging for a suppressed person.\n */\nexport const unsuppressPerson: CustomerIoStepExample = {\n title: 'Unsuppress person',\n description:\n 'A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.',\n in: getEvent('user unsuppress', {\n timestamp: 1700000109,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n unsuppress: true,\n },\n },\n out: [['trackClient.unsuppress', 'us3r']],\n};\n\n/**\n * Wildcard ignore -- the event matches a mapping rule with ignore: true.\n * The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: CustomerIoStepExample = {\n public: false,\n in: getEvent('debug noise', {\n timestamp: 1700000110,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\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,s=(s,t)=>{for(var i in t)e(s,i,{get:t[i],enumerable:!0})},t={};s(t,{MappingSchema:()=>o,SettingsSchema:()=>a,mapping:()=>l,settings:()=>p});import{zodToSchema as i}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var a=r.object({siteId:r.string().min(1).describe("Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials."),apiKey:r.string().min(1).describe("Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials."),appApiKey:r.string().describe("App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.").optional(),region:r.enum(["us","eu"]).describe("Data center region. Must match where your Customer.io workspace was created. Default: us.").optional(),timeout:r.number().int().positive().describe("HTTP request timeout in milliseconds. Default: 10000.").optional(),customerId:r.string().describe("walkerOS mapping value path to resolve customerId from each event (like user.id).").optional(),anonymousId:r.string().describe("walkerOS mapping value path to resolve anonymousId from each event (like user.session).").optional(),identify:r.unknown().describe("Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.").optional()});import{z as n}from"@walkeros/core/dev";var o=n.object({identify:n.unknown().describe("Per-event identify attributes. Resolves to { email?, first_name?, ... }. Use with skip: true on login/identify events.").optional(),page:n.unknown().describe("Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with skip: true.").optional(),destroy:n.boolean().describe("Permanently delete person from Customer.io. Set true on delete events with skip: true.").optional(),suppress:n.boolean().describe("Suppress person (stop messaging without deleting data). Set true with skip: true.").optional(),unsuppress:n.boolean().describe("Unsuppress person (resume messaging). Set true with skip: true.").optional(),addDevice:n.unknown().describe("Register push device. Resolves to { deviceId, platform, data? }. Use with skip: true.").optional(),deleteDevice:n.unknown().describe("Remove push device. Resolves to { deviceId, platform }. Use with skip: true.").optional(),merge:n.unknown().describe("Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with skip: true.").optional(),sendEmail:n.unknown().describe("Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.").optional(),sendPush:n.unknown().describe("Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.").optional()}),p=i(a),l=i(o),u={};s(u,{env:()=>m,step:()=>v});var m={};s(m,{push:()=>g,simulation:()=>k});var d=()=>Promise.resolve(),c=()=>Promise.resolve();var g={trackClient:{identify:()=>Promise.resolve(),track:()=>Promise.resolve(),trackAnonymous:()=>Promise.resolve(),trackPageView:()=>Promise.resolve(),destroy:d,suppress:d,unsuppress:d,addDevice:()=>Promise.resolve(),deleteDevice:()=>Promise.resolve(),mergeCustomers:()=>Promise.resolve()},apiClient:{sendEmail:c,sendPush:c}},k=["call:trackClient.identify","call:trackClient.track","call:trackClient.trackAnonymous","call:trackClient.trackPageView","call:trackClient.destroy","call:trackClient.suppress","call:trackClient.unsuppress","call:trackClient.addDevice","call:trackClient.deleteDevice","call:trackClient.mergeCustomers","call:apiClient.sendEmail","call:apiClient.sendPush"],v={};s(v,{anonymousTrack:()=>C,defaultTrack:()=>y,destinationIdentify:()=>b,destroyPerson:()=>I,mappedData:()=>w,mappedEventName:()=>h,pageView:()=>A,suppressPerson:()=>S,unsuppressPerson:()=>D,userLoginIdentify:()=>P,wildcardIgnored:()=>R});import{getEvent as f}from"@walkeros/core";var y={title:"Default track",description:"A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",in:f("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},h={title:"Rename event",description:"A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",in:f("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},w={title:"Mapped properties",description:"A data mapping transforms the event payload into Customer.io track properties for an order.",in:f("order complete",{timestamp:1700000102,user:{id:"us3r",session:"s3ss10n"},data:{id:"0rd3r1d",total:555,currency:"EUR"}}),mapping:{name:"purchase",data:{map:{order_id:"data.id",value:"data.total",currency:"data.currency"}}},out:[["trackClient.track","us3r",{name:"purchase",data:{order_id:"0rd3r1d",value:555,currency:"EUR"},timestamp:17e5}]]},C={title:"Anonymous track",description:"When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",in:f("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},b={title:"Destination identify",description:"Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",in:f("page view",{timestamp:1700000104,user:{id:"us3r",session:"s3ss10n",email:"user@example.com"}}),settings:{identify:{map:{email:"user.email"}}},out:[["trackClient.identify","us3r",{email:"user@example.com"}],["trackClient.track","us3r",{name:"page view",data:{},timestamp:17e5}]]},P={title:"User login identify",description:"A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",in:f("user login",{timestamp:1700000105,user:{id:"us3r",session:"s3ss10n"},data:{email:"user@acme.com",first_name:"Jane",plan:"premium"}}),mapping:{skip:!0,settings:{identify:{map:{email:"data.email",first_name:"data.first_name",plan:"data.plan"}}}},out:[["trackClient.identify","us3r",{email:"user@acme.com",first_name:"Jane",plan:"premium"}]]},A={title:"Page view",description:"A page view fires trackPageView with the URL and referrer instead of a generic track call.",in:f("page view",{timestamp:1700000106,user:{id:"us3r",session:"s3ss10n"},data:{url:"https://example.com/pricing",referrer:"https://google.com"}}),mapping:{skip:!0,settings:{page:{map:{url:"data.url",referrer:"data.referrer"}}}},out:[["trackClient.trackPageView","us3r","https://example.com/pricing",{referrer:"https://google.com"}]]},I={title:"Destroy person",description:"A user delete event permanently removes the person from Customer.io via trackClient.destroy.",in:f("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},S={title:"Suppress person",description:"A user suppress event stops messaging for the person without deleting their profile data.",in:f("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},D={title:"Unsuppress person",description:"A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",in:f("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},R={public:!1,in:f("debug noise",{timestamp:1700000110,user:{id:"us3r",session:"s3ss10n"}}),mapping:{ignore:!0},out:[]};export{u as examples,t as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,s=(s,t)=>{for(var i in t)e(s,i,{get:t[i],enumerable:!0})},t={};s(t,{MappingSchema:()=>o,SettingsSchema:()=>a,mapping:()=>l,settings:()=>p});import{zodToSchema as i}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var a=r.object({siteId:r.string().min(1).describe("Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials."),apiKey:r.string().min(1).describe("Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials."),appApiKey:r.string().describe("App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.").optional(),region:r.enum(["us","eu"]).describe("Data center region. Must match where your Customer.io workspace was created. Default: us.").optional(),timeout:r.number().int().positive().describe("HTTP request timeout in milliseconds. Default: 10000.").optional(),customerId:r.string().describe("walkerOS mapping value path to resolve customerId from each event (like user.id).").optional(),anonymousId:r.string().describe("walkerOS mapping value path to resolve anonymousId from each event (like user.session).").optional(),identify:r.unknown().describe("Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.").optional()});import{z as n}from"@walkeros/core/dev";var o=n.object({identify:n.unknown().describe("Per-event identify attributes. Resolves to { email?, first_name?, ... }. Use with silent: true on login/identify events.").optional(),page:n.unknown().describe("Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with silent: true.").optional(),destroy:n.boolean().describe("Permanently delete person from Customer.io. Set true on delete events with silent: true.").optional(),suppress:n.boolean().describe("Suppress person (stop messaging without deleting data). Set true with silent: true.").optional(),unsuppress:n.boolean().describe("Unsuppress person (resume messaging). Set true with silent: true.").optional(),addDevice:n.unknown().describe("Register push device. Resolves to { deviceId, platform, data? }. Use with silent: true.").optional(),deleteDevice:n.unknown().describe("Remove push device. Resolves to { deviceId, platform }. Use with silent: true.").optional(),merge:n.unknown().describe("Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with silent: true.").optional(),sendEmail:n.unknown().describe("Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.").optional(),sendPush:n.unknown().describe("Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.").optional()}),p=i(a),l=i(o),u={};s(u,{env:()=>m,step:()=>k});var m={};s(m,{push:()=>g,simulation:()=>v});var d=()=>Promise.resolve(),c=()=>Promise.resolve();var g={trackClient:{identify:()=>Promise.resolve(),track:()=>Promise.resolve(),trackAnonymous:()=>Promise.resolve(),trackPageView:()=>Promise.resolve(),destroy:d,suppress:d,unsuppress:d,addDevice:()=>Promise.resolve(),deleteDevice:()=>Promise.resolve(),mergeCustomers:()=>Promise.resolve()},apiClient:{sendEmail:c,sendPush:c}},v=["call:trackClient.identify","call:trackClient.track","call:trackClient.trackAnonymous","call:trackClient.trackPageView","call:trackClient.destroy","call:trackClient.suppress","call:trackClient.unsuppress","call:trackClient.addDevice","call:trackClient.deleteDevice","call:trackClient.mergeCustomers","call:apiClient.sendEmail","call:apiClient.sendPush"],k={};s(k,{anonymousTrack:()=>C,defaultTrack:()=>y,destinationIdentify:()=>b,destroyPerson:()=>I,mappedData:()=>w,mappedEventName:()=>h,pageView:()=>A,suppressPerson:()=>S,unsuppressPerson:()=>D,userLoginIdentify:()=>P,wildcardIgnored:()=>R});import{getEvent as f}from"@walkeros/core";var y={title:"Default track",description:"A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",in:f("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},h={title:"Rename event",description:"A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",in:f("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},w={title:"Mapped properties",description:"A data mapping transforms the event payload into Customer.io track properties for an order.",in:f("order complete",{timestamp:1700000102,user:{id:"us3r",session:"s3ss10n"},data:{id:"0rd3r1d",total:555,currency:"EUR"}}),mapping:{name:"purchase",data:{map:{order_id:"data.id",value:"data.total",currency:"data.currency"}}},out:[["trackClient.track","us3r",{name:"purchase",data:{order_id:"0rd3r1d",value:555,currency:"EUR"},timestamp:17e5}]]},C={title:"Anonymous track",description:"When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",in:f("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},b={title:"Destination identify",description:"Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",in:f("page view",{timestamp:1700000104,user:{id:"us3r",session:"s3ss10n",email:"user@example.com"}}),settings:{identify:{map:{email:"user.email"}}},out:[["trackClient.identify","us3r",{email:"user@example.com"}],["trackClient.track","us3r",{name:"page view",data:{},timestamp:17e5}]]},P={title:"User login identify",description:"A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",in:f("user login",{timestamp:1700000105,user:{id:"us3r",session:"s3ss10n"},data:{email:"user@acme.com",first_name:"Jane",plan:"premium"}}),mapping:{silent:!0,settings:{identify:{map:{email:"data.email",first_name:"data.first_name",plan:"data.plan"}}}},out:[["trackClient.identify","us3r",{email:"user@acme.com",first_name:"Jane",plan:"premium"}]]},A={title:"Page view",description:"A page view fires trackPageView with the URL and referrer instead of a generic track call.",in:f("page view",{timestamp:1700000106,user:{id:"us3r",session:"s3ss10n"},data:{url:"https://example.com/pricing",referrer:"https://google.com"}}),mapping:{silent:!0,settings:{page:{map:{url:"data.url",referrer:"data.referrer"}}}},out:[["trackClient.trackPageView","us3r","https://example.com/pricing",{referrer:"https://google.com"}]]},I={title:"Destroy person",description:"A user delete event permanently removes the person from Customer.io via trackClient.destroy.",in:f("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},S={title:"Suppress person",description:"A user suppress event stops messaging for the person without deleting their profile data.",in:f("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},D={title:"Unsuppress person",description:"A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",in:f("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{silent:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},R={public:!1,in:f("debug noise",{timestamp:1700000110,user:{id:"us3r",session:"s3ss10n"}}),mapping:{ignore:!0},out:[]};export{u as examples,t 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 siteId: z\n .string()\n .min(1)\n .describe(\n 'Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n apiKey: z\n .string()\n .min(1)\n .describe(\n 'Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n appApiKey: z\n .string()\n .describe(\n 'App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.',\n )\n .optional(),\n region: z\n .enum(['us', 'eu'])\n .describe(\n 'Data center region. Must match where your Customer.io workspace was created. Default: us.',\n )\n .optional(),\n timeout: z\n .number()\n .int()\n .positive()\n .describe('HTTP request timeout in milliseconds. Default: 10000.')\n .optional(),\n customerId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve customerId from each event (like user.id).',\n )\n .optional(),\n anonymousId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve anonymousId from each event (like user.session).',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.',\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 identify attributes. Resolves to { email?, first_name?, ... }. Use with skip: true on login/identify events.',\n )\n .optional(),\n page: z\n .unknown()\n .describe(\n 'Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with skip: true.',\n )\n .optional(),\n destroy: z\n .boolean()\n .describe(\n 'Permanently delete person from Customer.io. Set true on delete events with skip: true.',\n )\n .optional(),\n suppress: z\n .boolean()\n .describe(\n 'Suppress person (stop messaging without deleting data). Set true with skip: true.',\n )\n .optional(),\n unsuppress: z\n .boolean()\n .describe('Unsuppress person (resume messaging). Set true with skip: true.')\n .optional(),\n addDevice: z\n .unknown()\n .describe(\n 'Register push device. Resolves to { deviceId, platform, data? }. Use with skip: true.',\n )\n .optional(),\n deleteDevice: z\n .unknown()\n .describe(\n 'Remove push device. Resolves to { deviceId, platform }. Use with skip: true.',\n )\n .optional(),\n merge: z\n .unknown()\n .describe(\n 'Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with skip: true.',\n )\n .optional(),\n sendEmail: z\n .unknown()\n .describe(\n 'Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.',\n )\n .optional(),\n sendPush: z\n .unknown()\n .describe(\n 'Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.',\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 CustomerIoTrackClientMock,\n CustomerIoApiClientMock,\n} from '../types';\n\ntype TrackNoArg = () => Promise<void>;\ntype TrackOne = (_id: string | number) => Promise<void>;\ntype TrackIdentify = (\n _id: string | number,\n _attrs: Record<string, unknown>,\n) => Promise<void>;\ntype TrackEvent = (\n _id: string | number,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackAnonymous = (\n _id: string,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackPage = (\n _id: string | number,\n _url: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackAddDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackDeleteDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n) => Promise<void>;\ntype TrackMerge = (\n _pt: string,\n _pi: string,\n _st: string,\n _si: string,\n) => Promise<void>;\ntype ApiSend = (_request: unknown) => Promise<void>;\n\nconst asyncIdentify: TrackIdentify = () => Promise.resolve();\nconst asyncEvent: TrackEvent = () => Promise.resolve();\nconst asyncAnonymous: TrackAnonymous = () => Promise.resolve();\nconst asyncPage: TrackPage = () => Promise.resolve();\nconst asyncOne: TrackOne = () => Promise.resolve();\nconst asyncAddDevice: TrackAddDevice = () => Promise.resolve();\nconst asyncDeleteDevice: TrackDeleteDevice = () => Promise.resolve();\nconst asyncMerge: TrackMerge = () => Promise.resolve();\nconst asyncSend: ApiSend = () => Promise.resolve();\n\n// Suppress unused warning for narrow helper aliases used below.\nvoid (null as unknown as TrackNoArg);\n\nfunction createMockTrackClient(): CustomerIoTrackClientMock {\n return {\n identify: asyncIdentify,\n track: asyncEvent,\n trackAnonymous: asyncAnonymous,\n trackPageView: asyncPage,\n destroy: asyncOne,\n suppress: asyncOne,\n unsuppress: asyncOne,\n addDevice: asyncAddDevice,\n deleteDevice: asyncDeleteDevice,\n mergeCustomers: asyncMerge,\n };\n}\n\nfunction createMockApiClient(): CustomerIoApiClientMock {\n return {\n sendEmail: asyncSend,\n sendPush: asyncSend,\n };\n}\n\nexport const push: Env = {\n trackClient: createMockTrackClient(),\n apiClient: createMockApiClient(),\n};\n\nexport const simulation = [\n 'call:trackClient.identify',\n 'call:trackClient.track',\n 'call:trackClient.trackAnonymous',\n 'call:trackClient.trackPageView',\n 'call:trackClient.destroy',\n 'call:trackClient.suppress',\n 'call:trackClient.unsuppress',\n 'call:trackClient.addDevice',\n 'call:trackClient.deleteDevice',\n 'call:trackClient.mergeCustomers',\n 'call:apiClient.sendEmail',\n 'call:apiClient.sendPush',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Extended step example that may carry destination-level settings overrides.\n */\nexport type CustomerIoStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- trackClient.track() with event name and data.\n * customerId resolved from default settings.customerId = 'user.id'.\n */\nexport const defaultTrack: CustomerIoStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.',\n in: getEvent('product view', {\n timestamp: 1700000100,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event for Customer.io.\n */\nexport const mappedEventName: CustomerIoStepExample = {\n title: 'Rename event',\n description:\n 'A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.',\n in: getEvent('order complete', {\n timestamp: 1700000101,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n name: 'purchase',\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Track with mapped data properties.\n */\nexport const mappedData: CustomerIoStepExample = {\n title: 'Mapped properties',\n description:\n 'A data mapping transforms the event payload into Customer.io track properties for an order.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n user: { id: 'us3r', session: 's3ss10n' },\n data: { id: '0rd3r1d', total: 555, currency: 'EUR' },\n }),\n mapping: {\n name: 'purchase',\n data: {\n map: {\n order_id: 'data.id',\n value: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: { order_id: '0rd3r1d', value: 555, currency: 'EUR' },\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Anonymous event -- no customerId resolved, falls back to trackAnonymous().\n */\nexport const anonymousTrack: CustomerIoStepExample = {\n title: 'Anonymous track',\n description:\n 'When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.',\n in: getEvent('product view', {\n timestamp: 1700000103,\n user: { session: 's3ss10n' },\n }),\n settings: {\n customerId: undefined,\n },\n out: [\n [\n 'trackClient.trackAnonymous',\n 's3ss10n',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Destination-level identify -- fires trackClient.identify() on first push\n * when settings.identify mapping resolves. Then fires trackClient.track().\n */\nexport const destinationIdentify: CustomerIoStepExample = {\n title: 'Destination identify',\n description:\n 'Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.',\n in: getEvent('page view', {\n timestamp: 1700000104,\n user: { id: 'us3r', session: 's3ss10n', email: 'user@example.com' },\n }),\n settings: {\n identify: {\n map: {\n email: 'user.email',\n },\n },\n },\n out: [\n ['trackClient.identify', 'us3r', { email: 'user@example.com' }],\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'page view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify with skip -- user login fires identify() only.\n */\nexport const userLoginIdentify: CustomerIoStepExample = {\n title: 'User login identify',\n description:\n 'A user login triggers only a Customer.io identify call with profile attributes, skipping the track.',\n in: getEvent('user login', {\n timestamp: 1700000105,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n email: 'user@acme.com',\n first_name: 'Jane',\n plan: 'premium',\n },\n }),\n mapping: {\n skip: true,\n settings: {\n identify: {\n map: {\n email: 'data.email',\n first_name: 'data.first_name',\n plan: 'data.plan',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.identify',\n 'us3r',\n { email: 'user@acme.com', first_name: 'Jane', plan: 'premium' },\n ],\n ],\n};\n\n/**\n * Page view -- fires trackClient.trackPageView() with url.\n * skip: true suppresses track(); settings.page fires trackPageView().\n */\nexport const pageView: CustomerIoStepExample = {\n title: 'Page view',\n description:\n 'A page view fires trackPageView with the URL and referrer instead of a generic track call.',\n in: getEvent('page view', {\n timestamp: 1700000106,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n url: 'https://example.com/pricing',\n referrer: 'https://google.com',\n },\n }),\n mapping: {\n skip: true,\n settings: {\n page: {\n map: {\n url: 'data.url',\n referrer: 'data.referrer',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.trackPageView',\n 'us3r',\n 'https://example.com/pricing',\n { referrer: 'https://google.com' },\n ],\n ],\n};\n\n/**\n * Destroy -- permanently deletes a person from Customer.io.\n */\nexport const destroyPerson: CustomerIoStepExample = {\n title: 'Destroy person',\n description:\n 'A user delete event permanently removes the person from Customer.io via trackClient.destroy.',\n in: getEvent('user delete', {\n timestamp: 1700000107,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n destroy: true,\n },\n },\n out: [['trackClient.destroy', 'us3r']],\n};\n\n/**\n * Suppress -- stops messaging without deleting data.\n */\nexport const suppressPerson: CustomerIoStepExample = {\n title: 'Suppress person',\n description:\n 'A user suppress event stops messaging for the person without deleting their profile data.',\n in: getEvent('user suppress', {\n timestamp: 1700000108,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n suppress: true,\n },\n },\n out: [['trackClient.suppress', 'us3r']],\n};\n\n/**\n * Unsuppress -- resumes messaging for a suppressed person.\n */\nexport const unsuppressPerson: CustomerIoStepExample = {\n title: 'Unsuppress person',\n description:\n 'A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.',\n in: getEvent('user unsuppress', {\n timestamp: 1700000109,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n skip: true,\n settings: {\n unsuppress: true,\n },\n },\n out: [['trackClient.unsuppress', 'us3r']],\n};\n\n/**\n * Wildcard ignore -- the event matches a mapping rule with ignore: true.\n * The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: CustomerIoStepExample = {\n public: false,\n in: getEvent('debug noise', {\n timestamp: 1700000110,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\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 siteId: z\n .string()\n .min(1)\n .describe(\n 'Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n apiKey: z\n .string()\n .min(1)\n .describe(\n 'Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials.',\n ),\n appApiKey: z\n .string()\n .describe(\n 'App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.',\n )\n .optional(),\n region: z\n .enum(['us', 'eu'])\n .describe(\n 'Data center region. Must match where your Customer.io workspace was created. Default: us.',\n )\n .optional(),\n timeout: z\n .number()\n .int()\n .positive()\n .describe('HTTP request timeout in milliseconds. Default: 10000.')\n .optional(),\n customerId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve customerId from each event (like user.id).',\n )\n .optional(),\n anonymousId: z\n .string()\n .describe(\n 'walkerOS mapping value path to resolve anonymousId from each event (like user.session).',\n )\n .optional(),\n identify: z\n .unknown()\n .describe(\n 'Destination-level identity mapping. Resolves to { email?, first_name?, ... } attributes. Fires identify() on first push and re-fires when values change.',\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 identify attributes. Resolves to { email?, first_name?, ... }. Use with silent: true on login/identify events.',\n )\n .optional(),\n page: z\n .unknown()\n .describe(\n 'Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with silent: true.',\n )\n .optional(),\n destroy: z\n .boolean()\n .describe(\n 'Permanently delete person from Customer.io. Set true on delete events with silent: true.',\n )\n .optional(),\n suppress: z\n .boolean()\n .describe(\n 'Suppress person (stop messaging without deleting data). Set true with silent: true.',\n )\n .optional(),\n unsuppress: z\n .boolean()\n .describe(\n 'Unsuppress person (resume messaging). Set true with silent: true.',\n )\n .optional(),\n addDevice: z\n .unknown()\n .describe(\n 'Register push device. Resolves to { deviceId, platform, data? }. Use with silent: true.',\n )\n .optional(),\n deleteDevice: z\n .unknown()\n .describe(\n 'Remove push device. Resolves to { deviceId, platform }. Use with silent: true.',\n )\n .optional(),\n merge: z\n .unknown()\n .describe(\n 'Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with silent: true.',\n )\n .optional(),\n sendEmail: z\n .unknown()\n .describe(\n 'Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.',\n )\n .optional(),\n sendPush: z\n .unknown()\n .describe(\n 'Send transactional push. Resolves to { transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with silent: true.',\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 CustomerIoTrackClientMock,\n CustomerIoApiClientMock,\n} from '../types';\n\ntype TrackNoArg = () => Promise<void>;\ntype TrackOne = (_id: string | number) => Promise<void>;\ntype TrackIdentify = (\n _id: string | number,\n _attrs: Record<string, unknown>,\n) => Promise<void>;\ntype TrackEvent = (\n _id: string | number,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackAnonymous = (\n _id: string,\n _event: {\n name: string;\n data?: Record<string, unknown>;\n timestamp?: number;\n },\n) => Promise<void>;\ntype TrackPage = (\n _id: string | number,\n _url: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackAddDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n _data?: Record<string, unknown>,\n) => Promise<void>;\ntype TrackDeleteDevice = (\n _id: string | number,\n _deviceId: string,\n _platform: string,\n) => Promise<void>;\ntype TrackMerge = (\n _pt: string,\n _pi: string,\n _st: string,\n _si: string,\n) => Promise<void>;\ntype ApiSend = (_request: unknown) => Promise<void>;\n\nconst asyncIdentify: TrackIdentify = () => Promise.resolve();\nconst asyncEvent: TrackEvent = () => Promise.resolve();\nconst asyncAnonymous: TrackAnonymous = () => Promise.resolve();\nconst asyncPage: TrackPage = () => Promise.resolve();\nconst asyncOne: TrackOne = () => Promise.resolve();\nconst asyncAddDevice: TrackAddDevice = () => Promise.resolve();\nconst asyncDeleteDevice: TrackDeleteDevice = () => Promise.resolve();\nconst asyncMerge: TrackMerge = () => Promise.resolve();\nconst asyncSend: ApiSend = () => Promise.resolve();\n\n// Suppress unused warning for narrow helper aliases used below.\nvoid (null as unknown as TrackNoArg);\n\nfunction createMockTrackClient(): CustomerIoTrackClientMock {\n return {\n identify: asyncIdentify,\n track: asyncEvent,\n trackAnonymous: asyncAnonymous,\n trackPageView: asyncPage,\n destroy: asyncOne,\n suppress: asyncOne,\n unsuppress: asyncOne,\n addDevice: asyncAddDevice,\n deleteDevice: asyncDeleteDevice,\n mergeCustomers: asyncMerge,\n };\n}\n\nfunction createMockApiClient(): CustomerIoApiClientMock {\n return {\n sendEmail: asyncSend,\n sendPush: asyncSend,\n };\n}\n\nexport const push: Env = {\n trackClient: createMockTrackClient(),\n apiClient: createMockApiClient(),\n};\n\nexport const simulation = [\n 'call:trackClient.identify',\n 'call:trackClient.track',\n 'call:trackClient.trackAnonymous',\n 'call:trackClient.trackPageView',\n 'call:trackClient.destroy',\n 'call:trackClient.suppress',\n 'call:trackClient.unsuppress',\n 'call:trackClient.addDevice',\n 'call:trackClient.deleteDevice',\n 'call:trackClient.mergeCustomers',\n 'call:apiClient.sendEmail',\n 'call:apiClient.sendPush',\n];\n","import type { Flow } from '@walkeros/core';\nimport { getEvent } from '@walkeros/core';\nimport type { Settings } from '../types';\n\n/**\n * Extended step example that may carry destination-level settings overrides.\n */\nexport type CustomerIoStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- trackClient.track() with event name and data.\n * customerId resolved from default settings.customerId = 'user.id'.\n */\nexport const defaultTrack: CustomerIoStepExample = {\n title: 'Default track',\n description:\n 'A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.',\n in: getEvent('product view', {\n timestamp: 1700000100,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event for Customer.io.\n */\nexport const mappedEventName: CustomerIoStepExample = {\n title: 'Rename event',\n description:\n 'A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.',\n in: getEvent('order complete', {\n timestamp: 1700000101,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n name: 'purchase',\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Track with mapped data properties.\n */\nexport const mappedData: CustomerIoStepExample = {\n title: 'Mapped properties',\n description:\n 'A data mapping transforms the event payload into Customer.io track properties for an order.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n user: { id: 'us3r', session: 's3ss10n' },\n data: { id: '0rd3r1d', total: 555, currency: 'EUR' },\n }),\n mapping: {\n name: 'purchase',\n data: {\n map: {\n order_id: 'data.id',\n value: 'data.total',\n currency: 'data.currency',\n },\n },\n },\n out: [\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'purchase',\n data: { order_id: '0rd3r1d', value: 555, currency: 'EUR' },\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Anonymous event -- no customerId resolved, falls back to trackAnonymous().\n */\nexport const anonymousTrack: CustomerIoStepExample = {\n title: 'Anonymous track',\n description:\n 'When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.',\n in: getEvent('product view', {\n timestamp: 1700000103,\n user: { session: 's3ss10n' },\n }),\n settings: {\n customerId: undefined,\n },\n out: [\n [\n 'trackClient.trackAnonymous',\n 's3ss10n',\n {\n name: 'product view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Destination-level identify -- fires trackClient.identify() on first push\n * when settings.identify mapping resolves. Then fires trackClient.track().\n */\nexport const destinationIdentify: CustomerIoStepExample = {\n title: 'Destination identify',\n description:\n 'Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.',\n in: getEvent('page view', {\n timestamp: 1700000104,\n user: { id: 'us3r', session: 's3ss10n', email: 'user@example.com' },\n }),\n settings: {\n identify: {\n map: {\n email: 'user.email',\n },\n },\n },\n out: [\n ['trackClient.identify', 'us3r', { email: 'user@example.com' }],\n [\n 'trackClient.track',\n 'us3r',\n {\n name: 'page view',\n data: {},\n timestamp: 1700000,\n },\n ],\n ],\n};\n\n/**\n * Per-event identify with silent -- user login fires identify() only.\n */\nexport const userLoginIdentify: CustomerIoStepExample = {\n title: 'User login identify',\n description:\n 'A user login triggers only a Customer.io identify call with profile attributes, skipping the track.',\n in: getEvent('user login', {\n timestamp: 1700000105,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n email: 'user@acme.com',\n first_name: 'Jane',\n plan: 'premium',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n identify: {\n map: {\n email: 'data.email',\n first_name: 'data.first_name',\n plan: 'data.plan',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.identify',\n 'us3r',\n { email: 'user@acme.com', first_name: 'Jane', plan: 'premium' },\n ],\n ],\n};\n\n/**\n * Page view -- fires trackClient.trackPageView() with url.\n * silent: true suppresses track(); settings.page fires trackPageView().\n */\nexport const pageView: CustomerIoStepExample = {\n title: 'Page view',\n description:\n 'A page view fires trackPageView with the URL and referrer instead of a generic track call.',\n in: getEvent('page view', {\n timestamp: 1700000106,\n user: { id: 'us3r', session: 's3ss10n' },\n data: {\n url: 'https://example.com/pricing',\n referrer: 'https://google.com',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n page: {\n map: {\n url: 'data.url',\n referrer: 'data.referrer',\n },\n },\n },\n },\n out: [\n [\n 'trackClient.trackPageView',\n 'us3r',\n 'https://example.com/pricing',\n { referrer: 'https://google.com' },\n ],\n ],\n};\n\n/**\n * Destroy -- permanently deletes a person from Customer.io.\n */\nexport const destroyPerson: CustomerIoStepExample = {\n title: 'Destroy person',\n description:\n 'A user delete event permanently removes the person from Customer.io via trackClient.destroy.',\n in: getEvent('user delete', {\n timestamp: 1700000107,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n destroy: true,\n },\n },\n out: [['trackClient.destroy', 'us3r']],\n};\n\n/**\n * Suppress -- stops messaging without deleting data.\n */\nexport const suppressPerson: CustomerIoStepExample = {\n title: 'Suppress person',\n description:\n 'A user suppress event stops messaging for the person without deleting their profile data.',\n in: getEvent('user suppress', {\n timestamp: 1700000108,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n suppress: true,\n },\n },\n out: [['trackClient.suppress', 'us3r']],\n};\n\n/**\n * Unsuppress -- resumes messaging for a suppressed person.\n */\nexport const unsuppressPerson: CustomerIoStepExample = {\n title: 'Unsuppress person',\n description:\n 'A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.',\n in: getEvent('user unsuppress', {\n timestamp: 1700000109,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: {\n silent: true,\n settings: {\n unsuppress: true,\n },\n },\n out: [['trackClient.unsuppress', 'us3r']],\n};\n\n/**\n * Wildcard ignore -- the event matches a mapping rule with ignore: true.\n * The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: CustomerIoStepExample = {\n public: false,\n in: getEvent('debug noise', {\n timestamp: 1700000110,\n user: { id: 'us3r', session: 's3ss10n' },\n }),\n mapping: { ignore: true },\n out: [],\n};\n"],"mappings":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,mBAAmB;;;ACA5B,SAAS,SAAS;AAEX,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,QAAQ,EACL,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,WAAW,EACR,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,QAAQ,EACL,KAAK,CAAC,MAAM,IAAI,CAAC,EACjB;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,SAAS,EACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,uDAAuD,EAChE,SAAS;AAAA,EACZ,YAAY,EACT,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAa,EACV,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,UAAU,EACP,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;ACnDD,SAAS,KAAAA,UAAS;AAEX,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EACpC,UAAUA,GACP,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,MAAMA,GACH,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,SAASA,GACN,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,UAAUA,GACP,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,YAAYA,GACT,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,WAAWA,GACR,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,cAAcA,GACX,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,OAAOA,GACJ,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,WAAWA,GACR,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,UAAUA,GACP,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;AFvDM,IAAM,WAAW,YAAY,cAAc;AAC3C,IAAM,UAAU,YAAY,aAAa;;;AGThD;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAoDA,IAAM,gBAA+B,MAAM,QAAQ,QAAQ;AAC3D,IAAM,aAAyB,MAAM,QAAQ,QAAQ;AACrD,IAAM,iBAAiC,MAAM,QAAQ,QAAQ;AAC7D,IAAM,YAAuB,MAAM,QAAQ,QAAQ;AACnD,IAAM,WAAqB,MAAM,QAAQ,QAAQ;AACjD,IAAM,iBAAiC,MAAM,QAAQ,QAAQ;AAC7D,IAAM,oBAAuC,MAAM,QAAQ,QAAQ;AACnE,IAAM,aAAyB,MAAM,QAAQ,QAAQ;AACrD,IAAM,YAAqB,MAAM,QAAQ,QAAQ;AAKjD,SAAS,wBAAmD;AAC1D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AACF;AAEA,SAAS,sBAA+C;AACtD,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,OAAY;AAAA,EACvB,aAAa,sBAAsB;AAAA,EACnC,WAAW,oBAAoB;AACjC;AAEO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACzGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAS,gBAAgB;AAclB,IAAM,eAAsC;AAAA,EACjD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,gBAAgB;AAAA,IAC3B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,kBAAyC;AAAA,EACpD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,kBAAkB;AAAA,IAC7B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,aAAoC;AAAA,EAC/C,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,kBAAkB;AAAA,IAC7B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,IACvC,MAAM,EAAE,IAAI,WAAW,OAAO,KAAK,UAAU,MAAM;AAAA,EACrD,CAAC;AAAA,EACD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,KAAK;AAAA,QACH,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,EAAE,UAAU,WAAW,OAAO,KAAK,UAAU,MAAM;AAAA,QACzD,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,iBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,gBAAgB;AAAA,IAC3B,WAAW;AAAA,IACX,MAAM,EAAE,SAAS,UAAU;AAAA,EAC7B,CAAC;AAAA,EACD,UAAU;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,sBAA6C;AAAA,EACxD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,aAAa;AAAA,IACxB,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,WAAW,OAAO,mBAAmB;AAAA,EACpE,CAAC;AAAA,EACD,UAAU;AAAA,IACR,UAAU;AAAA,MACR,KAAK;AAAA,QACH,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,CAAC,wBAAwB,QAAQ,EAAE,OAAO,mBAAmB,CAAC;AAAA,IAC9D;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,oBAA2C;AAAA,EACtD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,cAAc;AAAA,IACzB,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,IACvC,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AAAA,EACD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,UAAU;AAAA,QACR,KAAK;AAAA,UACH,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,OAAO,iBAAiB,YAAY,QAAQ,MAAM,UAAU;AAAA,IAChE;AAAA,EACF;AACF;AAMO,IAAM,WAAkC;AAAA,EAC7C,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,aAAa;AAAA,IACxB,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,IACvC,MAAM;AAAA,MACJ,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAAA,EACD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,KAAK;AAAA,UACH,KAAK;AAAA,UACL,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,UAAU,qBAAqB;AAAA,IACnC;AAAA,EACF;AACF;AAKO,IAAM,gBAAuC;AAAA,EAClD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,eAAe;AAAA,IAC1B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,KAAK,CAAC,CAAC,uBAAuB,MAAM,CAAC;AACvC;AAKO,IAAM,iBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,iBAAiB;AAAA,IAC5B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,CAAC,CAAC,wBAAwB,MAAM,CAAC;AACxC;AAKO,IAAM,mBAA0C;AAAA,EACrD,OAAO;AAAA,EACP,aACE;AAAA,EACF,IAAI,SAAS,mBAAmB;AAAA,IAC9B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,KAAK,CAAC,CAAC,0BAA0B,MAAM,CAAC;AAC1C;AAMO,IAAM,kBAAyC;AAAA,EACpD,QAAQ;AAAA,EACR,IAAI,SAAS,eAAe;AAAA,IAC1B,WAAW;AAAA,IACX,MAAM,EAAE,IAAI,QAAQ,SAAS,UAAU;AAAA,EACzC,CAAC;AAAA,EACD,SAAS,EAAE,QAAQ,KAAK;AAAA,EACxB,KAAK,CAAC;AACR;","names":["z"]}
@@ -111,12 +111,12 @@ declare const anonymousTrack: CustomerIoStepExample;
111
111
  */
112
112
  declare const destinationIdentify: CustomerIoStepExample;
113
113
  /**
114
- * Per-event identify with skip -- user login fires identify() only.
114
+ * Per-event identify with silent -- user login fires identify() only.
115
115
  */
116
116
  declare const userLoginIdentify: CustomerIoStepExample;
117
117
  /**
118
118
  * Page view -- fires trackClient.trackPageView() with url.
119
- * skip: true suppresses track(); settings.page fires trackPageView().
119
+ * silent: true suppresses track(); settings.page fires trackPageView().
120
120
  */
121
121
  declare const pageView: CustomerIoStepExample;
122
122
  /**
@@ -111,12 +111,12 @@ declare const anonymousTrack: CustomerIoStepExample;
111
111
  */
112
112
  declare const destinationIdentify: CustomerIoStepExample;
113
113
  /**
114
- * Per-event identify with skip -- user login fires identify() only.
114
+ * Per-event identify with silent -- user login fires identify() only.
115
115
  */
116
116
  declare const userLoginIdentify: CustomerIoStepExample;
117
117
  /**
118
118
  * Page view -- fires trackClient.trackPageView() with url.
119
- * skip: true suppresses track(); settings.page fires trackPageView().
119
+ * silent: true suppresses track(); settings.page fires trackPageView().
120
120
  */
121
121
  declare const pageView: CustomerIoStepExample;
122
122
  /**
@@ -228,7 +228,7 @@ var userLoginIdentify = {
228
228
  }
229
229
  }),
230
230
  mapping: {
231
- skip: true,
231
+ silent: true,
232
232
  settings: {
233
233
  identify: {
234
234
  map: {
@@ -259,7 +259,7 @@ var pageView = {
259
259
  }
260
260
  }),
261
261
  mapping: {
262
- skip: true,
262
+ silent: true,
263
263
  settings: {
264
264
  page: {
265
265
  map: {
@@ -286,7 +286,7 @@ var destroyPerson = {
286
286
  user: { id: "us3r", session: "s3ss10n" }
287
287
  }),
288
288
  mapping: {
289
- skip: true,
289
+ silent: true,
290
290
  settings: {
291
291
  destroy: true
292
292
  }
@@ -301,7 +301,7 @@ var suppressPerson = {
301
301
  user: { id: "us3r", session: "s3ss10n" }
302
302
  }),
303
303
  mapping: {
304
- skip: true,
304
+ silent: true,
305
305
  settings: {
306
306
  suppress: true
307
307
  }
@@ -316,7 +316,7 @@ var unsuppressPerson = {
316
316
  user: { id: "us3r", session: "s3ss10n" }
317
317
  }),
318
318
  mapping: {
319
- skip: true,
319
+ silent: true,
320
320
  settings: {
321
321
  unsuppress: true
322
322
  }
@@ -207,7 +207,7 @@ var userLoginIdentify = {
207
207
  }
208
208
  }),
209
209
  mapping: {
210
- skip: true,
210
+ silent: true,
211
211
  settings: {
212
212
  identify: {
213
213
  map: {
@@ -238,7 +238,7 @@ var pageView = {
238
238
  }
239
239
  }),
240
240
  mapping: {
241
- skip: true,
241
+ silent: true,
242
242
  settings: {
243
243
  page: {
244
244
  map: {
@@ -265,7 +265,7 @@ var destroyPerson = {
265
265
  user: { id: "us3r", session: "s3ss10n" }
266
266
  }),
267
267
  mapping: {
268
- skip: true,
268
+ silent: true,
269
269
  settings: {
270
270
  destroy: true
271
271
  }
@@ -280,7 +280,7 @@ var suppressPerson = {
280
280
  user: { id: "us3r", session: "s3ss10n" }
281
281
  }),
282
282
  mapping: {
283
- skip: true,
283
+ silent: true,
284
284
  settings: {
285
285
  suppress: true
286
286
  }
@@ -295,7 +295,7 @@ var unsuppressPerson = {
295
295
  user: { id: "us3r", session: "s3ss10n" }
296
296
  }),
297
297
  mapping: {
298
- skip: true,
298
+ silent: true,
299
299
  settings: {
300
300
  unsuppress: true
301
301
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,i=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,a={};((e,i)=>{for(var n in i)t(e,n,{get:i[n],enumerable:!0})})(a,{DestinationCustomerIo:()=>l,default:()=>d,destinationCustomerIo:()=>u}),module.exports=(e=a,((e,a,r,s)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of n(a))o.call(e,c)||c===r||t(e,c,{get:()=>a[c],enumerable:!(s=i(a,c))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var r=require("@walkeros/core"),s=async function(e,{config:t,rule:i,data:n,collector:o,env:a,logger:s}){var l;const u=t.settings,d=a,p=(null==d?void 0:d.trackClient)||u._trackClient,g=(null==d?void 0:d.apiClient)||u._apiClient;if(!p)return void s.warn("Customer.io TrackClient not initialized");const m=u._state||{},f=(null==i?void 0:i.settings)||{},y=e.timestamp?Math.floor(e.timestamp/1e3):void 0,v=u.customerId?c(await(0,r.getMappingValue)(e,u.customerId,{collector:o})):void 0,w=u.anonymousId?c(await(0,r.getMappingValue)(e,u.anonymousId,{collector:o})):void 0;if(!v&&!w)return void s.warn("Customer.io requires customerId or anonymousId; skipping event",{event:e.name});const I=null!=(l=f.identify)?l:u.identify;if(void 0!==I&&v){const t=await(0,r.getMappingValue)(e,I,{collector:o});(0,r.isObject)(t)&&await async function(e,t,i,n){var o;const a=n.lastIdentity||{},r=function(e){if(!e)return"";try{return JSON.stringify(e)}catch(e){return""}}(i),s=t!==a.customerId,c=r!==(null!=(o=a.attributesHash)?o:"");if(!s&&!c)return;await e.identify(t,i),n.lastIdentity={customerId:t,attributesHash:r}}(p,v,t,m)}if(void 0!==f.page&&v){const t=await(0,r.getMappingValue)(e,f.page,{collector:o});if((0,r.isObject)(t)){const e=t,i=(0,r.isString)(e.url)?e.url:void 0;if(i){const{url:t,...n}=e,o=Object.keys(n).length>0?n:void 0;await p.trackPageView(v,i,o)}}}if(!0===f.destroy&&v&&await p.destroy(v),!0===f.suppress&&v&&await p.suppress(v),!0===f.unsuppress&&v&&await p.unsuppress(v),void 0!==f.addDevice&&v){const t=await(0,r.getMappingValue)(e,f.addDevice,{collector:o});if((0,r.isObject)(t)){const e=t;(0,r.isString)(e.deviceId)&&(0,r.isString)(e.platform)&&await p.addDevice(v,e.deviceId,e.platform,(0,r.isObject)(e.data)?e.data:void 0)}}if(void 0!==f.deleteDevice&&v){const t=await(0,r.getMappingValue)(e,f.deleteDevice,{collector:o});if((0,r.isObject)(t)){const e=t;(0,r.isString)(e.deviceId)&&(0,r.isString)(e.platform)&&await p.deleteDevice(v,e.deviceId,e.platform)}}if(void 0!==f.merge&&v){const t=await(0,r.getMappingValue)(e,f.merge,{collector:o});if((0,r.isObject)(t)){const e=t;(0,r.isString)(e.primaryType)&&(0,r.isString)(e.primaryId)&&(0,r.isString)(e.secondaryType)&&(0,r.isString)(e.secondaryId)&&await p.mergeCustomers(e.primaryType,e.primaryId,e.secondaryType,e.secondaryId)}}if(void 0!==f.sendEmail&&g){const t=await(0,r.getMappingValue)(e,f.sendEmail,{collector:o});(0,r.isObject)(t)&&await g.sendEmail(t)}if(void 0!==f.sendPush&&g){const t=await(0,r.getMappingValue)(e,f.sendPush,{collector:o});(0,r.isObject)(t)&&await g.sendPush(t)}if(!0!==(null==i?void 0:i.skip)){const t=(0,r.isString)(null==i?void 0:i.name)?i.name:e.name,o=(0,r.isObject)(n)?n:{},a={name:t};a.data=o,void 0!==y&&(a.timestamp=y),v?await p.track(v,a):w&&await p.trackAnonymous(w,a)}u._state=m};function c(e){if((0,r.isString)(e)&&e.length>0)return e}var l={},u={type:"customerio",config:{},init({config:e,logger:t,env:i}){const n=function(e={},t){var i,n;const o=e.settings||{},{siteId:a,apiKey:r}=o;a||t.throw("Config settings siteId missing"),r||t.throw("Config settings apiKey missing");const s={...o,siteId:a,apiKey:r,customerId:null!=(i=o.customerId)?i:"user.id",anonymousId:null!=(n=o.anonymousId)?n:"user.session"};return{...e,settings:s}}(e,t),o=n.settings,a=i;if(!(null==a?void 0:a.trackClient))try{const e=require("customerio-node"),{TrackClient:t,RegionUS:i,RegionEU:n}=e,a="eu"===o.region?n:i,r=new t(o.siteId,o.apiKey,{region:a,...o.timeout?{timeout:o.timeout}:{}});o._trackClient=r}catch(e){t.throw(`Failed to initialize Customer.io TrackClient: ${e}`)}if(!(null==a?void 0:a.apiClient)&&o.appApiKey)try{const e=require("customerio-node"),{APIClient:t,RegionUS:i,RegionEU:n}=e,a="eu"===o.region?n:i,r=new t(o.appApiKey,{region:a,...o.timeout?{timeout:o.timeout}:{}});o._apiClient=r}catch(e){t.throw(`Failed to initialize Customer.io APIClient: ${e}`)}return o._state={},n},push:async(e,t)=>await s(e,t),async destroy({config:e}){const t=(null==e?void 0:e.settings)||{};t._trackClient=void 0,t._apiClient=void 0}},d=u;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,i=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,a={};((e,i)=>{for(var n in i)t(e,n,{get:i[n],enumerable:!0})})(a,{DestinationCustomerIo:()=>d,default:()=>l,destinationCustomerIo:()=>u}),module.exports=(e=a,((e,a,s,r)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of n(a))o.call(e,c)||c===s||t(e,c,{get:()=>a[c],enumerable:!(r=i(a,c))||r.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s=require("@walkeros/core"),r=async function(e,{config:t,rule:i,data:n,collector:o,env:a,logger:r}){const d=t.settings,u=a,l=u?.trackClient||d._trackClient,p=u?.apiClient||d._apiClient;if(!l)return void r.warn("Customer.io TrackClient not initialized");const g=d._state||{},m=i?.settings||{},f=e.timestamp?Math.floor(e.timestamp/1e3):void 0,y=d.customerId?c(await(0,s.getMappingValue)(e,d.customerId,{collector:o})):void 0,v=d.anonymousId?c(await(0,s.getMappingValue)(e,d.anonymousId,{collector:o})):void 0;if(!y&&!v)return void r.warn("Customer.io requires customerId or anonymousId; skipping event",{event:e.name});const w=m.identify??d.identify;if(void 0!==w&&y){const t=await(0,s.getMappingValue)(e,w,{collector:o});(0,s.isObject)(t)&&await async function(e,t,i,n){const o=n.lastIdentity||{},a=function(e){if(!e)return"";try{return JSON.stringify(e)}catch{return""}}(i),s=t!==o.customerId,r=a!==(o.attributesHash??"");if(!s&&!r)return;await e.identify(t,i),n.lastIdentity={customerId:t,attributesHash:a}}(l,y,t,g)}if(void 0!==m.page&&y){const t=await(0,s.getMappingValue)(e,m.page,{collector:o});if((0,s.isObject)(t)){const e=t,i=(0,s.isString)(e.url)?e.url:void 0;if(i){const{url:t,...n}=e,o=Object.keys(n).length>0?n:void 0;await l.trackPageView(y,i,o)}}}if(!0===m.destroy&&y&&await l.destroy(y),!0===m.suppress&&y&&await l.suppress(y),!0===m.unsuppress&&y&&await l.unsuppress(y),void 0!==m.addDevice&&y){const t=await(0,s.getMappingValue)(e,m.addDevice,{collector:o});if((0,s.isObject)(t)){const e=t;(0,s.isString)(e.deviceId)&&(0,s.isString)(e.platform)&&await l.addDevice(y,e.deviceId,e.platform,(0,s.isObject)(e.data)?e.data:void 0)}}if(void 0!==m.deleteDevice&&y){const t=await(0,s.getMappingValue)(e,m.deleteDevice,{collector:o});if((0,s.isObject)(t)){const e=t;(0,s.isString)(e.deviceId)&&(0,s.isString)(e.platform)&&await l.deleteDevice(y,e.deviceId,e.platform)}}if(void 0!==m.merge&&y){const t=await(0,s.getMappingValue)(e,m.merge,{collector:o});if((0,s.isObject)(t)){const e=t;(0,s.isString)(e.primaryType)&&(0,s.isString)(e.primaryId)&&(0,s.isString)(e.secondaryType)&&(0,s.isString)(e.secondaryId)&&await l.mergeCustomers(e.primaryType,e.primaryId,e.secondaryType,e.secondaryId)}}if(void 0!==m.sendEmail&&p){const t=await(0,s.getMappingValue)(e,m.sendEmail,{collector:o});(0,s.isObject)(t)&&await p.sendEmail(t)}if(void 0!==m.sendPush&&p){const t=await(0,s.getMappingValue)(e,m.sendPush,{collector:o});(0,s.isObject)(t)&&await p.sendPush(t)}if(!0!==i?.silent){const t=(0,s.isString)(i?.name)?i.name:e.name,o=(0,s.isObject)(n)?n:{},a={name:t};a.data=o,void 0!==f&&(a.timestamp=f),y?await l.track(y,a):v&&await l.trackAnonymous(v,a)}d._state=g};function c(e){if((0,s.isString)(e)&&e.length>0)return e}var d={},u={type:"customerio",config:{},init({config:e,logger:t,env:i}){const n=function(e={},t){const i=e.settings||{},{siteId:n,apiKey:o}=i;n||t.throw("Config settings siteId missing"),o||t.throw("Config settings apiKey missing");const a={...i,siteId:n,apiKey:o,customerId:i.customerId??"user.id",anonymousId:i.anonymousId??"user.session"};return{...e,settings:a}}(e,t),o=n.settings,a=i;if(!a?.trackClient)try{const e=require("customerio-node"),{TrackClient:t,RegionUS:i,RegionEU:n}=e,a="eu"===o.region?n:i,s=new t(o.siteId,o.apiKey,{region:a,...o.timeout?{timeout:o.timeout}:{}});o._trackClient=s}catch(e){t.throw(`Failed to initialize Customer.io TrackClient: ${e}`)}if(!a?.apiClient&&o.appApiKey)try{const e=require("customerio-node"),{APIClient:t,RegionUS:i,RegionEU:n}=e,a="eu"===o.region?n:i,s=new t(o.appApiKey,{region:a,...o.timeout?{timeout:o.timeout}:{}});o._apiClient=s}catch(e){t.throw(`Failed to initialize Customer.io APIClient: ${e}`)}return o._state={},n},push:async(e,t)=>await r(e,t),async destroy({config:e}){const t=e?.settings||{};t._trackClient=void 0,t._apiClient=void 0}},l=u;//# sourceMappingURL=index.js.map