@walkeros/web-core 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,79 +1,321 @@
1
1
  <p align="left">
2
2
  <a href="https://elbwalker.com">
3
- <img title="elbwalker" src='https://www.elbwalker.com/img/elbwalker_logo.png' width="256px"/>
3
+ <img title="elbwalker" src="https://www.elbwalker.com/img/elbwalker_logo.png" width="256px"/>
4
4
  </a>
5
5
  </p>
6
6
 
7
7
  # Web Core Utilities for walkerOS
8
8
 
9
- The walkerOS Web Core package provides browser-specific utilities and functions
10
- that power web-based data collection. It extends the platform-agnostic Core
11
- package with web-specific functionality for DOM interaction, session management,
12
- and browser environment detection.
9
+ [Source Code](https://github.com/elbwalker/walkerOS/tree/main/packages/web/core)
10
+ &bull; [NPM Package](https://www.npmjs.com/package/@walkeros/web-core)
13
11
 
14
- ## Role in walkerOS Ecosystem
12
+ Web core utilities are browser-specific functions designed for client-side
13
+ walkerOS implementations. These utilities handle DOM interactions, browser
14
+ information, storage, sessions, and web-based communication.
15
15
 
16
- walkerOS follows a **source → collector → destination** architecture:
16
+ ## Installation
17
+
18
+ Import web utilities from the `@walkeros/web-core` package:
17
19
 
18
- - **Sources**: Capture events from various environments (browser DOM, dataLayer,
19
- server requests)
20
- - **Collector**: Processes, validates, and routes events with consent awareness
21
- - **Destinations**: Send processed events to analytics platforms (GA4, Meta,
22
- custom APIs)
20
+ ```ts
21
+ import { getAttribute, sendWeb, sessionStart } from '@walkeros/web-core';
22
+ ```
23
23
 
24
- The Web Core package serves as the foundation for all web-based sources and
25
- destinations, providing essential browser utilities, session handling, and
26
- web-specific event processing capabilities.
24
+ ## Utilities
27
25
 
28
- ## Installation
26
+ ### DOM Utilities
27
+
28
+ #### getAttribute
29
+
30
+ `getAttribute(element: Element, name: string): string` retrieves attribute
31
+ values from DOM elements with enhanced handling.
32
+
33
+ ```js
34
+ const element = document.querySelector('[data-elb="product"]');
35
+ const entityType = getAttribute(element, 'data-elb'); // Returns 'product'
36
+ ```
37
+
38
+ #### Attribute Parsing
39
+
40
+ ##### splitAttribute
41
+
42
+ `splitAttribute(str: string, separator?: string): string[]` splits attribute
43
+ strings using specified separators.
44
+
45
+ ```js
46
+ splitAttribute('id:123,name:shirt', ','); // Returns ['id:123', 'name:shirt']
47
+ ```
48
+
49
+ ##### splitKeyVal
50
+
51
+ `splitKeyVal(str: string): [string, string]` splits key-value pairs from
52
+ attribute strings.
53
+
54
+ ```js
55
+ splitKeyVal('id:123'); // Returns ['id', '123']
56
+ ```
57
+
58
+ ##### parseInlineConfig
59
+
60
+ `parseInlineConfig(str: string): Record<string, unknown>` parses inline
61
+ configuration strings from HTML attributes.
62
+
63
+ ```js
64
+ parseInlineConfig('{"tracking": true, "debug": false}');
65
+ // Returns { tracking: true, debug: false }
66
+ ```
67
+
68
+ ### Browser Information
69
+
70
+ #### getLanguage
71
+
72
+ `getLanguage(navigatorRef: Navigator): string | undefined` extracts the user's
73
+ preferred language.
74
+
75
+ ```js
76
+ getLanguage(navigator); // Returns 'en-US' or user's language
77
+ ```
78
+
79
+ #### getTimezone
80
+
81
+ `getTimezone(): string | undefined` gets the user's timezone from the Intl API.
82
+
83
+ ```js
84
+ getTimezone(); // Returns 'America/New_York' or user's timezone
85
+ ```
86
+
87
+ #### getScreenSize
88
+
89
+ `getScreenSize(windowRef: Window): string` returns the window's screen
90
+ dimensions.
91
+
92
+ ```js
93
+ getScreenSize(window); // Returns '1920x1080' or current screen size
94
+ ```
95
+
96
+ ### Element Visibility
97
+
98
+ #### isVisible
99
+
100
+ `isVisible(element: HTMLElement): boolean` checks if an element is visible to
101
+ the user.
102
+
103
+ ```js
104
+ const promoElement = document.getElementById('promotion');
105
+ if (isVisible(promoElement)) {
106
+ // Element is visible on screen
107
+ }
108
+ ```
109
+
110
+ This function considers:
111
+
112
+ - Element display and visibility styles
113
+ - Element position within viewport
114
+ - Parent element visibility
115
+ - Intersection with the visible area
116
+
117
+ ### Storage Management
118
+
119
+ #### Storage Operations
120
+
121
+ ##### storageRead
122
+
123
+ `storageRead(key: string, storage?: StorageType): WalkerOS.PropertyType` reads
124
+ data from browser storage with automatic type conversion.
125
+
126
+ ```js
127
+ // Default uses localStorage
128
+ const userId = storageRead('walker_user_id');
129
+
130
+ // Use sessionStorage
131
+ const sessionData = storageRead('session_data', 'sessionStorage');
132
+ ```
29
133
 
30
- ```sh
31
- npm install @walkeros/web-core
134
+ ##### storageWrite
135
+
136
+ `storageWrite(key: string, value: WalkerOS.PropertyType, maxAgeInMinutes?: number, storage?: StorageType, domain?: string): WalkerOS.PropertyType`
137
+ writes data to storage with expiration and domain options.
138
+
139
+ ```js
140
+ // Store with 30-minute expiration
141
+ storageWrite('user_preference', 'dark-mode', 30);
142
+
143
+ // Store in sessionStorage
144
+ storageWrite('temp_data', { id: 123 }, undefined, 'sessionStorage');
145
+
146
+ // Store with custom domain for cookies
147
+ storageWrite('tracking_id', 'abc123', 1440, 'cookie', '.example.com');
32
148
  ```
33
149
 
34
- ## Usage
150
+ ##### storageDelete
151
+
152
+ `storageDelete(key: string, storage?: StorageType)` removes data from storage.
153
+
154
+ ```js
155
+ storageDelete('expired_data');
156
+ storageDelete('session_temp', 'sessionStorage');
157
+ ```
158
+
159
+ ### Session Management
160
+
161
+ #### sessionStart
162
+
163
+ `sessionStart(config?: SessionConfig): WalkerOS.SessionData | void` initializes
164
+ and manages user sessions with automatic renewal and tracking.
165
+
166
+ ```js
167
+ // Start session with default config
168
+ const session = sessionStart();
169
+
170
+ // Custom session configuration
171
+ const session = sessionStart({
172
+ storage: true,
173
+ domain: '.example.com',
174
+ maxAge: 1440, // 24 hours
175
+ sampling: 1.0, // 100% sampling
176
+ });
177
+ ```
35
178
 
36
- The web core package provides browser-specific utilities:
179
+ Session data includes:
37
180
 
38
- ```typescript
39
- import {
40
- // Browser utilities
41
- getBrowser,
42
- getHash,
43
- isVisible,
181
+ - `id` - Unique session identifier
182
+ - `start` - Session start timestamp
183
+ - `isNew` - Whether this is a new session
184
+ - `count` - Number of events in session
185
+ - `device` - Device identifier
186
+ - `storage` - Whether storage is available
44
187
 
45
- // Session management
46
- sessionStart,
47
- sessionStorage,
188
+ #### Advanced Session Functions
48
189
 
49
- // Web-specific event handling
50
- sendWeb,
190
+ - `sessionStorage` - Session-specific storage operations
191
+ - `sessionWindow` - Window/tab session management
192
+
193
+ ### Web Communication
194
+
195
+ #### sendWeb
196
+
197
+ `sendWeb<T>(url: string, data?: SendDataValue, options?: SendWebOptionsDynamic<T>): SendWebReturn<T>`
198
+ sends data using various web transport methods.
199
+
200
+ ```js
201
+ // Default fetch transport
202
+ await sendWeb('https://api.example.com/events', eventData);
203
+
204
+ // Use specific transport
205
+ await sendWeb(url, data, { transport: 'beacon' });
206
+ await sendWeb(url, data, { transport: 'xhr' });
207
+
208
+ // With custom headers
209
+ await sendWeb(url, data, {
210
+ headers: { Authorization: 'Bearer token' },
211
+ method: 'PUT',
212
+ });
213
+ ```
214
+
215
+ #### Transport-Specific Functions
216
+
217
+ ##### sendWebAsFetch
218
+
219
+ `sendWebAsFetch(url: string, data?: SendDataValue, options?: SendWebOptionsFetch): Promise<SendResponse>`
220
+ uses the modern Fetch API with advanced options.
221
+
222
+ ```js
223
+ await sendWebAsFetch(url, data, {
224
+ credentials: 'include',
225
+ noCors: true,
226
+ headers: { 'Content-Type': 'application/json' },
227
+ });
228
+ ```
51
229
 
52
- // Storage utilities
53
- storage,
54
- } from '@walkeros/web-core';
230
+ ##### sendWebAsBeacon
55
231
 
56
- // Example: Check if element is visible
57
- const element = document.getElementById('my-element');
58
- if (isVisible(element)) {
59
- console.log('Element is visible in viewport');
232
+ `sendWebAsBeacon(url: string, data?: SendDataValue): SendResponse` uses the
233
+ Beacon API for reliable data transmission, especially during page unload.
234
+
235
+ ```js
236
+ // Reliable sending during page unload
237
+ window.addEventListener('beforeunload', () => {
238
+ sendWebAsBeacon('/analytics/pageview', { duration: Date.now() - startTime });
239
+ });
240
+ ```
241
+
242
+ ##### sendWebAsXhr
243
+
244
+ `sendWebAsXhr(url: string, data?: SendDataValue, options?: SendWebOptions): SendResponse`
245
+ uses XMLHttpRequest for synchronous communication.
246
+
247
+ ```js
248
+ // Synchronous request (blocks execution)
249
+ const response = sendWebAsXhr(url, data, { method: 'POST' });
250
+ ```
251
+
252
+ ### Web Hashing
253
+
254
+ #### getHashWeb
255
+
256
+ `getHashWeb(str: string, length?: number): Promise<string>` generates SHA-256
257
+ hashes using the Web Crypto API.
258
+
259
+ ```js
260
+ // Generate hash for fingerprinting
261
+ const userFingerprint = await getHashWeb(
262
+ navigator.userAgent + navigator.language + screen.width,
263
+ 16,
264
+ );
265
+ // Returns shortened hash like '47e0bdd10f04ef13'
266
+ ```
267
+
268
+ ## Configuration Types
269
+
270
+ ### SendWebOptions
271
+
272
+ ```ts
273
+ interface SendWebOptions {
274
+ headers?: Record<string, string>;
275
+ method?: string; // Default: 'POST'
276
+ transport?: 'fetch' | 'beacon' | 'xhr'; // Default: 'fetch'
277
+ }
278
+
279
+ interface SendWebOptionsFetch extends SendWebOptions {
280
+ credentials?: 'omit' | 'same-origin' | 'include';
281
+ noCors?: boolean;
282
+ }
283
+ ```
284
+
285
+ ### SessionConfig
286
+
287
+ ```ts
288
+ interface SessionConfig {
289
+ storage?: boolean; // Enable storage persistence
290
+ domain?: string; // Cookie domain
291
+ maxAge?: number; // Session duration in minutes
292
+ sampling?: number; // Sampling rate (0-1)
60
293
  }
294
+ ```
61
295
 
62
- // Example: Get browser information
63
- const browserInfo = getBrowser();
64
- console.log('Browser:', browserInfo.name, browserInfo.version);
296
+ ### StorageType
297
+
298
+ ```ts
299
+ type StorageType = 'localStorage' | 'sessionStorage' | 'cookie';
65
300
  ```
66
301
 
67
- ## Core Features
302
+ ## Usage Notes
303
+
304
+ - **Consent Required**: Browser information functions may require user consent
305
+ depending on privacy regulations
306
+ - **Storage Fallbacks**: Storage functions gracefully handle unavailable storage
307
+ with fallbacks
308
+ - **Transport Selection**: Choose transport based on use case:
309
+ - `fetch` - Modern, flexible, supports responses
310
+ - `beacon` - Reliable during page unload, small payloads
311
+ - `xhr` - Synchronous when needed, broader browser support
312
+ - **Performance**: Session and storage operations are optimized for minimal
313
+ performance impact
314
+
315
+ ---
68
316
 
69
- - **Browser Detection**: Identify browser type, version, and capabilities
70
- - **DOM Utilities**: Functions for element visibility, attributes, and
71
- manipulation
72
- - **Session Management**: Handle web session lifecycle and storage
73
- - **Viewport Detection**: Determine element visibility and user interaction
74
- - **Web Storage**: Unified interface for localStorage and sessionStorage
75
- - **Hash Generation**: Create consistent identifiers for web environments
76
- - **Event Transmission**: Web-optimized event sending mechanisms
317
+ For platform-agnostic utilities, see
318
+ [Core Utilities](https://www.elbwalker.com/docs/core).
77
319
 
78
320
  ## Contribute
79
321
 
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Elb, SendHeaders, SendResponse, SendDataValue, Collector as Collector$1, StorageType, WalkerOS, MarketingParameters, Destination as Destination$1, Source as Source$1, Hooks, On } from '@walkeros/core';
1
+ import { Elb, Destination as Destination$1, SendHeaders, SendResponse, SendDataValue, Collector as Collector$1, StorageType, WalkerOS, MarketingParameters, Source as Source$1, Hooks, On } from '@walkeros/core';
2
2
 
3
3
  /**
4
4
  * Get attribute value from element
@@ -35,6 +35,98 @@ declare function getScreenSize(windowRef: Window): string;
35
35
 
36
36
  declare const elb$1: Elb.Fn<void>;
37
37
 
38
+ interface Destination<Settings = unknown, Mapping = unknown> extends Destination$1.Instance<Settings, Mapping> {
39
+ }
40
+ type Init$1 = Destination$1.Init;
41
+ type Config$2<Settings = unknown, Mapping = unknown> = Destination$1.Config<Settings, Mapping>;
42
+ type PartialConfig$1<Settings = unknown, Mapping = unknown> = Destination$1.PartialConfig<Settings, Mapping>;
43
+ type InitFn$1<Settings = unknown, Mapping = unknown> = Destination$1.InitFn<Settings, Mapping>;
44
+ type PushFn<Settings = unknown, Mapping = unknown> = Destination$1.PushFn<Settings, Mapping>;
45
+ type PushEvent<Mapping = unknown> = Destination$1.PushEvent<Mapping>;
46
+ type PushEvents<Mapping = unknown> = Destination$1.PushEvents<Mapping>;
47
+ /**
48
+ * Web-specific environment requirements interface
49
+ *
50
+ * Extends the core Environment interface with web-specific
51
+ * globals like window and document for browser destinations.
52
+ */
53
+ interface Environment extends Destination$1.Environment {
54
+ /**
55
+ * Properties to be added to the global `window` object
56
+ *
57
+ * Used by web destinations that expect browser-specific
58
+ * global functions like analytics APIs.
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * window: {
63
+ * gtag: () => {},
64
+ * fbq: () => {},
65
+ * dataLayer: []
66
+ * }
67
+ * ```
68
+ */
69
+ window?: Record<string, unknown>;
70
+ /**
71
+ * Properties to be added to the global `document` object
72
+ *
73
+ * Used by destinations that need DOM manipulation capabilities
74
+ * for script loading or element creation.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * document: {
79
+ * createElement: () => ({ src: '', async: false }),
80
+ * head: { appendChild: () => {} }
81
+ * }
82
+ * ```
83
+ */
84
+ document?: Record<string, unknown>;
85
+ }
86
+
87
+ type destination_Destination<Settings = unknown, Mapping = unknown> = Destination<Settings, Mapping>;
88
+ type destination_Environment = Environment;
89
+ type destination_PushEvent<Mapping = unknown> = PushEvent<Mapping>;
90
+ type destination_PushEvents<Mapping = unknown> = PushEvents<Mapping>;
91
+ type destination_PushFn<Settings = unknown, Mapping = unknown> = PushFn<Settings, Mapping>;
92
+ declare namespace destination {
93
+ export type { Config$2 as Config, destination_Destination as Destination, destination_Environment as Environment, Init$1 as Init, InitFn$1 as InitFn, PartialConfig$1 as PartialConfig, destination_PushEvent as PushEvent, destination_PushEvents as PushEvents, destination_PushFn as PushFn };
94
+ }
95
+
96
+ /**
97
+ * Helper function to get environment globals with fallbacks
98
+ *
99
+ * Provides a consistent way for web destinations to access browser APIs
100
+ * (window, document) while supporting environment-based testing and simulation.
101
+ *
102
+ * @param environment - Optional environment override for testing/simulation
103
+ * @returns Environment globals with fallback to real browser APIs
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * // Production usage (environment = undefined)
108
+ * const { window, document } = getEnvironment();
109
+ * // Uses real globalThis.window, globalThis.document
110
+ *
111
+ * // Testing usage
112
+ * const testEnv = { window: { gtag: mockGtag } };
113
+ * const { window, document } = getEnvironment(testEnv);
114
+ * // Uses mock window.gtag, real document
115
+ *
116
+ * // Simulation usage
117
+ * const simEnv = { window: { gtag: capturingFunction } };
118
+ * const { window, document } = getEnvironment(simEnv);
119
+ * // Uses capturing functions for simulation
120
+ * ```
121
+ */
122
+ declare function getEnvironment<T extends Environment = Environment>(environment?: T): T extends undefined ? {
123
+ window: Window;
124
+ document: Document;
125
+ } : T & {
126
+ window: Window;
127
+ document: Document;
128
+ };
129
+
38
130
  declare function getHashWeb(str: string, length?: number): Promise<string>;
39
131
 
40
132
  declare function isVisible(element: HTMLElement): boolean;
@@ -97,24 +189,6 @@ declare function storageDelete(key: string, storage?: StorageType): void;
97
189
  declare function storageRead(key: string, storage?: StorageType): WalkerOS.PropertyType;
98
190
  declare function storageWrite(key: string, value: WalkerOS.PropertyType, maxAgeInMinutes?: number, storage?: StorageType, domain?: string): WalkerOS.PropertyType;
99
191
 
100
- interface Destination<Settings = unknown, Mapping = unknown> extends Destination$1.Instance<Settings, Mapping> {
101
- }
102
- type Init$1 = Destination$1.Init;
103
- type Config$2<Settings = unknown, Mapping = unknown> = Destination$1.Config<Settings, Mapping>;
104
- type PartialConfig$1<Settings = unknown, Mapping = unknown> = Destination$1.PartialConfig<Settings, Mapping>;
105
- type InitFn$1<Settings = unknown, Mapping = unknown> = Destination$1.InitFn<Settings, Mapping>;
106
- type PushFn<Settings = unknown, Mapping = unknown> = Destination$1.PushFn<Settings, Mapping>;
107
- type PushEvent<Mapping = unknown> = Destination$1.PushEvent<Mapping>;
108
- type PushEvents<Mapping = unknown> = Destination$1.PushEvents<Mapping>;
109
-
110
- type destination_Destination<Settings = unknown, Mapping = unknown> = Destination<Settings, Mapping>;
111
- type destination_PushEvent<Mapping = unknown> = PushEvent<Mapping>;
112
- type destination_PushEvents<Mapping = unknown> = PushEvents<Mapping>;
113
- type destination_PushFn<Settings = unknown, Mapping = unknown> = PushFn<Settings, Mapping>;
114
- declare namespace destination {
115
- export type { Config$2 as Config, destination_Destination as Destination, Init$1 as Init, InitFn$1 as InitFn, PartialConfig$1 as PartialConfig, destination_PushEvent as PushEvent, destination_PushEvents as PushEvents, destination_PushFn as PushFn };
116
- }
117
-
118
192
  interface Source<Settings extends Record<string, unknown> = Record<string, unknown>, Mapping = unknown> extends Source$1.Instance {
119
193
  settings?: Settings;
120
194
  mapping?: Mapping;
@@ -189,7 +263,7 @@ declare global {
189
263
  elbwalker: Collector;
190
264
  walkerjs: Collector;
191
265
  elbLayer: Layer;
192
- dataLayer: WalkerOS.Events | unknown;
266
+ dataLayer: WalkerOS.Events | unknown | unknown[];
193
267
  elb: Elb.Fn<Promise<Elb.PushResult>>;
194
268
  }
195
269
  }
@@ -257,4 +331,4 @@ declare namespace collector {
257
331
  export type { collector_Collector as Collector, collector_Config as Config, collector_Destinations as Destinations, collector_InitConfig as InitConfig, collector_Scope as Scope, collector_SessionStartOptions as SessionStartOptions, collector_State as State };
258
332
  }
259
333
 
260
- export { destination as DestinationWeb, elb as Elb, type SendWebOptions, type SendWebOptionsFetch, type SendWebReturn, type SendWebTransport, type SessionCallback, type SessionConfig, type SessionFunction, type SessionStorageConfig, type SessionWindowConfig, source as SourceWeb, type StorageValue, walker as Walker, collector as WebCollector, elb$1 as elb, getAttribute, getHashWeb, getLanguage, getScreenSize, getTimezone, isVisible, parseInlineConfig, sendWeb, sendWebAsBeacon, sendWebAsFetch, sendWebAsXhr, sessionStart, sessionStorage, sessionWindow, splitAttribute, splitKeyVal, storageDelete, storageRead, storageWrite };
334
+ export { destination as DestinationWeb, elb as Elb, type SendWebOptions, type SendWebOptionsFetch, type SendWebReturn, type SendWebTransport, type SessionCallback, type SessionConfig, type SessionFunction, type SessionStorageConfig, type SessionWindowConfig, source as SourceWeb, type StorageValue, walker as Walker, collector as WebCollector, elb$1 as elb, getAttribute, getEnvironment, getHashWeb, getLanguage, getScreenSize, getTimezone, isVisible, parseInlineConfig, sendWeb, sendWebAsBeacon, sendWebAsFetch, sendWebAsXhr, sessionStart, sessionStorage, sessionWindow, splitAttribute, splitKeyVal, storageDelete, storageRead, storageWrite };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Elb, SendHeaders, SendResponse, SendDataValue, Collector as Collector$1, StorageType, WalkerOS, MarketingParameters, Destination as Destination$1, Source as Source$1, Hooks, On } from '@walkeros/core';
1
+ import { Elb, Destination as Destination$1, SendHeaders, SendResponse, SendDataValue, Collector as Collector$1, StorageType, WalkerOS, MarketingParameters, Source as Source$1, Hooks, On } from '@walkeros/core';
2
2
 
3
3
  /**
4
4
  * Get attribute value from element
@@ -35,6 +35,98 @@ declare function getScreenSize(windowRef: Window): string;
35
35
 
36
36
  declare const elb$1: Elb.Fn<void>;
37
37
 
38
+ interface Destination<Settings = unknown, Mapping = unknown> extends Destination$1.Instance<Settings, Mapping> {
39
+ }
40
+ type Init$1 = Destination$1.Init;
41
+ type Config$2<Settings = unknown, Mapping = unknown> = Destination$1.Config<Settings, Mapping>;
42
+ type PartialConfig$1<Settings = unknown, Mapping = unknown> = Destination$1.PartialConfig<Settings, Mapping>;
43
+ type InitFn$1<Settings = unknown, Mapping = unknown> = Destination$1.InitFn<Settings, Mapping>;
44
+ type PushFn<Settings = unknown, Mapping = unknown> = Destination$1.PushFn<Settings, Mapping>;
45
+ type PushEvent<Mapping = unknown> = Destination$1.PushEvent<Mapping>;
46
+ type PushEvents<Mapping = unknown> = Destination$1.PushEvents<Mapping>;
47
+ /**
48
+ * Web-specific environment requirements interface
49
+ *
50
+ * Extends the core Environment interface with web-specific
51
+ * globals like window and document for browser destinations.
52
+ */
53
+ interface Environment extends Destination$1.Environment {
54
+ /**
55
+ * Properties to be added to the global `window` object
56
+ *
57
+ * Used by web destinations that expect browser-specific
58
+ * global functions like analytics APIs.
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * window: {
63
+ * gtag: () => {},
64
+ * fbq: () => {},
65
+ * dataLayer: []
66
+ * }
67
+ * ```
68
+ */
69
+ window?: Record<string, unknown>;
70
+ /**
71
+ * Properties to be added to the global `document` object
72
+ *
73
+ * Used by destinations that need DOM manipulation capabilities
74
+ * for script loading or element creation.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * document: {
79
+ * createElement: () => ({ src: '', async: false }),
80
+ * head: { appendChild: () => {} }
81
+ * }
82
+ * ```
83
+ */
84
+ document?: Record<string, unknown>;
85
+ }
86
+
87
+ type destination_Destination<Settings = unknown, Mapping = unknown> = Destination<Settings, Mapping>;
88
+ type destination_Environment = Environment;
89
+ type destination_PushEvent<Mapping = unknown> = PushEvent<Mapping>;
90
+ type destination_PushEvents<Mapping = unknown> = PushEvents<Mapping>;
91
+ type destination_PushFn<Settings = unknown, Mapping = unknown> = PushFn<Settings, Mapping>;
92
+ declare namespace destination {
93
+ export type { Config$2 as Config, destination_Destination as Destination, destination_Environment as Environment, Init$1 as Init, InitFn$1 as InitFn, PartialConfig$1 as PartialConfig, destination_PushEvent as PushEvent, destination_PushEvents as PushEvents, destination_PushFn as PushFn };
94
+ }
95
+
96
+ /**
97
+ * Helper function to get environment globals with fallbacks
98
+ *
99
+ * Provides a consistent way for web destinations to access browser APIs
100
+ * (window, document) while supporting environment-based testing and simulation.
101
+ *
102
+ * @param environment - Optional environment override for testing/simulation
103
+ * @returns Environment globals with fallback to real browser APIs
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * // Production usage (environment = undefined)
108
+ * const { window, document } = getEnvironment();
109
+ * // Uses real globalThis.window, globalThis.document
110
+ *
111
+ * // Testing usage
112
+ * const testEnv = { window: { gtag: mockGtag } };
113
+ * const { window, document } = getEnvironment(testEnv);
114
+ * // Uses mock window.gtag, real document
115
+ *
116
+ * // Simulation usage
117
+ * const simEnv = { window: { gtag: capturingFunction } };
118
+ * const { window, document } = getEnvironment(simEnv);
119
+ * // Uses capturing functions for simulation
120
+ * ```
121
+ */
122
+ declare function getEnvironment<T extends Environment = Environment>(environment?: T): T extends undefined ? {
123
+ window: Window;
124
+ document: Document;
125
+ } : T & {
126
+ window: Window;
127
+ document: Document;
128
+ };
129
+
38
130
  declare function getHashWeb(str: string, length?: number): Promise<string>;
39
131
 
40
132
  declare function isVisible(element: HTMLElement): boolean;
@@ -97,24 +189,6 @@ declare function storageDelete(key: string, storage?: StorageType): void;
97
189
  declare function storageRead(key: string, storage?: StorageType): WalkerOS.PropertyType;
98
190
  declare function storageWrite(key: string, value: WalkerOS.PropertyType, maxAgeInMinutes?: number, storage?: StorageType, domain?: string): WalkerOS.PropertyType;
99
191
 
100
- interface Destination<Settings = unknown, Mapping = unknown> extends Destination$1.Instance<Settings, Mapping> {
101
- }
102
- type Init$1 = Destination$1.Init;
103
- type Config$2<Settings = unknown, Mapping = unknown> = Destination$1.Config<Settings, Mapping>;
104
- type PartialConfig$1<Settings = unknown, Mapping = unknown> = Destination$1.PartialConfig<Settings, Mapping>;
105
- type InitFn$1<Settings = unknown, Mapping = unknown> = Destination$1.InitFn<Settings, Mapping>;
106
- type PushFn<Settings = unknown, Mapping = unknown> = Destination$1.PushFn<Settings, Mapping>;
107
- type PushEvent<Mapping = unknown> = Destination$1.PushEvent<Mapping>;
108
- type PushEvents<Mapping = unknown> = Destination$1.PushEvents<Mapping>;
109
-
110
- type destination_Destination<Settings = unknown, Mapping = unknown> = Destination<Settings, Mapping>;
111
- type destination_PushEvent<Mapping = unknown> = PushEvent<Mapping>;
112
- type destination_PushEvents<Mapping = unknown> = PushEvents<Mapping>;
113
- type destination_PushFn<Settings = unknown, Mapping = unknown> = PushFn<Settings, Mapping>;
114
- declare namespace destination {
115
- export type { Config$2 as Config, destination_Destination as Destination, Init$1 as Init, InitFn$1 as InitFn, PartialConfig$1 as PartialConfig, destination_PushEvent as PushEvent, destination_PushEvents as PushEvents, destination_PushFn as PushFn };
116
- }
117
-
118
192
  interface Source<Settings extends Record<string, unknown> = Record<string, unknown>, Mapping = unknown> extends Source$1.Instance {
119
193
  settings?: Settings;
120
194
  mapping?: Mapping;
@@ -189,7 +263,7 @@ declare global {
189
263
  elbwalker: Collector;
190
264
  walkerjs: Collector;
191
265
  elbLayer: Layer;
192
- dataLayer: WalkerOS.Events | unknown;
266
+ dataLayer: WalkerOS.Events | unknown | unknown[];
193
267
  elb: Elb.Fn<Promise<Elb.PushResult>>;
194
268
  }
195
269
  }
@@ -257,4 +331,4 @@ declare namespace collector {
257
331
  export type { collector_Collector as Collector, collector_Config as Config, collector_Destinations as Destinations, collector_InitConfig as InitConfig, collector_Scope as Scope, collector_SessionStartOptions as SessionStartOptions, collector_State as State };
258
332
  }
259
333
 
260
- export { destination as DestinationWeb, elb as Elb, type SendWebOptions, type SendWebOptionsFetch, type SendWebReturn, type SendWebTransport, type SessionCallback, type SessionConfig, type SessionFunction, type SessionStorageConfig, type SessionWindowConfig, source as SourceWeb, type StorageValue, walker as Walker, collector as WebCollector, elb$1 as elb, getAttribute, getHashWeb, getLanguage, getScreenSize, getTimezone, isVisible, parseInlineConfig, sendWeb, sendWebAsBeacon, sendWebAsFetch, sendWebAsXhr, sessionStart, sessionStorage, sessionWindow, splitAttribute, splitKeyVal, storageDelete, storageRead, storageWrite };
334
+ export { destination as DestinationWeb, elb as Elb, type SendWebOptions, type SendWebOptionsFetch, type SendWebReturn, type SendWebTransport, type SessionCallback, type SessionConfig, type SessionFunction, type SessionStorageConfig, type SessionWindowConfig, source as SourceWeb, type StorageValue, walker as Walker, collector as WebCollector, elb$1 as elb, getAttribute, getEnvironment, getHashWeb, getLanguage, getScreenSize, getTimezone, isVisible, parseInlineConfig, sendWeb, sendWebAsBeacon, sendWebAsFetch, sendWebAsXhr, sessionStart, sessionStorage, sessionWindow, splitAttribute, splitKeyVal, storageDelete, storageRead, storageWrite };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,s={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(s,{DestinationWeb:()=>$,Elb:()=>E,SourceWeb:()=>q,Walker:()=>R,WebCollector:()=>P,elb:()=>m,getAttribute:()=>a,getHashWeb:()=>p,getLanguage:()=>l,getScreenSize:()=>f,getTimezone:()=>g,isVisible:()=>h,parseInlineConfig:()=>d,sendWeb:()=>y,sendWebAsBeacon:()=>v,sendWebAsFetch:()=>b,sendWebAsXhr:()=>k,sessionStart:()=>O,sessionStorage:()=>H,sessionWindow:()=>N,splitAttribute:()=>c,splitKeyVal:()=>u,storageDelete:()=>D,storageRead:()=>A,storageWrite:()=>j}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=r(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core");function a(e,t){return(e.getAttribute(t)||"").trim()}function c(e,t=";"){if(!e)return[];const r=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(r)||[]}function u(e){const[t,r]=e.split(/:(.+)/,2);return[(0,i.trim)(t||""),(0,i.trim)(r||"")]}function d(e){const t={};return c(e).forEach(e=>{const[r,n]=u(e);r&&("true"===n?t[r]=!0:"false"===n?t[r]=!1:n&&/^\d+$/.test(n)?t[r]=parseInt(n,10):n&&/^\d+\.\d+$/.test(n)?t[r]=parseFloat(n):t[r]=n||!0)}),t}function l(e){return e.language}function g(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function f(e){return`${e.screen.width}x${e.screen.height}`}var m=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)},w=require("@walkeros/core");async function p(e,t){return(await async function(e){const t=(0,w.isDefined)(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const r=(new TextEncoder).encode(e),n=await t.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function h(e){const t=getComputedStyle(e);if("none"===t.display)return!1;if("visible"!==t.visibility)return!1;if(t.opacity&&Number(t.opacity)<.1)return!1;let r;const n=window.innerHeight,o=e.getBoundingClientRect(),s=o.height,i=o.y,a=i+s,c={x:o.x+e.offsetWidth/2,y:o.y+e.offsetHeight/2};if(s<=n){if(e.offsetWidth+o.width===0||e.offsetHeight+o.height===0)return!1;if(c.x<0)return!1;if(c.x>(document.documentElement.clientWidth||window.innerWidth))return!1;if(c.y<0)return!1;if(c.y>(document.documentElement.clientHeight||window.innerHeight))return!1;r=document.elementFromPoint(c.x,c.y)}else{const e=n/2;if(i<0&&a<e)return!1;if(a>n&&i>e)return!1;r=document.elementFromPoint(c.x,n/2)}if(r)do{if(r===e)return!0}while(r=r.parentElement);return!1}var S=require("@walkeros/core");function y(e,t,r={transport:"fetch"}){switch(r.transport||"fetch"){case"beacon":return v(e,t);case"xhr":return k(e,t,r);default:return b(e,t,r)}}async function b(e,t,r={}){const n=(0,S.getHeaders)(r.headers),o=(0,S.transformData)(t);return(0,S.tryCatchAsync)(async()=>{const t=await fetch(e,{method:r.method||"POST",headers:n,keepalive:!0,credentials:r.credentials||"same-origin",mode:r.noCors?"no-cors":"cors",body:o}),s=r.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}},e=>({ok:!1,error:e.message}))()}function v(e,t){const r=(0,S.transformData)(t),n=navigator.sendBeacon(e,r);return{ok:n,error:n?void 0:"Failed to send beacon"}}function k(e,t,r={}){const n=(0,S.getHeaders)(r.headers),o=r.method||"POST",s=(0,S.transformData)(t);return(0,S.tryCatch)(()=>{const t=new XMLHttpRequest;t.open(o,e,!1);for(const e in n)t.setRequestHeader(e,n[e]);t.send(s);const r=t.status>=200&&t.status<300;return{ok:r,data:(0,S.tryCatch)(JSON.parse,()=>t.response)(t.response),error:r?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}var C=require("@walkeros/core");function O(e={}){const{cb:t,consent:r,collector:n,storage:o}=e,s=n?.push||m;if(!r)return x((o?H:N)(e),n,t);{const n=function(e,t){let r;const n=(n,o)=>{if((0,C.isDefined)(r)&&r===n?.group)return;r=n?.group;let s=()=>N(e);if(e.consent){const t=((0,C.isArray)(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});(0,C.getGrantedConsent)(t,o)&&(s=()=>H(e))}return x(s(),n,t)};return n}(e,t);s("walker on","consent",((0,C.isArray)(r)?r:[r]).reduce((e,t)=>({...e,[t]:n}),{}))}}function x(e,t,r){return!1===r?e:(r||(r=U),r(e,t,U))}var U=(e,t)=>{const r=t?.push||m,n={};return e.id&&(n.session=e.id),e.storage&&e.device&&(n.device=e.device),r("walker user",n),e.isStart&&r({event:"session start",data:e}),e},I=require("@walkeros/core"),W=require("@walkeros/core");function D(e,t=W.Const.Utils.Storage.Session){switch(t){case W.Const.Utils.Storage.Cookie:j(e,"",0,t);break;case W.Const.Utils.Storage.Local:window.localStorage.removeItem(e);break;case W.Const.Utils.Storage.Session:window.sessionStorage.removeItem(e)}}function A(e,t=W.Const.Utils.Storage.Session){function r(e){try{return JSON.parse(e||"")}catch(t){let r=1,n="";return e&&(r=0,n=e),{e:r,v:n}}}let n,o;switch(t){case W.Const.Utils.Storage.Cookie:n=decodeURIComponent(document.cookie.split("; ").find(t=>t.startsWith(e+"="))?.split("=")[1]||"");break;case W.Const.Utils.Storage.Local:o=r(window.localStorage.getItem(e));break;case W.Const.Utils.Storage.Session:o=r(window.sessionStorage.getItem(e))}return o&&(n=o.v,0!=o.e&&o.e<Date.now()&&(D(e,t),n="")),(0,W.castValue)(n||"")}function j(e,t,r=30,n=W.Const.Utils.Storage.Session,o){const s={e:Date.now()+6e4*r,v:String(t)},i=JSON.stringify(s);switch(n){case W.Const.Utils.Storage.Cookie:{t="object"==typeof t?JSON.stringify(t):t;let n=`${e}=${encodeURIComponent(t)}; max-age=${60*r}; path=/; SameSite=Lax; secure`;o&&(n+="; domain="+o),document.cookie=n;break}case W.Const.Utils.Storage.Local:window.localStorage.setItem(e,i);break;case W.Const.Utils.Storage.Session:window.sessionStorage.setItem(e,i)}return A(e,n)}function H(e={}){const t=Date.now(),{length:r=30,deviceKey:n="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:i="elbSessionId",sessionStorage:a="local",pulse:c=!1}=e,u=N(e);let d=!1;const l=(0,I.tryCatch)((e,t,r)=>{let n=A(e,r);return n||(n=(0,I.getId)(8),j(e,n,1440*t,r)),String(n)})(n,s,o),g=(0,I.tryCatch)((e,n)=>{const o=JSON.parse(String(A(e,n)));return c||(o.isNew=!1,u.marketing&&(Object.assign(o,u),d=!0),d||o.updated+6e4*r<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,d=!0):o.runs++),o},()=>{d=!0})(i,a)||{},f={id:(0,I.getId)(12),start:t,isNew:!0,count:1,runs:1},m=Object.assign(f,u,g,{device:l},{isStart:d,storage:!0,updated:t},e.data);return j(i,JSON.stringify(m),2*r,a),m}var L=require("@walkeros/core");function N(e={}){let t=e.isStart||!1;const r={isStart:t,storage:!1};if(!1===e.isStart)return r;if(!t){const[e]=performance.getEntriesByType("navigation");if("navigate"!==e.type)return r}const n=new URL(e.url||window.location.href),o=e.referrer||document.referrer,s=o&&new URL(o).hostname,i=(0,L.getMarketingParameters)(n,e.parameters);if(Object.keys(i).length&&(i.marketing||(i.marketing=!0),t=!0),!t){const r=e.domains||[];r.push(n.hostname),t=!r.includes(s)}return t?Object.assign({isStart:t,storage:!1,start:Date.now(),id:(0,L.getId)(12),referrer:s},i,e.data):r}var $={},q={},E={},P={},R={};//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,s={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(s,{DestinationWeb:()=>N,Elb:()=>q,SourceWeb:()=>$,Walker:()=>R,WebCollector:()=>P,elb:()=>m,getAttribute:()=>a,getEnvironment:()=>w,getHashWeb:()=>p,getLanguage:()=>l,getScreenSize:()=>f,getTimezone:()=>g,isVisible:()=>S,parseInlineConfig:()=>d,sendWeb:()=>b,sendWebAsBeacon:()=>k,sendWebAsFetch:()=>v,sendWebAsXhr:()=>C,sessionStart:()=>x,sessionStorage:()=>T,sessionWindow:()=>L,splitAttribute:()=>c,splitKeyVal:()=>u,storageDelete:()=>A,storageRead:()=>j,storageWrite:()=>H}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=r(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core");function a(e,t){return(e.getAttribute(t)||"").trim()}function c(e,t=";"){if(!e)return[];const r=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(r)||[]}function u(e){const[t,r]=e.split(/:(.+)/,2);return[(0,i.trim)(t||""),(0,i.trim)(r||"")]}function d(e){const t={};return c(e).forEach(e=>{const[r,n]=u(e);r&&("true"===n?t[r]=!0:"false"===n?t[r]=!1:n&&/^\d+$/.test(n)?t[r]=parseInt(n,10):n&&/^\d+\.\d+$/.test(n)?t[r]=parseFloat(n):t[r]=n||!0)}),t}function l(e){return e.language}function g(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function f(e){return`${e.screen.width}x${e.screen.height}`}var m=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)};function w(e){const t={window:globalThis.window,document:globalThis.document};return e?{...t,...e}:t}var h=require("@walkeros/core");async function p(e,t){return(await async function(e){const t=(0,h.isDefined)(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const r=(new TextEncoder).encode(e),n=await t.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function S(e){const t=getComputedStyle(e);if("none"===t.display)return!1;if("visible"!==t.visibility)return!1;if(t.opacity&&Number(t.opacity)<.1)return!1;let r;const n=window.innerHeight,o=e.getBoundingClientRect(),s=o.height,i=o.y,a=i+s,c={x:o.x+e.offsetWidth/2,y:o.y+e.offsetHeight/2};if(s<=n){if(e.offsetWidth+o.width===0||e.offsetHeight+o.height===0)return!1;if(c.x<0)return!1;if(c.x>(document.documentElement.clientWidth||window.innerWidth))return!1;if(c.y<0)return!1;if(c.y>(document.documentElement.clientHeight||window.innerHeight))return!1;r=document.elementFromPoint(c.x,c.y)}else{const e=n/2;if(i<0&&a<e)return!1;if(a>n&&i>e)return!1;r=document.elementFromPoint(c.x,n/2)}if(r)do{if(r===e)return!0}while(r=r.parentElement);return!1}var y=require("@walkeros/core");function b(e,t,r={transport:"fetch"}){switch(r.transport||"fetch"){case"beacon":return k(e,t);case"xhr":return C(e,t,r);default:return v(e,t,r)}}async function v(e,t,r={}){const n=(0,y.getHeaders)(r.headers),o=(0,y.transformData)(t);return(0,y.tryCatchAsync)(async()=>{const t=await fetch(e,{method:r.method||"POST",headers:n,keepalive:!0,credentials:r.credentials||"same-origin",mode:r.noCors?"no-cors":"cors",body:o}),s=r.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}},e=>({ok:!1,error:e.message}))()}function k(e,t){const r=(0,y.transformData)(t),n=navigator.sendBeacon(e,r);return{ok:n,error:n?void 0:"Failed to send beacon"}}function C(e,t,r={}){const n=(0,y.getHeaders)(r.headers),o=r.method||"POST",s=(0,y.transformData)(t);return(0,y.tryCatch)(()=>{const t=new XMLHttpRequest;t.open(o,e,!1);for(const e in n)t.setRequestHeader(e,n[e]);t.send(s);const r=t.status>=200&&t.status<300;return{ok:r,data:(0,y.tryCatch)(JSON.parse,()=>t.response)(t.response),error:r?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}var O=require("@walkeros/core");function x(e={}){const{cb:t,consent:r,collector:n,storage:o}=e,s=n?.push||m;if(!r)return U((o?T:L)(e),n,t);{const n=function(e,t){let r;const n=(n,o)=>{if((0,O.isDefined)(r)&&r===n?.group)return;r=n?.group;let s=()=>L(e);if(e.consent){const t=((0,O.isArray)(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});(0,O.getGrantedConsent)(t,o)&&(s=()=>T(e))}return U(s(),n,t)};return n}(e,t);s("walker on","consent",((0,O.isArray)(r)?r:[r]).reduce((e,t)=>({...e,[t]:n}),{}))}}function U(e,t,r){return!1===r?e:(r||(r=I),r(e,t,I))}var I=(e,t)=>{const r=t?.push||m,n={};return e.id&&(n.session=e.id),e.storage&&e.device&&(n.device=e.device),r("walker user",n),e.isStart&&r({name:"session start",data:e}),e},W=require("@walkeros/core"),D=require("@walkeros/core");function A(e,t=D.Const.Utils.Storage.Session){switch(t){case D.Const.Utils.Storage.Cookie:H(e,"",0,t);break;case D.Const.Utils.Storage.Local:window.localStorage.removeItem(e);break;case D.Const.Utils.Storage.Session:window.sessionStorage.removeItem(e)}}function j(e,t=D.Const.Utils.Storage.Session){function r(e){try{return JSON.parse(e||"")}catch(t){let r=1,n="";return e&&(r=0,n=e),{e:r,v:n}}}let n,o;switch(t){case D.Const.Utils.Storage.Cookie:n=decodeURIComponent(document.cookie.split("; ").find(t=>t.startsWith(e+"="))?.split("=")[1]||"");break;case D.Const.Utils.Storage.Local:o=r(window.localStorage.getItem(e));break;case D.Const.Utils.Storage.Session:o=r(window.sessionStorage.getItem(e))}return o&&(n=o.v,0!=o.e&&o.e<Date.now()&&(A(e,t),n="")),(0,D.castValue)(n||"")}function H(e,t,r=30,n=D.Const.Utils.Storage.Session,o){const s={e:Date.now()+6e4*r,v:String(t)},i=JSON.stringify(s);switch(n){case D.Const.Utils.Storage.Cookie:{t="object"==typeof t?JSON.stringify(t):t;let n=`${e}=${encodeURIComponent(t)}; max-age=${60*r}; path=/; SameSite=Lax; secure`;o&&(n+="; domain="+o),document.cookie=n;break}case D.Const.Utils.Storage.Local:window.localStorage.setItem(e,i);break;case D.Const.Utils.Storage.Session:window.sessionStorage.setItem(e,i)}return j(e,n)}function T(e={}){const t=Date.now(),{length:r=30,deviceKey:n="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:i="elbSessionId",sessionStorage:a="local",pulse:c=!1}=e,u=L(e);let d=!1;const l=(0,W.tryCatch)((e,t,r)=>{let n=j(e,r);return n||(n=(0,W.getId)(8),H(e,n,1440*t,r)),String(n)})(n,s,o),g=(0,W.tryCatch)((e,n)=>{const o=JSON.parse(String(j(e,n)));return c||(o.isNew=!1,u.marketing&&(Object.assign(o,u),d=!0),d||o.updated+6e4*r<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,d=!0):o.runs++),o},()=>{d=!0})(i,a)||{},f={id:(0,W.getId)(12),start:t,isNew:!0,count:1,runs:1},m=Object.assign(f,u,g,{device:l},{isStart:d,storage:!0,updated:t},e.data);return H(i,JSON.stringify(m),2*r,a),m}var E=require("@walkeros/core");function L(e={}){let t=e.isStart||!1;const r={isStart:t,storage:!1};if(!1===e.isStart)return r;if(!t){const[e]=performance.getEntriesByType("navigation");if("navigate"!==e.type)return r}const n=new URL(e.url||window.location.href),o=e.referrer||document.referrer,s=o&&new URL(o).hostname,i=(0,E.getMarketingParameters)(n,e.parameters);if(Object.keys(i).length&&(i.marketing||(i.marketing=!0),t=!0),!t){const r=e.domains||[];r.push(n.hostname),t=!r.includes(s)}return t?Object.assign({isStart:t,storage:!1,start:Date.now(),id:(0,E.getId)(12),referrer:s},i,e.data):r}var N={},$={},q={},P={},R={};//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/session/sessionStart.ts","../src/session/sessionStorage.ts","../src/storage.ts","../src/session/sessionWindow.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["export * from './attributes';\nexport * from './browser';\nexport * from './elb';\nexport * from './getHashWeb';\nexport * from './isVisible';\nexport * from './sendWeb';\nexport * from './session/';\nexport * from './storage';\n\n// Export web-specific types\nexport * from './types';\n","import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","export function isVisible(element: HTMLElement): boolean {\n // Check for hiding styles\n const style = getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n if (style.opacity && Number(style.opacity) < 0.1) return false;\n\n // Window positions\n let pointContainer;\n const windowHeight = window.innerHeight; // Height of the viewport\n\n // Element positions\n const elemRectRel = element.getBoundingClientRect(); // Get the elements relative to the viewport\n const elementHeight = elemRectRel.height; // Height of the element\n const elementTopRel = elemRectRel.y; // Relative distance from window top to element top\n const elementBottomRel = elementTopRel + elementHeight; // Relative distance from window to to element bottom\n const elemCenterRel = {\n // Relative position on viewport of the elements center\n x: elemRectRel.x + element.offsetWidth / 2,\n y: elemRectRel.y + element.offsetHeight / 2,\n };\n\n // Differentiate between small and large elements\n if (elementHeight <= windowHeight) {\n // Smaller than the viewport\n\n // Must have a width and height\n if (\n element.offsetWidth + elemRectRel.width === 0 ||\n element.offsetHeight + elemRectRel.height === 0\n )\n return false;\n\n if (elemCenterRel.x < 0) return false;\n if (\n elemCenterRel.x >\n (document.documentElement.clientWidth || window.innerWidth)\n )\n return false;\n if (elemCenterRel.y < 0) return false;\n if (\n elemCenterRel.y >\n (document.documentElement.clientHeight || window.innerHeight)\n )\n return false;\n\n // Select the element that is at the center of the target\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n elemCenterRel.y,\n );\n } else {\n // Bigger than the viewport\n\n // that are considered visible if they fill half of the screen\n const viewportCenter = windowHeight / 2;\n\n // Check if upper part is above the viewports center\n if (elementTopRel < 0 && elementBottomRel < viewportCenter) return false;\n\n // Check if lower part is below the viewports center\n if (elementBottomRel > windowHeight && elementTopRel > viewportCenter)\n return false;\n\n // Select the element that is in the middle of the screen\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n windowHeight / 2,\n );\n }\n\n // Check for potential overlays\n if (pointContainer) {\n do {\n if (pointContainer === element) return true; // should be visible\n } while ((pointContainer = pointContainer.parentElement));\n }\n\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n}\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n\n return tryCatchAsync(\n async () => {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { Collector, WalkerOS, On } from '@walkeros/core';\nimport type { SessionStorageConfig } from './';\nimport { sessionStorage, sessionWindow } from './';\nimport { elb as elbOrg } from '../elb';\nimport { getGrantedConsent, isArray, isDefined } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const elb = collector?.push || elbOrg;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentConfig>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n elb('walker on', 'consent', consentConfig);\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(config: SessionConfig, cb?: SessionCallback | false) {\n // Track the last processed group to prevent duplicate processing\n let lastProcessedGroup: string | undefined;\n\n const func = (collector: Collector.Instance, consent: WalkerOS.Consent) => {\n // Skip if we've already processed this group\n if (\n isDefined(lastProcessedGroup) &&\n lastProcessedGroup === collector?.group\n )\n return;\n\n // Remember this group has been processed\n lastProcessedGroup = collector?.group;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n return callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const elb = collector?.push || elbOrg;\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs - using unknown cast for type safety\n elb('walker user', user);\n\n if (session.isStart) {\n // Convert session start to an event object\n elb({\n event: 'session start',\n data: session,\n });\n }\n\n return session;\n};\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport type { SessionWindowConfig } from '.';\nimport type { StorageType } from '@walkeros/core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '../storage';\nimport { sessionWindow } from '.';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(String(storageRead(key, storage)));\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(sessionKey, JSON.stringify(session), length * 2, sessionStorage);\n\n return session;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n) {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage);\n break;\n case Const.Utils.Storage.Local:\n window.localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.removeItem(key);\n break;\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem(window.localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem(window.sessionStorage.getItem(key));\n break;\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage); // Remove item\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n document.cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n window.localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n\n return storageRead(key, storage);\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || window.location.href);\n const ref = config.referrer || document.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(url, config.parameters);\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport interface Destination<Settings = unknown, Mapping = unknown>\n extends WalkerOSDestination.Instance<Settings, Mapping> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.Config<Settings, Mapping>;\n\nexport type PartialConfig<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PartialConfig<Settings, Mapping>;\n\nexport type InitFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.InitFn<Settings, Mapping>;\n\nexport type PushFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PushFn<Settings, Mapping>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n","import type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport interface Source<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> extends CoreSource.Instance {\n settings?: Settings;\n mapping?: Mapping;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = CoreSource.Instance & {\n settings: Settings;\n mapping?: Mapping;\n};\n\nexport type PartialConfig<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = Partial<Config<Settings, Mapping>>;\n\nexport type InitFn<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = (\n collector: Collector.Instance,\n config: Config<Settings, Mapping>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n} from '@walkeros/core';\nimport type { SessionConfig } from '../session';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\nimport type { On } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: Collector;\n elbLayer: Layer;\n dataLayer: WalkerOS.Events | unknown;\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n sessionStart: (\n options?: SessionStartOptions,\n ) => void | CoreCollector.SessionData;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n session: false | SessionConfig;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n tagging?: number;\n user?: WalkerOS.User;\n}\n\nexport interface SessionStartOptions {\n config?: SessionConfig;\n data?: Partial<CoreCollector.SessionData>;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["import_core","import_core","import_core","elb","import_core","import_core","sessionStorage","session","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/session/sessionStart.ts","../src/session/sessionStorage.ts","../src/storage.ts","../src/session/sessionWindow.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["export * from './attributes';\nexport * from './browser';\nexport * from './elb';\nexport * from './environment';\nexport * from './getHashWeb';\nexport * from './isVisible';\nexport * from './sendWeb';\nexport * from './session/';\nexport * from './storage';\n\n// Export web-specific types\nexport * from './types';\n","import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Environment } from './types/destination';\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Provides a consistent way for web destinations to access browser APIs\n * (window, document) while supporting environment-based testing and simulation.\n *\n * @param environment - Optional environment override for testing/simulation\n * @returns Environment globals with fallback to real browser APIs\n *\n * @example\n * ```typescript\n * // Production usage (environment = undefined)\n * const { window, document } = getEnvironment();\n * // Uses real globalThis.window, globalThis.document\n *\n * // Testing usage\n * const testEnv = { window: { gtag: mockGtag } };\n * const { window, document } = getEnvironment(testEnv);\n * // Uses mock window.gtag, real document\n *\n * // Simulation usage\n * const simEnv = { window: { gtag: capturingFunction } };\n * const { window, document } = getEnvironment(simEnv);\n * // Uses capturing functions for simulation\n * ```\n */\nexport function getEnvironment<T extends Environment = Environment>(\n environment?: T,\n): T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document } {\n const defaults = {\n window: globalThis.window,\n document: globalThis.document,\n };\n\n if (!environment) {\n return defaults as unknown as T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document };\n }\n\n // Merge environment with defaults, environment takes precedence\n return {\n ...defaults,\n ...environment,\n } as unknown as T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","export function isVisible(element: HTMLElement): boolean {\n // Check for hiding styles\n const style = getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n if (style.opacity && Number(style.opacity) < 0.1) return false;\n\n // Window positions\n let pointContainer;\n const windowHeight = window.innerHeight; // Height of the viewport\n\n // Element positions\n const elemRectRel = element.getBoundingClientRect(); // Get the elements relative to the viewport\n const elementHeight = elemRectRel.height; // Height of the element\n const elementTopRel = elemRectRel.y; // Relative distance from window top to element top\n const elementBottomRel = elementTopRel + elementHeight; // Relative distance from window to to element bottom\n const elemCenterRel = {\n // Relative position on viewport of the elements center\n x: elemRectRel.x + element.offsetWidth / 2,\n y: elemRectRel.y + element.offsetHeight / 2,\n };\n\n // Differentiate between small and large elements\n if (elementHeight <= windowHeight) {\n // Smaller than the viewport\n\n // Must have a width and height\n if (\n element.offsetWidth + elemRectRel.width === 0 ||\n element.offsetHeight + elemRectRel.height === 0\n )\n return false;\n\n if (elemCenterRel.x < 0) return false;\n if (\n elemCenterRel.x >\n (document.documentElement.clientWidth || window.innerWidth)\n )\n return false;\n if (elemCenterRel.y < 0) return false;\n if (\n elemCenterRel.y >\n (document.documentElement.clientHeight || window.innerHeight)\n )\n return false;\n\n // Select the element that is at the center of the target\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n elemCenterRel.y,\n );\n } else {\n // Bigger than the viewport\n\n // that are considered visible if they fill half of the screen\n const viewportCenter = windowHeight / 2;\n\n // Check if upper part is above the viewports center\n if (elementTopRel < 0 && elementBottomRel < viewportCenter) return false;\n\n // Check if lower part is below the viewports center\n if (elementBottomRel > windowHeight && elementTopRel > viewportCenter)\n return false;\n\n // Select the element that is in the middle of the screen\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n windowHeight / 2,\n );\n }\n\n // Check for potential overlays\n if (pointContainer) {\n do {\n if (pointContainer === element) return true; // should be visible\n } while ((pointContainer = pointContainer.parentElement));\n }\n\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n}\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n\n return tryCatchAsync(\n async () => {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { Collector, WalkerOS, On } from '@walkeros/core';\nimport type { SessionStorageConfig } from './';\nimport { sessionStorage, sessionWindow } from './';\nimport { elb as elbOrg } from '../elb';\nimport { getGrantedConsent, isArray, isDefined } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const elb = collector?.push || elbOrg;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentConfig>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n elb('walker on', 'consent', consentConfig);\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(config: SessionConfig, cb?: SessionCallback | false) {\n // Track the last processed group to prevent duplicate processing\n let lastProcessedGroup: string | undefined;\n\n const func = (collector: Collector.Instance, consent: WalkerOS.Consent) => {\n // Skip if we've already processed this group\n if (\n isDefined(lastProcessedGroup) &&\n lastProcessedGroup === collector?.group\n )\n return;\n\n // Remember this group has been processed\n lastProcessedGroup = collector?.group;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n return callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const elb = collector?.push || elbOrg;\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs - using unknown cast for type safety\n elb('walker user', user);\n\n if (session.isStart) {\n // Convert session start to an event object\n elb({\n name: 'session start',\n data: session,\n });\n }\n\n return session;\n};\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport type { SessionWindowConfig } from '.';\nimport type { StorageType } from '@walkeros/core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '../storage';\nimport { sessionWindow } from '.';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(String(storageRead(key, storage)));\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(sessionKey, JSON.stringify(session), length * 2, sessionStorage);\n\n return session;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n) {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage);\n break;\n case Const.Utils.Storage.Local:\n window.localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.removeItem(key);\n break;\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem(window.localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem(window.sessionStorage.getItem(key));\n break;\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage); // Remove item\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n document.cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n window.localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n\n return storageRead(key, storage);\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || window.location.href);\n const ref = config.referrer || document.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(url, config.parameters);\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport interface Destination<Settings = unknown, Mapping = unknown>\n extends WalkerOSDestination.Instance<Settings, Mapping> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.Config<Settings, Mapping>;\n\nexport type PartialConfig<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PartialConfig<Settings, Mapping>;\n\nexport type InitFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.InitFn<Settings, Mapping>;\n\nexport type PushFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PushFn<Settings, Mapping>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Environment interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Environment extends WalkerOSDestination.Environment {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","import type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport interface Source<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> extends CoreSource.Instance {\n settings?: Settings;\n mapping?: Mapping;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = CoreSource.Instance & {\n settings: Settings;\n mapping?: Mapping;\n};\n\nexport type PartialConfig<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = Partial<Config<Settings, Mapping>>;\n\nexport type InitFn<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = (\n collector: Collector.Instance,\n config: Config<Settings, Mapping>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n} from '@walkeros/core';\nimport type { SessionConfig } from '../session';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\nimport type { On } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: Collector;\n elbLayer: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n sessionStart: (\n options?: SessionStartOptions,\n ) => void | CoreCollector.SessionData;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n session: false | SessionConfig;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n tagging?: number;\n user?: WalkerOS.User;\n}\n\nexport interface SessionStartOptions {\n config?: SessionConfig;\n data?: Partial<CoreCollector.SessionData>;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["import_core","import_core","import_core","elb","import_core","import_core","sessionStorage","session","import_core"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{trim as e}from"@walkeros/core";function t(e,t){return(e.getAttribute(t)||"").trim()}function r(e,t=";"){if(!e)return[];const r=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(r)||[]}function n(t){const[r,n]=t.split(/:(.+)/,2);return[e(r||""),e(n||"")]}function o(e){const t={};return r(e).forEach(e=>{const[r,o]=n(e);r&&("true"===o?t[r]=!0:"false"===o?t[r]=!1:o&&/^\d+$/.test(o)?t[r]=parseInt(o,10):o&&/^\d+\.\d+$/.test(o)?t[r]=parseFloat(o):t[r]=o||!0)}),t}function s(e){return e.language}function i(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function a(e){return`${e.screen.width}x${e.screen.height}`}var c=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)};import{isDefined as u}from"@walkeros/core";async function d(e,t){return(await async function(e){const t=u(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const r=(new TextEncoder).encode(e),n=await t.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function l(e){const t=getComputedStyle(e);if("none"===t.display)return!1;if("visible"!==t.visibility)return!1;if(t.opacity&&Number(t.opacity)<.1)return!1;let r;const n=window.innerHeight,o=e.getBoundingClientRect(),s=o.height,i=o.y,a=i+s,c={x:o.x+e.offsetWidth/2,y:o.y+e.offsetHeight/2};if(s<=n){if(e.offsetWidth+o.width===0||e.offsetHeight+o.height===0)return!1;if(c.x<0)return!1;if(c.x>(document.documentElement.clientWidth||window.innerWidth))return!1;if(c.y<0)return!1;if(c.y>(document.documentElement.clientHeight||window.innerHeight))return!1;r=document.elementFromPoint(c.x,c.y)}else{const e=n/2;if(i<0&&a<e)return!1;if(a>n&&i>e)return!1;r=document.elementFromPoint(c.x,n/2)}if(r)do{if(r===e)return!0}while(r=r.parentElement);return!1}import{getHeaders as f,transformData as g,tryCatch as m,tryCatchAsync as w}from"@walkeros/core";function p(e,t,r={transport:"fetch"}){switch(r.transport||"fetch"){case"beacon":return h(e,t);case"xhr":return y(e,t,r);default:return S(e,t,r)}}async function S(e,t,r={}){const n=f(r.headers),o=g(t);return w(async()=>{const t=await fetch(e,{method:r.method||"POST",headers:n,keepalive:!0,credentials:r.credentials||"same-origin",mode:r.noCors?"no-cors":"cors",body:o}),s=r.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}},e=>({ok:!1,error:e.message}))()}function h(e,t){const r=g(t),n=navigator.sendBeacon(e,r);return{ok:n,error:n?void 0:"Failed to send beacon"}}function y(e,t,r={}){const n=f(r.headers),o=r.method||"POST",s=g(t);return m(()=>{const t=new XMLHttpRequest;t.open(o,e,!1);for(const e in n)t.setRequestHeader(e,n[e]);t.send(s);const r=t.status>=200&&t.status<300;return{ok:r,data:m(JSON.parse,()=>t.response)(t.response),error:r?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}import{getGrantedConsent as k,isArray as b,isDefined as v}from"@walkeros/core";function x(e={}){const{cb:t,consent:r,collector:n,storage:o}=e,s=n?.push||c;if(!r)return U((o?D:T)(e),n,t);{const n=function(e,t){let r;const n=(n,o)=>{if(v(r)&&r===n?.group)return;r=n?.group;let s=()=>T(e);if(e.consent){const t=(b(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});k(t,o)&&(s=()=>D(e))}return U(s(),n,t)};return n}(e,t);s("walker on","consent",(b(r)?r:[r]).reduce((e,t)=>({...e,[t]:n}),{}))}}function U(e,t,r){return!1===r?e:(r||(r=I),r(e,t,I))}var I=(e,t)=>{const r=t?.push||c,n={};return e.id&&(n.session=e.id),e.storage&&e.device&&(n.device=e.device),r("walker user",n),e.isStart&&r({event:"session start",data:e}),e};import{getId as O,tryCatch as C}from"@walkeros/core";import{castValue as $,Const as E}from"@walkeros/core";function L(e,t=E.Utils.Storage.Session){switch(t){case E.Utils.Storage.Cookie:W(e,"",0,t);break;case E.Utils.Storage.Local:window.localStorage.removeItem(e);break;case E.Utils.Storage.Session:window.sessionStorage.removeItem(e)}}function N(e,t=E.Utils.Storage.Session){function r(e){try{return JSON.parse(e||"")}catch(t){let r=1,n="";return e&&(r=0,n=e),{e:r,v:n}}}let n,o;switch(t){case E.Utils.Storage.Cookie:n=decodeURIComponent(document.cookie.split("; ").find(t=>t.startsWith(e+"="))?.split("=")[1]||"");break;case E.Utils.Storage.Local:o=r(window.localStorage.getItem(e));break;case E.Utils.Storage.Session:o=r(window.sessionStorage.getItem(e))}return o&&(n=o.v,0!=o.e&&o.e<Date.now()&&(L(e,t),n="")),$(n||"")}function W(e,t,r=30,n=E.Utils.Storage.Session,o){const s={e:Date.now()+6e4*r,v:String(t)},i=JSON.stringify(s);switch(n){case E.Utils.Storage.Cookie:{t="object"==typeof t?JSON.stringify(t):t;let n=`${e}=${encodeURIComponent(t)}; max-age=${60*r}; path=/; SameSite=Lax; secure`;o&&(n+="; domain="+o),document.cookie=n;break}case E.Utils.Storage.Local:window.localStorage.setItem(e,i);break;case E.Utils.Storage.Session:window.sessionStorage.setItem(e,i)}return N(e,n)}function D(e={}){const t=Date.now(),{length:r=30,deviceKey:n="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:i="elbSessionId",sessionStorage:a="local",pulse:c=!1}=e,u=T(e);let d=!1;const l=C((e,t,r)=>{let n=N(e,r);return n||(n=O(8),W(e,n,1440*t,r)),String(n)})(n,s,o),f=C((e,n)=>{const o=JSON.parse(String(N(e,n)));return c||(o.isNew=!1,u.marketing&&(Object.assign(o,u),d=!0),d||o.updated+6e4*r<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,d=!0):o.runs++),o},()=>{d=!0})(i,a)||{},g={id:O(12),start:t,isNew:!0,count:1,runs:1},m=Object.assign(g,u,f,{device:l},{isStart:d,storage:!0,updated:t},e.data);return W(i,JSON.stringify(m),2*r,a),m}import{getId as H,getMarketingParameters as R}from"@walkeros/core";function T(e={}){let t=e.isStart||!1;const r={isStart:t,storage:!1};if(!1===e.isStart)return r;if(!t){const[e]=performance.getEntriesByType("navigation");if("navigate"!==e.type)return r}const n=new URL(e.url||window.location.href),o=e.referrer||document.referrer,s=o&&new URL(o).hostname,i=R(n,e.parameters);if(Object.keys(i).length&&(i.marketing||(i.marketing=!0),t=!0),!t){const r=e.domains||[];r.push(n.hostname),t=!r.includes(s)}return t?Object.assign({isStart:t,storage:!1,start:Date.now(),id:H(12),referrer:s},i,e.data):r}var j={},J={},A={},F={},P={};export{j as DestinationWeb,A as Elb,J as SourceWeb,P as Walker,F as WebCollector,c as elb,t as getAttribute,d as getHashWeb,s as getLanguage,a as getScreenSize,i as getTimezone,l as isVisible,o as parseInlineConfig,p as sendWeb,h as sendWebAsBeacon,S as sendWebAsFetch,y as sendWebAsXhr,x as sessionStart,D as sessionStorage,T as sessionWindow,r as splitAttribute,n as splitKeyVal,L as storageDelete,N as storageRead,W as storageWrite};//# sourceMappingURL=index.mjs.map
1
+ import{trim as e}from"@walkeros/core";function t(e,t){return(e.getAttribute(t)||"").trim()}function n(e,t=";"){if(!e)return[];const n=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(n)||[]}function r(t){const[n,r]=t.split(/:(.+)/,2);return[e(n||""),e(r||"")]}function o(e){const t={};return n(e).forEach(e=>{const[n,o]=r(e);n&&("true"===o?t[n]=!0:"false"===o?t[n]=!1:o&&/^\d+$/.test(o)?t[n]=parseInt(o,10):o&&/^\d+\.\d+$/.test(o)?t[n]=parseFloat(o):t[n]=o||!0)}),t}function s(e){return e.language}function i(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function a(e){return`${e.screen.width}x${e.screen.height}`}var c=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)};function u(e){const t={window:globalThis.window,document:globalThis.document};return e?{...t,...e}:t}import{isDefined as d}from"@walkeros/core";async function l(e,t){return(await async function(e){const t=d(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const n=(new TextEncoder).encode(e),r=await t.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function f(e){const t=getComputedStyle(e);if("none"===t.display)return!1;if("visible"!==t.visibility)return!1;if(t.opacity&&Number(t.opacity)<.1)return!1;let n;const r=window.innerHeight,o=e.getBoundingClientRect(),s=o.height,i=o.y,a=i+s,c={x:o.x+e.offsetWidth/2,y:o.y+e.offsetHeight/2};if(s<=r){if(e.offsetWidth+o.width===0||e.offsetHeight+o.height===0)return!1;if(c.x<0)return!1;if(c.x>(document.documentElement.clientWidth||window.innerWidth))return!1;if(c.y<0)return!1;if(c.y>(document.documentElement.clientHeight||window.innerHeight))return!1;n=document.elementFromPoint(c.x,c.y)}else{const e=r/2;if(i<0&&a<e)return!1;if(a>r&&i>e)return!1;n=document.elementFromPoint(c.x,r/2)}if(n)do{if(n===e)return!0}while(n=n.parentElement);return!1}import{getHeaders as g,transformData as m,tryCatch as w,tryCatchAsync as p}from"@walkeros/core";function S(e,t,n={transport:"fetch"}){switch(n.transport||"fetch"){case"beacon":return y(e,t);case"xhr":return k(e,t,n);default:return h(e,t,n)}}async function h(e,t,n={}){const r=g(n.headers),o=m(t);return p(async()=>{const t=await fetch(e,{method:n.method||"POST",headers:r,keepalive:!0,credentials:n.credentials||"same-origin",mode:n.noCors?"no-cors":"cors",body:o}),s=n.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}},e=>({ok:!1,error:e.message}))()}function y(e,t){const n=m(t),r=navigator.sendBeacon(e,n);return{ok:r,error:r?void 0:"Failed to send beacon"}}function k(e,t,n={}){const r=g(n.headers),o=n.method||"POST",s=m(t);return w(()=>{const t=new XMLHttpRequest;t.open(o,e,!1);for(const e in r)t.setRequestHeader(e,r[e]);t.send(s);const n=t.status>=200&&t.status<300;return{ok:n,data:w(JSON.parse,()=>t.response)(t.response),error:n?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}import{getGrantedConsent as b,isArray as v,isDefined as x}from"@walkeros/core";function U(e={}){const{cb:t,consent:n,collector:r,storage:o}=e,s=r?.push||c;if(!n)return I((o?D:j)(e),r,t);{const r=function(e,t){let n;const r=(r,o)=>{if(x(n)&&n===r?.group)return;n=r?.group;let s=()=>j(e);if(e.consent){const t=(v(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});b(t,o)&&(s=()=>D(e))}return I(s(),r,t)};return r}(e,t);s("walker on","consent",(v(n)?n:[n]).reduce((e,t)=>({...e,[t]:r}),{}))}}function I(e,t,n){return!1===n?e:(n||(n=O),n(e,t,O))}var O=(e,t)=>{const n=t?.push||c,r={};return e.id&&(r.session=e.id),e.storage&&e.device&&(r.device=e.device),n("walker user",r),e.isStart&&n({name:"session start",data:e}),e};import{getId as C,tryCatch as T}from"@walkeros/core";import{castValue as $,Const as E}from"@walkeros/core";function L(e,t=E.Utils.Storage.Session){switch(t){case E.Utils.Storage.Cookie:W(e,"",0,t);break;case E.Utils.Storage.Local:window.localStorage.removeItem(e);break;case E.Utils.Storage.Session:window.sessionStorage.removeItem(e)}}function N(e,t=E.Utils.Storage.Session){function n(e){try{return JSON.parse(e||"")}catch(t){let n=1,r="";return e&&(n=0,r=e),{e:n,v:r}}}let r,o;switch(t){case E.Utils.Storage.Cookie:r=decodeURIComponent(document.cookie.split("; ").find(t=>t.startsWith(e+"="))?.split("=")[1]||"");break;case E.Utils.Storage.Local:o=n(window.localStorage.getItem(e));break;case E.Utils.Storage.Session:o=n(window.sessionStorage.getItem(e))}return o&&(r=o.v,0!=o.e&&o.e<Date.now()&&(L(e,t),r="")),$(r||"")}function W(e,t,n=30,r=E.Utils.Storage.Session,o){const s={e:Date.now()+6e4*n,v:String(t)},i=JSON.stringify(s);switch(r){case E.Utils.Storage.Cookie:{t="object"==typeof t?JSON.stringify(t):t;let r=`${e}=${encodeURIComponent(t)}; max-age=${60*n}; path=/; SameSite=Lax; secure`;o&&(r+="; domain="+o),document.cookie=r;break}case E.Utils.Storage.Local:window.localStorage.setItem(e,i);break;case E.Utils.Storage.Session:window.sessionStorage.setItem(e,i)}return N(e,r)}function D(e={}){const t=Date.now(),{length:n=30,deviceKey:r="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:i="elbSessionId",sessionStorage:a="local",pulse:c=!1}=e,u=j(e);let d=!1;const l=T((e,t,n)=>{let r=N(e,n);return r||(r=C(8),W(e,r,1440*t,n)),String(r)})(r,s,o),f=T((e,r)=>{const o=JSON.parse(String(N(e,r)));return c||(o.isNew=!1,u.marketing&&(Object.assign(o,u),d=!0),d||o.updated+6e4*n<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,d=!0):o.runs++),o},()=>{d=!0})(i,a)||{},g={id:C(12),start:t,isNew:!0,count:1,runs:1},m=Object.assign(g,u,f,{device:l},{isStart:d,storage:!0,updated:t},e.data);return W(i,JSON.stringify(m),2*n,a),m}import{getId as H,getMarketingParameters as R}from"@walkeros/core";function j(e={}){let t=e.isStart||!1;const n={isStart:t,storage:!1};if(!1===e.isStart)return n;if(!t){const[e]=performance.getEntriesByType("navigation");if("navigate"!==e.type)return n}const r=new URL(e.url||window.location.href),o=e.referrer||document.referrer,s=o&&new URL(o).hostname,i=R(r,e.parameters);if(Object.keys(i).length&&(i.marketing||(i.marketing=!0),t=!0),!t){const n=e.domains||[];n.push(r.hostname),t=!n.includes(s)}return t?Object.assign({isStart:t,storage:!1,start:Date.now(),id:H(12),referrer:s},i,e.data):n}var J={},A={},F={},P={},B={};export{J as DestinationWeb,F as Elb,A as SourceWeb,B as Walker,P as WebCollector,c as elb,t as getAttribute,u as getEnvironment,l as getHashWeb,s as getLanguage,a as getScreenSize,i as getTimezone,f as isVisible,o as parseInlineConfig,S as sendWeb,y as sendWebAsBeacon,h as sendWebAsFetch,k as sendWebAsXhr,U as sessionStart,D as sessionStorage,j as sessionWindow,n as splitAttribute,r as splitKeyVal,L as storageDelete,N as storageRead,W as storageWrite};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/session/sessionStart.ts","../src/session/sessionStorage.ts","../src/storage.ts","../src/session/sessionWindow.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","export function isVisible(element: HTMLElement): boolean {\n // Check for hiding styles\n const style = getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n if (style.opacity && Number(style.opacity) < 0.1) return false;\n\n // Window positions\n let pointContainer;\n const windowHeight = window.innerHeight; // Height of the viewport\n\n // Element positions\n const elemRectRel = element.getBoundingClientRect(); // Get the elements relative to the viewport\n const elementHeight = elemRectRel.height; // Height of the element\n const elementTopRel = elemRectRel.y; // Relative distance from window top to element top\n const elementBottomRel = elementTopRel + elementHeight; // Relative distance from window to to element bottom\n const elemCenterRel = {\n // Relative position on viewport of the elements center\n x: elemRectRel.x + element.offsetWidth / 2,\n y: elemRectRel.y + element.offsetHeight / 2,\n };\n\n // Differentiate between small and large elements\n if (elementHeight <= windowHeight) {\n // Smaller than the viewport\n\n // Must have a width and height\n if (\n element.offsetWidth + elemRectRel.width === 0 ||\n element.offsetHeight + elemRectRel.height === 0\n )\n return false;\n\n if (elemCenterRel.x < 0) return false;\n if (\n elemCenterRel.x >\n (document.documentElement.clientWidth || window.innerWidth)\n )\n return false;\n if (elemCenterRel.y < 0) return false;\n if (\n elemCenterRel.y >\n (document.documentElement.clientHeight || window.innerHeight)\n )\n return false;\n\n // Select the element that is at the center of the target\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n elemCenterRel.y,\n );\n } else {\n // Bigger than the viewport\n\n // that are considered visible if they fill half of the screen\n const viewportCenter = windowHeight / 2;\n\n // Check if upper part is above the viewports center\n if (elementTopRel < 0 && elementBottomRel < viewportCenter) return false;\n\n // Check if lower part is below the viewports center\n if (elementBottomRel > windowHeight && elementTopRel > viewportCenter)\n return false;\n\n // Select the element that is in the middle of the screen\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n windowHeight / 2,\n );\n }\n\n // Check for potential overlays\n if (pointContainer) {\n do {\n if (pointContainer === element) return true; // should be visible\n } while ((pointContainer = pointContainer.parentElement));\n }\n\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n}\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n\n return tryCatchAsync(\n async () => {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { Collector, WalkerOS, On } from '@walkeros/core';\nimport type { SessionStorageConfig } from './';\nimport { sessionStorage, sessionWindow } from './';\nimport { elb as elbOrg } from '../elb';\nimport { getGrantedConsent, isArray, isDefined } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const elb = collector?.push || elbOrg;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentConfig>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n elb('walker on', 'consent', consentConfig);\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(config: SessionConfig, cb?: SessionCallback | false) {\n // Track the last processed group to prevent duplicate processing\n let lastProcessedGroup: string | undefined;\n\n const func = (collector: Collector.Instance, consent: WalkerOS.Consent) => {\n // Skip if we've already processed this group\n if (\n isDefined(lastProcessedGroup) &&\n lastProcessedGroup === collector?.group\n )\n return;\n\n // Remember this group has been processed\n lastProcessedGroup = collector?.group;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n return callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const elb = collector?.push || elbOrg;\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs - using unknown cast for type safety\n elb('walker user', user);\n\n if (session.isStart) {\n // Convert session start to an event object\n elb({\n event: 'session start',\n data: session,\n });\n }\n\n return session;\n};\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport type { SessionWindowConfig } from '.';\nimport type { StorageType } from '@walkeros/core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '../storage';\nimport { sessionWindow } from '.';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(String(storageRead(key, storage)));\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(sessionKey, JSON.stringify(session), length * 2, sessionStorage);\n\n return session;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n) {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage);\n break;\n case Const.Utils.Storage.Local:\n window.localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.removeItem(key);\n break;\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem(window.localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem(window.sessionStorage.getItem(key));\n break;\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage); // Remove item\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n document.cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n window.localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n\n return storageRead(key, storage);\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || window.location.href);\n const ref = config.referrer || document.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(url, config.parameters);\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport interface Destination<Settings = unknown, Mapping = unknown>\n extends WalkerOSDestination.Instance<Settings, Mapping> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.Config<Settings, Mapping>;\n\nexport type PartialConfig<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PartialConfig<Settings, Mapping>;\n\nexport type InitFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.InitFn<Settings, Mapping>;\n\nexport type PushFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PushFn<Settings, Mapping>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n","import type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport interface Source<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> extends CoreSource.Instance {\n settings?: Settings;\n mapping?: Mapping;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = CoreSource.Instance & {\n settings: Settings;\n mapping?: Mapping;\n};\n\nexport type PartialConfig<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = Partial<Config<Settings, Mapping>>;\n\nexport type InitFn<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = (\n collector: Collector.Instance,\n config: Config<Settings, Mapping>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n} from '@walkeros/core';\nimport type { SessionConfig } from '../session';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\nimport type { On } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: Collector;\n elbLayer: Layer;\n dataLayer: WalkerOS.Events | unknown;\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n sessionStart: (\n options?: SessionStartOptions,\n ) => void | CoreCollector.SessionData;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n session: false | SessionConfig;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n tagging?: number;\n user?: WalkerOS.User;\n}\n\nexport interface SessionStartOptions {\n config?: SessionConfig;\n data?: Partial<CoreCollector.SessionData>;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["isDefined","elb","tryCatch","sessionStorage","tryCatch","session","getId"]}
1
+ {"version":3,"sources":["../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/session/sessionStart.ts","../src/session/sessionStorage.ts","../src/storage.ts","../src/session/sessionWindow.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Environment } from './types/destination';\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Provides a consistent way for web destinations to access browser APIs\n * (window, document) while supporting environment-based testing and simulation.\n *\n * @param environment - Optional environment override for testing/simulation\n * @returns Environment globals with fallback to real browser APIs\n *\n * @example\n * ```typescript\n * // Production usage (environment = undefined)\n * const { window, document } = getEnvironment();\n * // Uses real globalThis.window, globalThis.document\n *\n * // Testing usage\n * const testEnv = { window: { gtag: mockGtag } };\n * const { window, document } = getEnvironment(testEnv);\n * // Uses mock window.gtag, real document\n *\n * // Simulation usage\n * const simEnv = { window: { gtag: capturingFunction } };\n * const { window, document } = getEnvironment(simEnv);\n * // Uses capturing functions for simulation\n * ```\n */\nexport function getEnvironment<T extends Environment = Environment>(\n environment?: T,\n): T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document } {\n const defaults = {\n window: globalThis.window,\n document: globalThis.document,\n };\n\n if (!environment) {\n return defaults as unknown as T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document };\n }\n\n // Merge environment with defaults, environment takes precedence\n return {\n ...defaults,\n ...environment,\n } as unknown as T extends undefined\n ? { window: Window; document: Document }\n : T & { window: Window; document: Document };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","export function isVisible(element: HTMLElement): boolean {\n // Check for hiding styles\n const style = getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n if (style.opacity && Number(style.opacity) < 0.1) return false;\n\n // Window positions\n let pointContainer;\n const windowHeight = window.innerHeight; // Height of the viewport\n\n // Element positions\n const elemRectRel = element.getBoundingClientRect(); // Get the elements relative to the viewport\n const elementHeight = elemRectRel.height; // Height of the element\n const elementTopRel = elemRectRel.y; // Relative distance from window top to element top\n const elementBottomRel = elementTopRel + elementHeight; // Relative distance from window to to element bottom\n const elemCenterRel = {\n // Relative position on viewport of the elements center\n x: elemRectRel.x + element.offsetWidth / 2,\n y: elemRectRel.y + element.offsetHeight / 2,\n };\n\n // Differentiate between small and large elements\n if (elementHeight <= windowHeight) {\n // Smaller than the viewport\n\n // Must have a width and height\n if (\n element.offsetWidth + elemRectRel.width === 0 ||\n element.offsetHeight + elemRectRel.height === 0\n )\n return false;\n\n if (elemCenterRel.x < 0) return false;\n if (\n elemCenterRel.x >\n (document.documentElement.clientWidth || window.innerWidth)\n )\n return false;\n if (elemCenterRel.y < 0) return false;\n if (\n elemCenterRel.y >\n (document.documentElement.clientHeight || window.innerHeight)\n )\n return false;\n\n // Select the element that is at the center of the target\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n elemCenterRel.y,\n );\n } else {\n // Bigger than the viewport\n\n // that are considered visible if they fill half of the screen\n const viewportCenter = windowHeight / 2;\n\n // Check if upper part is above the viewports center\n if (elementTopRel < 0 && elementBottomRel < viewportCenter) return false;\n\n // Check if lower part is below the viewports center\n if (elementBottomRel > windowHeight && elementTopRel > viewportCenter)\n return false;\n\n // Select the element that is in the middle of the screen\n pointContainer = document.elementFromPoint(\n elemCenterRel.x,\n windowHeight / 2,\n );\n }\n\n // Check for potential overlays\n if (pointContainer) {\n do {\n if (pointContainer === element) return true; // should be visible\n } while ((pointContainer = pointContainer.parentElement));\n }\n\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n}\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n\n return tryCatchAsync(\n async () => {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { Collector, WalkerOS, On } from '@walkeros/core';\nimport type { SessionStorageConfig } from './';\nimport { sessionStorage, sessionWindow } from './';\nimport { elb as elbOrg } from '../elb';\nimport { getGrantedConsent, isArray, isDefined } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const elb = collector?.push || elbOrg;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentConfig>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n elb('walker on', 'consent', consentConfig);\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(config: SessionConfig, cb?: SessionCallback | false) {\n // Track the last processed group to prevent duplicate processing\n let lastProcessedGroup: string | undefined;\n\n const func = (collector: Collector.Instance, consent: WalkerOS.Consent) => {\n // Skip if we've already processed this group\n if (\n isDefined(lastProcessedGroup) &&\n lastProcessedGroup === collector?.group\n )\n return;\n\n // Remember this group has been processed\n lastProcessedGroup = collector?.group;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n return callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const elb = collector?.push || elbOrg;\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs - using unknown cast for type safety\n elb('walker user', user);\n\n if (session.isStart) {\n // Convert session start to an event object\n elb({\n name: 'session start',\n data: session,\n });\n }\n\n return session;\n};\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport type { SessionWindowConfig } from '.';\nimport type { StorageType } from '@walkeros/core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '../storage';\nimport { sessionWindow } from '.';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(String(storageRead(key, storage)));\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(sessionKey, JSON.stringify(session), length * 2, sessionStorage);\n\n return session;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n) {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage);\n break;\n case Const.Utils.Storage.Local:\n window.localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.removeItem(key);\n break;\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem(window.localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem(window.sessionStorage.getItem(key));\n break;\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage); // Remove item\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n document.cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n window.localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n window.sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n\n return storageRead(key, storage);\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || window.location.href);\n const ref = config.referrer || document.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(url, config.parameters);\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport interface Destination<Settings = unknown, Mapping = unknown>\n extends WalkerOSDestination.Instance<Settings, Mapping> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.Config<Settings, Mapping>;\n\nexport type PartialConfig<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PartialConfig<Settings, Mapping>;\n\nexport type InitFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.InitFn<Settings, Mapping>;\n\nexport type PushFn<\n Settings = unknown,\n Mapping = unknown,\n> = WalkerOSDestination.PushFn<Settings, Mapping>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Environment interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Environment extends WalkerOSDestination.Environment {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","import type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport interface Source<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> extends CoreSource.Instance {\n settings?: Settings;\n mapping?: Mapping;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = CoreSource.Instance & {\n settings: Settings;\n mapping?: Mapping;\n};\n\nexport type PartialConfig<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = Partial<Config<Settings, Mapping>>;\n\nexport type InitFn<\n Settings extends Record<string, unknown> = Record<string, unknown>,\n Mapping = unknown,\n> = (\n collector: Collector.Instance,\n config: Config<Settings, Mapping>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n} from '@walkeros/core';\nimport type { SessionConfig } from '../session';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\nimport type { On } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: Collector;\n elbLayer: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n sessionStart: (\n options?: SessionStartOptions,\n ) => void | CoreCollector.SessionData;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n session: false | SessionConfig;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n tagging?: number;\n user?: WalkerOS.User;\n}\n\nexport interface SessionStartOptions {\n config?: SessionConfig;\n data?: Partial<CoreCollector.SessionData>;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["isDefined","elb","tryCatch","sessionStorage","tryCatch","session","getId"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-core",
3
3
  "description": "Web-specific utilities for walkerOS",
4
- "version": "0.0.8",
4
+ "version": "0.1.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -25,7 +25,7 @@
25
25
  "update": "npx npm-check-updates -u && npm update"
26
26
  },
27
27
  "dependencies": {
28
- "@walkeros/core": "0.0.8"
28
+ "@walkeros/core": "0.1.0"
29
29
  },
30
30
  "repository": {
31
31
  "url": "git+https://github.com/elbwalker/walkerOS.git",