@walkeros/server-destination-customerio 3.4.0 → 3.4.1-next-1776790594143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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:()=>d,SettingsSchema:()=>l,mapping:()=>g,settings:()=>c});var p=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),l=u.z.object({siteId:u.z.string().min(1).describe("Customer.io Site ID. Find it in Settings > Workspace Settings > API Credentials."),apiKey:u.z.string().min(1).describe("Customer.io API Key. Find it in Settings > Workspace Settings > API Credentials."),appApiKey:u.z.string().describe("App API Key for transactional messaging (sendEmail/sendPush). Find it in Settings > Workspace Settings > API Credentials > App API Keys.").optional(),region:u.z.enum(["us","eu"]).describe("Data center region. Must match where your Customer.io workspace was created. Default: us.").optional(),timeout:u.z.number().int().positive().describe("HTTP request timeout in milliseconds. Default: 10000.").optional(),customerId:u.z.string().describe("walkerOS mapping value path to resolve customerId from each event (like user.id).").optional(),anonymousId:u.z.string().describe("walkerOS mapping value path to resolve anonymousId from each event (like user.session).").optional(),identify:u.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()}),m=require("@walkeros/core/dev"),d=m.z.object({identify:m.z.unknown().describe("Per-event identify attributes. Resolves to { email?, first_name?, ... }. Use with skip: true on login/identify events.").optional(),page:m.z.unknown().describe("Per-event page view. Resolves to { url, ... }. Calls trackPageView(). Use with skip: true.").optional(),destroy:m.z.boolean().describe("Permanently delete person from Customer.io. Set true on delete events with skip: true.").optional(),suppress:m.z.boolean().describe("Suppress person (stop messaging without deleting data). Set true with skip: true.").optional(),unsuppress:m.z.boolean().describe("Unsuppress person (resume messaging). Set true with skip: true.").optional(),addDevice:m.z.unknown().describe("Register push device. Resolves to { deviceId, platform, data? }. Use with skip: true.").optional(),deleteDevice:m.z.unknown().describe("Remove push device. Resolves to { deviceId, platform }. Use with skip: true.").optional(),merge:m.z.unknown().describe("Merge duplicate profiles. Resolves to { primaryType, primaryId, secondaryType, secondaryId }. Use with skip: true.").optional(),sendEmail:m.z.unknown().describe("Send transactional email. Resolves to { to, transactional_message_id, message_data?, identifiers? }. Requires appApiKey. Use with skip: true.").optional(),sendPush:m.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)(l),g=(0,p.zodToSchema)(d),v={};a(v,{env:()=>k,step:()=>b});var k={};a(k,{push:()=>f,simulation:()=>h});var y=()=>Promise.resolve(),w=()=>Promise.resolve();var f={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:w,sendPush:w}},h=["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"],b={};a(b,{anonymousTrack:()=>S,defaultTrack:()=>P,destinationIdentify:()=>E,destroyPerson:()=>R,mappedData:()=>I,mappedEventName:()=>z,pageView:()=>A,suppressPerson:()=>D,unsuppressPerson:()=>U,userLoginIdentify:()=>_,wildcardIgnored:()=>O});var C=require("@walkeros/core"),P={in:(0,C.getEvent)("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},z={in:(0,C.getEvent)("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},I={in:(0,C.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={in:(0,C.getEvent)("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},E={in:(0,C.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}]]},_={in:(0,C.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"}]]},A={in:(0,C.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={in:(0,C.getEvent)("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},D={in:(0,C.getEvent)("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},U={in:(0,C.getEvent)("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},O={in:(0,C.getEvent)("debug noise",{timestamp:1700000110,user:{id:"us3r",session:"s3ss10n"}}),mapping:{ignore:!0},out:[]};//# sourceMappingURL=dev.js.map
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
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 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 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 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 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 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 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 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 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 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 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 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 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"]}
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:()=>f,destinationIdentify:()=>P,destroyPerson:()=>S,mappedData:()=>h,mappedEventName:()=>w,pageView:()=>I,suppressPerson:()=>A,unsuppressPerson:()=>R,userLoginIdentify:()=>b,wildcardIgnored:()=>_});import{getEvent as y}from"@walkeros/core";var f={in:y("product view",{timestamp:1700000100,user:{id:"us3r",session:"s3ss10n"}}),out:[["trackClient.track","us3r",{name:"product view",data:{},timestamp:17e5}]]},w={in:y("order complete",{timestamp:1700000101,user:{id:"us3r",session:"s3ss10n"}}),mapping:{name:"purchase"},out:[["trackClient.track","us3r",{name:"purchase",data:{},timestamp:17e5}]]},h={in:y("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={in:y("product view",{timestamp:1700000103,user:{session:"s3ss10n"}}),settings:{customerId:void 0},out:[["trackClient.trackAnonymous","s3ss10n",{name:"product view",data:{},timestamp:17e5}]]},P={in:y("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}]]},b={in:y("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"}]]},I={in:y("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"}]]},S={in:y("user delete",{timestamp:1700000107,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{destroy:!0}},out:[["trackClient.destroy","us3r"]]},A={in:y("user suppress",{timestamp:1700000108,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{suppress:!0}},out:[["trackClient.suppress","us3r"]]},R={in:y("user unsuppress",{timestamp:1700000109,user:{id:"us3r",session:"s3ss10n"}}),mapping:{skip:!0,settings:{unsuppress:!0}},out:[["trackClient.unsuppress","us3r"]]},_={in:y("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 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
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 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 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 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 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 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 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 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 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 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 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 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 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"]}
@@ -96,6 +96,8 @@ __export(step_exports, {
96
96
  });
97
97
  var import_core = require("@walkeros/core");
98
98
  var defaultTrack = {
99
+ title: "Default track",
100
+ description: "A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",
99
101
  in: (0, import_core.getEvent)("product view", {
100
102
  timestamp: 1700000100,
101
103
  user: { id: "us3r", session: "s3ss10n" }
@@ -113,6 +115,8 @@ var defaultTrack = {
113
115
  ]
114
116
  };
115
117
  var mappedEventName = {
118
+ title: "Rename event",
119
+ description: "A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",
116
120
  in: (0, import_core.getEvent)("order complete", {
117
121
  timestamp: 1700000101,
118
122
  user: { id: "us3r", session: "s3ss10n" }
@@ -133,6 +137,8 @@ var mappedEventName = {
133
137
  ]
134
138
  };
135
139
  var mappedData = {
140
+ title: "Mapped properties",
141
+ description: "A data mapping transforms the event payload into Customer.io track properties for an order.",
136
142
  in: (0, import_core.getEvent)("order complete", {
137
143
  timestamp: 1700000102,
138
144
  user: { id: "us3r", session: "s3ss10n" },
@@ -161,6 +167,8 @@ var mappedData = {
161
167
  ]
162
168
  };
163
169
  var anonymousTrack = {
170
+ title: "Anonymous track",
171
+ description: "When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",
164
172
  in: (0, import_core.getEvent)("product view", {
165
173
  timestamp: 1700000103,
166
174
  user: { session: "s3ss10n" }
@@ -181,6 +189,8 @@ var anonymousTrack = {
181
189
  ]
182
190
  };
183
191
  var destinationIdentify = {
192
+ title: "Destination identify",
193
+ description: "Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",
184
194
  in: (0, import_core.getEvent)("page view", {
185
195
  timestamp: 1700000104,
186
196
  user: { id: "us3r", session: "s3ss10n", email: "user@example.com" }
@@ -206,6 +216,8 @@ var destinationIdentify = {
206
216
  ]
207
217
  };
208
218
  var userLoginIdentify = {
219
+ title: "User login identify",
220
+ description: "A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",
209
221
  in: (0, import_core.getEvent)("user login", {
210
222
  timestamp: 1700000105,
211
223
  user: { id: "us3r", session: "s3ss10n" },
@@ -236,6 +248,8 @@ var userLoginIdentify = {
236
248
  ]
237
249
  };
238
250
  var pageView = {
251
+ title: "Page view",
252
+ description: "A page view fires trackPageView with the URL and referrer instead of a generic track call.",
239
253
  in: (0, import_core.getEvent)("page view", {
240
254
  timestamp: 1700000106,
241
255
  user: { id: "us3r", session: "s3ss10n" },
@@ -265,6 +279,8 @@ var pageView = {
265
279
  ]
266
280
  };
267
281
  var destroyPerson = {
282
+ title: "Destroy person",
283
+ description: "A user delete event permanently removes the person from Customer.io via trackClient.destroy.",
268
284
  in: (0, import_core.getEvent)("user delete", {
269
285
  timestamp: 1700000107,
270
286
  user: { id: "us3r", session: "s3ss10n" }
@@ -278,6 +294,8 @@ var destroyPerson = {
278
294
  out: [["trackClient.destroy", "us3r"]]
279
295
  };
280
296
  var suppressPerson = {
297
+ title: "Suppress person",
298
+ description: "A user suppress event stops messaging for the person without deleting their profile data.",
281
299
  in: (0, import_core.getEvent)("user suppress", {
282
300
  timestamp: 1700000108,
283
301
  user: { id: "us3r", session: "s3ss10n" }
@@ -291,6 +309,8 @@ var suppressPerson = {
291
309
  out: [["trackClient.suppress", "us3r"]]
292
310
  };
293
311
  var unsuppressPerson = {
312
+ title: "Unsuppress person",
313
+ description: "A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",
294
314
  in: (0, import_core.getEvent)("user unsuppress", {
295
315
  timestamp: 1700000109,
296
316
  user: { id: "us3r", session: "s3ss10n" }
@@ -304,6 +324,7 @@ var unsuppressPerson = {
304
324
  out: [["trackClient.unsuppress", "us3r"]]
305
325
  };
306
326
  var wildcardIgnored = {
327
+ public: false,
307
328
  in: (0, import_core.getEvent)("debug noise", {
308
329
  timestamp: 1700000110,
309
330
  user: { id: "us3r", session: "s3ss10n" }
@@ -75,6 +75,8 @@ __export(step_exports, {
75
75
  });
76
76
  import { getEvent } from "@walkeros/core";
77
77
  var defaultTrack = {
78
+ title: "Default track",
79
+ description: "A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",
78
80
  in: getEvent("product view", {
79
81
  timestamp: 1700000100,
80
82
  user: { id: "us3r", session: "s3ss10n" }
@@ -92,6 +94,8 @@ var defaultTrack = {
92
94
  ]
93
95
  };
94
96
  var mappedEventName = {
97
+ title: "Rename event",
98
+ description: "A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",
95
99
  in: getEvent("order complete", {
96
100
  timestamp: 1700000101,
97
101
  user: { id: "us3r", session: "s3ss10n" }
@@ -112,6 +116,8 @@ var mappedEventName = {
112
116
  ]
113
117
  };
114
118
  var mappedData = {
119
+ title: "Mapped properties",
120
+ description: "A data mapping transforms the event payload into Customer.io track properties for an order.",
115
121
  in: getEvent("order complete", {
116
122
  timestamp: 1700000102,
117
123
  user: { id: "us3r", session: "s3ss10n" },
@@ -140,6 +146,8 @@ var mappedData = {
140
146
  ]
141
147
  };
142
148
  var anonymousTrack = {
149
+ title: "Anonymous track",
150
+ description: "When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",
143
151
  in: getEvent("product view", {
144
152
  timestamp: 1700000103,
145
153
  user: { session: "s3ss10n" }
@@ -160,6 +168,8 @@ var anonymousTrack = {
160
168
  ]
161
169
  };
162
170
  var destinationIdentify = {
171
+ title: "Destination identify",
172
+ description: "Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",
163
173
  in: getEvent("page view", {
164
174
  timestamp: 1700000104,
165
175
  user: { id: "us3r", session: "s3ss10n", email: "user@example.com" }
@@ -185,6 +195,8 @@ var destinationIdentify = {
185
195
  ]
186
196
  };
187
197
  var userLoginIdentify = {
198
+ title: "User login identify",
199
+ description: "A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",
188
200
  in: getEvent("user login", {
189
201
  timestamp: 1700000105,
190
202
  user: { id: "us3r", session: "s3ss10n" },
@@ -215,6 +227,8 @@ var userLoginIdentify = {
215
227
  ]
216
228
  };
217
229
  var pageView = {
230
+ title: "Page view",
231
+ description: "A page view fires trackPageView with the URL and referrer instead of a generic track call.",
218
232
  in: getEvent("page view", {
219
233
  timestamp: 1700000106,
220
234
  user: { id: "us3r", session: "s3ss10n" },
@@ -244,6 +258,8 @@ var pageView = {
244
258
  ]
245
259
  };
246
260
  var destroyPerson = {
261
+ title: "Destroy person",
262
+ description: "A user delete event permanently removes the person from Customer.io via trackClient.destroy.",
247
263
  in: getEvent("user delete", {
248
264
  timestamp: 1700000107,
249
265
  user: { id: "us3r", session: "s3ss10n" }
@@ -257,6 +273,8 @@ var destroyPerson = {
257
273
  out: [["trackClient.destroy", "us3r"]]
258
274
  };
259
275
  var suppressPerson = {
276
+ title: "Suppress person",
277
+ description: "A user suppress event stops messaging for the person without deleting their profile data.",
260
278
  in: getEvent("user suppress", {
261
279
  timestamp: 1700000108,
262
280
  user: { id: "us3r", session: "s3ss10n" }
@@ -270,6 +288,8 @@ var suppressPerson = {
270
288
  out: [["trackClient.suppress", "us3r"]]
271
289
  };
272
290
  var unsuppressPerson = {
291
+ title: "Unsuppress person",
292
+ description: "A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",
273
293
  in: getEvent("user unsuppress", {
274
294
  timestamp: 1700000109,
275
295
  user: { id: "us3r", session: "s3ss10n" }
@@ -283,6 +303,7 @@ var unsuppressPerson = {
283
303
  out: [["trackClient.unsuppress", "us3r"]]
284
304
  };
285
305
  var wildcardIgnored = {
306
+ public: false,
286
307
  in: getEvent("debug noise", {
287
308
  timestamp: 1700000110,
288
309
  user: { id: "us3r", session: "s3ss10n" }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-destination-customerio",
4
- "version": "3.4.0",
4
+ "version": "3.4.1-next-1776790594143",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "server"
@@ -162,6 +162,8 @@
162
162
  },
163
163
  "step": {
164
164
  "anonymousTrack": {
165
+ "title": "Anonymous track",
166
+ "description": "When no customer id is resolved the event is sent via trackAnonymous keyed by the session id.",
165
167
  "in": {
166
168
  "name": "product view",
167
169
  "data": {
@@ -199,7 +201,7 @@
199
201
  "group": "gr0up",
200
202
  "count": 1,
201
203
  "version": {
202
- "source": "3.4.0",
204
+ "source": "3.4.1-next-1776790594143",
203
205
  "tagging": 1
204
206
  },
205
207
  "source": {
@@ -222,6 +224,8 @@
222
224
  ]
223
225
  },
224
226
  "defaultTrack": {
227
+ "title": "Default track",
228
+ "description": "A walkerOS event is forwarded to Customer.io as a track call keyed by the user id.",
225
229
  "in": {
226
230
  "name": "product view",
227
231
  "data": {
@@ -260,7 +264,7 @@
260
264
  "group": "gr0up",
261
265
  "count": 1,
262
266
  "version": {
263
- "source": "3.4.0",
267
+ "source": "3.4.1-next-1776790594143",
264
268
  "tagging": 1
265
269
  },
266
270
  "source": {
@@ -282,6 +286,8 @@
282
286
  ]
283
287
  },
284
288
  "destinationIdentify": {
289
+ "title": "Destination identify",
290
+ "description": "Destination-level identify fires a Customer.io identify call once on the first push, before the track, attaching user attributes.",
285
291
  "in": {
286
292
  "name": "page view",
287
293
  "data": {
@@ -336,7 +342,7 @@
336
342
  "group": "gr0up",
337
343
  "count": 1,
338
344
  "version": {
339
- "source": "3.4.0",
345
+ "source": "3.4.1-next-1776790594143",
340
346
  "tagging": 1
341
347
  },
342
348
  "source": {
@@ -372,6 +378,8 @@
372
378
  ]
373
379
  },
374
380
  "destroyPerson": {
381
+ "title": "Destroy person",
382
+ "description": "A user delete event permanently removes the person from Customer.io via trackClient.destroy.",
375
383
  "in": {
376
384
  "name": "user delete",
377
385
  "data": {
@@ -427,7 +435,7 @@
427
435
  "group": "gr0up",
428
436
  "count": 1,
429
437
  "version": {
430
- "source": "3.4.0",
438
+ "source": "3.4.1-next-1776790594143",
431
439
  "tagging": 1
432
440
  },
433
441
  "source": {
@@ -450,6 +458,8 @@
450
458
  ]
451
459
  },
452
460
  "mappedData": {
461
+ "title": "Mapped properties",
462
+ "description": "A data mapping transforms the event payload into Customer.io track properties for an order.",
453
463
  "in": {
454
464
  "name": "order complete",
455
465
  "data": {
@@ -533,7 +543,7 @@
533
543
  "group": "gr0up",
534
544
  "count": 1,
535
545
  "version": {
536
- "source": "3.4.0",
546
+ "source": "3.4.1-next-1776790594143",
537
547
  "tagging": 1
538
548
  },
539
549
  "source": {
@@ -569,6 +579,8 @@
569
579
  ]
570
580
  },
571
581
  "mappedEventName": {
582
+ "title": "Rename event",
583
+ "description": "A mapping rule renames the walker event to a Customer.io-specific event name such as purchase.",
572
584
  "in": {
573
585
  "name": "order complete",
574
586
  "data": {
@@ -654,7 +666,7 @@
654
666
  "group": "gr0up",
655
667
  "count": 1,
656
668
  "version": {
657
- "source": "3.4.0",
669
+ "source": "3.4.1-next-1776790594143",
658
670
  "tagging": 1
659
671
  },
660
672
  "source": {
@@ -679,6 +691,8 @@
679
691
  ]
680
692
  },
681
693
  "pageView": {
694
+ "title": "Page view",
695
+ "description": "A page view fires trackPageView with the URL and referrer instead of a generic track call.",
682
696
  "in": {
683
697
  "name": "page view",
684
698
  "data": {
@@ -728,7 +742,7 @@
728
742
  "group": "gr0up",
729
743
  "count": 1,
730
744
  "version": {
731
- "source": "3.4.0",
745
+ "source": "3.4.1-next-1776790594143",
732
746
  "tagging": 1
733
747
  },
734
748
  "source": {
@@ -760,6 +774,8 @@
760
774
  ]
761
775
  },
762
776
  "suppressPerson": {
777
+ "title": "Suppress person",
778
+ "description": "A user suppress event stops messaging for the person without deleting their profile data.",
763
779
  "in": {
764
780
  "name": "user suppress",
765
781
  "data": {
@@ -815,7 +831,7 @@
815
831
  "group": "gr0up",
816
832
  "count": 1,
817
833
  "version": {
818
- "source": "3.4.0",
834
+ "source": "3.4.1-next-1776790594143",
819
835
  "tagging": 1
820
836
  },
821
837
  "source": {
@@ -838,6 +854,8 @@
838
854
  ]
839
855
  },
840
856
  "unsuppressPerson": {
857
+ "title": "Unsuppress person",
858
+ "description": "A user unsuppress event resumes messaging for a previously suppressed Customer.io profile.",
841
859
  "in": {
842
860
  "name": "user unsuppress",
843
861
  "data": {
@@ -893,7 +911,7 @@
893
911
  "group": "gr0up",
894
912
  "count": 1,
895
913
  "version": {
896
- "source": "3.4.0",
914
+ "source": "3.4.1-next-1776790594143",
897
915
  "tagging": 1
898
916
  },
899
917
  "source": {
@@ -916,6 +934,8 @@
916
934
  ]
917
935
  },
918
936
  "userLoginIdentify": {
937
+ "title": "User login identify",
938
+ "description": "A user login triggers only a Customer.io identify call with profile attributes, skipping the track.",
919
939
  "in": {
920
940
  "name": "user login",
921
941
  "data": {
@@ -966,7 +986,7 @@
966
986
  "group": "gr0up",
967
987
  "count": 1,
968
988
  "version": {
969
- "source": "3.4.0",
989
+ "source": "3.4.1-next-1776790594143",
970
990
  "tagging": 1
971
991
  },
972
992
  "source": {
@@ -1000,6 +1020,7 @@
1000
1020
  ]
1001
1021
  },
1002
1022
  "wildcardIgnored": {
1023
+ "public": false,
1003
1024
  "in": {
1004
1025
  "name": "debug noise",
1005
1026
  "data": {
@@ -1055,7 +1076,7 @@
1055
1076
  "group": "gr0up",
1056
1077
  "count": 1,
1057
1078
  "version": {
1058
- "source": "3.4.0",
1079
+ "source": "3.4.1-next-1776790594143",
1059
1080
  "tagging": 1
1060
1081
  },
1061
1082
  "source": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-destination-customerio",
3
3
  "description": "Customer.io messaging automation server destination for walkerOS (customerio-node, Track + Transactional API)",
4
- "version": "3.4.0",
4
+ "version": "3.4.1-next-1776790594143",
5
5
  "license": "MIT",
6
6
  "exports": {
7
7
  ".": {
@@ -35,11 +35,11 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "customerio-node": "^4.2.0",
38
- "@walkeros/core": "3.4.0",
39
- "@walkeros/server-core": "3.4.0"
38
+ "@walkeros/core": "3.4.1-next-1776790594143",
39
+ "@walkeros/server-core": "3.4.1-next-1776790594143"
40
40
  },
41
41
  "devDependencies": {
42
- "@walkeros/collector": "3.4.0"
42
+ "@walkeros/collector": "3.4.1-next-1776790594143"
43
43
  },
44
44
  "repository": {
45
45
  "url": "git+https://github.com/elbwalker/walkerOS.git",