@walkeros/web-source-datalayer 0.0.7
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/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/examples/index.d.mts +82 -0
- package/dist/examples/index.d.ts +82 -0
- package/dist/examples/index.js +289 -0
- package/dist/examples/index.mjs +264 -0
- package/dist/index.browser.js +1 -0
- package/dist/index.d.mts +133 -0
- package/dist/index.d.ts +133 -0
- package/dist/index.es5.js +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 elbWalker GmbH
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<p align="left">
|
|
2
|
+
<a href="https://elbwalker.com">
|
|
3
|
+
<img title="elbwalker" src='https://www.elbwalker.com/img/elbwalker_logo.png' width="256px"/>
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
# DataLayer Source for walkerOS
|
|
8
|
+
|
|
9
|
+
This package provides a dataLayer source for walkerOS. It allows you to process
|
|
10
|
+
events from a dataLayer and send them to the walkerOS collector.
|
|
11
|
+
|
|
12
|
+
[View documentation](https://www.elbwalker.com/docs/sources/datalayer/)
|
|
13
|
+
|
|
14
|
+
## Role in walkerOS Ecosystem
|
|
15
|
+
|
|
16
|
+
walkerOS follows a **source → collector → destination** architecture:
|
|
17
|
+
|
|
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)
|
|
23
|
+
|
|
24
|
+
This dataLayer source monitors the browser's dataLayer (commonly used with
|
|
25
|
+
Google Tag Manager) and transforms existing gtag() calls and dataLayer.push()
|
|
26
|
+
events into standardized walkerOS events, enabling seamless migration from
|
|
27
|
+
traditional dataLayer implementations.
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
npm install @walkeros/web-source-datalayer
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
Here's a basic example of how to use the dataLayer source:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { elb } from '@walkeros/collector';
|
|
41
|
+
import { sourceDataLayer } from '@walkeros/web-source-datalayer';
|
|
42
|
+
|
|
43
|
+
sourceDataLayer({ elb });
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Contribute
|
|
47
|
+
|
|
48
|
+
Feel free to contribute by submitting an
|
|
49
|
+
[issue](https://github.com/elbwalker/walkerOS/issues), starting a
|
|
50
|
+
[discussion](https://github.com/elbwalker/walkerOS/discussions), or getting in
|
|
51
|
+
[contact](https://calendly.com/elb-alexander/30min).
|
|
52
|
+
|
|
53
|
+
## License
|
|
54
|
+
|
|
55
|
+
This project is licensed under the MIT License.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Mapping } from '@walkeros/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sample gtag events that would be pushed to dataLayer
|
|
5
|
+
* These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Consent Mode Events - Primary use case
|
|
9
|
+
*/
|
|
10
|
+
declare function consentUpdate$1(): unknown[];
|
|
11
|
+
declare function consentDefault(): unknown[];
|
|
12
|
+
/**
|
|
13
|
+
* E-commerce Events
|
|
14
|
+
*/
|
|
15
|
+
declare function purchase$1(): unknown[];
|
|
16
|
+
declare function add_to_cart$1(): unknown[];
|
|
17
|
+
declare function view_item$1(): unknown[];
|
|
18
|
+
/**
|
|
19
|
+
* Config Events
|
|
20
|
+
*/
|
|
21
|
+
declare function config$1(): unknown[];
|
|
22
|
+
/**
|
|
23
|
+
* Set Events
|
|
24
|
+
*/
|
|
25
|
+
declare function setCustom(): unknown[];
|
|
26
|
+
/**
|
|
27
|
+
* Direct dataLayer object pushes (not gtag)
|
|
28
|
+
*/
|
|
29
|
+
declare function directDataLayerEvent(): Record<string, unknown>;
|
|
30
|
+
|
|
31
|
+
declare const events_consentDefault: typeof consentDefault;
|
|
32
|
+
declare const events_directDataLayerEvent: typeof directDataLayerEvent;
|
|
33
|
+
declare const events_setCustom: typeof setCustom;
|
|
34
|
+
declare namespace events {
|
|
35
|
+
export { add_to_cart$1 as add_to_cart, config$1 as config, events_consentDefault as consentDefault, consentUpdate$1 as consentUpdate, events_directDataLayerEvent as directDataLayerEvent, purchase$1 as purchase, events_setCustom as setCustom, view_item$1 as view_item };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Consent Mode Mapping - Primary use case
|
|
40
|
+
* Maps gtag consent events to walker consent commands
|
|
41
|
+
*/
|
|
42
|
+
declare const consentUpdate: Mapping.Rule;
|
|
43
|
+
/**
|
|
44
|
+
* E-commerce Event Mappings
|
|
45
|
+
* Transform GA4 ecommerce events to WalkerOS events
|
|
46
|
+
*/
|
|
47
|
+
declare const purchase: Mapping.Rule;
|
|
48
|
+
declare const add_to_cart: Mapping.Rule;
|
|
49
|
+
declare const view_item: Mapping.Rule;
|
|
50
|
+
/**
|
|
51
|
+
* Config Event Mapping
|
|
52
|
+
* Transform GA4 config events to WalkerOS page events
|
|
53
|
+
*/
|
|
54
|
+
declare const configGA4: Mapping.Rule;
|
|
55
|
+
/**
|
|
56
|
+
* Custom Event Mapping
|
|
57
|
+
* Handle direct dataLayer pushes
|
|
58
|
+
*/
|
|
59
|
+
declare const customEvent: Mapping.Rule;
|
|
60
|
+
/**
|
|
61
|
+
* Complete mapping configuration
|
|
62
|
+
* Following the same pattern as destination mappings
|
|
63
|
+
*/
|
|
64
|
+
declare const config: Mapping.Rules;
|
|
65
|
+
/**
|
|
66
|
+
* Minimal consent-only mapping for focused use cases
|
|
67
|
+
*/
|
|
68
|
+
declare const consentOnlyMapping: Mapping.Rules;
|
|
69
|
+
|
|
70
|
+
declare const mapping_add_to_cart: typeof add_to_cart;
|
|
71
|
+
declare const mapping_config: typeof config;
|
|
72
|
+
declare const mapping_configGA4: typeof configGA4;
|
|
73
|
+
declare const mapping_consentOnlyMapping: typeof consentOnlyMapping;
|
|
74
|
+
declare const mapping_consentUpdate: typeof consentUpdate;
|
|
75
|
+
declare const mapping_customEvent: typeof customEvent;
|
|
76
|
+
declare const mapping_purchase: typeof purchase;
|
|
77
|
+
declare const mapping_view_item: typeof view_item;
|
|
78
|
+
declare namespace mapping {
|
|
79
|
+
export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Mapping } from '@walkeros/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sample gtag events that would be pushed to dataLayer
|
|
5
|
+
* These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Consent Mode Events - Primary use case
|
|
9
|
+
*/
|
|
10
|
+
declare function consentUpdate$1(): unknown[];
|
|
11
|
+
declare function consentDefault(): unknown[];
|
|
12
|
+
/**
|
|
13
|
+
* E-commerce Events
|
|
14
|
+
*/
|
|
15
|
+
declare function purchase$1(): unknown[];
|
|
16
|
+
declare function add_to_cart$1(): unknown[];
|
|
17
|
+
declare function view_item$1(): unknown[];
|
|
18
|
+
/**
|
|
19
|
+
* Config Events
|
|
20
|
+
*/
|
|
21
|
+
declare function config$1(): unknown[];
|
|
22
|
+
/**
|
|
23
|
+
* Set Events
|
|
24
|
+
*/
|
|
25
|
+
declare function setCustom(): unknown[];
|
|
26
|
+
/**
|
|
27
|
+
* Direct dataLayer object pushes (not gtag)
|
|
28
|
+
*/
|
|
29
|
+
declare function directDataLayerEvent(): Record<string, unknown>;
|
|
30
|
+
|
|
31
|
+
declare const events_consentDefault: typeof consentDefault;
|
|
32
|
+
declare const events_directDataLayerEvent: typeof directDataLayerEvent;
|
|
33
|
+
declare const events_setCustom: typeof setCustom;
|
|
34
|
+
declare namespace events {
|
|
35
|
+
export { add_to_cart$1 as add_to_cart, config$1 as config, events_consentDefault as consentDefault, consentUpdate$1 as consentUpdate, events_directDataLayerEvent as directDataLayerEvent, purchase$1 as purchase, events_setCustom as setCustom, view_item$1 as view_item };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Consent Mode Mapping - Primary use case
|
|
40
|
+
* Maps gtag consent events to walker consent commands
|
|
41
|
+
*/
|
|
42
|
+
declare const consentUpdate: Mapping.Rule;
|
|
43
|
+
/**
|
|
44
|
+
* E-commerce Event Mappings
|
|
45
|
+
* Transform GA4 ecommerce events to WalkerOS events
|
|
46
|
+
*/
|
|
47
|
+
declare const purchase: Mapping.Rule;
|
|
48
|
+
declare const add_to_cart: Mapping.Rule;
|
|
49
|
+
declare const view_item: Mapping.Rule;
|
|
50
|
+
/**
|
|
51
|
+
* Config Event Mapping
|
|
52
|
+
* Transform GA4 config events to WalkerOS page events
|
|
53
|
+
*/
|
|
54
|
+
declare const configGA4: Mapping.Rule;
|
|
55
|
+
/**
|
|
56
|
+
* Custom Event Mapping
|
|
57
|
+
* Handle direct dataLayer pushes
|
|
58
|
+
*/
|
|
59
|
+
declare const customEvent: Mapping.Rule;
|
|
60
|
+
/**
|
|
61
|
+
* Complete mapping configuration
|
|
62
|
+
* Following the same pattern as destination mappings
|
|
63
|
+
*/
|
|
64
|
+
declare const config: Mapping.Rules;
|
|
65
|
+
/**
|
|
66
|
+
* Minimal consent-only mapping for focused use cases
|
|
67
|
+
*/
|
|
68
|
+
declare const consentOnlyMapping: Mapping.Rules;
|
|
69
|
+
|
|
70
|
+
declare const mapping_add_to_cart: typeof add_to_cart;
|
|
71
|
+
declare const mapping_config: typeof config;
|
|
72
|
+
declare const mapping_configGA4: typeof configGA4;
|
|
73
|
+
declare const mapping_consentOnlyMapping: typeof consentOnlyMapping;
|
|
74
|
+
declare const mapping_consentUpdate: typeof consentUpdate;
|
|
75
|
+
declare const mapping_customEvent: typeof customEvent;
|
|
76
|
+
declare const mapping_purchase: typeof purchase;
|
|
77
|
+
declare const mapping_view_item: typeof view_item;
|
|
78
|
+
declare namespace mapping {
|
|
79
|
+
export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples };
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/examples/index.ts
|
|
21
|
+
var examples_exports = {};
|
|
22
|
+
__export(examples_exports, {
|
|
23
|
+
Events: () => events_exports,
|
|
24
|
+
Mapping: () => mapping_exports,
|
|
25
|
+
consentOnlyMapping: () => consentOnlyMapping,
|
|
26
|
+
consentUpdateEvent: () => consentUpdate,
|
|
27
|
+
dataLayerExamples: () => config2
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(examples_exports);
|
|
30
|
+
|
|
31
|
+
// src/examples/events.ts
|
|
32
|
+
var events_exports = {};
|
|
33
|
+
__export(events_exports, {
|
|
34
|
+
add_to_cart: () => add_to_cart,
|
|
35
|
+
config: () => config,
|
|
36
|
+
consentDefault: () => consentDefault,
|
|
37
|
+
consentUpdate: () => consentUpdate,
|
|
38
|
+
directDataLayerEvent: () => directDataLayerEvent,
|
|
39
|
+
purchase: () => purchase,
|
|
40
|
+
setCustom: () => setCustom,
|
|
41
|
+
view_item: () => view_item
|
|
42
|
+
});
|
|
43
|
+
function consentUpdate() {
|
|
44
|
+
return [
|
|
45
|
+
"consent",
|
|
46
|
+
"update",
|
|
47
|
+
{
|
|
48
|
+
ad_user_data: "granted",
|
|
49
|
+
ad_personalization: "granted",
|
|
50
|
+
ad_storage: "denied",
|
|
51
|
+
analytics_storage: "granted"
|
|
52
|
+
}
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
function consentDefault() {
|
|
56
|
+
return [
|
|
57
|
+
"consent",
|
|
58
|
+
"default",
|
|
59
|
+
{
|
|
60
|
+
ad_storage: "denied",
|
|
61
|
+
analytics_storage: "denied",
|
|
62
|
+
ad_user_data: "denied",
|
|
63
|
+
ad_personalization: "denied"
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
function purchase() {
|
|
68
|
+
return [
|
|
69
|
+
"event",
|
|
70
|
+
"purchase",
|
|
71
|
+
{
|
|
72
|
+
transaction_id: "T_12345",
|
|
73
|
+
value: 25.42,
|
|
74
|
+
currency: "EUR",
|
|
75
|
+
items: [
|
|
76
|
+
{
|
|
77
|
+
item_id: "SKU_12345",
|
|
78
|
+
item_name: "Product Name",
|
|
79
|
+
item_category: "Category",
|
|
80
|
+
quantity: 1,
|
|
81
|
+
price: 25.42
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
function add_to_cart() {
|
|
88
|
+
return [
|
|
89
|
+
"event",
|
|
90
|
+
"add_to_cart",
|
|
91
|
+
{
|
|
92
|
+
currency: "EUR",
|
|
93
|
+
value: 15.25,
|
|
94
|
+
items: [
|
|
95
|
+
{
|
|
96
|
+
item_id: "SKU_12345",
|
|
97
|
+
item_name: "Product Name",
|
|
98
|
+
item_variant: "red",
|
|
99
|
+
quantity: 1,
|
|
100
|
+
price: 15.25
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
function view_item() {
|
|
107
|
+
return [
|
|
108
|
+
"event",
|
|
109
|
+
"view_item",
|
|
110
|
+
{
|
|
111
|
+
currency: "EUR",
|
|
112
|
+
value: 15.25,
|
|
113
|
+
items: [
|
|
114
|
+
{
|
|
115
|
+
item_id: "SKU_12345",
|
|
116
|
+
item_name: "Product Name",
|
|
117
|
+
item_category: "Category",
|
|
118
|
+
price: 15.25
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
function config() {
|
|
125
|
+
return [
|
|
126
|
+
"config",
|
|
127
|
+
"G-XXXXXXXXXX",
|
|
128
|
+
{
|
|
129
|
+
page_title: "Custom Page Title",
|
|
130
|
+
page_location: "https://example.com/page",
|
|
131
|
+
send_page_view: false
|
|
132
|
+
}
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
function setCustom() {
|
|
136
|
+
return [
|
|
137
|
+
"set",
|
|
138
|
+
{
|
|
139
|
+
currency: "EUR",
|
|
140
|
+
country: "DE"
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
}
|
|
144
|
+
function directDataLayerEvent() {
|
|
145
|
+
return {
|
|
146
|
+
event: "custom_event",
|
|
147
|
+
custom_parameter: "custom_value",
|
|
148
|
+
user_id: "user123"
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/examples/mapping.ts
|
|
153
|
+
var mapping_exports = {};
|
|
154
|
+
__export(mapping_exports, {
|
|
155
|
+
add_to_cart: () => add_to_cart2,
|
|
156
|
+
config: () => config2,
|
|
157
|
+
configGA4: () => configGA4,
|
|
158
|
+
consentOnlyMapping: () => consentOnlyMapping,
|
|
159
|
+
consentUpdate: () => consentUpdate2,
|
|
160
|
+
customEvent: () => customEvent,
|
|
161
|
+
purchase: () => purchase2,
|
|
162
|
+
view_item: () => view_item2
|
|
163
|
+
});
|
|
164
|
+
var consentUpdate2 = {
|
|
165
|
+
name: "walker consent",
|
|
166
|
+
settings: {
|
|
167
|
+
command: {
|
|
168
|
+
map: {
|
|
169
|
+
functional: { value: true },
|
|
170
|
+
// Static value - always true for functional
|
|
171
|
+
analytics: {
|
|
172
|
+
key: "analytics_storage",
|
|
173
|
+
fn: (value) => value === "granted"
|
|
174
|
+
},
|
|
175
|
+
marketing: {
|
|
176
|
+
key: "ad_storage",
|
|
177
|
+
fn: (value) => value === "granted"
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var purchase2 = {
|
|
184
|
+
name: "order complete",
|
|
185
|
+
data: {
|
|
186
|
+
map: {
|
|
187
|
+
id: "transaction_id",
|
|
188
|
+
total: "value",
|
|
189
|
+
currency: "currency",
|
|
190
|
+
nested: {
|
|
191
|
+
loop: [
|
|
192
|
+
"items",
|
|
193
|
+
{
|
|
194
|
+
map: {
|
|
195
|
+
type: { value: "product" },
|
|
196
|
+
data: {
|
|
197
|
+
map: {
|
|
198
|
+
id: "item_id",
|
|
199
|
+
name: "item_name",
|
|
200
|
+
category: "item_category",
|
|
201
|
+
quantity: "quantity",
|
|
202
|
+
price: "price"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
var add_to_cart2 = {
|
|
213
|
+
name: "product add",
|
|
214
|
+
data: {
|
|
215
|
+
map: {
|
|
216
|
+
id: "items.0.item_id",
|
|
217
|
+
name: "items.0.item_name",
|
|
218
|
+
price: "value",
|
|
219
|
+
currency: "currency",
|
|
220
|
+
color: "items.0.item_variant",
|
|
221
|
+
quantity: "items.0.quantity"
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
var view_item2 = {
|
|
226
|
+
name: "product view",
|
|
227
|
+
data: {
|
|
228
|
+
map: {
|
|
229
|
+
id: "items.0.item_id",
|
|
230
|
+
name: "items.0.item_name",
|
|
231
|
+
category: "items.0.item_category",
|
|
232
|
+
price: "items.0.price",
|
|
233
|
+
currency: "currency"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
var configGA4 = {
|
|
238
|
+
name: "page view",
|
|
239
|
+
data: {
|
|
240
|
+
map: {
|
|
241
|
+
title: "page_title",
|
|
242
|
+
url: "page_location"
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
var customEvent = {
|
|
247
|
+
// Keep original event name with gtag prefix
|
|
248
|
+
data: {
|
|
249
|
+
map: {
|
|
250
|
+
// Map all properties as-is
|
|
251
|
+
user_id: "user_id",
|
|
252
|
+
custom_parameter: "custom_parameter"
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
var config2 = {
|
|
257
|
+
// Consent events
|
|
258
|
+
consent: {
|
|
259
|
+
update: consentUpdate2
|
|
260
|
+
},
|
|
261
|
+
// E-commerce events
|
|
262
|
+
purchase: purchase2,
|
|
263
|
+
add_to_cart: add_to_cart2,
|
|
264
|
+
view_item: view_item2,
|
|
265
|
+
// Config events
|
|
266
|
+
"config G-XXXXXXXXXX": configGA4,
|
|
267
|
+
// Custom events
|
|
268
|
+
custom_event: customEvent,
|
|
269
|
+
// Catch-all for unmapped events
|
|
270
|
+
"*": {
|
|
271
|
+
// Pass through with gtag prefix
|
|
272
|
+
data: {
|
|
273
|
+
// Copy all data as-is
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
var consentOnlyMapping = {
|
|
278
|
+
consent: {
|
|
279
|
+
update: consentUpdate2
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
283
|
+
0 && (module.exports = {
|
|
284
|
+
Events,
|
|
285
|
+
Mapping,
|
|
286
|
+
consentOnlyMapping,
|
|
287
|
+
consentUpdateEvent,
|
|
288
|
+
dataLayerExamples
|
|
289
|
+
});
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/examples/events.ts
|
|
8
|
+
var events_exports = {};
|
|
9
|
+
__export(events_exports, {
|
|
10
|
+
add_to_cart: () => add_to_cart,
|
|
11
|
+
config: () => config,
|
|
12
|
+
consentDefault: () => consentDefault,
|
|
13
|
+
consentUpdate: () => consentUpdate,
|
|
14
|
+
directDataLayerEvent: () => directDataLayerEvent,
|
|
15
|
+
purchase: () => purchase,
|
|
16
|
+
setCustom: () => setCustom,
|
|
17
|
+
view_item: () => view_item
|
|
18
|
+
});
|
|
19
|
+
function consentUpdate() {
|
|
20
|
+
return [
|
|
21
|
+
"consent",
|
|
22
|
+
"update",
|
|
23
|
+
{
|
|
24
|
+
ad_user_data: "granted",
|
|
25
|
+
ad_personalization: "granted",
|
|
26
|
+
ad_storage: "denied",
|
|
27
|
+
analytics_storage: "granted"
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
function consentDefault() {
|
|
32
|
+
return [
|
|
33
|
+
"consent",
|
|
34
|
+
"default",
|
|
35
|
+
{
|
|
36
|
+
ad_storage: "denied",
|
|
37
|
+
analytics_storage: "denied",
|
|
38
|
+
ad_user_data: "denied",
|
|
39
|
+
ad_personalization: "denied"
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
function purchase() {
|
|
44
|
+
return [
|
|
45
|
+
"event",
|
|
46
|
+
"purchase",
|
|
47
|
+
{
|
|
48
|
+
transaction_id: "T_12345",
|
|
49
|
+
value: 25.42,
|
|
50
|
+
currency: "EUR",
|
|
51
|
+
items: [
|
|
52
|
+
{
|
|
53
|
+
item_id: "SKU_12345",
|
|
54
|
+
item_name: "Product Name",
|
|
55
|
+
item_category: "Category",
|
|
56
|
+
quantity: 1,
|
|
57
|
+
price: 25.42
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
function add_to_cart() {
|
|
64
|
+
return [
|
|
65
|
+
"event",
|
|
66
|
+
"add_to_cart",
|
|
67
|
+
{
|
|
68
|
+
currency: "EUR",
|
|
69
|
+
value: 15.25,
|
|
70
|
+
items: [
|
|
71
|
+
{
|
|
72
|
+
item_id: "SKU_12345",
|
|
73
|
+
item_name: "Product Name",
|
|
74
|
+
item_variant: "red",
|
|
75
|
+
quantity: 1,
|
|
76
|
+
price: 15.25
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
function view_item() {
|
|
83
|
+
return [
|
|
84
|
+
"event",
|
|
85
|
+
"view_item",
|
|
86
|
+
{
|
|
87
|
+
currency: "EUR",
|
|
88
|
+
value: 15.25,
|
|
89
|
+
items: [
|
|
90
|
+
{
|
|
91
|
+
item_id: "SKU_12345",
|
|
92
|
+
item_name: "Product Name",
|
|
93
|
+
item_category: "Category",
|
|
94
|
+
price: 15.25
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
function config() {
|
|
101
|
+
return [
|
|
102
|
+
"config",
|
|
103
|
+
"G-XXXXXXXXXX",
|
|
104
|
+
{
|
|
105
|
+
page_title: "Custom Page Title",
|
|
106
|
+
page_location: "https://example.com/page",
|
|
107
|
+
send_page_view: false
|
|
108
|
+
}
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
function setCustom() {
|
|
112
|
+
return [
|
|
113
|
+
"set",
|
|
114
|
+
{
|
|
115
|
+
currency: "EUR",
|
|
116
|
+
country: "DE"
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
function directDataLayerEvent() {
|
|
121
|
+
return {
|
|
122
|
+
event: "custom_event",
|
|
123
|
+
custom_parameter: "custom_value",
|
|
124
|
+
user_id: "user123"
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/examples/mapping.ts
|
|
129
|
+
var mapping_exports = {};
|
|
130
|
+
__export(mapping_exports, {
|
|
131
|
+
add_to_cart: () => add_to_cart2,
|
|
132
|
+
config: () => config2,
|
|
133
|
+
configGA4: () => configGA4,
|
|
134
|
+
consentOnlyMapping: () => consentOnlyMapping,
|
|
135
|
+
consentUpdate: () => consentUpdate2,
|
|
136
|
+
customEvent: () => customEvent,
|
|
137
|
+
purchase: () => purchase2,
|
|
138
|
+
view_item: () => view_item2
|
|
139
|
+
});
|
|
140
|
+
var consentUpdate2 = {
|
|
141
|
+
name: "walker consent",
|
|
142
|
+
settings: {
|
|
143
|
+
command: {
|
|
144
|
+
map: {
|
|
145
|
+
functional: { value: true },
|
|
146
|
+
// Static value - always true for functional
|
|
147
|
+
analytics: {
|
|
148
|
+
key: "analytics_storage",
|
|
149
|
+
fn: (value) => value === "granted"
|
|
150
|
+
},
|
|
151
|
+
marketing: {
|
|
152
|
+
key: "ad_storage",
|
|
153
|
+
fn: (value) => value === "granted"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
var purchase2 = {
|
|
160
|
+
name: "order complete",
|
|
161
|
+
data: {
|
|
162
|
+
map: {
|
|
163
|
+
id: "transaction_id",
|
|
164
|
+
total: "value",
|
|
165
|
+
currency: "currency",
|
|
166
|
+
nested: {
|
|
167
|
+
loop: [
|
|
168
|
+
"items",
|
|
169
|
+
{
|
|
170
|
+
map: {
|
|
171
|
+
type: { value: "product" },
|
|
172
|
+
data: {
|
|
173
|
+
map: {
|
|
174
|
+
id: "item_id",
|
|
175
|
+
name: "item_name",
|
|
176
|
+
category: "item_category",
|
|
177
|
+
quantity: "quantity",
|
|
178
|
+
price: "price"
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
var add_to_cart2 = {
|
|
189
|
+
name: "product add",
|
|
190
|
+
data: {
|
|
191
|
+
map: {
|
|
192
|
+
id: "items.0.item_id",
|
|
193
|
+
name: "items.0.item_name",
|
|
194
|
+
price: "value",
|
|
195
|
+
currency: "currency",
|
|
196
|
+
color: "items.0.item_variant",
|
|
197
|
+
quantity: "items.0.quantity"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
var view_item2 = {
|
|
202
|
+
name: "product view",
|
|
203
|
+
data: {
|
|
204
|
+
map: {
|
|
205
|
+
id: "items.0.item_id",
|
|
206
|
+
name: "items.0.item_name",
|
|
207
|
+
category: "items.0.item_category",
|
|
208
|
+
price: "items.0.price",
|
|
209
|
+
currency: "currency"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
var configGA4 = {
|
|
214
|
+
name: "page view",
|
|
215
|
+
data: {
|
|
216
|
+
map: {
|
|
217
|
+
title: "page_title",
|
|
218
|
+
url: "page_location"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
var customEvent = {
|
|
223
|
+
// Keep original event name with gtag prefix
|
|
224
|
+
data: {
|
|
225
|
+
map: {
|
|
226
|
+
// Map all properties as-is
|
|
227
|
+
user_id: "user_id",
|
|
228
|
+
custom_parameter: "custom_parameter"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
var config2 = {
|
|
233
|
+
// Consent events
|
|
234
|
+
consent: {
|
|
235
|
+
update: consentUpdate2
|
|
236
|
+
},
|
|
237
|
+
// E-commerce events
|
|
238
|
+
purchase: purchase2,
|
|
239
|
+
add_to_cart: add_to_cart2,
|
|
240
|
+
view_item: view_item2,
|
|
241
|
+
// Config events
|
|
242
|
+
"config G-XXXXXXXXXX": configGA4,
|
|
243
|
+
// Custom events
|
|
244
|
+
custom_event: customEvent,
|
|
245
|
+
// Catch-all for unmapped events
|
|
246
|
+
"*": {
|
|
247
|
+
// Pass through with gtag prefix
|
|
248
|
+
data: {
|
|
249
|
+
// Copy all data as-is
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
var consentOnlyMapping = {
|
|
254
|
+
consent: {
|
|
255
|
+
update: consentUpdate2
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
export {
|
|
259
|
+
events_exports as Events,
|
|
260
|
+
mapping_exports as Mapping,
|
|
261
|
+
consentOnlyMapping,
|
|
262
|
+
consentUpdate as consentUpdateEvent,
|
|
263
|
+
config2 as dataLayerExamples
|
|
264
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var Destination=(()=>{var e,t,r=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})},s={};o(s,{Events:()=>w,Mapping:()=>A,SourceDataLayer:()=>v,consentOnlyMapping:()=>M,consentUpdateEvent:()=>b,dataLayerExamples:()=>q,default:()=>R,sourceDataLayer:()=>N});var c=Object.getOwnPropertyNames,u=(e={"package.json"(e,t){t.exports={name:"@walkeros/core",description:"Core types and platform-agnostic utilities for walkerOS",version:"0.0.7",main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",license:"MIT",files:["dist/**"],scripts:{build:"tsup --silent",clean:"rm -rf .turbo && rm -rf node_modules && rm -rf dist",dev:"jest --watchAll --colors",lint:'tsc && eslint "**/*.ts*"',test:"jest",update:"npx npm-check-updates -u && npm update"},dependencies:{},devDependencies:{},repository:{url:"git+https://github.com/elbwalker/walkerOS.git",directory:"packages/core"},author:"elbwalker <hello@elbwalker.com>",homepage:"https://github.com/elbwalker/walkerOS#readme",bugs:{url:"https://github.com/elbwalker/walkerOS/issues"},keywords:["walker","walkerOS","analytics","tracking","data collection","measurement","data privacy","privacy friendly","web analytics","product analytics","core","types","utils"],funding:[{type:"GitHub Sponsors",url:"https://github.com/sponsors/elbwalker"}]}}},function(){return t||(0,e[c(e)[0]])((t={exports:{}}).exports,t),t.exports});function d(e){return Array.isArray(e)}function l(e){return"object"==typeof e&&null!==e&&!d(e)&&"[object Object]"===Object.prototype.toString.call(e)}function m(e){return"string"==typeof e}var{version:p}=u();function y(e,t,r){return function(...n){try{return e(...n)}catch(e){if(!t)return;return t(e)}finally{null==r||r()}}}var f=!1;function g(e,t={},r){if(t.filter){if(!0===y(()=>t.filter(r),()=>!1)())return}const n=function(e){if(l(e)&&m(e.event))return e;if(d(e)&&e.length>=2)return _(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return _(Array.from(e))}var t;return null}(r);if(!n)return;const a={event:`${t.prefix||"dataLayer"} ${n.event}`,data:n,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};y(()=>e.push(a),()=>{})()}function _(e){const[t,r,n]=e;if(!m(t))return null;let a,i={};switch(t){case"consent":if(!m(r)||e.length<3)return null;if(!l(n)||null===n)return null;a=`${t} ${r}`,i={...n};break;case"event":if(!m(r))return null;a=r,l(n)&&(i={...n});break;case"config":if(!m(r))return null;a=`${t} ${r}`,l(n)&&(i={...n});break;case"set":if(m(r))a=`${t} ${r}`,l(n)&&(i={...n});else{if(!l(r))return null;a=`${t} custom`,i={...r}}break;default:return null}return{event:a,...i}}var v={},w={};function b(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function h(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function k(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function X(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function O(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function L(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function j(){return["set",{currency:"EUR",country:"DE"}]}function x(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}o(w,{add_to_cart:()=>X,config:()=>L,consentDefault:()=>h,consentUpdate:()=>b,directDataLayerEvent:()=>x,purchase:()=>k,setCustom:()=>j,view_item:()=>O});var A={};o(A,{add_to_cart:()=>E,config:()=>q,configGA4:()=>D,consentOnlyMapping:()=>M,consentUpdate:()=>S,customEvent:()=>$,purchase:()=>P,view_item:()=>U});var S={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},P={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},E={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},U={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},D={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},$={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},q={consent:{update:S},purchase:P,add_to_cart:E,view_item:U,"config G-XXXXXXXXXX":D,custom_event:$,"*":{data:{}}},M={consent:{update:S}},C=(e,t)=>{const{settings:r}=t,n={type:"dataLayer",config:t,collector:e,destroy(){const e=r.name||"dataLayer";window[e]&&Array.isArray(window[e])}};!function(e,t){const r=t.settings,n=(null==r?void 0:r.name)||"dataLayer",a=window[n];if(Array.isArray(a)&&!f){f=!0;try{for(const t of a)g(e,r,t)}finally{f=!1}}}(e,t),function(e,t){const r=t.settings,n=(null==r?void 0:r.name)||"dataLayer";window[n]||(window[n]=[]);const a=window[n];if(!Array.isArray(a))return;const i=a.push.bind(a);a.push=function(...t){if(f)return i(...t);f=!0;try{for(const n of t)g(e,r,n)}finally{f=!1}return i(...t)}}(e,t);return{source:n,elb:(...e)=>{const t=r.name||"dataLayer",n=window[t];return Array.isArray(n)?Promise.resolve(n.push(...e)):Promise.resolve(0)}}};function N(e={}){const t=(t,r)=>{const n={...r,settings:{name:"dataLayer",prefix:"dataLayer",...e,...r.settings}};return C(t,n)};return t.init=(e,t)=>C(e,{type:"dataLayer",settings:t.settings}),t.settings={name:"dataLayer",prefix:"dataLayer",...e},t.type="dataLayer",t}var G,R=N;return G=s,((e,t,o,s)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let c of a(t))i.call(e,c)||c===o||r(e,c,{get:()=>t[c],enumerable:!(s=n(t,c))||s.enumerable});return e})(r({},"__esModule",{value:!0}),G)})();
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { WalkerOS, Source, Mapping, Collector } from '@walkeros/core';
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
dataLayer?: DataLayer;
|
|
6
|
+
[key: string]: DataLayer | unknown;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
interface DataLayerSourceConfig extends Source.Config {
|
|
10
|
+
type: 'dataLayer';
|
|
11
|
+
settings: Settings;
|
|
12
|
+
}
|
|
13
|
+
type DataLayer = Array<unknown>;
|
|
14
|
+
interface Settings extends Record<string, unknown> {
|
|
15
|
+
name?: string;
|
|
16
|
+
prefix?: string;
|
|
17
|
+
filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;
|
|
18
|
+
}
|
|
19
|
+
type DataLayerEvent = {
|
|
20
|
+
event: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
};
|
|
23
|
+
type MappedEvent = {
|
|
24
|
+
event?: WalkerOS.DeepPartialEvent & {
|
|
25
|
+
id: string;
|
|
26
|
+
};
|
|
27
|
+
command?: {
|
|
28
|
+
name: string;
|
|
29
|
+
data: unknown;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type index_DataLayer = DataLayer;
|
|
34
|
+
type index_DataLayerEvent = DataLayerEvent;
|
|
35
|
+
type index_DataLayerSourceConfig = DataLayerSourceConfig;
|
|
36
|
+
type index_MappedEvent = MappedEvent;
|
|
37
|
+
type index_Settings = Settings;
|
|
38
|
+
declare namespace index {
|
|
39
|
+
export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_DataLayerSourceConfig as DataLayerSourceConfig, index_MappedEvent as MappedEvent, index_Settings as Settings };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Sample gtag events that would be pushed to dataLayer
|
|
44
|
+
* These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* Consent Mode Events - Primary use case
|
|
48
|
+
*/
|
|
49
|
+
declare function consentUpdate$1(): unknown[];
|
|
50
|
+
declare function consentDefault(): unknown[];
|
|
51
|
+
/**
|
|
52
|
+
* E-commerce Events
|
|
53
|
+
*/
|
|
54
|
+
declare function purchase$1(): unknown[];
|
|
55
|
+
declare function add_to_cart$1(): unknown[];
|
|
56
|
+
declare function view_item$1(): unknown[];
|
|
57
|
+
/**
|
|
58
|
+
* Config Events
|
|
59
|
+
*/
|
|
60
|
+
declare function config$1(): unknown[];
|
|
61
|
+
/**
|
|
62
|
+
* Set Events
|
|
63
|
+
*/
|
|
64
|
+
declare function setCustom(): unknown[];
|
|
65
|
+
/**
|
|
66
|
+
* Direct dataLayer object pushes (not gtag)
|
|
67
|
+
*/
|
|
68
|
+
declare function directDataLayerEvent(): Record<string, unknown>;
|
|
69
|
+
|
|
70
|
+
declare const events_consentDefault: typeof consentDefault;
|
|
71
|
+
declare const events_directDataLayerEvent: typeof directDataLayerEvent;
|
|
72
|
+
declare const events_setCustom: typeof setCustom;
|
|
73
|
+
declare namespace events {
|
|
74
|
+
export { add_to_cart$1 as add_to_cart, config$1 as config, events_consentDefault as consentDefault, consentUpdate$1 as consentUpdate, events_directDataLayerEvent as directDataLayerEvent, purchase$1 as purchase, events_setCustom as setCustom, view_item$1 as view_item };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Consent Mode Mapping - Primary use case
|
|
79
|
+
* Maps gtag consent events to walker consent commands
|
|
80
|
+
*/
|
|
81
|
+
declare const consentUpdate: Mapping.Rule;
|
|
82
|
+
/**
|
|
83
|
+
* E-commerce Event Mappings
|
|
84
|
+
* Transform GA4 ecommerce events to WalkerOS events
|
|
85
|
+
*/
|
|
86
|
+
declare const purchase: Mapping.Rule;
|
|
87
|
+
declare const add_to_cart: Mapping.Rule;
|
|
88
|
+
declare const view_item: Mapping.Rule;
|
|
89
|
+
/**
|
|
90
|
+
* Config Event Mapping
|
|
91
|
+
* Transform GA4 config events to WalkerOS page events
|
|
92
|
+
*/
|
|
93
|
+
declare const configGA4: Mapping.Rule;
|
|
94
|
+
/**
|
|
95
|
+
* Custom Event Mapping
|
|
96
|
+
* Handle direct dataLayer pushes
|
|
97
|
+
*/
|
|
98
|
+
declare const customEvent: Mapping.Rule;
|
|
99
|
+
/**
|
|
100
|
+
* Complete mapping configuration
|
|
101
|
+
* Following the same pattern as destination mappings
|
|
102
|
+
*/
|
|
103
|
+
declare const config: Mapping.Rules;
|
|
104
|
+
/**
|
|
105
|
+
* Minimal consent-only mapping for focused use cases
|
|
106
|
+
*/
|
|
107
|
+
declare const consentOnlyMapping: Mapping.Rules;
|
|
108
|
+
|
|
109
|
+
declare const mapping_add_to_cart: typeof add_to_cart;
|
|
110
|
+
declare const mapping_config: typeof config;
|
|
111
|
+
declare const mapping_configGA4: typeof configGA4;
|
|
112
|
+
declare const mapping_consentOnlyMapping: typeof consentOnlyMapping;
|
|
113
|
+
declare const mapping_consentUpdate: typeof consentUpdate;
|
|
114
|
+
declare const mapping_customEvent: typeof customEvent;
|
|
115
|
+
declare const mapping_purchase: typeof purchase;
|
|
116
|
+
declare const mapping_view_item: typeof view_item;
|
|
117
|
+
declare namespace mapping {
|
|
118
|
+
export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* DataLayer source factory function
|
|
123
|
+
* Intercepts dataLayer.push calls and transforms them to WalkerOS events
|
|
124
|
+
*/
|
|
125
|
+
declare function sourceDataLayer(init?: Partial<Settings>): Source.Init<DataLayerSourceConfig> & {
|
|
126
|
+
init?: (collector: Collector.Instance, config: {
|
|
127
|
+
settings: Settings;
|
|
128
|
+
}) => void;
|
|
129
|
+
settings?: Settings;
|
|
130
|
+
type?: string;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, sourceDataLayer };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { WalkerOS, Source, Mapping, Collector } from '@walkeros/core';
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
dataLayer?: DataLayer;
|
|
6
|
+
[key: string]: DataLayer | unknown;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
interface DataLayerSourceConfig extends Source.Config {
|
|
10
|
+
type: 'dataLayer';
|
|
11
|
+
settings: Settings;
|
|
12
|
+
}
|
|
13
|
+
type DataLayer = Array<unknown>;
|
|
14
|
+
interface Settings extends Record<string, unknown> {
|
|
15
|
+
name?: string;
|
|
16
|
+
prefix?: string;
|
|
17
|
+
filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;
|
|
18
|
+
}
|
|
19
|
+
type DataLayerEvent = {
|
|
20
|
+
event: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
};
|
|
23
|
+
type MappedEvent = {
|
|
24
|
+
event?: WalkerOS.DeepPartialEvent & {
|
|
25
|
+
id: string;
|
|
26
|
+
};
|
|
27
|
+
command?: {
|
|
28
|
+
name: string;
|
|
29
|
+
data: unknown;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type index_DataLayer = DataLayer;
|
|
34
|
+
type index_DataLayerEvent = DataLayerEvent;
|
|
35
|
+
type index_DataLayerSourceConfig = DataLayerSourceConfig;
|
|
36
|
+
type index_MappedEvent = MappedEvent;
|
|
37
|
+
type index_Settings = Settings;
|
|
38
|
+
declare namespace index {
|
|
39
|
+
export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_DataLayerSourceConfig as DataLayerSourceConfig, index_MappedEvent as MappedEvent, index_Settings as Settings };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Sample gtag events that would be pushed to dataLayer
|
|
44
|
+
* These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* Consent Mode Events - Primary use case
|
|
48
|
+
*/
|
|
49
|
+
declare function consentUpdate$1(): unknown[];
|
|
50
|
+
declare function consentDefault(): unknown[];
|
|
51
|
+
/**
|
|
52
|
+
* E-commerce Events
|
|
53
|
+
*/
|
|
54
|
+
declare function purchase$1(): unknown[];
|
|
55
|
+
declare function add_to_cart$1(): unknown[];
|
|
56
|
+
declare function view_item$1(): unknown[];
|
|
57
|
+
/**
|
|
58
|
+
* Config Events
|
|
59
|
+
*/
|
|
60
|
+
declare function config$1(): unknown[];
|
|
61
|
+
/**
|
|
62
|
+
* Set Events
|
|
63
|
+
*/
|
|
64
|
+
declare function setCustom(): unknown[];
|
|
65
|
+
/**
|
|
66
|
+
* Direct dataLayer object pushes (not gtag)
|
|
67
|
+
*/
|
|
68
|
+
declare function directDataLayerEvent(): Record<string, unknown>;
|
|
69
|
+
|
|
70
|
+
declare const events_consentDefault: typeof consentDefault;
|
|
71
|
+
declare const events_directDataLayerEvent: typeof directDataLayerEvent;
|
|
72
|
+
declare const events_setCustom: typeof setCustom;
|
|
73
|
+
declare namespace events {
|
|
74
|
+
export { add_to_cart$1 as add_to_cart, config$1 as config, events_consentDefault as consentDefault, consentUpdate$1 as consentUpdate, events_directDataLayerEvent as directDataLayerEvent, purchase$1 as purchase, events_setCustom as setCustom, view_item$1 as view_item };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Consent Mode Mapping - Primary use case
|
|
79
|
+
* Maps gtag consent events to walker consent commands
|
|
80
|
+
*/
|
|
81
|
+
declare const consentUpdate: Mapping.Rule;
|
|
82
|
+
/**
|
|
83
|
+
* E-commerce Event Mappings
|
|
84
|
+
* Transform GA4 ecommerce events to WalkerOS events
|
|
85
|
+
*/
|
|
86
|
+
declare const purchase: Mapping.Rule;
|
|
87
|
+
declare const add_to_cart: Mapping.Rule;
|
|
88
|
+
declare const view_item: Mapping.Rule;
|
|
89
|
+
/**
|
|
90
|
+
* Config Event Mapping
|
|
91
|
+
* Transform GA4 config events to WalkerOS page events
|
|
92
|
+
*/
|
|
93
|
+
declare const configGA4: Mapping.Rule;
|
|
94
|
+
/**
|
|
95
|
+
* Custom Event Mapping
|
|
96
|
+
* Handle direct dataLayer pushes
|
|
97
|
+
*/
|
|
98
|
+
declare const customEvent: Mapping.Rule;
|
|
99
|
+
/**
|
|
100
|
+
* Complete mapping configuration
|
|
101
|
+
* Following the same pattern as destination mappings
|
|
102
|
+
*/
|
|
103
|
+
declare const config: Mapping.Rules;
|
|
104
|
+
/**
|
|
105
|
+
* Minimal consent-only mapping for focused use cases
|
|
106
|
+
*/
|
|
107
|
+
declare const consentOnlyMapping: Mapping.Rules;
|
|
108
|
+
|
|
109
|
+
declare const mapping_add_to_cart: typeof add_to_cart;
|
|
110
|
+
declare const mapping_config: typeof config;
|
|
111
|
+
declare const mapping_configGA4: typeof configGA4;
|
|
112
|
+
declare const mapping_consentOnlyMapping: typeof consentOnlyMapping;
|
|
113
|
+
declare const mapping_consentUpdate: typeof consentUpdate;
|
|
114
|
+
declare const mapping_customEvent: typeof customEvent;
|
|
115
|
+
declare const mapping_purchase: typeof purchase;
|
|
116
|
+
declare const mapping_view_item: typeof view_item;
|
|
117
|
+
declare namespace mapping {
|
|
118
|
+
export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* DataLayer source factory function
|
|
123
|
+
* Intercepts dataLayer.push calls and transforms them to WalkerOS events
|
|
124
|
+
*/
|
|
125
|
+
declare function sourceDataLayer(init?: Partial<Settings>): Source.Init<DataLayerSourceConfig> & {
|
|
126
|
+
init?: (collector: Collector.Instance, config: {
|
|
127
|
+
settings: Settings;
|
|
128
|
+
}) => void;
|
|
129
|
+
settings?: Settings;
|
|
130
|
+
type?: string;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, sourceDataLayer };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function _array_like_to_array(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function _array_with_holes(e){if(Array.isArray(e))return e}function _array_without_holes(e){if(Array.isArray(e))return _array_like_to_array(e)}function _define_property(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _iterable_to_array(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _iterable_to_array_limit(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o=[],i=!0,u=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);i=!0);}catch(e){u=!0,a=e}finally{try{i||null==r.return||r.return()}finally{if(u)throw a}}return o}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_define_property(e,t,r[t])})}return e}function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function _object_spread_props(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function _sliced_to_array(e,t){return _array_with_holes(e)||_iterable_to_array_limit(e,t)||_unsupported_iterable_to_array(e,t)||_non_iterable_rest()}function _to_consumable_array(e){return _array_without_holes(e)||_iterable_to_array(e)||_unsupported_iterable_to_array(e)||_non_iterable_spread()}function _type_of(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function _unsupported_iterable_to_array(e,t){if(e){if("string"==typeof e)return _array_like_to_array(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(r):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_array_like_to_array(e,t):void 0}}var Destination=function(){var e,t,r=function(e){return Array.isArray(e)},n=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!r(e)&&"[object Object]"===Object.prototype.toString.call(e)},a=function(e){return"string"==typeof e},o=function(e,t,r){return function(){for(var n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];try{return e.apply(void 0,_to_consumable_array(a))}catch(e){if(!t)return;return t(e)}finally{null==r||r()}}},i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0;if(t.filter&&!0===o(function(){return t.filter(r)},function(){return!1})())return;var n=u(r);if(n){var a=t.prefix||"dataLayer",i={event:"".concat(a," ").concat(n.event),data:n,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:s(),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};o(function(){return e.push(i)},function(){})()}},u=function(e){if(n(e)&&a(e.event))return e;if(r(e)&&e.length>=2)return c(e);if(l(e)){var t=Array.from(e);return c(t)}return null},c=function(e){var t,r=_sliced_to_array(e,3),o=r[0],i=r[1],u=r[2];if(!a(o))return null;var c={};switch(o){case"consent":if(!a(i)||e.length<3)return null;if(!n(u)||null===u)return null;t="".concat(o," ").concat(i),c=_object_spread({},u);break;case"event":if(!a(i))return null;t=i,n(u)&&(c=_object_spread({},u));break;case"config":if(!a(i))return null;t="".concat(o," ").concat(i),n(u)&&(c=_object_spread({},u));break;case"set":if(a(i))t="".concat(o," ").concat(i),n(u)&&(c=_object_spread({},u));else{if(!n(i))return null;t="".concat(o," custom"),c=_object_spread({},i)}break;default:return null}return _object_spread({event:t},c)},l=function(e){return null!=e&&"object"===(void 0===e?"undefined":_type_of(e))&&"length"in e&&"number"==typeof e.length&&e.length>0},s=function(){return Math.random().toString(36).substring(2,15)},d=function(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]},y=function(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]},f=function(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]},_=function(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]},p=function(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]},m=function(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]},b=function(){return["set",{currency:"EUR",country:"DE"}]},v=function(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}},g=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=function(t,r){var n=_object_spread_props(_object_spread({},r),{settings:_object_spread({name:"dataLayer",prefix:"dataLayer"},e,r.settings)});return T(t,n)};return t.init=function(e,t){return T(e,{type:"dataLayer",settings:t.settings})},t.settings=_object_spread({name:"dataLayer",prefix:"dataLayer"},e),t.type="dataLayer",t},w=Object.defineProperty,h=Object.getOwnPropertyDescriptor,j=Object.getOwnPropertyNames,O=Object.prototype.hasOwnProperty,k=function(e,t){for(var r in t)w(e,r,{get:t[r],enumerable:!0})},S={};k(S,{Events:function(){return x},Mapping:function(){return L},SourceDataLayer:function(){return X},consentOnlyMapping:function(){return N},consentUpdateEvent:function(){return d},dataLayerExamples:function(){return K},default:function(){return G},sourceDataLayer:function(){return g}});var A=Object.getOwnPropertyNames,P=((e={"package.json":function(e,t){t.exports={name:"@walkeros/core",description:"Core types and platform-agnostic utilities for walkerOS",version:"0.0.7",main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",license:"MIT",files:["dist/**"],scripts:{build:"tsup --silent",clean:"rm -rf .turbo && rm -rf node_modules && rm -rf dist",dev:"jest --watchAll --colors",lint:'tsc && eslint "**/*.ts*"',test:"jest",update:"npx npm-check-updates -u && npm update"},dependencies:{},devDependencies:{},repository:{url:"git+https://github.com/elbwalker/walkerOS.git",directory:"packages/core"},author:"elbwalker <hello@elbwalker.com>",homepage:"https://github.com/elbwalker/walkerOS#readme",bugs:{url:"https://github.com/elbwalker/walkerOS/issues"},keywords:["walker","walkerOS","analytics","tracking","data collection","measurement","data privacy","privacy friendly","web analytics","product analytics","core","types","utils"],funding:[{type:"GitHub Sponsors",url:"https://github.com/sponsors/elbwalker"}]}}},function(){return t||(0,e[A(e)[0]])((t={exports:{}}).exports,t),t.exports})().version,!1),X={},x={};k(x,{add_to_cart:function(){return _},config:function(){return m},consentDefault:function(){return y},consentUpdate:function(){return d},directDataLayerEvent:function(){return v},purchase:function(){return f},setCustom:function(){return b},view_item:function(){return p}});var L={};k(L,{add_to_cart:function(){return M},config:function(){return K},configGA4:function(){return C},consentOnlyMapping:function(){return N},consentUpdate:function(){return E},customEvent:function(){return I},purchase:function(){return U},view_item:function(){return q}});var D,E={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:function(e){return"granted"===e}},marketing:{key:"ad_storage",fn:function(e){return"granted"===e}}}}}},U={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},M={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},q={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},C={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},I={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},K={consent:{update:E},purchase:U,add_to_cart:M,view_item:q,"config G-XXXXXXXXXX":C,custom_event:I,"*":{data:{}}},N={consent:{update:E}},T=function(e,t){var r=t.settings,n={type:"dataLayer",config:t,collector:e,destroy:function(){var e=r.name||"dataLayer";window[e]&&Array.isArray(window[e])}};!function(e,t){var r=t.settings,n=(null==r?void 0:r.name)||"dataLayer",a=window[n];if(Array.isArray(a)&&!P){P=!0;try{var o=!0,u=!1,c=void 0;try{for(var l,s=a[Symbol.iterator]();!(o=(l=s.next()).done);o=!0){var d=l.value;i(e,r,d)}}catch(e){u=!0,c=e}finally{try{o||null==s.return||s.return()}finally{if(u)throw c}}}finally{P=!1}}}(e,t),function(e,t){var r=t.settings,n=(null==r?void 0:r.name)||"dataLayer";window[n]||(window[n]=[]);var a=window[n];if(Array.isArray(a)){var o=a.push.bind(a);a.push=function(){for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];if(P)return o.apply(void 0,_to_consumable_array(n));P=!0;try{var u=!0,c=!1,l=void 0;try{for(var s,d=n[Symbol.iterator]();!(u=(s=d.next()).done);u=!0){var y=s.value;i(e,r,y)}}catch(e){c=!0,l=e}finally{try{u||null==d.return||d.return()}finally{if(c)throw l}}}finally{P=!1}return o.apply(void 0,_to_consumable_array(n))}}}(e,t);return{source:n,elb:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var a,o=r.name||"dataLayer",i=window[o];return Array.isArray(i)?Promise.resolve((a=i).push.apply(a,_to_consumable_array(t))):Promise.resolve(0)}}},G=g;return D=S,function(e,t,r,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var a=!0,o=!1,i=void 0;try{for(var u,c=function(){var a=u.value;O.call(e,a)||a===r||w(e,a,{get:function(){return t[a]},enumerable:!(n=h(t,a))||n.enumerable})},l=j(t)[Symbol.iterator]();!(a=(u=l.next()).done);a=!0)c()}catch(e){o=!0,i=e}finally{try{a||null==l.return||l.return()}finally{if(o)throw i}}}return e}(w({},"__esModule",{value:!0}),D)}();
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i=(e,n)=>{for(var r in n)t(e,r,{get:n[r],enumerable:!0})},o={};i(o,{Events:()=>l,Mapping:()=>X,SourceDataLayer:()=>m,consentOnlyMapping:()=>P,consentUpdateEvent:()=>y,dataLayerExamples:()=>E,default:()=>$,sourceDataLayer:()=>k}),module.exports=(e=o,((e,i,o,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of r(i))a.call(e,s)||s===o||t(e,s,{get:()=>i[s],enumerable:!(c=n(i,s))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core"),s=!1;function u(e,t={},n){if(t.filter){if(!0===(0,c.tryCatch)(()=>t.filter(n),()=>!1)())return}const r=function(e){if((0,c.isObject)(e)&&(0,c.isString)(e.event))return e;if((0,c.isArray)(e)&&e.length>=2)return d(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return d(Array.from(e))}var t;return null}(n);if(!r)return;const a={event:`${t.prefix||"dataLayer"} ${r.event}`,data:r,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};(0,c.tryCatch)(()=>e.push(a),()=>{})()}function d(e){const[t,n,r]=e;if(!(0,c.isString)(t))return null;let a,i={};switch(t){case"consent":if(!(0,c.isString)(n)||e.length<3)return null;if(!(0,c.isObject)(r)||null===r)return null;a=`${t} ${n}`,i={...r};break;case"event":if(!(0,c.isString)(n))return null;a=n,(0,c.isObject)(r)&&(i={...r});break;case"config":if(!(0,c.isString)(n))return null;a=`${t} ${n}`,(0,c.isObject)(r)&&(i={...r});break;case"set":if((0,c.isString)(n))a=`${t} ${n}`,(0,c.isObject)(r)&&(i={...r});else{if(!(0,c.isObject)(n))return null;a=`${t} custom`,i={...n}}break;default:return null}return{event:a,...i}}var m={},l={};function y(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function p(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function g(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function f(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function _(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function v(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function w(){return["set",{currency:"EUR",country:"DE"}]}function b(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}i(l,{add_to_cart:()=>f,config:()=>v,consentDefault:()=>p,consentUpdate:()=>y,directDataLayerEvent:()=>b,purchase:()=>g,setCustom:()=>w,view_item:()=>_});var X={};i(X,{add_to_cart:()=>O,config:()=>E,configGA4:()=>A,consentOnlyMapping:()=>P,consentUpdate:()=>h,customEvent:()=>S,purchase:()=>L,view_item:()=>j});var h={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},L={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},O={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},j={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},A={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},S={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},E={consent:{update:h},purchase:L,add_to_cart:O,view_item:j,"config G-XXXXXXXXXX":A,custom_event:S,"*":{data:{}}},P={consent:{update:h}},U=(e,t)=>{const{settings:n}=t,r={type:"dataLayer",config:t,collector:e,destroy(){const e=n.name||"dataLayer";window[e]&&Array.isArray(window[e])}};!function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer",a=window[r];if(Array.isArray(a)&&!s){s=!0;try{for(const t of a)u(e,n,t)}finally{s=!1}}}(e,t),function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer";window[r]||(window[r]=[]);const a=window[r];if(!Array.isArray(a))return;const i=a.push.bind(a);a.push=function(...t){if(s)return i(...t);s=!0;try{for(const r of t)u(e,n,r)}finally{s=!1}return i(...t)}}(e,t);return{source:r,elb:(...e)=>{const t=n.name||"dataLayer",r=window[t];return Array.isArray(r)?Promise.resolve(r.push(...e)):Promise.resolve(0)}}};function k(e={}){const t=(t,n)=>{const r={...n,settings:{name:"dataLayer",prefix:"dataLayer",...e,...n.settings}};return U(t,r)};return t.init=(e,t)=>U(e,{type:"dataLayer",settings:t.settings}),t.settings={name:"dataLayer",prefix:"dataLayer",...e},t.type="dataLayer",t}var $=k;//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/interceptor.ts","../src/types/index.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Collector, WalkerOS, Source } from '@walkeros/core';\nimport type { Settings, DataLayerSourceConfig } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\nimport { getId } from '@walkeros/core';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source initialization function\n * Sets up dataLayer interception and processes existing events\n */\nconst initDataLayerSource: Source.Init<DataLayerSourceConfig> = (\n collector: Collector.Instance,\n config: DataLayerSourceConfig,\n) => {\n const { settings } = config;\n\n // Create the source instance\n const source: Source.Instance<DataLayerSourceConfig> = {\n type: 'dataLayer',\n config,\n collector,\n destroy() {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (window[dataLayerName] && Array.isArray(window[dataLayerName])) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n\n // Process existing events in dataLayer\n processExistingEvents(collector, config);\n\n // Set up interception for new events\n interceptDataLayer(collector, config);\n\n // Create dataLayer-specific elb function\n const elb: WalkerOS.AnyFunction = (...args: unknown[]) => {\n // DataLayer source doesn't typically expose its own elb function\n // Users push directly to dataLayer, not to the source\n // But we can provide a convenience function for direct push\n const dataLayerName = settings.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (Array.isArray(dataLayer)) {\n return Promise.resolve(dataLayer.push(...args));\n }\n\n return Promise.resolve(0);\n };\n\n return { source, elb };\n};\n\n/**\n * DataLayer source factory function\n * Intercepts dataLayer.push calls and transforms them to WalkerOS events\n */\nexport function sourceDataLayer(\n init: Partial<Settings> = {},\n): Source.Init<DataLayerSourceConfig> & {\n init?: (\n collector: Collector.Instance,\n config: { settings: Settings },\n ) => void;\n settings?: Settings;\n type?: string;\n} {\n const sourceInit = (\n collector: Collector.Instance,\n config: DataLayerSourceConfig,\n ) => {\n // Merge provided settings with defaults\n const fullConfig: DataLayerSourceConfig = {\n ...config,\n settings: {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...init,\n ...config.settings,\n },\n };\n\n return initDataLayerSource(collector, fullConfig);\n };\n\n // Add backward compatibility properties for tests\n sourceInit.init = (\n collector: Collector.Instance,\n config: { settings: Settings },\n ) => {\n return initDataLayerSource(collector, {\n type: 'dataLayer',\n settings: config.settings,\n } as DataLayerSourceConfig);\n };\n\n sourceInit.settings = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...init,\n };\n\n sourceInit.type = 'dataLayer';\n\n return sourceInit;\n}\n\nexport default sourceDataLayer;\n","import type { InitSource } from '@walkeros/collector';\nimport type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n collector: Collector.Instance,\n config: InitSource,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(collector, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n collector: Collector.Instance,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(collector, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n collector: Collector.Instance,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.event}`;\n\n // Create WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n event: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to collector\n tryCatch(\n () => collector.push(walkerEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { event: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n return rawEvent as { event: string; [key: string]: unknown };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { event: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n event: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\n// DataLayer source configuration extending core source config\nexport interface DataLayerSourceConfig extends Source.Config {\n type: 'dataLayer';\n settings: Settings;\n}\n\nexport type DataLayer = Array<unknown>;\n\nexport interface Settings extends Record<string, unknown> {\n name?: string; // dataLayer variable name (default: 'dataLayer')\n prefix?: string; // Event prefix (default: 'gtag')\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n"],"mappings":"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","names":["config","config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,t=(t,a)=>{for(var n in a)e(t,n,{get:a[n],enumerable:!0})};import{isArray as a,isObject as n,isString as r,tryCatch as i}from"@walkeros/core";var o=!1;function c(e,t={},o){if(t.filter){if(!0===i(()=>t.filter(o),()=>!1)())return}const c=function(e){if(n(e)&&r(e.event))return e;if(a(e)&&e.length>=2)return s(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return s(Array.from(e))}var t;return null}(o);if(!c)return;const u={event:`${t.prefix||"dataLayer"} ${c.event}`,data:c,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};i(()=>e.push(u),()=>{})()}function s(e){const[t,a,i]=e;if(!r(t))return null;let o,c={};switch(t){case"consent":if(!r(a)||e.length<3)return null;if(!n(i)||null===i)return null;o=`${t} ${a}`,c={...i};break;case"event":if(!r(a))return null;o=a,n(i)&&(c={...i});break;case"config":if(!r(a))return null;o=`${t} ${a}`,n(i)&&(c={...i});break;case"set":if(r(a))o=`${t} ${a}`,n(i)&&(c={...i});else{if(!n(a))return null;o=`${t} custom`,c={...a}}break;default:return null}return{event:o,...c}}var u={},d={};function m(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function l(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function y(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function p(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function _(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function f(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function g(){return["set",{currency:"EUR",country:"DE"}]}function v(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}t(d,{add_to_cart:()=>p,config:()=>f,consentDefault:()=>l,consentUpdate:()=>m,directDataLayerEvent:()=>v,purchase:()=>y,setCustom:()=>g,view_item:()=>_});var w={};t(w,{add_to_cart:()=>L,config:()=>U,configGA4:()=>A,consentOnlyMapping:()=>k,consentUpdate:()=>X,customEvent:()=>E,purchase:()=>h,view_item:()=>b});var X={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},h={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},L={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},b={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},A={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},E={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},U={consent:{update:X},purchase:h,add_to_cart:L,view_item:b,"config G-XXXXXXXXXX":A,custom_event:E,"*":{data:{}}},k={consent:{update:X}},$=(e,t)=>{const{settings:a}=t,n={type:"dataLayer",config:t,collector:e,destroy(){const e=a.name||"dataLayer";window[e]&&Array.isArray(window[e])}};!function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer",r=window[n];if(Array.isArray(r)&&!o){o=!0;try{for(const t of r)c(e,a,t)}finally{o=!1}}}(e,t),function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer";window[n]||(window[n]=[]);const r=window[n];if(!Array.isArray(r))return;const i=r.push.bind(r);r.push=function(...t){if(o)return i(...t);o=!0;try{for(const n of t)c(e,a,n)}finally{o=!1}return i(...t)}}(e,t);return{source:n,elb:(...e)=>{const t=a.name||"dataLayer",n=window[t];return Array.isArray(n)?Promise.resolve(n.push(...e)):Promise.resolve(0)}}};function x(e={}){const t=(t,a)=>{const n={...a,settings:{name:"dataLayer",prefix:"dataLayer",...e,...a.settings}};return $(t,n)};return t.init=(e,t)=>$(e,{type:"dataLayer",settings:t.settings}),t.settings={name:"dataLayer",prefix:"dataLayer",...e},t.type="dataLayer",t}var P=x;export{d as Events,w as Mapping,u as SourceDataLayer,k as consentOnlyMapping,m as consentUpdateEvent,U as dataLayerExamples,P as default,x as sourceDataLayer};//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["import type { InitSource } from '@walkeros/collector';\nimport type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n collector: Collector.Instance,\n config: InitSource,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(collector, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n collector: Collector.Instance,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(collector, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n collector: Collector.Instance,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.event}`;\n\n // Create WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n event: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to collector\n tryCatch(\n () => collector.push(walkerEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { event: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n return rawEvent as { event: string; [key: string]: unknown };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { event: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n event: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\n// DataLayer source configuration extending core source config\nexport interface DataLayerSourceConfig extends Source.Config {\n type: 'dataLayer';\n settings: Settings;\n}\n\nexport type DataLayer = Array<unknown>;\n\nexport interface Settings extends Record<string, unknown> {\n name?: string; // dataLayer variable name (default: 'dataLayer')\n prefix?: string; // Event prefix (default: 'gtag')\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n","import type { Collector, WalkerOS, Source } from '@walkeros/core';\nimport type { Settings, DataLayerSourceConfig } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\nimport { getId } from '@walkeros/core';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source initialization function\n * Sets up dataLayer interception and processes existing events\n */\nconst initDataLayerSource: Source.Init<DataLayerSourceConfig> = (\n collector: Collector.Instance,\n config: DataLayerSourceConfig,\n) => {\n const { settings } = config;\n\n // Create the source instance\n const source: Source.Instance<DataLayerSourceConfig> = {\n type: 'dataLayer',\n config,\n collector,\n destroy() {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (window[dataLayerName] && Array.isArray(window[dataLayerName])) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n\n // Process existing events in dataLayer\n processExistingEvents(collector, config);\n\n // Set up interception for new events\n interceptDataLayer(collector, config);\n\n // Create dataLayer-specific elb function\n const elb: WalkerOS.AnyFunction = (...args: unknown[]) => {\n // DataLayer source doesn't typically expose its own elb function\n // Users push directly to dataLayer, not to the source\n // But we can provide a convenience function for direct push\n const dataLayerName = settings.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (Array.isArray(dataLayer)) {\n return Promise.resolve(dataLayer.push(...args));\n }\n\n return Promise.resolve(0);\n };\n\n return { source, elb };\n};\n\n/**\n * DataLayer source factory function\n * Intercepts dataLayer.push calls and transforms them to WalkerOS events\n */\nexport function sourceDataLayer(\n init: Partial<Settings> = {},\n): Source.Init<DataLayerSourceConfig> & {\n init?: (\n collector: Collector.Instance,\n config: { settings: Settings },\n ) => void;\n settings?: Settings;\n type?: string;\n} {\n const sourceInit = (\n collector: Collector.Instance,\n config: DataLayerSourceConfig,\n ) => {\n // Merge provided settings with defaults\n const fullConfig: DataLayerSourceConfig = {\n ...config,\n settings: {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...init,\n ...config.settings,\n },\n };\n\n return initDataLayerSource(collector, fullConfig);\n };\n\n // Add backward compatibility properties for tests\n sourceInit.init = (\n collector: Collector.Instance,\n config: { settings: Settings },\n ) => {\n return initDataLayerSource(collector, {\n type: 'dataLayer',\n settings: config.settings,\n } as DataLayerSourceConfig);\n };\n\n sourceInit.settings = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...init,\n };\n\n sourceInit.type = 'dataLayer';\n\n return sourceInit;\n}\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":["config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@walkeros/web-source-datalayer",
|
|
3
|
+
"description": "DataLayer source for walkerOS",
|
|
4
|
+
"version": "0.0.7",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./examples": {
|
|
16
|
+
"types": "./dist/examples/index.d.ts",
|
|
17
|
+
"import": "./dist/examples/index.mjs",
|
|
18
|
+
"require": "./dist/examples/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist/**"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup --silent",
|
|
26
|
+
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
|
|
27
|
+
"dev": "jest --watchAll --colors",
|
|
28
|
+
"lint": "tsc && eslint \"**/*.ts*\"",
|
|
29
|
+
"test": "jest",
|
|
30
|
+
"update": "npx npm-check-updates -u && npm update"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@walkeros/core": "0.0.7",
|
|
34
|
+
"@walkeros/collector": "0.0.7"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/gtag.js": "^0.0.20"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"url": "git+https://github.com/elbwalker/walkerOS.git",
|
|
41
|
+
"directory": "packages/web/sources/dataLayer"
|
|
42
|
+
},
|
|
43
|
+
"author": "elbwalker <hello@elbwalker.com>",
|
|
44
|
+
"homepage": "https://github.com/elbwalker/walkerOS#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/elbwalker/walkerOS/issues"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"walker",
|
|
50
|
+
"walkerOS",
|
|
51
|
+
"source",
|
|
52
|
+
"web",
|
|
53
|
+
"dataLayer"
|
|
54
|
+
],
|
|
55
|
+
"funding": [
|
|
56
|
+
{
|
|
57
|
+
"type": "GitHub Sponsors",
|
|
58
|
+
"url": "https://github.com/sponsors/elbwalker"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|