@walkeros/server-destination-segment 3.3.0-next-1776098542393

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.
@@ -0,0 +1,338 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/examples/env.ts
8
+ var env_exports = {};
9
+ __export(env_exports, {
10
+ push: () => push,
11
+ simulation: () => simulation
12
+ });
13
+ var noop = () => {
14
+ };
15
+ var asyncNoop = () => Promise.resolve();
16
+ function createMockAnalytics() {
17
+ return {
18
+ track: noop,
19
+ identify: noop,
20
+ group: noop,
21
+ page: noop,
22
+ screen: noop,
23
+ closeAndFlush: asyncNoop
24
+ };
25
+ }
26
+ var push = {
27
+ analytics: createMockAnalytics()
28
+ };
29
+ var simulation = [
30
+ "call:analytics.track",
31
+ "call:analytics.identify",
32
+ "call:analytics.group",
33
+ "call:analytics.page",
34
+ "call:analytics.screen"
35
+ ];
36
+
37
+ // src/examples/step.ts
38
+ var step_exports = {};
39
+ __export(step_exports, {
40
+ anonymousOnly: () => anonymousOnly,
41
+ companyGroup: () => companyGroup,
42
+ consentForwarding: () => consentForwarding,
43
+ defaultTrack: () => defaultTrack,
44
+ destinationIdentify: () => destinationIdentify,
45
+ mappedEventName: () => mappedEventName,
46
+ pageView: () => pageView,
47
+ screenView: () => screenView,
48
+ userLoginIdentify: () => userLoginIdentify,
49
+ wildcardIgnored: () => wildcardIgnored
50
+ });
51
+ import { getEvent } from "@walkeros/core";
52
+ var defaultTrack = {
53
+ in: getEvent("product view", {
54
+ timestamp: 1700000100,
55
+ user: { id: "us3r", session: "s3ss10n" }
56
+ }),
57
+ out: [
58
+ "analytics.track",
59
+ {
60
+ userId: "us3r",
61
+ anonymousId: "s3ss10n",
62
+ event: "product view",
63
+ properties: {},
64
+ timestamp: /* @__PURE__ */ new Date(1700000100)
65
+ }
66
+ ]
67
+ };
68
+ var mappedEventName = {
69
+ in: getEvent("order complete", {
70
+ timestamp: 1700000101,
71
+ user: { id: "us3r", session: "s3ss10n" }
72
+ }),
73
+ mapping: {
74
+ name: "Order Completed"
75
+ },
76
+ out: [
77
+ "analytics.track",
78
+ {
79
+ userId: "us3r",
80
+ anonymousId: "s3ss10n",
81
+ event: "Order Completed",
82
+ properties: {},
83
+ timestamp: /* @__PURE__ */ new Date(1700000101)
84
+ }
85
+ ]
86
+ };
87
+ var destinationIdentify = {
88
+ in: getEvent("page view", {
89
+ timestamp: 1700000102,
90
+ user: { id: "us3r", session: "s3ss10n", email: "user@example.com" }
91
+ }),
92
+ settings: {
93
+ identify: {
94
+ map: {
95
+ traits: {
96
+ map: {
97
+ email: "user.email"
98
+ }
99
+ }
100
+ }
101
+ }
102
+ },
103
+ out: [
104
+ [
105
+ "analytics.identify",
106
+ {
107
+ userId: "us3r",
108
+ anonymousId: "s3ss10n",
109
+ traits: { email: "user@example.com" },
110
+ timestamp: /* @__PURE__ */ new Date(1700000102)
111
+ }
112
+ ],
113
+ [
114
+ "analytics.track",
115
+ {
116
+ userId: "us3r",
117
+ anonymousId: "s3ss10n",
118
+ event: "page view",
119
+ properties: {},
120
+ timestamp: /* @__PURE__ */ new Date(1700000102)
121
+ }
122
+ ]
123
+ ]
124
+ };
125
+ var userLoginIdentify = {
126
+ in: getEvent("user login", {
127
+ timestamp: 1700000103,
128
+ user: { id: "us3r", session: "s3ss10n" },
129
+ data: {
130
+ user_id: "new-user-123",
131
+ email: "user@acme.com",
132
+ name: "Jane Doe",
133
+ plan: "premium"
134
+ }
135
+ }),
136
+ mapping: {
137
+ skip: true,
138
+ settings: {
139
+ identify: {
140
+ map: {
141
+ userId: "data.user_id",
142
+ traits: {
143
+ map: {
144
+ email: "data.email",
145
+ name: "data.name",
146
+ plan: "data.plan"
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ },
153
+ out: [
154
+ "analytics.identify",
155
+ {
156
+ userId: "new-user-123",
157
+ anonymousId: "s3ss10n",
158
+ traits: { email: "user@acme.com", name: "Jane Doe", plan: "premium" },
159
+ timestamp: /* @__PURE__ */ new Date(1700000103)
160
+ }
161
+ ]
162
+ };
163
+ var companyGroup = {
164
+ in: getEvent("company update", {
165
+ timestamp: 1700000104,
166
+ user: { id: "us3r", session: "s3ss10n" },
167
+ data: {
168
+ company_id: "comp-456",
169
+ company_name: "Acme",
170
+ industry: "tech",
171
+ employees: 50
172
+ }
173
+ }),
174
+ mapping: {
175
+ skip: true,
176
+ settings: {
177
+ group: {
178
+ map: {
179
+ groupId: "data.company_id",
180
+ traits: {
181
+ map: {
182
+ name: "data.company_name",
183
+ industry: "data.industry",
184
+ employees: "data.employees"
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ },
191
+ out: [
192
+ "analytics.group",
193
+ {
194
+ userId: "us3r",
195
+ anonymousId: "s3ss10n",
196
+ groupId: "comp-456",
197
+ traits: { name: "Acme", industry: "tech", employees: 50 },
198
+ timestamp: /* @__PURE__ */ new Date(1700000104)
199
+ }
200
+ ]
201
+ };
202
+ var pageView = {
203
+ in: getEvent("page view", {
204
+ timestamp: 1700000105,
205
+ user: { id: "us3r", session: "s3ss10n" },
206
+ data: {
207
+ category: "docs",
208
+ title: "Getting Started",
209
+ section: "tutorials"
210
+ }
211
+ }),
212
+ mapping: {
213
+ skip: true,
214
+ settings: {
215
+ page: {
216
+ map: {
217
+ category: "data.category",
218
+ name: "data.title",
219
+ properties: {
220
+ map: {
221
+ section: "data.section"
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+ },
228
+ out: [
229
+ "analytics.page",
230
+ {
231
+ userId: "us3r",
232
+ anonymousId: "s3ss10n",
233
+ category: "docs",
234
+ name: "Getting Started",
235
+ properties: { section: "tutorials" },
236
+ timestamp: /* @__PURE__ */ new Date(1700000105)
237
+ }
238
+ ]
239
+ };
240
+ var screenView = {
241
+ in: getEvent("screen view", {
242
+ timestamp: 1700000106,
243
+ user: { id: "us3r", session: "s3ss10n" },
244
+ data: {
245
+ screen_name: "Welcome",
246
+ section: "onboarding",
247
+ build: "1.2.3"
248
+ }
249
+ }),
250
+ mapping: {
251
+ skip: true,
252
+ settings: {
253
+ screen: {
254
+ map: {
255
+ name: "data.screen_name",
256
+ category: "data.section",
257
+ properties: {
258
+ map: {
259
+ build: "data.build"
260
+ }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ },
266
+ out: [
267
+ "analytics.screen",
268
+ {
269
+ userId: "us3r",
270
+ anonymousId: "s3ss10n",
271
+ name: "Welcome",
272
+ category: "onboarding",
273
+ properties: { build: "1.2.3" },
274
+ timestamp: /* @__PURE__ */ new Date(1700000106)
275
+ }
276
+ ]
277
+ };
278
+ var anonymousOnly = {
279
+ in: getEvent("product view", {
280
+ timestamp: 1700000107,
281
+ user: { session: "s3ss10n" }
282
+ }),
283
+ settings: {
284
+ userId: void 0
285
+ },
286
+ out: [
287
+ "analytics.track",
288
+ {
289
+ anonymousId: "s3ss10n",
290
+ event: "product view",
291
+ properties: {},
292
+ timestamp: /* @__PURE__ */ new Date(1700000107)
293
+ }
294
+ ]
295
+ };
296
+ var consentForwarding = {
297
+ in: getEvent("product view", {
298
+ timestamp: 1700000108,
299
+ user: { id: "us3r", session: "s3ss10n" },
300
+ consent: { analytics: true, marketing: true }
301
+ }),
302
+ settings: {
303
+ consent: {
304
+ analytics: "Analytics",
305
+ marketing: "Advertising"
306
+ }
307
+ },
308
+ out: [
309
+ "analytics.track",
310
+ {
311
+ userId: "us3r",
312
+ anonymousId: "s3ss10n",
313
+ event: "product view",
314
+ properties: {},
315
+ timestamp: /* @__PURE__ */ new Date(1700000108),
316
+ context: {
317
+ consent: {
318
+ categoryPreferences: {
319
+ Analytics: true,
320
+ Advertising: true
321
+ }
322
+ }
323
+ }
324
+ }
325
+ ]
326
+ };
327
+ var wildcardIgnored = {
328
+ in: getEvent("debug noise", {
329
+ timestamp: 1700000109,
330
+ user: { id: "us3r", session: "s3ss10n" }
331
+ }),
332
+ mapping: { ignore: true },
333
+ out: []
334
+ };
335
+ export {
336
+ env_exports as env,
337
+ step_exports as step
338
+ };
@@ -0,0 +1,119 @@
1
+ import { Mapping as Mapping$1, Destination as Destination$1 } from '@walkeros/core';
2
+ import { DestinationServer } from '@walkeros/server-core';
3
+ import { Analytics } from '@segment/analytics-node';
4
+
5
+ interface Settings {
6
+ /** Segment source write key (required). */
7
+ writeKey: string;
8
+ /** walkerOS mapping value path to resolve userId from each event. */
9
+ userId?: string;
10
+ /** walkerOS mapping value path to resolve anonymousId from each event. */
11
+ anonymousId?: string;
12
+ /** Destination-level identity mapping (fires identify() on first push / change). */
13
+ identify?: Mapping$1.Value;
14
+ /** Destination-level group mapping (fires group() on first push / change). */
15
+ group?: Mapping$1.Value;
16
+ /** walkerOS consent key -> Segment categoryPreferences key mapping. */
17
+ consent?: Record<string, string>;
18
+ /** Downstream destination filtering. Passthrough to SDK. */
19
+ integrations?: Record<string, boolean | Record<string, unknown>>;
20
+ /** Base URL of Segment API. Default: 'https://api.segment.io'. */
21
+ host?: string;
22
+ /** API path. Default: '/v1/batch'. */
23
+ path?: string;
24
+ /** Events to enqueue before flushing. Default: 15. */
25
+ flushAt?: number;
26
+ /** Max milliseconds before auto-flush. Default: 10000. */
27
+ flushInterval?: number;
28
+ /** Retry attempts for failed batches. Default: 3. */
29
+ maxRetries?: number;
30
+ /** HTTP request timeout (ms). Default: 10000. */
31
+ httpRequestTimeout?: number;
32
+ /** Completely disable the SDK. Default: false. */
33
+ disable?: boolean;
34
+ /** Runtime state -- not user-facing. Mutated by init/push. */
35
+ _analytics?: Analytics;
36
+ _state?: RuntimeState;
37
+ }
38
+ interface RuntimeState {
39
+ lastIdentity?: {
40
+ userId?: string;
41
+ anonymousId?: string;
42
+ traitsHash?: string;
43
+ };
44
+ lastGroup?: {
45
+ groupId?: string;
46
+ traitsHash?: string;
47
+ };
48
+ }
49
+ type InitSettings = Partial<Settings>;
50
+ /**
51
+ * Per-rule mapping settings. Every feature is a walkerOS mapping value
52
+ * resolved via getMappingValue(). The resolved object's keys drive
53
+ * which Segment SDK methods to call.
54
+ */
55
+ interface Mapping {
56
+ identify?: Mapping$1.Value;
57
+ group?: Mapping$1.Value;
58
+ page?: Mapping$1.Value | boolean;
59
+ screen?: Mapping$1.Value | boolean;
60
+ }
61
+ /**
62
+ * Env -- optional SDK override. Production leaves this undefined and the
63
+ * destination creates a real Analytics instance. Tests provide a mock via
64
+ * env.analytics.
65
+ */
66
+ interface Env extends DestinationServer.Env {
67
+ analytics?: SegmentAnalyticsMock;
68
+ }
69
+ /**
70
+ * Mock-friendly interface for the Analytics instance methods the
71
+ * destination actually calls. Tests can provide this via env.analytics
72
+ * instead of the real SDK.
73
+ */
74
+ interface SegmentAnalyticsMock {
75
+ track: (params: Record<string, unknown>) => void;
76
+ identify: (params: Record<string, unknown>) => void;
77
+ group: (params: Record<string, unknown>) => void;
78
+ page: (params: Record<string, unknown>) => void;
79
+ screen: (params: Record<string, unknown>) => void;
80
+ closeAndFlush: (opts?: {
81
+ timeout?: number;
82
+ }) => Promise<void>;
83
+ }
84
+ type Types = Destination$1.Types<Settings, Mapping, Env, InitSettings>;
85
+ interface Destination extends DestinationServer.Destination<Types> {
86
+ init: DestinationServer.InitFn<Types>;
87
+ }
88
+ type Config = {
89
+ settings: Settings;
90
+ } & DestinationServer.Config<Types>;
91
+ type InitFn = DestinationServer.InitFn<Types>;
92
+ type PushFn = DestinationServer.PushFn<Types>;
93
+ type PartialConfig = DestinationServer.PartialConfig<Types>;
94
+ type PushEvents = DestinationServer.PushEvents<Mapping>;
95
+ type Rule = Mapping$1.Rule<Mapping>;
96
+ type Rules = Mapping$1.Rules<Rule>;
97
+
98
+ type index_Config = Config;
99
+ type index_Destination = Destination;
100
+ type index_Env = Env;
101
+ type index_InitFn = InitFn;
102
+ type index_InitSettings = InitSettings;
103
+ type index_Mapping = Mapping;
104
+ type index_PartialConfig = PartialConfig;
105
+ type index_PushEvents = PushEvents;
106
+ type index_PushFn = PushFn;
107
+ type index_Rule = Rule;
108
+ type index_Rules = Rules;
109
+ type index_RuntimeState = RuntimeState;
110
+ type index_SegmentAnalyticsMock = SegmentAnalyticsMock;
111
+ type index_Settings = Settings;
112
+ type index_Types = Types;
113
+ declare namespace index {
114
+ export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushEvents as PushEvents, index_PushFn as PushFn, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_SegmentAnalyticsMock as SegmentAnalyticsMock, index_Settings as Settings, index_Types as Types };
115
+ }
116
+
117
+ declare const destinationSegment: Destination;
118
+
119
+ export { index as DestinationSegment, destinationSegment as default, destinationSegment };
@@ -0,0 +1,119 @@
1
+ import { Mapping as Mapping$1, Destination as Destination$1 } from '@walkeros/core';
2
+ import { DestinationServer } from '@walkeros/server-core';
3
+ import { Analytics } from '@segment/analytics-node';
4
+
5
+ interface Settings {
6
+ /** Segment source write key (required). */
7
+ writeKey: string;
8
+ /** walkerOS mapping value path to resolve userId from each event. */
9
+ userId?: string;
10
+ /** walkerOS mapping value path to resolve anonymousId from each event. */
11
+ anonymousId?: string;
12
+ /** Destination-level identity mapping (fires identify() on first push / change). */
13
+ identify?: Mapping$1.Value;
14
+ /** Destination-level group mapping (fires group() on first push / change). */
15
+ group?: Mapping$1.Value;
16
+ /** walkerOS consent key -> Segment categoryPreferences key mapping. */
17
+ consent?: Record<string, string>;
18
+ /** Downstream destination filtering. Passthrough to SDK. */
19
+ integrations?: Record<string, boolean | Record<string, unknown>>;
20
+ /** Base URL of Segment API. Default: 'https://api.segment.io'. */
21
+ host?: string;
22
+ /** API path. Default: '/v1/batch'. */
23
+ path?: string;
24
+ /** Events to enqueue before flushing. Default: 15. */
25
+ flushAt?: number;
26
+ /** Max milliseconds before auto-flush. Default: 10000. */
27
+ flushInterval?: number;
28
+ /** Retry attempts for failed batches. Default: 3. */
29
+ maxRetries?: number;
30
+ /** HTTP request timeout (ms). Default: 10000. */
31
+ httpRequestTimeout?: number;
32
+ /** Completely disable the SDK. Default: false. */
33
+ disable?: boolean;
34
+ /** Runtime state -- not user-facing. Mutated by init/push. */
35
+ _analytics?: Analytics;
36
+ _state?: RuntimeState;
37
+ }
38
+ interface RuntimeState {
39
+ lastIdentity?: {
40
+ userId?: string;
41
+ anonymousId?: string;
42
+ traitsHash?: string;
43
+ };
44
+ lastGroup?: {
45
+ groupId?: string;
46
+ traitsHash?: string;
47
+ };
48
+ }
49
+ type InitSettings = Partial<Settings>;
50
+ /**
51
+ * Per-rule mapping settings. Every feature is a walkerOS mapping value
52
+ * resolved via getMappingValue(). The resolved object's keys drive
53
+ * which Segment SDK methods to call.
54
+ */
55
+ interface Mapping {
56
+ identify?: Mapping$1.Value;
57
+ group?: Mapping$1.Value;
58
+ page?: Mapping$1.Value | boolean;
59
+ screen?: Mapping$1.Value | boolean;
60
+ }
61
+ /**
62
+ * Env -- optional SDK override. Production leaves this undefined and the
63
+ * destination creates a real Analytics instance. Tests provide a mock via
64
+ * env.analytics.
65
+ */
66
+ interface Env extends DestinationServer.Env {
67
+ analytics?: SegmentAnalyticsMock;
68
+ }
69
+ /**
70
+ * Mock-friendly interface for the Analytics instance methods the
71
+ * destination actually calls. Tests can provide this via env.analytics
72
+ * instead of the real SDK.
73
+ */
74
+ interface SegmentAnalyticsMock {
75
+ track: (params: Record<string, unknown>) => void;
76
+ identify: (params: Record<string, unknown>) => void;
77
+ group: (params: Record<string, unknown>) => void;
78
+ page: (params: Record<string, unknown>) => void;
79
+ screen: (params: Record<string, unknown>) => void;
80
+ closeAndFlush: (opts?: {
81
+ timeout?: number;
82
+ }) => Promise<void>;
83
+ }
84
+ type Types = Destination$1.Types<Settings, Mapping, Env, InitSettings>;
85
+ interface Destination extends DestinationServer.Destination<Types> {
86
+ init: DestinationServer.InitFn<Types>;
87
+ }
88
+ type Config = {
89
+ settings: Settings;
90
+ } & DestinationServer.Config<Types>;
91
+ type InitFn = DestinationServer.InitFn<Types>;
92
+ type PushFn = DestinationServer.PushFn<Types>;
93
+ type PartialConfig = DestinationServer.PartialConfig<Types>;
94
+ type PushEvents = DestinationServer.PushEvents<Mapping>;
95
+ type Rule = Mapping$1.Rule<Mapping>;
96
+ type Rules = Mapping$1.Rules<Rule>;
97
+
98
+ type index_Config = Config;
99
+ type index_Destination = Destination;
100
+ type index_Env = Env;
101
+ type index_InitFn = InitFn;
102
+ type index_InitSettings = InitSettings;
103
+ type index_Mapping = Mapping;
104
+ type index_PartialConfig = PartialConfig;
105
+ type index_PushEvents = PushEvents;
106
+ type index_PushFn = PushFn;
107
+ type index_Rule = Rule;
108
+ type index_Rules = Rules;
109
+ type index_RuntimeState = RuntimeState;
110
+ type index_SegmentAnalyticsMock = SegmentAnalyticsMock;
111
+ type index_Settings = Settings;
112
+ type index_Types = Types;
113
+ declare namespace index {
114
+ export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushEvents as PushEvents, index_PushFn as PushFn, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_SegmentAnalyticsMock as SegmentAnalyticsMock, index_Settings as Settings, index_Types as Types };
115
+ }
116
+
117
+ declare const destinationSegment: Destination;
118
+
119
+ export { index as DestinationSegment, destinationSegment as default, destinationSegment };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var t,e=Object.defineProperty,n=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,s={};((t,n)=>{for(var i in n)e(t,i,{get:n[i],enumerable:!0})})(s,{DestinationSegment:()=>l,default:()=>p,destinationSegment:()=>g}),module.exports=(t=s,((t,s,o,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of i(s))r.call(t,c)||c===o||e(t,c,{get:()=>s[c],enumerable:!(a=n(s,c))||a.enumerable});return t})(e({},"__esModule",{value:!0}),t));var o=require("@walkeros/core"),a=async function(t,{config:e,rule:n,data:i,collector:r,env:s,logger:a}){var l,g;const p=e.settings,d=p._analytics,y=(null==s?void 0:s.analytics)||d;if(!y)return void a.warn("Segment Analytics not initialized");const f=p._state||{},m=(null==n?void 0:n.settings)||{},v=new Date(t.timestamp||Date.now()),I=p.userId?c(await(0,o.getMappingValue)(t,p.userId,{collector:r})):void 0,w=p.anonymousId?c(await(0,o.getMappingValue)(t,p.anonymousId,{collector:r})):void 0;if(!I&&!w)return void a.warn("Segment requires userId or anonymousId; skipping event",{event:t.name});const b={};I&&(b.userId=I),w&&(b.anonymousId=w);const O=function(t,e){const n=e.consent;if(!n||0===Object.keys(n).length)return;const i=t.consent;if(!(0,o.isObject)(i))return;const r={};for(const[t,e]of Object.entries(n))t in i&&(r[e]=!0===i[t]);return 0===Object.keys(r).length?void 0:{consent:{categoryPreferences:r}}}(t,p),j=null!=(l=m.identify)?l:p.identify;if(void 0!==j){const e=await(0,o.getMappingValue)(t,j,{collector:r});(0,o.isObject)(e)&&function(t,e,n,i,r,s){var a;const c=i.lastIdentity||{},l=(0,o.isString)(e.userId)?e.userId:n.userId,g=(0,o.isObject)(e.traits)&&!(0,o.isArray)(e.traits)?e.traits:void 0,p=u(g),d=l!==c.userId,y=p!==(null!=(a=c.traitsHash)?a:"");if(!d&&!y)return;const f={...n,timestamp:r};l&&(f.userId=l);g&&(f.traits=g);s&&(f.context=s);t.identify(f),i.lastIdentity={userId:l,anonymousId:n.anonymousId,traitsHash:p}}(y,e,b,f,v,O)}const S=null!=(g=m.group)?g:p.group;if(void 0!==S){const e=await(0,o.getMappingValue)(t,S,{collector:r});(0,o.isObject)(e)&&function(t,e,n,i,r,s){var a;const c=(0,o.isString)(e.groupId)?e.groupId:void 0;if(!c)return;const l=i.lastGroup||{},g=(0,o.isObject)(e.traits)&&!(0,o.isArray)(e.traits)?e.traits:void 0,p=u(g),d=c!==l.groupId,y=p!==(null!=(a=l.traitsHash)?a:"");if(!d&&!y)return;const f={...n,groupId:c,timestamp:r};g&&(f.traits=g);s&&(f.context=s);t.group(f),i.lastGroup={groupId:c,traitsHash:p}}(y,e,b,f,v,O)}if(void 0!==m.page&&await async function(t,e,n,i,r,s,a){const c={...i,timestamp:s};if(!0===e)return a&&(c.context=a),void t.page(c);const u=await(0,o.getMappingValue)(n,e,{collector:r});if(!(0,o.isObject)(u))return;const l=u;(0,o.isString)(l.category)&&(c.category=l.category);(0,o.isString)(l.name)&&(c.name=l.name);(0,o.isObject)(l.properties)&&!(0,o.isArray)(l.properties)&&(c.properties=l.properties);a&&(c.context=a);t.page(c)}(y,m.page,t,b,r,v,O),void 0!==m.screen&&await async function(t,e,n,i,r,s,a){const c={...i,timestamp:s};if(!0===e)return a&&(c.context=a),void t.screen(c);const u=await(0,o.getMappingValue)(n,e,{collector:r});if(!(0,o.isObject)(u))return;const l=u;(0,o.isString)(l.category)&&(c.category=l.category);(0,o.isString)(l.name)&&(c.name=l.name);(0,o.isObject)(l.properties)&&!(0,o.isArray)(l.properties)&&(c.properties=l.properties);a&&(c.context=a);t.screen(c)}(y,m.screen,t,b,r,v,O),!0!==(null==n?void 0:n.skip)){const e=(0,o.isString)(null==n?void 0:n.name)?n.name:t.name,r=(0,o.isObject)(i)?i:{},s={...b,event:e,properties:r,timestamp:v};O&&(s.context=O),y.track(s)}p._state=f};function c(t){if((0,o.isString)(t)&&t.length>0)return t}function u(t){if(!t)return"";try{return JSON.stringify(t)}catch(t){return""}}var l={},g={type:"segment",config:{},init({config:t,logger:e,env:n}){const i=function(t={},e){var n,i;const r=t.settings||{},{writeKey:s}=r;s||e.throw("Config settings writeKey missing");const o={...r,writeKey:s,userId:null!=(n=r.userId)?n:"user.id",anonymousId:null!=(i=r.anonymousId)?i:"user.session"};return{...t,settings:o}}(t,e),r=i.settings;if(!(null==n?void 0:n.analytics))try{const{Analytics:t}=require("@segment/analytics-node"),{writeKey:e,userId:n,anonymousId:i,identify:s,group:o,consent:a,integrations:c,_analytics:u,_state:l,...g}=r,p=new t({writeKey:e,...g});r._analytics=p}catch(t){e.throw(`Failed to initialize Segment SDK: ${t}`)}return r._state={},i},push:async(t,e)=>await a(t,e),async destroy({config:t}){const e=((null==t?void 0:t.settings)||{})._analytics;e&&await e.closeAndFlush({timeout:5e3})}},p=g;//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination, Settings, SegmentAnalyticsMock } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationSegment from './types';\n\nexport const destinationSegment: Destination = {\n type: 'segment',\n\n config: {},\n\n init({ config: partialConfig, logger, env }) {\n const config = getConfig(partialConfig, logger);\n const settings = config.settings as Settings;\n\n // Use env.analytics mock if provided (testing), otherwise create real SDK\n const envAnalytics = (\n env as { analytics?: SegmentAnalyticsMock } | undefined\n )?.analytics;\n\n if (!envAnalytics) {\n // Production path: create real Analytics instance\n try {\n const { Analytics } = require('@segment/analytics-node');\n const {\n writeKey,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n consent: _c,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n const analytics = new Analytics({ writeKey, ...sdkOptions });\n settings._analytics = analytics;\n } catch (err) {\n logger.throw(`Failed to initialize Segment SDK: ${err}`);\n }\n }\n\n settings._state = {};\n\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n\n async destroy({ config }) {\n const settings = (config?.settings || {}) as Settings;\n const analytics = settings._analytics;\n if (analytics) {\n await (analytics as unknown as SegmentAnalyticsMock).closeAndFlush({\n timeout: 5000,\n });\n }\n },\n};\n\nexport default destinationSegment;\n","import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { writeKey } = settings;\n\n if (!writeKey) logger.throw('Config settings writeKey missing');\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n // Default identity resolution paths\n userId: settings.userId ?? 'user.id',\n anonymousId: settings.anonymousId ?? 'user.session',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n PushFn,\n Settings,\n RuntimeState,\n SegmentAnalyticsMock,\n} from './types';\nimport { getMappingValue, isObject, isString, isArray } from '@walkeros/core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, collector, env, logger },\n) {\n const settings = config.settings as Settings;\n const analytics = settings._analytics as unknown as\n | SegmentAnalyticsMock\n | undefined;\n const envAnalytics = (env as { analytics?: SegmentAnalyticsMock } | undefined)\n ?.analytics;\n const sdk = envAnalytics || analytics;\n\n if (!sdk) {\n logger.warn('Segment Analytics not initialized');\n return;\n }\n\n const state: RuntimeState = settings._state || {};\n const mappingSettings = rule?.settings || {};\n const timestamp = new Date(event.timestamp || Date.now());\n\n // 1. Resolve identity from event\n const userId = settings.userId\n ? resolveString(\n await getMappingValue(event, settings.userId, { collector }),\n )\n : undefined;\n const anonymousId = settings.anonymousId\n ? resolveString(\n await getMappingValue(event, settings.anonymousId, { collector }),\n )\n : undefined;\n\n if (!userId && !anonymousId) {\n logger.warn('Segment requires userId or anonymousId; skipping event', {\n event: event.name,\n });\n return;\n }\n\n // Build identity object for every SDK call\n const identity: Record<string, unknown> = {};\n if (userId) identity.userId = userId;\n if (anonymousId) identity.anonymousId = anonymousId;\n\n // Build consent context\n const context = buildConsentContext(event, settings);\n\n // 2. Identify -- rule-level overrides destination-level\n const identifyMapping = mappingSettings.identify ?? settings.identify;\n if (identifyMapping !== undefined) {\n const resolved = await getMappingValue(event, identifyMapping, {\n collector,\n });\n if (isObject(resolved)) {\n applyIdentify(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n context,\n );\n }\n }\n\n // 3. Group -- rule-level overrides destination-level\n const groupMapping = mappingSettings.group ?? settings.group;\n if (groupMapping !== undefined) {\n const resolved = await getMappingValue(event, groupMapping, { collector });\n if (isObject(resolved)) {\n applyGroup(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n context,\n );\n }\n }\n\n // 4. Page\n if (mappingSettings.page !== undefined) {\n await applyPage(\n sdk,\n mappingSettings.page,\n event,\n identity,\n collector,\n timestamp,\n context,\n );\n }\n\n // 5. Screen\n if (mappingSettings.screen !== undefined) {\n await applyScreen(\n sdk,\n mappingSettings.screen,\n event,\n identity,\n collector,\n timestamp,\n context,\n );\n }\n\n // 6. Track (unless skip: true)\n if (rule?.skip !== true) {\n const eventName = isString(rule?.name) ? rule.name : event.name;\n const properties = isObject(data) ? (data as Record<string, unknown>) : {};\n\n const params: Record<string, unknown> = {\n ...identity,\n event: eventName,\n properties,\n timestamp,\n };\n if (context) params.context = context;\n\n sdk.track(params);\n }\n\n settings._state = state;\n};\n\nfunction resolveString(value: unknown): string | undefined {\n if (isString(value) && value.length > 0) return value;\n return undefined;\n}\n\nfunction hashTraits(traits: Record<string, unknown> | undefined): string {\n if (!traits) return '';\n try {\n return JSON.stringify(traits);\n } catch {\n return '';\n }\n}\n\nfunction buildConsentContext(\n event: WalkerOS.Event,\n settings: Settings,\n): Record<string, unknown> | undefined {\n const map = settings.consent;\n if (!map || Object.keys(map).length === 0) return undefined;\n\n const consentState = event.consent;\n if (!isObject(consentState)) return undefined;\n\n const categoryPreferences: Record<string, boolean> = {};\n for (const [walkerKey, segmentKey] of Object.entries(map)) {\n if (walkerKey in consentState) {\n categoryPreferences[segmentKey] = consentState[walkerKey] === true;\n }\n }\n\n if (Object.keys(categoryPreferences).length === 0) return undefined;\n\n return { consent: { categoryPreferences } };\n}\n\nfunction applyIdentify(\n sdk: SegmentAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n context?: Record<string, unknown>,\n): void {\n const last = state.lastIdentity || {};\n\n // Per-event identify can override userId\n const identifyUserId = isString(resolved.userId)\n ? resolved.userId\n : (identity.userId as string | undefined);\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const userIdChanged = identifyUserId !== last.userId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n\n if (!userIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n timestamp,\n };\n if (identifyUserId) params.userId = identifyUserId;\n if (traits) params.traits = traits;\n if (context) params.context = context;\n\n sdk.identify(params);\n\n state.lastIdentity = {\n userId: identifyUserId,\n anonymousId: identity.anonymousId as string | undefined,\n traitsHash,\n };\n}\n\nfunction applyGroup(\n sdk: SegmentAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n context?: Record<string, unknown>,\n): void {\n const groupId = isString(resolved.groupId) ? resolved.groupId : undefined;\n if (!groupId) return;\n\n const last = state.lastGroup || {};\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const groupIdChanged = groupId !== last.groupId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n if (!groupIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n groupId,\n timestamp,\n };\n if (traits) params.traits = traits;\n if (context) params.context = context;\n\n sdk.group(params);\n\n state.lastGroup = { groupId, traitsHash };\n}\n\nasync function applyPage(\n sdk: SegmentAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n context?: Record<string, unknown>,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n if (context) params.context = context;\n sdk.page(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n pageMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n if (context) params.context = context;\n\n sdk.page(params);\n}\n\nasync function applyScreen(\n sdk: SegmentAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n context?: Record<string, unknown>,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n if (context) params.context = context;\n sdk.screen(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n screenMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n if (context) params.context = context;\n\n sdk.screen(params);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\nimport type { Analytics, AnalyticsSettings } from '@segment/analytics-node';\n\nexport interface Settings {\n /** Segment source write key (required). */\n writeKey: string;\n /** walkerOS mapping value path to resolve userId from each event. */\n userId?: string;\n /** walkerOS mapping value path to resolve anonymousId from each event. */\n anonymousId?: string;\n /** Destination-level identity mapping (fires identify() on first push / change). */\n identify?: WalkerOSMapping.Value;\n /** Destination-level group mapping (fires group() on first push / change). */\n group?: WalkerOSMapping.Value;\n /** walkerOS consent key -> Segment categoryPreferences key mapping. */\n consent?: Record<string, string>;\n /** Downstream destination filtering. Passthrough to SDK. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** Base URL of Segment API. Default: 'https://api.segment.io'. */\n host?: string;\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 15. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Retry attempts for failed batches. Default: 3. */\n maxRetries?: number;\n /** HTTP request timeout (ms). Default: 10000. */\n httpRequestTimeout?: number;\n /** Completely disable the SDK. Default: false. */\n disable?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: Analytics;\n _state?: RuntimeState;\n}\n\nexport interface RuntimeState {\n lastIdentity?: {\n userId?: string;\n anonymousId?: string;\n traitsHash?: string;\n };\n lastGroup?: {\n groupId?: string;\n traitsHash?: string;\n };\n}\n\nexport type InitSettings = Partial<Settings>;\n\n/**\n * Per-rule mapping settings. Every feature is a walkerOS mapping value\n * resolved via getMappingValue(). The resolved object's keys drive\n * which Segment SDK methods to call.\n */\nexport interface Mapping {\n identify?: WalkerOSMapping.Value;\n group?: WalkerOSMapping.Value;\n page?: WalkerOSMapping.Value | boolean;\n screen?: WalkerOSMapping.Value | boolean;\n}\n\n/**\n * Env -- optional SDK override. Production leaves this undefined and the\n * destination creates a real Analytics instance. Tests provide a mock via\n * env.analytics.\n */\nexport interface Env extends DestinationServer.Env {\n analytics?: SegmentAnalyticsMock;\n}\n\n/**\n * Mock-friendly interface for the Analytics instance methods the\n * destination actually calls. Tests can provide this via env.analytics\n * instead of the real SDK.\n */\nexport interface SegmentAnalyticsMock {\n track: (params: Record<string, unknown>) => void;\n identify: (params: Record<string, unknown>) => void;\n group: (params: Record<string, unknown>) => void;\n page: (params: Record<string, unknown>) => void;\n screen: (params: Record<string, unknown>) => void;\n closeAndFlush: (opts?: { timeout?: number }) => Promise<void>;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ var t=(t=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(t,{get:(t,e)=>("undefined"!=typeof require?require:t)[e]}):t)(function(t){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import{getMappingValue as e,isObject as n,isString as r,isArray as o}from"@walkeros/core";var i=async function(t,{config:i,rule:c,data:u,collector:d,env:l,logger:y}){var p,f;const g=i.settings,m=g._analytics,v=(null==l?void 0:l.analytics)||m;if(!v)return void y.warn("Segment Analytics not initialized");const I=g._state||{},w=(null==c?void 0:c.settings)||{},h=new Date(t.timestamp||Date.now()),x=g.userId?s(await e(t,g.userId,{collector:d})):void 0,q=g.anonymousId?s(await e(t,g.anonymousId,{collector:d})):void 0;if(!x&&!q)return void y.warn("Segment requires userId or anonymousId; skipping event",{event:t.name});const _={};x&&(_.userId=x),q&&(_.anonymousId=q);const k=function(t,e){const r=e.consent;if(!r||0===Object.keys(r).length)return;const o=t.consent;if(!n(o))return;const i={};for(const[t,e]of Object.entries(r))t in o&&(i[e]=!0===o[t]);return 0===Object.keys(i).length?void 0:{consent:{categoryPreferences:i}}}(t,g),K=null!=(p=w.identify)?p:g.identify;if(void 0!==K){const i=await e(t,K,{collector:d});n(i)&&function(t,e,i,s,c,u){var d;const l=s.lastIdentity||{},y=r(e.userId)?e.userId:i.userId,p=n(e.traits)&&!o(e.traits)?e.traits:void 0,f=a(p),g=y!==l.userId,m=f!==(null!=(d=l.traitsHash)?d:"");if(!g&&!m)return;const v={...i,timestamp:c};y&&(v.userId=y);p&&(v.traits=p);u&&(v.context=u);t.identify(v),s.lastIdentity={userId:y,anonymousId:i.anonymousId,traitsHash:f}}(v,i,_,I,h,k)}const S=null!=(f=w.group)?f:g.group;if(void 0!==S){const i=await e(t,S,{collector:d});n(i)&&function(t,e,i,s,c,u){var d;const l=r(e.groupId)?e.groupId:void 0;if(!l)return;const y=s.lastGroup||{},p=n(e.traits)&&!o(e.traits)?e.traits:void 0,f=a(p),g=l!==y.groupId,m=f!==(null!=(d=y.traitsHash)?d:"");if(!g&&!m)return;const v={...i,groupId:l,timestamp:c};p&&(v.traits=p);u&&(v.context=u);t.group(v),s.lastGroup={groupId:l,traitsHash:f}}(v,i,_,I,h,k)}if(void 0!==w.page&&await async function(t,i,s,a,c,u,d){const l={...a,timestamp:u};if(!0===i)return d&&(l.context=d),void t.page(l);const y=await e(s,i,{collector:c});if(!n(y))return;const p=y;r(p.category)&&(l.category=p.category);r(p.name)&&(l.name=p.name);n(p.properties)&&!o(p.properties)&&(l.properties=p.properties);d&&(l.context=d);t.page(l)}(v,w.page,t,_,d,h,k),void 0!==w.screen&&await async function(t,i,s,a,c,u,d){const l={...a,timestamp:u};if(!0===i)return d&&(l.context=d),void t.screen(l);const y=await e(s,i,{collector:c});if(!n(y))return;const p=y;r(p.category)&&(l.category=p.category);r(p.name)&&(l.name=p.name);n(p.properties)&&!o(p.properties)&&(l.properties=p.properties);d&&(l.context=d);t.screen(l)}(v,w.screen,t,_,d,h,k),!0!==(null==c?void 0:c.skip)){const e=r(null==c?void 0:c.name)?c.name:t.name,o=n(u)?u:{},i={..._,event:e,properties:o,timestamp:h};k&&(i.context=k),v.track(i)}g._state=I};function s(t){if(r(t)&&t.length>0)return t}function a(t){if(!t)return"";try{return JSON.stringify(t)}catch(t){return""}}var c={},u={type:"segment",config:{},init({config:e,logger:n,env:r}){const o=function(t={},e){var n,r;const o=t.settings||{},{writeKey:i}=o;i||e.throw("Config settings writeKey missing");const s={...o,writeKey:i,userId:null!=(n=o.userId)?n:"user.id",anonymousId:null!=(r=o.anonymousId)?r:"user.session"};return{...t,settings:s}}(e,n),i=o.settings;if(!(null==r?void 0:r.analytics))try{const{Analytics:e}=t("@segment/analytics-node"),{writeKey:n,userId:r,anonymousId:o,identify:s,group:a,consent:c,integrations:u,_analytics:d,_state:l,...y}=i,p=new e({writeKey:n,...y});i._analytics=p}catch(t){n.throw(`Failed to initialize Segment SDK: ${t}`)}return i._state={},o},push:async(t,e)=>await i(t,e),async destroy({config:t}){const e=((null==t?void 0:t.settings)||{})._analytics;e&&await e.closeAndFlush({timeout:5e3})}},d=u;export{c as DestinationSegment,d as default,u as destinationSegment};//# sourceMappingURL=index.mjs.map