@walkeros/web-destination-optimizely 4.2.0 → 4.2.1-next-1781538735002
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/dev.d.mts +3 -1
- package/dist/dev.d.ts +3 -1
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/examples/index.d.mts +3 -1
- package/dist/examples/index.d.ts +3 -1
- package/dist/examples/index.js +1 -0
- package/dist/examples/index.mjs +1 -0
- package/dist/walkerOS.json +10 -7
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @walkeros/web-destination-optimizely
|
|
2
2
|
|
|
3
|
+
## 4.2.1-next-1781538735002
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [5cbcd23]
|
|
8
|
+
- @walkeros/core@4.2.1-next-1781538735002
|
|
9
|
+
- @walkeros/web-core@4.2.1-next-1781538735002
|
|
10
|
+
|
|
3
11
|
## 4.2.0
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
package/dist/dev.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _walkeros_core_dev from '@walkeros/core/dev';
|
|
2
2
|
import { z } from '@walkeros/core/dev';
|
|
3
|
-
import { Mapping as Mapping$1, Flow } from '@walkeros/core';
|
|
3
|
+
import { Mapping as Mapping$1, Flow, WalkerOS } from '@walkeros/core';
|
|
4
4
|
import { DestinationWeb } from '@walkeros/web-core';
|
|
5
5
|
|
|
6
6
|
declare const SettingsSchema: z.ZodObject<{
|
|
@@ -127,6 +127,8 @@ declare namespace env {
|
|
|
127
127
|
*/
|
|
128
128
|
type OptimizelyStepExample = Flow.StepExample & {
|
|
129
129
|
settings?: Partial<Settings>;
|
|
130
|
+
/** Consent granted before `in` so a gated destination is loaded first. */
|
|
131
|
+
before?: WalkerOS.Consent;
|
|
130
132
|
};
|
|
131
133
|
/**
|
|
132
134
|
* Default event forwarding -- every walkerOS event becomes
|
package/dist/dev.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _walkeros_core_dev from '@walkeros/core/dev';
|
|
2
2
|
import { z } from '@walkeros/core/dev';
|
|
3
|
-
import { Mapping as Mapping$1, Flow } from '@walkeros/core';
|
|
3
|
+
import { Mapping as Mapping$1, Flow, WalkerOS } from '@walkeros/core';
|
|
4
4
|
import { DestinationWeb } from '@walkeros/web-core';
|
|
5
5
|
|
|
6
6
|
declare const SettingsSchema: z.ZodObject<{
|
|
@@ -127,6 +127,8 @@ declare namespace env {
|
|
|
127
127
|
*/
|
|
128
128
|
type OptimizelyStepExample = Flow.StepExample & {
|
|
129
129
|
settings?: Partial<Settings>;
|
|
130
|
+
/** Consent granted before `in` so a gated destination is loaded first. */
|
|
131
|
+
before?: WalkerOS.Consent;
|
|
130
132
|
};
|
|
131
133
|
/**
|
|
132
134
|
* Default event forwarding -- every walkerOS event becomes
|
package/dist/dev.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a=(e,n)=>{for(var i in n)t(e,i,{get:n[i],enumerable:!0})},o={};a(o,{examples:()=>g,schemas:()=>s}),module.exports=(e=o,((e,a,o,s)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let l of i(a))r.call(e,l)||l===o||t(e,l,{get:()=>a[l],enumerable:!(s=n(a,l))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};a(s,{MappingSchema:()=>m,SettingsSchema:()=>c,mapping:()=>v,settings:()=>d});var l=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),c=u.z.object({sdkKey:u.z.string().min(1).describe("Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments."),userId:u.z.unknown().describe('walkerOS mapping value to resolve userId for experiment bucketing. Example: "user.id" or { key: "user.id", value: "user.device" } for fallback.').optional(),attributes:u.z.unknown().describe("User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().").optional(),updateInterval:u.z.number().int().positive().describe("Polling interval for datafile updates in milliseconds. Default: 60000.").optional(),autoUpdate:u.z.boolean().describe("Auto-update datafile via polling. Default: true.").optional(),batchSize:u.z.number().int().positive().describe("Batch event processor: number of events per batch. Default: 10.").optional(),flushInterval:u.z.number().int().positive().describe("Batch event processor: flush interval in milliseconds. Default: 1000.").optional(),skipOdp:u.z.boolean().describe("Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.").optional()}),p=require("@walkeros/core/dev"),m=p.z.object({eventKey:p.z.string().describe("Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.").optional(),revenue:p.z.unknown().describe("Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().").optional(),value:p.z.unknown().describe("Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().").optional(),eventTags:p.z.unknown().describe("Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().").optional(),attributes:p.z.unknown().describe("Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.").optional()}),d=(0,l.zodToSchema)(c),v=(0,l.zodToSchema)(m),g={};a(g,{env:()=>y,step:()=>E});var y={};a(y,{init:()=>k,push:()=>h,simulation:()=>w});var b=()=>{};function f(){return{onReady:()=>Promise.resolve({success:!0}),createUserContext:()=>({trackEvent:b,setAttribute:b}),close:b}}function z(){return{createInstance:()=>f(),createPollingProjectConfigManager:()=>({}),createBatchEventProcessor:()=>({})}}var k={optimizely:z()},h={optimizely:z()},w=["call:optimizely.createInstance","call:optimizely.client.onReady","call:optimizely.client.createUserContext","call:optimizely.userContext.trackEvent","call:optimizely.userContext.setAttribute","call:optimizely.client.close"],E={};a(E,{attributesOnlySilent:()=>D,consentGranted:()=>x,consentRevoked:()=>j,defaultEventForwarding:()=>A,mappedEventName:()=>P,orderCompleteRevenue:()=>R,signupWithAttributes:()=>S,wildcardIgnored:()=>_});var O=require("@walkeros/core"),A={title:"Default event",description:"A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.",in:(0,O.getEvent)("page view",{timestamp:1700000100}),out:[["optimizely.trackEvent","page view",{}]]},P={title:"Mapped event key",description:"A mapping renames the walker event to an Optimizely event key defined in the project.",in:(0,O.getEvent)("product view",{timestamp:1700000101}),mapping:{name:"product_viewed"},out:[["optimizely.trackEvent","product_viewed",{}]]},R={title:"Purchase revenue",description:"An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.",in:(0,O.getEvent)("order complete",{timestamp:1700000102,data:{revenue_cents:55500,total:555,currency:"EUR",item_count:3}}),mapping:{name:"purchase",settings:{revenue:"data.revenue_cents",value:"data.total",eventTags:{map:{currency:"data.currency",item_count:"data.item_count"}}}},out:[["optimizely.trackEvent","purchase",{revenue:55500,value:555,currency:"EUR",item_count:3}]]},S={title:"Signup with attributes",description:"A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.",in:(0,O.getEvent)("user signup",{timestamp:1700000103,data:{method:"google",source:"referral"}}),mapping:{name:"signup",settings:{attributes:{map:{signup_method:"data.method",referral_source:"data.source"}}}},out:[["optimizely.setAttribute","signup_method","google"],["optimizely.setAttribute","referral_source","referral"],["optimizely.trackEvent","signup",{}]]},_={public:!1,in:(0,O.getEvent)("debug noise",{timestamp:1700000104}),mapping:{ignore:!0},out:[]},D={title:"Attributes only",description:"A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.",in:(0,O.getEvent)("profile update",{timestamp:1700000105,data:{plan:"premium",country:"DE"}}),mapping:{silent:!0,settings:{attributes:{map:{plan:"data.plan",country:"data.country"}}}},out:[["optimizely.setAttribute","plan","premium"],["optimizely.setAttribute","country","DE"]]},j={title:"Consent revoked",description:"A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",command:"consent",in:{analytics:!1},settings:{},out:[["optimizely.close"]]},x={public:!1,command:"consent",in:{analytics:!0},settings:{},out:[]};//# sourceMappingURL=dev.js.map
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a=(e,n)=>{for(var i in n)t(e,i,{get:n[i],enumerable:!0})},o={};a(o,{examples:()=>g,schemas:()=>s}),module.exports=(e=o,((e,a,o,s)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let l of i(a))r.call(e,l)||l===o||t(e,l,{get:()=>a[l],enumerable:!(s=n(a,l))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};a(s,{MappingSchema:()=>m,SettingsSchema:()=>c,mapping:()=>v,settings:()=>d});var l=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),c=u.z.object({sdkKey:u.z.string().min(1).describe("Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments."),userId:u.z.unknown().describe('walkerOS mapping value to resolve userId for experiment bucketing. Example: "user.id" or { key: "user.id", value: "user.device" } for fallback.').optional(),attributes:u.z.unknown().describe("User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().").optional(),updateInterval:u.z.number().int().positive().describe("Polling interval for datafile updates in milliseconds. Default: 60000.").optional(),autoUpdate:u.z.boolean().describe("Auto-update datafile via polling. Default: true.").optional(),batchSize:u.z.number().int().positive().describe("Batch event processor: number of events per batch. Default: 10.").optional(),flushInterval:u.z.number().int().positive().describe("Batch event processor: flush interval in milliseconds. Default: 1000.").optional(),skipOdp:u.z.boolean().describe("Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.").optional()}),p=require("@walkeros/core/dev"),m=p.z.object({eventKey:p.z.string().describe("Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.").optional(),revenue:p.z.unknown().describe("Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().").optional(),value:p.z.unknown().describe("Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().").optional(),eventTags:p.z.unknown().describe("Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().").optional(),attributes:p.z.unknown().describe("Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.").optional()}),d=(0,l.zodToSchema)(c),v=(0,l.zodToSchema)(m),g={};a(g,{env:()=>y,step:()=>E});var y={};a(y,{init:()=>k,push:()=>h,simulation:()=>w});var b=()=>{};function f(){return{onReady:()=>Promise.resolve({success:!0}),createUserContext:()=>({trackEvent:b,setAttribute:b}),close:b}}function z(){return{createInstance:()=>f(),createPollingProjectConfigManager:()=>({}),createBatchEventProcessor:()=>({})}}var k={optimizely:z()},h={optimizely:z()},w=["call:optimizely.createInstance","call:optimizely.client.onReady","call:optimizely.client.createUserContext","call:optimizely.userContext.trackEvent","call:optimizely.userContext.setAttribute","call:optimizely.client.close"],E={};a(E,{attributesOnlySilent:()=>D,consentGranted:()=>x,consentRevoked:()=>j,defaultEventForwarding:()=>A,mappedEventName:()=>P,orderCompleteRevenue:()=>R,signupWithAttributes:()=>S,wildcardIgnored:()=>_});var O=require("@walkeros/core"),A={title:"Default event",description:"A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.",in:(0,O.getEvent)("page view",{timestamp:1700000100}),out:[["optimizely.trackEvent","page view",{}]]},P={title:"Mapped event key",description:"A mapping renames the walker event to an Optimizely event key defined in the project.",in:(0,O.getEvent)("product view",{timestamp:1700000101}),mapping:{name:"product_viewed"},out:[["optimizely.trackEvent","product_viewed",{}]]},R={title:"Purchase revenue",description:"An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.",in:(0,O.getEvent)("order complete",{timestamp:1700000102,data:{revenue_cents:55500,total:555,currency:"EUR",item_count:3}}),mapping:{name:"purchase",settings:{revenue:"data.revenue_cents",value:"data.total",eventTags:{map:{currency:"data.currency",item_count:"data.item_count"}}}},out:[["optimizely.trackEvent","purchase",{revenue:55500,value:555,currency:"EUR",item_count:3}]]},S={title:"Signup with attributes",description:"A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.",in:(0,O.getEvent)("user signup",{timestamp:1700000103,data:{method:"google",source:"referral"}}),mapping:{name:"signup",settings:{attributes:{map:{signup_method:"data.method",referral_source:"data.source"}}}},out:[["optimizely.setAttribute","signup_method","google"],["optimizely.setAttribute","referral_source","referral"],["optimizely.trackEvent","signup",{}]]},_={public:!1,in:(0,O.getEvent)("debug noise",{timestamp:1700000104}),mapping:{ignore:!0},out:[]},D={title:"Attributes only",description:"A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.",in:(0,O.getEvent)("profile update",{timestamp:1700000105,data:{plan:"premium",country:"DE"}}),mapping:{silent:!0,settings:{attributes:{map:{plan:"data.plan",country:"data.country"}}}},out:[["optimizely.setAttribute","plan","premium"],["optimizely.setAttribute","country","DE"]]},j={title:"Consent revoked",description:"A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",command:"consent",before:{analytics:!0},in:{analytics:!1},settings:{},out:[["optimizely.close"]]},x={public:!1,command:"consent",in:{analytics:!0},settings:{},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 sdkKey: z\n .string()\n .min(1)\n .describe(\n 'Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments.',\n ),\n userId: z\n .unknown()\n .describe(\n 'walkerOS mapping value to resolve userId for experiment bucketing. Example: \"user.id\" or { key: \"user.id\", value: \"user.device\" } for fallback.',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n 'User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().',\n )\n .optional(),\n updateInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Polling interval for datafile updates in milliseconds. Default: 60000.',\n )\n .optional(),\n autoUpdate: z\n .boolean()\n .describe('Auto-update datafile via polling. Default: true.')\n .optional(),\n batchSize: z\n .number()\n .int()\n .positive()\n .describe('Batch event processor: number of events per batch. Default: 10.')\n .optional(),\n flushInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Batch event processor: flush interval in milliseconds. Default: 1000.',\n )\n .optional(),\n skipOdp: z\n .boolean()\n .describe(\n 'Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.',\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 eventKey: z\n .string()\n .describe(\n 'Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.',\n )\n .optional(),\n revenue: z\n .unknown()\n .describe(\n 'Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().',\n )\n .optional(),\n value: z\n .unknown()\n .describe(\n 'Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().',\n )\n .optional(),\n eventTags: z\n .unknown()\n .describe(\n 'Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n \"Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.\",\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 OptimizelyClient,\n OptimizelyUserContext,\n OptimizelySDK,\n} from '../types';\n\n/**\n * Example environment configurations for Optimizely destination.\n *\n * Tests clone `push` and replace individual methods with jest spies.\n * Production leaves `env.optimizely` undefined -- the destination falls back\n * to the real `@optimizely/optimizely-sdk` import.\n */\n\nconst noop = () => {};\n\n// Narrow helper types for mock SDK factory functions without loose casts.\ntype OptCreateInstance = OptimizelySDK['createInstance'];\ntype OptCreatePollingConfigMgr =\n OptimizelySDK['createPollingProjectConfigManager'];\ntype OptCreateBatchEventProcessor = OptimizelySDK['createBatchEventProcessor'];\ntype OptCreateUserContext = OptimizelyClient['createUserContext'];\ntype OptOnReady = OptimizelyClient['onReady'];\ntype OptTrackEvent = OptimizelyUserContext['trackEvent'];\ntype OptSetAttribute = OptimizelyUserContext['setAttribute'];\n\nfunction createMockUserContext(): OptimizelyUserContext {\n return {\n trackEvent: noop as OptTrackEvent,\n setAttribute: noop as OptSetAttribute,\n };\n}\n\nfunction createMockClient(): OptimizelyClient {\n return {\n onReady: (() => Promise.resolve({ success: true })) as OptOnReady,\n createUserContext: (() => createMockUserContext()) as OptCreateUserContext,\n close: noop,\n };\n}\n\nfunction createMockSDK(): OptimizelySDK {\n return {\n createInstance: (() => createMockClient()) as OptCreateInstance,\n createPollingProjectConfigManager:\n (() => ({})) as OptCreatePollingConfigMgr,\n createBatchEventProcessor: (() => ({})) as OptCreateBatchEventProcessor,\n };\n}\n\n/**\n * Pre-init env -- all methods are no-ops until the test runner wires spies.\n */\nexport const init: Env | undefined = {\n optimizely: createMockSDK(),\n};\n\n/**\n * Post-init env -- same shape. The test runner clones this and replaces\n * individual methods with jest.fn() so it can assert on calls.\n */\nexport const push: Env = {\n optimizely: createMockSDK(),\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:optimizely.createInstance',\n 'call:optimizely.client.onReady',\n 'call:optimizely.client.createUserContext',\n 'call:optimizely.userContext.trackEvent',\n 'call:optimizely.userContext.setAttribute',\n 'call:optimizely.client.close',\n];\n","import type { Flow, WalkerOS } 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 OptimizelyStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- every walkerOS event becomes\n * userContext.trackEvent(event.name). No mapping, no eventTags.\n */\nexport const defaultEventForwarding: OptimizelyStepExample = {\n title: 'Default event',\n description:\n 'A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.',\n in: getEvent('page view', { timestamp: 1700000100 }),\n out: [['optimizely.trackEvent', 'page view', {}]],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event key for Optimizely.\n * The eventKey must match an event created in the Optimizely project.\n */\nexport const mappedEventName: OptimizelyStepExample = {\n title: 'Mapped event key',\n description:\n 'A mapping renames the walker event to an Optimizely event key defined in the project.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n mapping: {\n name: 'product_viewed',\n },\n out: [['optimizely.trackEvent', 'product_viewed', {}]],\n};\n\n/**\n * Revenue tracking -- mapping.settings.revenue resolves to an integer\n * (cents). Passed as eventTags.revenue. The value is a pass-through;\n * the user must provide cents (e.g. 55500 = $555.00).\n */\nexport const orderCompleteRevenue: OptimizelyStepExample = {\n title: 'Purchase revenue',\n description:\n 'An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n data: {\n revenue_cents: 55500,\n total: 555,\n currency: 'EUR',\n item_count: 3,\n },\n }),\n mapping: {\n name: 'purchase',\n settings: {\n revenue: 'data.revenue_cents',\n value: 'data.total',\n eventTags: {\n map: {\n currency: 'data.currency',\n item_count: 'data.item_count',\n },\n },\n },\n },\n out: [\n [\n 'optimizely.trackEvent',\n 'purchase',\n { revenue: 55500, value: 555, currency: 'EUR', item_count: 3 },\n ],\n ],\n};\n\n/**\n * Per-event attributes -- mapping.settings.attributes resolves to\n * key-value pairs that are applied via setAttribute() before trackEvent().\n */\nexport const signupWithAttributes: OptimizelyStepExample = {\n title: 'Signup with attributes',\n description:\n 'A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.',\n in: getEvent('user signup', {\n timestamp: 1700000103,\n data: {\n method: 'google',\n source: 'referral',\n },\n }),\n mapping: {\n name: 'signup',\n settings: {\n attributes: {\n map: {\n signup_method: 'data.method',\n referral_source: 'data.source',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'signup_method', 'google'],\n ['optimizely.setAttribute', 'referral_source', 'referral'],\n ['optimizely.trackEvent', 'signup', {}],\n ],\n};\n\n/**\n * Wildcard ignore -- walkerOS's standard way to drop events. The rule\n * matches but does nothing. The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: OptimizelyStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000104 }),\n mapping: { ignore: true },\n out: [],\n};\n\n/**\n * Skip track with attributes only -- fires setAttribute calls but no\n * trackEvent. Useful for enriching user context without a conversion.\n */\nexport const attributesOnlySilent: OptimizelyStepExample = {\n title: 'Attributes only',\n description:\n 'A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n plan: 'premium',\n country: 'DE',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n attributes: {\n map: {\n plan: 'data.plan',\n country: 'data.country',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'plan', 'premium'],\n ['optimizely.setAttribute', 'country', 'DE'],\n ],\n};\n\n/**\n * Consent revoked -- the destination closes the Optimizely client,\n * flushing queued events and stopping datafile polling.\n */\nexport const consentRevoked: OptimizelyStepExample = {\n title: 'Consent revoked',\n description:\n 'A walker consent command with analytics denied closes the Optimizely client and flushes queued events.',\n command: 'consent',\n in: { analytics: false } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [['optimizely.close']],\n};\n\n/**\n * Consent granted -- no immediate SDK action needed. The destination\n * re-initializes on the next push (walkerOS queues events until consent\n * is granted, then re-inits). No calls expected.\n */\nexport const consentGranted: OptimizelyStepExample = {\n public: false,\n command: 'consent',\n in: { analytics: true } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\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 sdkKey: z\n .string()\n .min(1)\n .describe(\n 'Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments.',\n ),\n userId: z\n .unknown()\n .describe(\n 'walkerOS mapping value to resolve userId for experiment bucketing. Example: \"user.id\" or { key: \"user.id\", value: \"user.device\" } for fallback.',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n 'User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().',\n )\n .optional(),\n updateInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Polling interval for datafile updates in milliseconds. Default: 60000.',\n )\n .optional(),\n autoUpdate: z\n .boolean()\n .describe('Auto-update datafile via polling. Default: true.')\n .optional(),\n batchSize: z\n .number()\n .int()\n .positive()\n .describe('Batch event processor: number of events per batch. Default: 10.')\n .optional(),\n flushInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Batch event processor: flush interval in milliseconds. Default: 1000.',\n )\n .optional(),\n skipOdp: z\n .boolean()\n .describe(\n 'Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.',\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 eventKey: z\n .string()\n .describe(\n 'Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.',\n )\n .optional(),\n revenue: z\n .unknown()\n .describe(\n 'Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().',\n )\n .optional(),\n value: z\n .unknown()\n .describe(\n 'Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().',\n )\n .optional(),\n eventTags: z\n .unknown()\n .describe(\n 'Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n \"Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.\",\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 OptimizelyClient,\n OptimizelyUserContext,\n OptimizelySDK,\n} from '../types';\n\n/**\n * Example environment configurations for Optimizely destination.\n *\n * Tests clone `push` and replace individual methods with jest spies.\n * Production leaves `env.optimizely` undefined -- the destination falls back\n * to the real `@optimizely/optimizely-sdk` import.\n */\n\nconst noop = () => {};\n\n// Narrow helper types for mock SDK factory functions without loose casts.\ntype OptCreateInstance = OptimizelySDK['createInstance'];\ntype OptCreatePollingConfigMgr =\n OptimizelySDK['createPollingProjectConfigManager'];\ntype OptCreateBatchEventProcessor = OptimizelySDK['createBatchEventProcessor'];\ntype OptCreateUserContext = OptimizelyClient['createUserContext'];\ntype OptOnReady = OptimizelyClient['onReady'];\ntype OptTrackEvent = OptimizelyUserContext['trackEvent'];\ntype OptSetAttribute = OptimizelyUserContext['setAttribute'];\n\nfunction createMockUserContext(): OptimizelyUserContext {\n return {\n trackEvent: noop as OptTrackEvent,\n setAttribute: noop as OptSetAttribute,\n };\n}\n\nfunction createMockClient(): OptimizelyClient {\n return {\n onReady: (() => Promise.resolve({ success: true })) as OptOnReady,\n createUserContext: (() => createMockUserContext()) as OptCreateUserContext,\n close: noop,\n };\n}\n\nfunction createMockSDK(): OptimizelySDK {\n return {\n createInstance: (() => createMockClient()) as OptCreateInstance,\n createPollingProjectConfigManager:\n (() => ({})) as OptCreatePollingConfigMgr,\n createBatchEventProcessor: (() => ({})) as OptCreateBatchEventProcessor,\n };\n}\n\n/**\n * Pre-init env -- all methods are no-ops until the test runner wires spies.\n */\nexport const init: Env | undefined = {\n optimizely: createMockSDK(),\n};\n\n/**\n * Post-init env -- same shape. The test runner clones this and replaces\n * individual methods with jest.fn() so it can assert on calls.\n */\nexport const push: Env = {\n optimizely: createMockSDK(),\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:optimizely.createInstance',\n 'call:optimizely.client.onReady',\n 'call:optimizely.client.createUserContext',\n 'call:optimizely.userContext.trackEvent',\n 'call:optimizely.userContext.setAttribute',\n 'call:optimizely.client.close',\n];\n","import type { Flow, WalkerOS } 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 OptimizelyStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n /** Consent granted before `in` so a gated destination is loaded first. */\n before?: WalkerOS.Consent;\n};\n\n/**\n * Default event forwarding -- every walkerOS event becomes\n * userContext.trackEvent(event.name). No mapping, no eventTags.\n */\nexport const defaultEventForwarding: OptimizelyStepExample = {\n title: 'Default event',\n description:\n 'A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.',\n in: getEvent('page view', { timestamp: 1700000100 }),\n out: [['optimizely.trackEvent', 'page view', {}]],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event key for Optimizely.\n * The eventKey must match an event created in the Optimizely project.\n */\nexport const mappedEventName: OptimizelyStepExample = {\n title: 'Mapped event key',\n description:\n 'A mapping renames the walker event to an Optimizely event key defined in the project.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n mapping: {\n name: 'product_viewed',\n },\n out: [['optimizely.trackEvent', 'product_viewed', {}]],\n};\n\n/**\n * Revenue tracking -- mapping.settings.revenue resolves to an integer\n * (cents). Passed as eventTags.revenue. The value is a pass-through;\n * the user must provide cents (e.g. 55500 = $555.00).\n */\nexport const orderCompleteRevenue: OptimizelyStepExample = {\n title: 'Purchase revenue',\n description:\n 'An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n data: {\n revenue_cents: 55500,\n total: 555,\n currency: 'EUR',\n item_count: 3,\n },\n }),\n mapping: {\n name: 'purchase',\n settings: {\n revenue: 'data.revenue_cents',\n value: 'data.total',\n eventTags: {\n map: {\n currency: 'data.currency',\n item_count: 'data.item_count',\n },\n },\n },\n },\n out: [\n [\n 'optimizely.trackEvent',\n 'purchase',\n { revenue: 55500, value: 555, currency: 'EUR', item_count: 3 },\n ],\n ],\n};\n\n/**\n * Per-event attributes -- mapping.settings.attributes resolves to\n * key-value pairs that are applied via setAttribute() before trackEvent().\n */\nexport const signupWithAttributes: OptimizelyStepExample = {\n title: 'Signup with attributes',\n description:\n 'A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.',\n in: getEvent('user signup', {\n timestamp: 1700000103,\n data: {\n method: 'google',\n source: 'referral',\n },\n }),\n mapping: {\n name: 'signup',\n settings: {\n attributes: {\n map: {\n signup_method: 'data.method',\n referral_source: 'data.source',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'signup_method', 'google'],\n ['optimizely.setAttribute', 'referral_source', 'referral'],\n ['optimizely.trackEvent', 'signup', {}],\n ],\n};\n\n/**\n * Wildcard ignore -- walkerOS's standard way to drop events. The rule\n * matches but does nothing. The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: OptimizelyStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000104 }),\n mapping: { ignore: true },\n out: [],\n};\n\n/**\n * Skip track with attributes only -- fires setAttribute calls but no\n * trackEvent. Useful for enriching user context without a conversion.\n */\nexport const attributesOnlySilent: OptimizelyStepExample = {\n title: 'Attributes only',\n description:\n 'A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n plan: 'premium',\n country: 'DE',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n attributes: {\n map: {\n plan: 'data.plan',\n country: 'data.country',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'plan', 'premium'],\n ['optimizely.setAttribute', 'country', 'DE'],\n ],\n};\n\n/**\n * Consent revoked -- the destination closes the Optimizely client,\n * flushing queued events and stopping datafile polling.\n */\nexport const consentRevoked: OptimizelyStepExample = {\n title: 'Consent revoked',\n description:\n 'A walker consent command with analytics denied closes the Optimizely client and flushes queued events.',\n command: 'consent',\n before: { analytics: true },\n in: { analytics: false } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [['optimizely.close']],\n};\n\n/**\n * Consent granted -- no immediate SDK action needed. The destination\n * re-initializes on the next push (walkerOS queues events until consent\n * is granted, then re-inits). No calls expected.\n */\nexport const consentGranted: OptimizelyStepExample = {\n public: false,\n command: 'consent',\n in: { analytics: true } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [],\n};\n"],"mappings":"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","names":["import_dev","import_dev"]}
|
package/dist/dev.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,i)=>{for(var n in i)e(t,n,{get:i[n],enumerable:!0})},i={};t(i,{MappingSchema:()=>s,SettingsSchema:()=>r,mapping:()=>u,settings:()=>l});import{zodToSchema as n}from"@walkeros/core/dev";import{z as a}from"@walkeros/core/dev";var r=a.object({sdkKey:a.string().min(1).describe("Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments."),userId:a.unknown().describe('walkerOS mapping value to resolve userId for experiment bucketing. Example: "user.id" or { key: "user.id", value: "user.device" } for fallback.').optional(),attributes:a.unknown().describe("User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().").optional(),updateInterval:a.number().int().positive().describe("Polling interval for datafile updates in milliseconds. Default: 60000.").optional(),autoUpdate:a.boolean().describe("Auto-update datafile via polling. Default: true.").optional(),batchSize:a.number().int().positive().describe("Batch event processor: number of events per batch. Default: 10.").optional(),flushInterval:a.number().int().positive().describe("Batch event processor: flush interval in milliseconds. Default: 1000.").optional(),skipOdp:a.boolean().describe("Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.").optional()});import{z as o}from"@walkeros/core/dev";var s=o.object({eventKey:o.string().describe("Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.").optional(),revenue:o.unknown().describe("Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().").optional(),value:o.unknown().describe("Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().").optional(),eventTags:o.unknown().describe("Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().").optional(),attributes:o.unknown().describe("Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.").optional()}),l=n(r),u=n(s),p={};t(p,{env:()=>c,step:()=>f});var c={};t(c,{init:()=>g,push:()=>y,simulation:()=>b});var m=()=>{};function d(){return{onReady:()=>Promise.resolve({success:!0}),createUserContext:()=>({trackEvent:m,setAttribute:m}),close:m}}function v(){return{createInstance:()=>d(),createPollingProjectConfigManager:()=>({}),createBatchEventProcessor:()=>({})}}var g={optimizely:v()},y={optimizely:v()},b=["call:optimizely.createInstance","call:optimizely.client.onReady","call:optimizely.client.createUserContext","call:optimizely.userContext.trackEvent","call:optimizely.userContext.setAttribute","call:optimizely.client.close"],f={};t(f,{attributesOnlySilent:()=>O,consentGranted:()=>P,consentRevoked:()=>R,defaultEventForwarding:()=>h,mappedEventName:()=>z,orderCompleteRevenue:()=>w,signupWithAttributes:()=>E,wildcardIgnored:()=>A});import{getEvent as k}from"@walkeros/core";var h={title:"Default event",description:"A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.",in:k("page view",{timestamp:1700000100}),out:[["optimizely.trackEvent","page view",{}]]},z={title:"Mapped event key",description:"A mapping renames the walker event to an Optimizely event key defined in the project.",in:k("product view",{timestamp:1700000101}),mapping:{name:"product_viewed"},out:[["optimizely.trackEvent","product_viewed",{}]]},w={title:"Purchase revenue",description:"An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.",in:k("order complete",{timestamp:1700000102,data:{revenue_cents:55500,total:555,currency:"EUR",item_count:3}}),mapping:{name:"purchase",settings:{revenue:"data.revenue_cents",value:"data.total",eventTags:{map:{currency:"data.currency",item_count:"data.item_count"}}}},out:[["optimizely.trackEvent","purchase",{revenue:55500,value:555,currency:"EUR",item_count:3}]]},E={title:"Signup with attributes",description:"A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.",in:k("user signup",{timestamp:1700000103,data:{method:"google",source:"referral"}}),mapping:{name:"signup",settings:{attributes:{map:{signup_method:"data.method",referral_source:"data.source"}}}},out:[["optimizely.setAttribute","signup_method","google"],["optimizely.setAttribute","referral_source","referral"],["optimizely.trackEvent","signup",{}]]},A={public:!1,in:k("debug noise",{timestamp:1700000104}),mapping:{ignore:!0},out:[]},O={title:"Attributes only",description:"A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.",in:k("profile update",{timestamp:1700000105,data:{plan:"premium",country:"DE"}}),mapping:{silent:!0,settings:{attributes:{map:{plan:"data.plan",country:"data.country"}}}},out:[["optimizely.setAttribute","plan","premium"],["optimizely.setAttribute","country","DE"]]},R={title:"Consent revoked",description:"A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",command:"consent",in:{analytics:!1},settings:{},out:[["optimizely.close"]]},P={public:!1,command:"consent",in:{analytics:!0},settings:{},out:[]};export{p as examples,i as schemas};//# sourceMappingURL=dev.mjs.map
|
|
1
|
+
var e=Object.defineProperty,t=(t,i)=>{for(var n in i)e(t,n,{get:i[n],enumerable:!0})},i={};t(i,{MappingSchema:()=>s,SettingsSchema:()=>r,mapping:()=>u,settings:()=>l});import{zodToSchema as n}from"@walkeros/core/dev";import{z as a}from"@walkeros/core/dev";var r=a.object({sdkKey:a.string().min(1).describe("Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments."),userId:a.unknown().describe('walkerOS mapping value to resolve userId for experiment bucketing. Example: "user.id" or { key: "user.id", value: "user.device" } for fallback.').optional(),attributes:a.unknown().describe("User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().").optional(),updateInterval:a.number().int().positive().describe("Polling interval for datafile updates in milliseconds. Default: 60000.").optional(),autoUpdate:a.boolean().describe("Auto-update datafile via polling. Default: true.").optional(),batchSize:a.number().int().positive().describe("Batch event processor: number of events per batch. Default: 10.").optional(),flushInterval:a.number().int().positive().describe("Batch event processor: flush interval in milliseconds. Default: 1000.").optional(),skipOdp:a.boolean().describe("Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.").optional()});import{z as o}from"@walkeros/core/dev";var s=o.object({eventKey:o.string().describe("Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.").optional(),revenue:o.unknown().describe("Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().").optional(),value:o.unknown().describe("Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().").optional(),eventTags:o.unknown().describe("Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().").optional(),attributes:o.unknown().describe("Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.").optional()}),l=n(r),u=n(s),p={};t(p,{env:()=>c,step:()=>f});var c={};t(c,{init:()=>g,push:()=>y,simulation:()=>b});var m=()=>{};function d(){return{onReady:()=>Promise.resolve({success:!0}),createUserContext:()=>({trackEvent:m,setAttribute:m}),close:m}}function v(){return{createInstance:()=>d(),createPollingProjectConfigManager:()=>({}),createBatchEventProcessor:()=>({})}}var g={optimizely:v()},y={optimizely:v()},b=["call:optimizely.createInstance","call:optimizely.client.onReady","call:optimizely.client.createUserContext","call:optimizely.userContext.trackEvent","call:optimizely.userContext.setAttribute","call:optimizely.client.close"],f={};t(f,{attributesOnlySilent:()=>O,consentGranted:()=>P,consentRevoked:()=>R,defaultEventForwarding:()=>h,mappedEventName:()=>z,orderCompleteRevenue:()=>w,signupWithAttributes:()=>E,wildcardIgnored:()=>A});import{getEvent as k}from"@walkeros/core";var h={title:"Default event",description:"A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.",in:k("page view",{timestamp:1700000100}),out:[["optimizely.trackEvent","page view",{}]]},z={title:"Mapped event key",description:"A mapping renames the walker event to an Optimizely event key defined in the project.",in:k("product view",{timestamp:1700000101}),mapping:{name:"product_viewed"},out:[["optimizely.trackEvent","product_viewed",{}]]},w={title:"Purchase revenue",description:"An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.",in:k("order complete",{timestamp:1700000102,data:{revenue_cents:55500,total:555,currency:"EUR",item_count:3}}),mapping:{name:"purchase",settings:{revenue:"data.revenue_cents",value:"data.total",eventTags:{map:{currency:"data.currency",item_count:"data.item_count"}}}},out:[["optimizely.trackEvent","purchase",{revenue:55500,value:555,currency:"EUR",item_count:3}]]},E={title:"Signup with attributes",description:"A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.",in:k("user signup",{timestamp:1700000103,data:{method:"google",source:"referral"}}),mapping:{name:"signup",settings:{attributes:{map:{signup_method:"data.method",referral_source:"data.source"}}}},out:[["optimizely.setAttribute","signup_method","google"],["optimizely.setAttribute","referral_source","referral"],["optimizely.trackEvent","signup",{}]]},A={public:!1,in:k("debug noise",{timestamp:1700000104}),mapping:{ignore:!0},out:[]},O={title:"Attributes only",description:"A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.",in:k("profile update",{timestamp:1700000105,data:{plan:"premium",country:"DE"}}),mapping:{silent:!0,settings:{attributes:{map:{plan:"data.plan",country:"data.country"}}}},out:[["optimizely.setAttribute","plan","premium"],["optimizely.setAttribute","country","DE"]]},R={title:"Consent revoked",description:"A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",command:"consent",before:{analytics:!0},in:{analytics:!1},settings:{},out:[["optimizely.close"]]},P={public:!1,command:"consent",in:{analytics:!0},settings:{},out:[]};export{p as examples,i as schemas};//# sourceMappingURL=dev.mjs.map
|
package/dist/dev.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/mapping.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { MappingSchema } from './mapping';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { MappingSchema, type Mapping } from './mapping';\n\n// JSON Schema\nexport const settings = zodToSchema(SettingsSchema);\nexport const mapping = zodToSchema(MappingSchema);\n","import { z } from '@walkeros/core/dev';\n\nexport const SettingsSchema = z.object({\n sdkKey: z\n .string()\n .min(1)\n .describe(\n 'Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments.',\n ),\n userId: z\n .unknown()\n .describe(\n 'walkerOS mapping value to resolve userId for experiment bucketing. Example: \"user.id\" or { key: \"user.id\", value: \"user.device\" } for fallback.',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n 'User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().',\n )\n .optional(),\n updateInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Polling interval for datafile updates in milliseconds. Default: 60000.',\n )\n .optional(),\n autoUpdate: z\n .boolean()\n .describe('Auto-update datafile via polling. Default: true.')\n .optional(),\n batchSize: z\n .number()\n .int()\n .positive()\n .describe('Batch event processor: number of events per batch. Default: 10.')\n .optional(),\n flushInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Batch event processor: flush interval in milliseconds. Default: 1000.',\n )\n .optional(),\n skipOdp: z\n .boolean()\n .describe(\n 'Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.',\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 eventKey: z\n .string()\n .describe(\n 'Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.',\n )\n .optional(),\n revenue: z\n .unknown()\n .describe(\n 'Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().',\n )\n .optional(),\n value: z\n .unknown()\n .describe(\n 'Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().',\n )\n .optional(),\n eventTags: z\n .unknown()\n .describe(\n 'Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n \"Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.\",\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 OptimizelyClient,\n OptimizelyUserContext,\n OptimizelySDK,\n} from '../types';\n\n/**\n * Example environment configurations for Optimizely destination.\n *\n * Tests clone `push` and replace individual methods with jest spies.\n * Production leaves `env.optimizely` undefined -- the destination falls back\n * to the real `@optimizely/optimizely-sdk` import.\n */\n\nconst noop = () => {};\n\n// Narrow helper types for mock SDK factory functions without loose casts.\ntype OptCreateInstance = OptimizelySDK['createInstance'];\ntype OptCreatePollingConfigMgr =\n OptimizelySDK['createPollingProjectConfigManager'];\ntype OptCreateBatchEventProcessor = OptimizelySDK['createBatchEventProcessor'];\ntype OptCreateUserContext = OptimizelyClient['createUserContext'];\ntype OptOnReady = OptimizelyClient['onReady'];\ntype OptTrackEvent = OptimizelyUserContext['trackEvent'];\ntype OptSetAttribute = OptimizelyUserContext['setAttribute'];\n\nfunction createMockUserContext(): OptimizelyUserContext {\n return {\n trackEvent: noop as OptTrackEvent,\n setAttribute: noop as OptSetAttribute,\n };\n}\n\nfunction createMockClient(): OptimizelyClient {\n return {\n onReady: (() => Promise.resolve({ success: true })) as OptOnReady,\n createUserContext: (() => createMockUserContext()) as OptCreateUserContext,\n close: noop,\n };\n}\n\nfunction createMockSDK(): OptimizelySDK {\n return {\n createInstance: (() => createMockClient()) as OptCreateInstance,\n createPollingProjectConfigManager:\n (() => ({})) as OptCreatePollingConfigMgr,\n createBatchEventProcessor: (() => ({})) as OptCreateBatchEventProcessor,\n };\n}\n\n/**\n * Pre-init env -- all methods are no-ops until the test runner wires spies.\n */\nexport const init: Env | undefined = {\n optimizely: createMockSDK(),\n};\n\n/**\n * Post-init env -- same shape. The test runner clones this and replaces\n * individual methods with jest.fn() so it can assert on calls.\n */\nexport const push: Env = {\n optimizely: createMockSDK(),\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:optimizely.createInstance',\n 'call:optimizely.client.onReady',\n 'call:optimizely.client.createUserContext',\n 'call:optimizely.userContext.trackEvent',\n 'call:optimizely.userContext.setAttribute',\n 'call:optimizely.client.close',\n];\n","import type { Flow, WalkerOS } 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 OptimizelyStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n};\n\n/**\n * Default event forwarding -- every walkerOS event becomes\n * userContext.trackEvent(event.name). No mapping, no eventTags.\n */\nexport const defaultEventForwarding: OptimizelyStepExample = {\n title: 'Default event',\n description:\n 'A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.',\n in: getEvent('page view', { timestamp: 1700000100 }),\n out: [['optimizely.trackEvent', 'page view', {}]],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event key for Optimizely.\n * The eventKey must match an event created in the Optimizely project.\n */\nexport const mappedEventName: OptimizelyStepExample = {\n title: 'Mapped event key',\n description:\n 'A mapping renames the walker event to an Optimizely event key defined in the project.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n mapping: {\n name: 'product_viewed',\n },\n out: [['optimizely.trackEvent', 'product_viewed', {}]],\n};\n\n/**\n * Revenue tracking -- mapping.settings.revenue resolves to an integer\n * (cents). Passed as eventTags.revenue. The value is a pass-through;\n * the user must provide cents (e.g. 55500 = $555.00).\n */\nexport const orderCompleteRevenue: OptimizelyStepExample = {\n title: 'Purchase revenue',\n description:\n 'An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n data: {\n revenue_cents: 55500,\n total: 555,\n currency: 'EUR',\n item_count: 3,\n },\n }),\n mapping: {\n name: 'purchase',\n settings: {\n revenue: 'data.revenue_cents',\n value: 'data.total',\n eventTags: {\n map: {\n currency: 'data.currency',\n item_count: 'data.item_count',\n },\n },\n },\n },\n out: [\n [\n 'optimizely.trackEvent',\n 'purchase',\n { revenue: 55500, value: 555, currency: 'EUR', item_count: 3 },\n ],\n ],\n};\n\n/**\n * Per-event attributes -- mapping.settings.attributes resolves to\n * key-value pairs that are applied via setAttribute() before trackEvent().\n */\nexport const signupWithAttributes: OptimizelyStepExample = {\n title: 'Signup with attributes',\n description:\n 'A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.',\n in: getEvent('user signup', {\n timestamp: 1700000103,\n data: {\n method: 'google',\n source: 'referral',\n },\n }),\n mapping: {\n name: 'signup',\n settings: {\n attributes: {\n map: {\n signup_method: 'data.method',\n referral_source: 'data.source',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'signup_method', 'google'],\n ['optimizely.setAttribute', 'referral_source', 'referral'],\n ['optimizely.trackEvent', 'signup', {}],\n ],\n};\n\n/**\n * Wildcard ignore -- walkerOS's standard way to drop events. The rule\n * matches but does nothing. The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: OptimizelyStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000104 }),\n mapping: { ignore: true },\n out: [],\n};\n\n/**\n * Skip track with attributes only -- fires setAttribute calls but no\n * trackEvent. Useful for enriching user context without a conversion.\n */\nexport const attributesOnlySilent: OptimizelyStepExample = {\n title: 'Attributes only',\n description:\n 'A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n plan: 'premium',\n country: 'DE',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n attributes: {\n map: {\n plan: 'data.plan',\n country: 'data.country',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'plan', 'premium'],\n ['optimizely.setAttribute', 'country', 'DE'],\n ],\n};\n\n/**\n * Consent revoked -- the destination closes the Optimizely client,\n * flushing queued events and stopping datafile polling.\n */\nexport const consentRevoked: OptimizelyStepExample = {\n title: 'Consent revoked',\n description:\n 'A walker consent command with analytics denied closes the Optimizely client and flushes queued events.',\n command: 'consent',\n in: { analytics: false } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [['optimizely.close']],\n};\n\n/**\n * Consent granted -- no immediate SDK action needed. The destination\n * re-initializes on the next push (walkerOS queues events until consent\n * is granted, then re-inits). No calls expected.\n */\nexport const consentGranted: OptimizelyStepExample = {\n public: false,\n command: 'consent',\n in: { analytics: true } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\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 sdkKey: z\n .string()\n .min(1)\n .describe(\n 'Your Optimizely Feature Experimentation SDK key. Find it in your Optimizely project under Settings > Environments.',\n ),\n userId: z\n .unknown()\n .describe(\n 'walkerOS mapping value to resolve userId for experiment bucketing. Example: \"user.id\" or { key: \"user.id\", value: \"user.device\" } for fallback.',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n 'User attributes for audience targeting. Resolves to Record<string, unknown>. Applied to every event via createUserContext().',\n )\n .optional(),\n updateInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Polling interval for datafile updates in milliseconds. Default: 60000.',\n )\n .optional(),\n autoUpdate: z\n .boolean()\n .describe('Auto-update datafile via polling. Default: true.')\n .optional(),\n batchSize: z\n .number()\n .int()\n .positive()\n .describe('Batch event processor: number of events per batch. Default: 10.')\n .optional(),\n flushInterval: z\n .number()\n .int()\n .positive()\n .describe(\n 'Batch event processor: flush interval in milliseconds. Default: 1000.',\n )\n .optional(),\n skipOdp: z\n .boolean()\n .describe(\n 'Skip Optimizely Data Platform (ODP) manager initialization. Default: true. Set to false only if you use ODP.',\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 eventKey: z\n .string()\n .describe(\n 'Override event key sent to Optimizely. If omitted, the walkerOS event name is used. Must match an event created in your Optimizely project.',\n )\n .optional(),\n revenue: z\n .unknown()\n .describe(\n 'Revenue mapping. Resolves to an integer in cents (e.g. 7281 = $72.81). Passed as eventTags.revenue to trackEvent().',\n )\n .optional(),\n value: z\n .unknown()\n .describe(\n 'Numeric value mapping. Resolves to a float. Passed as eventTags.value to trackEvent().',\n )\n .optional(),\n eventTags: z\n .unknown()\n .describe(\n 'Additional event tags. Resolves to Record<string, unknown>. Spread into the eventTags object passed to trackEvent().',\n )\n .optional(),\n attributes: z\n .unknown()\n .describe(\n \"Per-event user attributes override. Resolves to Record<string, unknown>. Applied via setAttribute() before this event's trackEvent() call.\",\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 OptimizelyClient,\n OptimizelyUserContext,\n OptimizelySDK,\n} from '../types';\n\n/**\n * Example environment configurations for Optimizely destination.\n *\n * Tests clone `push` and replace individual methods with jest spies.\n * Production leaves `env.optimizely` undefined -- the destination falls back\n * to the real `@optimizely/optimizely-sdk` import.\n */\n\nconst noop = () => {};\n\n// Narrow helper types for mock SDK factory functions without loose casts.\ntype OptCreateInstance = OptimizelySDK['createInstance'];\ntype OptCreatePollingConfigMgr =\n OptimizelySDK['createPollingProjectConfigManager'];\ntype OptCreateBatchEventProcessor = OptimizelySDK['createBatchEventProcessor'];\ntype OptCreateUserContext = OptimizelyClient['createUserContext'];\ntype OptOnReady = OptimizelyClient['onReady'];\ntype OptTrackEvent = OptimizelyUserContext['trackEvent'];\ntype OptSetAttribute = OptimizelyUserContext['setAttribute'];\n\nfunction createMockUserContext(): OptimizelyUserContext {\n return {\n trackEvent: noop as OptTrackEvent,\n setAttribute: noop as OptSetAttribute,\n };\n}\n\nfunction createMockClient(): OptimizelyClient {\n return {\n onReady: (() => Promise.resolve({ success: true })) as OptOnReady,\n createUserContext: (() => createMockUserContext()) as OptCreateUserContext,\n close: noop,\n };\n}\n\nfunction createMockSDK(): OptimizelySDK {\n return {\n createInstance: (() => createMockClient()) as OptCreateInstance,\n createPollingProjectConfigManager:\n (() => ({})) as OptCreatePollingConfigMgr,\n createBatchEventProcessor: (() => ({})) as OptCreateBatchEventProcessor,\n };\n}\n\n/**\n * Pre-init env -- all methods are no-ops until the test runner wires spies.\n */\nexport const init: Env | undefined = {\n optimizely: createMockSDK(),\n};\n\n/**\n * Post-init env -- same shape. The test runner clones this and replaces\n * individual methods with jest.fn() so it can assert on calls.\n */\nexport const push: Env = {\n optimizely: createMockSDK(),\n};\n\n/** Simulation tracking paths for CLI --simulate. */\nexport const simulation = [\n 'call:optimizely.createInstance',\n 'call:optimizely.client.onReady',\n 'call:optimizely.client.createUserContext',\n 'call:optimizely.userContext.trackEvent',\n 'call:optimizely.userContext.setAttribute',\n 'call:optimizely.client.close',\n];\n","import type { Flow, WalkerOS } 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 OptimizelyStepExample = Flow.StepExample & {\n settings?: Partial<Settings>;\n /** Consent granted before `in` so a gated destination is loaded first. */\n before?: WalkerOS.Consent;\n};\n\n/**\n * Default event forwarding -- every walkerOS event becomes\n * userContext.trackEvent(event.name). No mapping, no eventTags.\n */\nexport const defaultEventForwarding: OptimizelyStepExample = {\n title: 'Default event',\n description:\n 'A walker event becomes an Optimizely trackEvent call with the event name and empty eventTags.',\n in: getEvent('page view', { timestamp: 1700000100 }),\n out: [['optimizely.trackEvent', 'page view', {}]],\n};\n\n/**\n * Mapped event name -- mapping.name renames the event key for Optimizely.\n * The eventKey must match an event created in the Optimizely project.\n */\nexport const mappedEventName: OptimizelyStepExample = {\n title: 'Mapped event key',\n description:\n 'A mapping renames the walker event to an Optimizely event key defined in the project.',\n in: getEvent('product view', { timestamp: 1700000101 }),\n mapping: {\n name: 'product_viewed',\n },\n out: [['optimizely.trackEvent', 'product_viewed', {}]],\n};\n\n/**\n * Revenue tracking -- mapping.settings.revenue resolves to an integer\n * (cents). Passed as eventTags.revenue. The value is a pass-through;\n * the user must provide cents (e.g. 55500 = $555.00).\n */\nexport const orderCompleteRevenue: OptimizelyStepExample = {\n title: 'Purchase revenue',\n description:\n 'An order fires an Optimizely purchase event with revenue in cents, value, and additional event tags.',\n in: getEvent('order complete', {\n timestamp: 1700000102,\n data: {\n revenue_cents: 55500,\n total: 555,\n currency: 'EUR',\n item_count: 3,\n },\n }),\n mapping: {\n name: 'purchase',\n settings: {\n revenue: 'data.revenue_cents',\n value: 'data.total',\n eventTags: {\n map: {\n currency: 'data.currency',\n item_count: 'data.item_count',\n },\n },\n },\n },\n out: [\n [\n 'optimizely.trackEvent',\n 'purchase',\n { revenue: 55500, value: 555, currency: 'EUR', item_count: 3 },\n ],\n ],\n};\n\n/**\n * Per-event attributes -- mapping.settings.attributes resolves to\n * key-value pairs that are applied via setAttribute() before trackEvent().\n */\nexport const signupWithAttributes: OptimizelyStepExample = {\n title: 'Signup with attributes',\n description:\n 'A user signup sets per-event Optimizely attributes via setAttribute before firing the trackEvent.',\n in: getEvent('user signup', {\n timestamp: 1700000103,\n data: {\n method: 'google',\n source: 'referral',\n },\n }),\n mapping: {\n name: 'signup',\n settings: {\n attributes: {\n map: {\n signup_method: 'data.method',\n referral_source: 'data.source',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'signup_method', 'google'],\n ['optimizely.setAttribute', 'referral_source', 'referral'],\n ['optimizely.trackEvent', 'signup', {}],\n ],\n};\n\n/**\n * Wildcard ignore -- walkerOS's standard way to drop events. The rule\n * matches but does nothing. The destination fires zero SDK calls.\n */\nexport const wildcardIgnored: OptimizelyStepExample = {\n public: false,\n in: getEvent('debug noise', { timestamp: 1700000104 }),\n mapping: { ignore: true },\n out: [],\n};\n\n/**\n * Skip track with attributes only -- fires setAttribute calls but no\n * trackEvent. Useful for enriching user context without a conversion.\n */\nexport const attributesOnlySilent: OptimizelyStepExample = {\n title: 'Attributes only',\n description:\n 'A profile update sets Optimizely user attributes without firing a trackEvent for user enrichment.',\n in: getEvent('profile update', {\n timestamp: 1700000105,\n data: {\n plan: 'premium',\n country: 'DE',\n },\n }),\n mapping: {\n silent: true,\n settings: {\n attributes: {\n map: {\n plan: 'data.plan',\n country: 'data.country',\n },\n },\n },\n },\n out: [\n ['optimizely.setAttribute', 'plan', 'premium'],\n ['optimizely.setAttribute', 'country', 'DE'],\n ],\n};\n\n/**\n * Consent revoked -- the destination closes the Optimizely client,\n * flushing queued events and stopping datafile polling.\n */\nexport const consentRevoked: OptimizelyStepExample = {\n title: 'Consent revoked',\n description:\n 'A walker consent command with analytics denied closes the Optimizely client and flushes queued events.',\n command: 'consent',\n before: { analytics: true },\n in: { analytics: false } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [['optimizely.close']],\n};\n\n/**\n * Consent granted -- no immediate SDK action needed. The destination\n * re-initializes on the next push (walkerOS queues events until consent\n * is granted, then re-inits). No calls expected.\n */\nexport const consentGranted: OptimizelyStepExample = {\n public: false,\n command: 'consent',\n in: { analytics: true } as WalkerOS.Consent,\n settings: {} as Partial<Settings>,\n out: [],\n};\n"],"mappings":"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","names":["z"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Mapping, Flow } from '@walkeros/core';
|
|
1
|
+
import { Mapping, Flow, WalkerOS } from '@walkeros/core';
|
|
2
2
|
import { DestinationWeb } from '@walkeros/web-core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -92,6 +92,8 @@ declare namespace env {
|
|
|
92
92
|
*/
|
|
93
93
|
type OptimizelyStepExample = Flow.StepExample & {
|
|
94
94
|
settings?: Partial<Settings>;
|
|
95
|
+
/** Consent granted before `in` so a gated destination is loaded first. */
|
|
96
|
+
before?: WalkerOS.Consent;
|
|
95
97
|
};
|
|
96
98
|
/**
|
|
97
99
|
* Default event forwarding -- every walkerOS event becomes
|
package/dist/examples/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Mapping, Flow } from '@walkeros/core';
|
|
1
|
+
import { Mapping, Flow, WalkerOS } from '@walkeros/core';
|
|
2
2
|
import { DestinationWeb } from '@walkeros/web-core';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -92,6 +92,8 @@ declare namespace env {
|
|
|
92
92
|
*/
|
|
93
93
|
type OptimizelyStepExample = Flow.StepExample & {
|
|
94
94
|
settings?: Partial<Settings>;
|
|
95
|
+
/** Consent granted before `in` so a gated destination is loaded first. */
|
|
96
|
+
before?: WalkerOS.Consent;
|
|
95
97
|
};
|
|
96
98
|
/**
|
|
97
99
|
* Default event forwarding -- every walkerOS event becomes
|
package/dist/examples/index.js
CHANGED
|
@@ -193,6 +193,7 @@ var consentRevoked = {
|
|
|
193
193
|
title: "Consent revoked",
|
|
194
194
|
description: "A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",
|
|
195
195
|
command: "consent",
|
|
196
|
+
before: { analytics: true },
|
|
196
197
|
in: { analytics: false },
|
|
197
198
|
settings: {},
|
|
198
199
|
out: [["optimizely.close"]]
|
package/dist/examples/index.mjs
CHANGED
|
@@ -172,6 +172,7 @@ var consentRevoked = {
|
|
|
172
172
|
title: "Consent revoked",
|
|
173
173
|
description: "A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",
|
|
174
174
|
command: "consent",
|
|
175
|
+
before: { analytics: true },
|
|
175
176
|
in: { analytics: false },
|
|
176
177
|
settings: {},
|
|
177
178
|
out: [["optimizely.close"]]
|
package/dist/walkerOS.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$meta": {
|
|
3
3
|
"package": "@walkeros/web-destination-optimizely",
|
|
4
|
-
"version": "4.2.
|
|
4
|
+
"version": "4.2.1-next-1781538735002",
|
|
5
5
|
"type": "destination",
|
|
6
6
|
"platform": [
|
|
7
7
|
"web"
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
"consent": {
|
|
157
157
|
"functional": true
|
|
158
158
|
},
|
|
159
|
-
"id": "
|
|
159
|
+
"id": "9b5609bcc2d7ac6b",
|
|
160
160
|
"trigger": "test",
|
|
161
161
|
"entity": "profile",
|
|
162
162
|
"action": "update",
|
|
@@ -204,6 +204,9 @@
|
|
|
204
204
|
"title": "Consent revoked",
|
|
205
205
|
"description": "A walker consent command with analytics denied closes the Optimizely client and flushes queued events.",
|
|
206
206
|
"command": "consent",
|
|
207
|
+
"before": {
|
|
208
|
+
"analytics": true
|
|
209
|
+
},
|
|
207
210
|
"in": {
|
|
208
211
|
"analytics": false
|
|
209
212
|
},
|
|
@@ -255,7 +258,7 @@
|
|
|
255
258
|
"consent": {
|
|
256
259
|
"functional": true
|
|
257
260
|
},
|
|
258
|
-
"id": "
|
|
261
|
+
"id": "d21ddf543b85c857",
|
|
259
262
|
"trigger": "load",
|
|
260
263
|
"entity": "page",
|
|
261
264
|
"action": "view",
|
|
@@ -307,7 +310,7 @@
|
|
|
307
310
|
"consent": {
|
|
308
311
|
"functional": true
|
|
309
312
|
},
|
|
310
|
-
"id": "
|
|
313
|
+
"id": "729aadb6af1a40fb",
|
|
311
314
|
"trigger": "load",
|
|
312
315
|
"entity": "product",
|
|
313
316
|
"action": "view",
|
|
@@ -408,7 +411,7 @@
|
|
|
408
411
|
"consent": {
|
|
409
412
|
"functional": true
|
|
410
413
|
},
|
|
411
|
-
"id": "
|
|
414
|
+
"id": "b1016f27dd2b6f33",
|
|
412
415
|
"trigger": "load",
|
|
413
416
|
"entity": "order",
|
|
414
417
|
"action": "complete",
|
|
@@ -482,7 +485,7 @@
|
|
|
482
485
|
"consent": {
|
|
483
486
|
"functional": true
|
|
484
487
|
},
|
|
485
|
-
"id": "
|
|
488
|
+
"id": "96364ad062248ff4",
|
|
486
489
|
"trigger": "test",
|
|
487
490
|
"entity": "user",
|
|
488
491
|
"action": "signup",
|
|
@@ -564,7 +567,7 @@
|
|
|
564
567
|
"consent": {
|
|
565
568
|
"functional": true
|
|
566
569
|
},
|
|
567
|
-
"id": "
|
|
570
|
+
"id": "447c07f35d21c068",
|
|
568
571
|
"trigger": "test",
|
|
569
572
|
"entity": "debug",
|
|
570
573
|
"action": "noise",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/web-destination-optimizely",
|
|
3
3
|
"description": "Optimizely Feature Experimentation web destination for walkerOS (conversion tracking, revenue metrics, user targeting)",
|
|
4
|
-
"version": "4.2.
|
|
4
|
+
"version": "4.2.1-next-1781538735002",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@optimizely/optimizely-sdk": "^6.0.0",
|
|
42
|
-
"@walkeros/core": "4.2.
|
|
43
|
-
"@walkeros/web-core": "4.2.
|
|
42
|
+
"@walkeros/core": "4.2.1-next-1781538735002",
|
|
43
|
+
"@walkeros/web-core": "4.2.1-next-1781538735002"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@walkeros/collector": "4.2.
|
|
46
|
+
"@walkeros/collector": "4.2.1-next-1781538735002"
|
|
47
47
|
},
|
|
48
48
|
"repository": {
|
|
49
49
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|