+ data-elbactions="TRIGGER:ACTION"
data-elbcontext="KEY:VALUE"
data-elbglobals="KEY:VALUE"
/>
@@ -120,10 +121,22 @@ You define the entity **scope** by setting the `data-elb` attribute with the
name of an entity to an element, e.g. `data-elb="promotion"`. The default entity
is `page` when no `data-elb` is set.
-An **action** can be added by setting the `data-elbaction` attribute on the
-**same level** or **child elements** in combination with a **matching trigger**,
-e.g., `data-elbaction="visible:view"` to fire a promotion view event when an
-element has been in the viewport for at least 50% for one second.
+An **action** can be added by setting one of the following attributes on the
+**same level** or **child elements** in combination with a **matching trigger**:
+
+- **`data-elbaction`** - applies action to the **nearest entity only**
+- **`data-elbactions`** - applies action to **all entities** in the DOM hierarchy
+
+Both attributes use the same syntax, e.g., `data-elbaction="visible:view"` or
+`data-elbactions="click:select"` to fire events when triggered.
+
+:::info Migration Note
+
+The behavior of `data-elbaction` changed in @walkeros to apply to nearest entity only.
+For the previous @elbwalker "all entities" behavior, use `data-elbactions`.
+See the [Migration Guide](/docs/guides/migration#data-elbaction-vs-data-elbactions) for details.
+
+:::
To define the entities' **properties**, set the **composited attribute**
`data-elb-ENTITY` with the key and value, e.g.
@@ -180,10 +193,10 @@ gets triggered. Use brackets behind the trigger to pass that information.
### Action filter
At some point, you might want to nest one entity inside another. To prevent an
-action to trigger both entities, you can restrict the action to a specific
-entity by adding the name, e.g. `data-elbaction="load:view(product)`. If the
-trigger event gets called, the result will only include the property values from
-the specific entities.
+action to trigger unwanted entities, you can restrict the action to a specific
+entity by adding the name, e.g. `data-elbaction="load:view(product)` or
+`data-elbactions="load:view(product)"`. If the trigger event gets called,
+the result will only include the property values from the specific entities.
```html
From c651e6e446aa1ad8a71fd54a19ca0fa59526fbf2 Mon Sep 17 00:00:00 2001
From: alexander
Date: Fri, 5 Sep 2025 17:38:58 +0200
Subject: [PATCH 07/13] visible and impression
---
.../browser/src/__tests__/tagger.test.ts | 20 +++----
.../browser/src/__tests__/trigger.test.ts | 1 +
.../src/__tests__/triggerVisible.test.ts | 8 ++-
packages/web/sources/browser/src/trigger.ts | 6 +-
.../web/sources/browser/src/triggerVisible.ts | 5 +-
website/docs/guides/migration.mdx | 56 +++++++++++++++++++
website/docs/sources/web/browser/tagger.mdx | 9 +--
website/docs/sources/web/browser/tagging.mdx | 21 ++++---
8 files changed, 93 insertions(+), 33 deletions(-)
diff --git a/packages/web/sources/browser/src/__tests__/tagger.test.ts b/packages/web/sources/browser/src/__tests__/tagger.test.ts
index fc6398d1e..bd7181835 100644
--- a/packages/web/sources/browser/src/__tests__/tagger.test.ts
+++ b/packages/web/sources/browser/src/__tests__/tagger.test.ts
@@ -149,10 +149,10 @@ describe('Tagger', () => {
test('object with multiple actions', () => {
const result = createTagger()()
- .action({ load: 'view', click: 'select', visible: 'impression' })
+ .action({ load: 'view', click: 'select', impression: 'view' })
.get();
expect(result).toMatchObject({
- 'data-elbaction': 'load:view;click:select;visible:impression',
+ 'data-elbaction': 'load:view;click:select;impression:view',
});
});
@@ -160,10 +160,10 @@ describe('Tagger', () => {
const result = createTagger()()
.action('load', 'view')
.action('click', 'select')
- .action({ visible: 'impression' })
+ .action({ impression: 'view' })
.get();
expect(result).toMatchObject({
- 'data-elbaction': 'load:view;click:select;visible:impression',
+ 'data-elbaction': 'load:view;click:select;impression:view',
});
});
@@ -198,10 +198,10 @@ describe('Tagger', () => {
test('object with multiple actions', () => {
const result = createTagger()()
- .actions({ load: 'view', click: 'select', visible: 'impression' })
+ .actions({ load: 'view', click: 'select', impression: 'view' })
.get();
expect(result).toMatchObject({
- 'data-elbactions': 'load:view;click:select;visible:impression',
+ 'data-elbactions': 'load:view;click:select;impression:view',
});
});
@@ -209,10 +209,10 @@ describe('Tagger', () => {
const result = createTagger()()
.actions('load', 'view')
.actions({ click: 'select' })
- .actions('visible:impression')
+ .actions('impression:view')
.get();
expect(result).toMatchObject({
- 'data-elbactions': 'load:view;click:select;visible:impression',
+ 'data-elbactions': 'load:view;click:select;impression:view',
});
});
@@ -395,14 +395,14 @@ describe('Tagger', () => {
test('full chain without entity (generic)', () => {
const result = createTagger()()
.data({ category: 'electronics', brand: 'TechCorp' })
- .action({ load: 'view', visible: 'impression' })
+ .action({ load: 'view', impression: 'view' })
.context({ test: 'a/b', position: 'header' })
.globals({ lang: 'en', plan: 'paid' })
.get();
expect(result).toMatchObject({
'data-elb-': 'category:electronics;brand:TechCorp',
- 'data-elbaction': 'load:view;visible:impression',
+ 'data-elbaction': 'load:view;impression:view',
'data-elbcontext': 'test:a/b;position:header',
'data-elbglobals': 'lang:en;plan:paid',
});
diff --git a/packages/web/sources/browser/src/__tests__/trigger.test.ts b/packages/web/sources/browser/src/__tests__/trigger.test.ts
index d3e392efa..cf5fc1784 100644
--- a/packages/web/sources/browser/src/__tests__/trigger.test.ts
+++ b/packages/web/sources/browser/src/__tests__/trigger.test.ts
@@ -86,6 +86,7 @@ describe('Trigger System', () => {
expect(Triggers.Load).toBe('load');
expect(Triggers.Hover).toBe('hover');
expect(Triggers.Submit).toBe('submit');
+ expect(Triggers.Impression).toBe('impression');
expect(Triggers.Visible).toBe('visible');
expect(Triggers.Scroll).toBe('scroll');
expect(Triggers.Pulse).toBe('pulse');
diff --git a/packages/web/sources/browser/src/__tests__/triggerVisible.test.ts b/packages/web/sources/browser/src/__tests__/triggerVisible.test.ts
index df21a4345..d980e71ad 100644
--- a/packages/web/sources/browser/src/__tests__/triggerVisible.test.ts
+++ b/packages/web/sources/browser/src/__tests__/triggerVisible.test.ts
@@ -19,6 +19,7 @@ interface CollectorWithVisibility extends Collector.Instance {
multiple: boolean;
blocked: boolean;
context: Context;
+ trigger: string;
}
>;
};
@@ -47,7 +48,7 @@ jest.mock('@walkeros/web-core', () => ({
jest.mock('../trigger', () => ({
...jest.requireActual('../trigger'),
handleTrigger: jest.fn(),
- Triggers: { Visible: 'visible' },
+ Triggers: { Impression: 'impression', Visible: 'visible' },
}));
// Get references to mocked functions
@@ -146,6 +147,7 @@ describe('triggerVisible', () => {
multiple: true,
blocked: false,
context: expect.any(Object),
+ trigger: 'visible',
});
});
@@ -202,7 +204,7 @@ describe('triggerVisible', () => {
}),
}),
element,
- 'visible',
+ 'impression',
);
});
@@ -243,7 +245,7 @@ describe('triggerVisible', () => {
}),
}),
element,
- 'visible',
+ 'impression',
);
});
diff --git a/packages/web/sources/browser/src/trigger.ts b/packages/web/sources/browser/src/trigger.ts
index 4bda64d17..3cbee637e 100644
--- a/packages/web/sources/browser/src/trigger.ts
+++ b/packages/web/sources/browser/src/trigger.ts
@@ -44,8 +44,8 @@ export const Triggers: { [key: string]: Walker.Trigger } = {
Pulse: 'pulse',
Scroll: 'scroll',
Submit: 'submit',
+ Impression: 'impression',
Visible: 'visible',
- Visibles: 'visibles',
Wait: 'wait',
} as const;
@@ -195,10 +195,10 @@ function handleActionElem(
case Triggers.Scroll:
triggerScroll(elem, triggerAction.triggerParams);
break;
- case Triggers.Visible:
+ case Triggers.Impression:
triggerVisible(context, elem);
break;
- case Triggers.Visibles:
+ case Triggers.Visible:
triggerVisible(context, elem, { multiple: true });
break;
case Triggers.Wait:
diff --git a/packages/web/sources/browser/src/triggerVisible.ts b/packages/web/sources/browser/src/triggerVisible.ts
index 031376fbf..b065e94c8 100644
--- a/packages/web/sources/browser/src/triggerVisible.ts
+++ b/packages/web/sources/browser/src/triggerVisible.ts
@@ -23,7 +23,7 @@ interface VisibilityState {
duration: number;
elementConfigs?: WeakMap<
HTMLElement,
- { multiple: boolean; blocked: boolean; context: Context }
+ { multiple: boolean; blocked: boolean; context: Context; trigger: string }
>;
}
@@ -156,7 +156,7 @@ function handleIntersection(
await handleTrigger(
elementConfig.context,
target as Element,
- Triggers.Visible,
+ elementConfig.trigger,
);
}
@@ -226,6 +226,7 @@ export function triggerVisible(
multiple: config.multiple ?? false,
blocked: false,
context,
+ trigger: config.multiple ? 'visible' : 'impression',
});
state.observer.observe(element);
}
diff --git a/website/docs/guides/migration.mdx b/website/docs/guides/migration.mdx
index ff4294fd5..b9bf0b2fd 100644
--- a/website/docs/guides/migration.mdx
+++ b/website/docs/guides/migration.mdx
@@ -263,3 +263,59 @@ tagger().action('click', 'select').get()
// All entities (data-elbactions)
tagger().actions('click', 'select').get()
```
+
+## visible vs impression Triggers
+
+### Breaking Change in @walkeros packages
+
+The visibility trigger names have been updated to better reflect their behavior:
+
+- **`visible` trigger**: Now fires **multiple times** when element re-enters viewport (was `visibles`)
+- **`impression` trigger**: Fires **once only** when element first becomes visible (was `visible`)
+
+### Migration Strategy
+
+#### Option 1: Update Trigger Names (Recommended)
+
+Update your HTML to use the new trigger names:
+
+```html
+
+Single fire
+Multiple fires
+
+
+Single fire
+Multiple fires
+```
+
+#### Option 2: Understand the Behavior Change
+
+If you keep using the old names, understand the behavior has changed:
+
+- Old `visible` behavior (single-fire) → Now use `impression`
+- Old `visibles` behavior (multiple-fire) → Now use `visible`
+
+### When to Use Each
+
+**Use `impression` trigger when:**
+- You want to track when content is first seen
+- Measuring ad impressions or content views
+- One-time engagement metrics
+
+**Use `visible` trigger when:**
+- You want to track repeated interactions
+- Measuring scroll behavior or re-engagement
+- Analytics requires multiple visibility events
+
+### Tagger API
+
+The tagger supports both trigger types:
+
+```typescript
+// Single impression (fires once)
+tagger().action('impression', 'view').get()
+
+// Multiple visibility (fires each time visible)
+tagger().action('visible', 'track').get()
+```
diff --git a/website/docs/sources/web/browser/tagger.mdx b/website/docs/sources/web/browser/tagger.mdx
index d759a10d2..4cbd2133f 100644
--- a/website/docs/sources/web/browser/tagger.mdx
+++ b/website/docs/sources/web/browser/tagger.mdx
@@ -254,7 +254,7 @@ tagger().action('load', 'view');
tagger().action('load:view');
// Multiple actions
-tagger().action({ load: 'view', click: 'select', visible: 'impression' });
+tagger().action({ load: 'view', click: 'select', impression: 'view' });
```
##### `actions(trigger: string, action?: string)` | `actions(object: Record)`
@@ -269,12 +269,10 @@ tagger().actions('load', 'view');
tagger().actions('load:view');
// Multiple actions
-tagger().actions({ load: 'view', click: 'select', visible: 'impression' });
+tagger().actions({ load: 'view', click: 'select', visible: 'visible' });
// Can be combined with action() method
-tagger()
- .action('click', 'select')
- .actions('load', 'view');
+tagger().action('click', 'select').actions('load', 'view');
```
##### `context(key: string, value: Property)` | `context(object: Properties)`
@@ -415,4 +413,3 @@ function trackComponent(type, data, actions = {}) {
Sign Up
```
-
diff --git a/website/docs/sources/web/browser/tagging.mdx b/website/docs/sources/web/browser/tagging.mdx
index 639eb3d5c..3fc38d27a 100644
--- a/website/docs/sources/web/browser/tagging.mdx
+++ b/website/docs/sources/web/browser/tagging.mdx
@@ -125,16 +125,19 @@ An **action** can be added by setting one of the following attributes on the
**same level** or **child elements** in combination with a **matching trigger**:
- **`data-elbaction`** - applies action to the **nearest entity only**
-- **`data-elbactions`** - applies action to **all entities** in the DOM hierarchy
+- **`data-elbactions`** - applies action to **all entities** in the DOM
+ hierarchy
Both attributes use the same syntax, e.g., `data-elbaction="visible:view"` or
`data-elbactions="click:select"` to fire events when triggered.
:::info Migration Note
-The behavior of `data-elbaction` changed in @walkeros to apply to nearest entity only.
-For the previous @elbwalker "all entities" behavior, use `data-elbactions`.
-See the [Migration Guide](/docs/guides/migration#data-elbaction-vs-data-elbactions) for details.
+The behavior of `data-elbaction` changed in @walkeros to apply to nearest entity
+only. For the previous @elbwalker "all entities" behavior, use
+`data-elbactions`. See the
+[Migration Guide](/docs/guides/migration#data-elbaction-vs-data-elbactions) for
+details.
:::
@@ -151,8 +154,8 @@ listener or mutation observer initialization.
| ----------- | ------------------------------------------------------------------------------------ |
| load | after loading a page when DOM is ready |
| click | when an element or a child is clicked |
-| visible | after an element has been in the viewport for at least 50% for one second |
-| visibles | each time an element re-enters the viewport after being out of view |
+| impression | after an element has been in the viewport for at least 50% for one second |
+| visible | each time an element re-enters the viewport after being out of view |
| hover | each time the mouse enters the corresponding element |
| submit | on valid form submission |
| wait(ms) | waits ms seconds (15 seconds by default) until triggering |
@@ -194,9 +197,9 @@ gets triggered. Use brackets behind the trigger to pass that information.
At some point, you might want to nest one entity inside another. To prevent an
action to trigger unwanted entities, you can restrict the action to a specific
-entity by adding the name, e.g. `data-elbaction="load:view(product)` or
-`data-elbactions="load:view(product)"`. If the trigger event gets called,
-the result will only include the property values from the specific entities.
+entity by adding the name, e.g. `data-elbaction="load:view(product)` or
+`data-elbactions="load:view(product)"`. If the trigger event gets called, the
+result will only include the property values from the specific entities.
```html
From 88661eddd1b8ede51833a47250d234bf154ba19c Mon Sep 17 00:00:00 2001
From: alexander
Date: Sat, 6 Sep 2025 13:49:02 +0200
Subject: [PATCH 08/13] entity
---
packages/core/README.md | 2 +-
packages/core/src/__tests__/eventGenerator.test.ts | 2 +-
packages/core/src/__tests__/mapping.test.ts | 4 ++--
packages/core/src/eventGenerator.ts | 14 +++++++-------
packages/core/src/types/walkeros.ts | 2 +-
.../server/core/src/__tests__/destination.test.ts | 4 ++--
.../destinations/meta/src/examples/events.ts | 2 +-
.../destinations/meta/src/examples/mapping.ts | 4 ++--
packages/web/destinations/gtag/README.md | 2 +-
.../web/destinations/gtag/src/examples/events.ts | 2 +-
.../web/destinations/gtag/src/examples/mapping.ts | 4 ++--
.../web/destinations/meta/src/examples/events.ts | 7 ++++---
.../web/destinations/meta/src/examples/mapping.ts | 8 ++++----
.../destinations/piwikpro/src/examples/events.ts | 4 ++--
.../destinations/piwikpro/src/examples/mapping.ts | 4 ++--
.../sources/browser/src/__tests__/walker.test.ts | 10 +++++-----
packages/web/sources/browser/src/translation.ts | 2 +-
website/docs/core/index.mdx | 2 +-
website/docs/sources/web/browser/tagging.mdx | 8 ++++----
19 files changed, 44 insertions(+), 43 deletions(-)
diff --git a/packages/core/README.md b/packages/core/README.md
index c16fea9d3..8ceaa07c2 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -133,7 +133,7 @@ const mapping = {
loop: [
'nested',
{
- condition: (entity) => entity.type === 'product',
+ condition: (entity) => entity.entity === 'product',
map: { id: 'data.id', name: 'data.name' },
},
],
diff --git a/packages/core/src/__tests__/eventGenerator.test.ts b/packages/core/src/__tests__/eventGenerator.test.ts
index baf16e28d..90a38c57e 100644
--- a/packages/core/src/__tests__/eventGenerator.test.ts
+++ b/packages/core/src/__tests__/eventGenerator.test.ts
@@ -21,7 +21,7 @@ describe('createEvent', () => {
user: { id: 'us3r', device: 'c00k13', session: 's3ss10n' },
nested: [
{
- type: 'child',
+ entity: 'child',
data: { is: 'subordinated' },
nested: [],
context: { element: ['child', 0] },
diff --git a/packages/core/src/__tests__/mapping.test.ts b/packages/core/src/__tests__/mapping.test.ts
index 88af9a222..b83a22a65 100644
--- a/packages/core/src/__tests__/mapping.test.ts
+++ b/packages/core/src/__tests__/mapping.test.ts
@@ -146,7 +146,7 @@ describe('getMappingValue', () => {
function getNested(data: WalkerOS.Properties) {
return {
- type: 'child',
+ entity: 'child',
data,
nested: [],
context: { element: ['child', 0] },
@@ -236,7 +236,7 @@ describe('getMappingValue', () => {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
key: 'data.name',
},
],
diff --git a/packages/core/src/eventGenerator.ts b/packages/core/src/eventGenerator.ts
index 8417f38a2..6fe48ea7d 100644
--- a/packages/core/src/eventGenerator.ts
+++ b/packages/core/src/eventGenerator.ts
@@ -33,7 +33,7 @@ export function createEvent(
user: { id: 'us3r', device: 'c00k13', session: 's3ss10n' },
nested: [
{
- type: 'child',
+ entity: 'child',
data: { is: 'subordinated' },
nested: [],
context: { element: ['child', 0] },
@@ -122,7 +122,7 @@ export function getEvent(
globals: { pagegroup: 'shop' },
nested: [
{
- type: 'product',
+ entity: 'product',
data: { ...product1.data, quantity },
context: { shopping: ['cart', 0] },
nested: [],
@@ -140,13 +140,13 @@ export function getEvent(
globals: { pagegroup: 'shop' },
nested: [
{
- type: 'product',
+ entity: 'product',
...product1,
context: { shopping: ['checkout', 0] },
nested: [],
},
{
- type: 'product',
+ entity: 'product',
...product2,
context: { shopping: ['checkout', 0] },
nested: [],
@@ -166,19 +166,19 @@ export function getEvent(
globals: { pagegroup: 'shop' },
nested: [
{
- type: 'product',
+ entity: 'product',
...product1,
context: { shopping: ['complete', 0] },
nested: [],
},
{
- type: 'product',
+ entity: 'product',
...product2,
context: { shopping: ['complete', 0] },
nested: [],
},
{
- type: 'gift',
+ entity: 'gift',
data: {
name: 'Surprise',
},
diff --git a/packages/core/src/types/walkeros.ts b/packages/core/src/types/walkeros.ts
index 0d2242bc4..4b103c42c 100644
--- a/packages/core/src/types/walkeros.ts
+++ b/packages/core/src/types/walkeros.ts
@@ -97,7 +97,7 @@ export interface OrderedProperties {
export type Entities = Array;
export interface Entity {
- type: string;
+ entity: string;
data: Properties;
nested: Entities;
context: OrderedProperties;
diff --git a/packages/server/core/src/__tests__/destination.test.ts b/packages/server/core/src/__tests__/destination.test.ts
index d2539ce4b..689f2e066 100644
--- a/packages/server/core/src/__tests__/destination.test.ts
+++ b/packages/server/core/src/__tests__/destination.test.ts
@@ -424,7 +424,7 @@ describe('Destination', () => {
value: 'new name',
},
'data.string': { value: 'bar' },
- 'nested.0.type': { value: 'kid' },
+ 'nested.0.entity': { value: 'kid' },
'data.number': {
consent: { marketing: true },
},
@@ -453,7 +453,7 @@ describe('Destination', () => {
number: undefined, // Redacted due to missing consent
new: 'value',
}),
- nested: [expect.objectContaining({ type: 'kid' })],
+ nested: [expect.objectContaining({ entity: 'kid' })],
// timing: 0, // @TODO should be set to default type
});
});
diff --git a/packages/server/destinations/meta/src/examples/events.ts b/packages/server/destinations/meta/src/examples/events.ts
index c965956be..7390e1178 100644
--- a/packages/server/destinations/meta/src/examples/events.ts
+++ b/packages/server/destinations/meta/src/examples/events.ts
@@ -22,7 +22,7 @@ export function Purchase(): BodyParameters {
currency: 'EUR',
value: Number(event.data.total),
contents: event.nested
- .filter((item) => item.type === 'product')
+ .filter((item) => item.entity === 'product')
.map((item) => ({
id: String(item.data.id),
quantity: Number(item.data.quantity) || 1,
diff --git a/packages/server/destinations/meta/src/examples/mapping.ts b/packages/server/destinations/meta/src/examples/mapping.ts
index 5a529ec39..b5c7d3645 100644
--- a/packages/server/destinations/meta/src/examples/mapping.ts
+++ b/packages/server/destinations/meta/src/examples/mapping.ts
@@ -22,7 +22,7 @@ export const Purchase: DestinationMeta.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: {
id: 'data.id',
item_price: 'data.price',
@@ -34,7 +34,7 @@ export const Purchase: DestinationMeta.Rule = {
num_items: {
fn: (event) =>
(event as WalkerOS.Event).nested.filter(
- (item) => item.type === 'product',
+ (item) => item.entity === 'product',
).length,
},
},
diff --git a/packages/web/destinations/gtag/README.md b/packages/web/destinations/gtag/README.md
index 830b18b5e..0c09b5391 100644
--- a/packages/web/destinations/gtag/README.md
+++ b/packages/web/destinations/gtag/README.md
@@ -97,7 +97,7 @@ const destination = destinationGtag({
loop: [
'nested',
{
- condition: (entity) => entity.type === 'product',
+ condition: (entity) => entity.entity === 'product',
map: {
item_id: 'data.id',
item_name: 'data.name',
diff --git a/packages/web/destinations/gtag/src/examples/events.ts b/packages/web/destinations/gtag/src/examples/events.ts
index 99ea3cde2..f0ee89d07 100644
--- a/packages/web/destinations/gtag/src/examples/events.ts
+++ b/packages/web/destinations/gtag/src/examples/events.ts
@@ -14,7 +14,7 @@ export function ga4Purchase(): unknown[] {
shipping: event.data.shipping,
currency: 'EUR',
items: event.nested
- .filter((item) => item.type === 'product')
+ .filter((item) => item.entity === 'product')
.map((item) => ({
item_id: item.data.id,
item_name: item.data.name,
diff --git a/packages/web/destinations/gtag/src/examples/mapping.ts b/packages/web/destinations/gtag/src/examples/mapping.ts
index d50628a90..f41719092 100644
--- a/packages/web/destinations/gtag/src/examples/mapping.ts
+++ b/packages/web/destinations/gtag/src/examples/mapping.ts
@@ -22,7 +22,7 @@ export const ga4Purchase: DestinationGtag.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: {
item_id: 'data.id',
item_name: 'data.name',
@@ -115,7 +115,7 @@ export const combinedPurchase: DestinationGtag.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: {
item_id: 'data.id',
item_name: 'data.name',
diff --git a/packages/web/destinations/meta/src/examples/events.ts b/packages/web/destinations/meta/src/examples/events.ts
index 3e1f2c970..0900b486d 100644
--- a/packages/web/destinations/meta/src/examples/events.ts
+++ b/packages/web/destinations/meta/src/examples/events.ts
@@ -10,7 +10,7 @@ export function Purchase(): unknown[] {
value: event.data.total,
currency: 'EUR',
contents: event.nested
- .filter((item) => item.type === 'product')
+ .filter((item) => item.entity === 'product')
.map((item) => ({ id: item.data.id, quantity: 1 })),
content_type: 'product',
num_items: 2,
@@ -45,12 +45,13 @@ export function InitiateCheckout(): unknown[] {
currency: 'EUR',
value: event.data.value,
contents: event.nested
- .filter((entity) => entity.type === 'product')
+ .filter((entity) => entity.entity === 'product')
.map((entity) => ({
id: entity.data.id,
quantity: entity.data.quantity,
})),
- num_items: event.nested.filter((item) => item.type === 'product').length,
+ num_items: event.nested.filter((item) => item.entity === 'product')
+ .length,
},
{ eventID: event.id },
];
diff --git a/packages/web/destinations/meta/src/examples/mapping.ts b/packages/web/destinations/meta/src/examples/mapping.ts
index cbc5796de..1ff0610ab 100644
--- a/packages/web/destinations/meta/src/examples/mapping.ts
+++ b/packages/web/destinations/meta/src/examples/mapping.ts
@@ -13,7 +13,7 @@ export const Purchase: DestinationMeta.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: {
id: 'data.id',
quantity: { key: 'data.quantity', value: 1 },
@@ -25,7 +25,7 @@ export const Purchase: DestinationMeta.Rule = {
num_items: {
fn: (event) =>
(event as WalkerOS.Event).nested.filter(
- (item) => item.type === 'product',
+ (item) => item.entity === 'product',
).length,
},
},
@@ -64,7 +64,7 @@ export const InitiateCheckout: DestinationMeta.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: {
id: 'data.id',
quantity: { key: 'data.quantity', value: 1 },
@@ -75,7 +75,7 @@ export const InitiateCheckout: DestinationMeta.Rule = {
num_items: {
fn: (event) =>
(event as WalkerOS.Event).nested.filter(
- (item) => item.type === 'product',
+ (item) => item.entity === 'product',
).length,
},
},
diff --git a/packages/web/destinations/piwikpro/src/examples/events.ts b/packages/web/destinations/piwikpro/src/examples/events.ts
index b0f22dedb..278988b80 100644
--- a/packages/web/destinations/piwikpro/src/examples/events.ts
+++ b/packages/web/destinations/piwikpro/src/examples/events.ts
@@ -20,7 +20,7 @@ export function ecommerceOrder(): unknown[] {
return [
[
'ecommerceOrder',
- event.nested.filter((item) => item.type === 'product').map(getProduct),
+ event.nested.filter((item) => item.entity === 'product').map(getProduct),
{
orderId: event.data.id,
grandTotal: event.data.total,
@@ -58,7 +58,7 @@ export function ecommerceCartUpdate(): unknown[] {
return [
[
'ecommerceCartUpdate',
- event.nested.filter((item) => item.type === 'product').map(getProduct),
+ event.nested.filter((item) => item.entity === 'product').map(getProduct),
event.data.value,
{ currencyCode: 'EUR' },
],
diff --git a/packages/web/destinations/piwikpro/src/examples/mapping.ts b/packages/web/destinations/piwikpro/src/examples/mapping.ts
index 07f7dd386..7b36770f5 100644
--- a/packages/web/destinations/piwikpro/src/examples/mapping.ts
+++ b/packages/web/destinations/piwikpro/src/examples/mapping.ts
@@ -23,7 +23,7 @@ export const ecommerceOrder: DestinationPiwikPro.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: productMap,
},
],
@@ -94,7 +94,7 @@ export const ecommerceCartUpdate: DestinationPiwikPro.Rule = {
'nested',
{
condition: (entity) =>
- isObject(entity) && entity.type === 'product',
+ isObject(entity) && entity.entity === 'product',
map: productMap,
},
],
diff --git a/packages/web/sources/browser/src/__tests__/walker.test.ts b/packages/web/sources/browser/src/__tests__/walker.test.ts
index a8d8f12f2..952a2699d 100644
--- a/packages/web/sources/browser/src/__tests__/walker.test.ts
+++ b/packages/web/sources/browser/src/__tests__/walker.test.ts
@@ -39,13 +39,13 @@ describe('Walker', () => {
data: { label: 'grandmother' },
trigger: Triggers.Load,
nested: [
- { type: 'son', data: { interested_in: 'pizza' } },
+ { entity: 'son', data: { interested_in: 'pizza' } },
{
- type: 'daughter',
+ entity: 'daughter',
data: { status: 'hungry' },
- nested: [{ type: 'baby', data: { status: 'infant' } }],
+ nested: [{ entity: 'baby', data: { status: 'infant' } }],
},
- { type: 'baby', data: { status: 'infant' } },
+ { entity: 'baby', data: { status: 'infant' } },
],
},
]);
@@ -291,7 +291,7 @@ describe('Walker', () => {
parent: ['link', 1],
entity: ['link', 2],
},
- nested: [{ type: 'n', data: { k: 'v' } }],
+ nested: [{ entity: 'n', data: { k: 'v' } }],
},
]);
});
diff --git a/packages/web/sources/browser/src/translation.ts b/packages/web/sources/browser/src/translation.ts
index e5aa2b84d..bdd17b311 100644
--- a/packages/web/sources/browser/src/translation.ts
+++ b/packages/web/sources/browser/src/translation.ts
@@ -68,7 +68,7 @@ export function translateToCoreCollector(
const entityObj = getEntities(
settings.prefix || 'data-elb',
elemParameter,
- ).find((obj) => obj.type === entity);
+ ).find((obj) => obj.entity === entity);
if (entityObj) {
if (dataIsElem) eventData = entityObj.data;
eventContext = entityObj.context;
diff --git a/website/docs/core/index.mdx b/website/docs/core/index.mdx
index d13b5760a..9d38eb773 100644
--- a/website/docs/core/index.mdx
+++ b/website/docs/core/index.mdx
@@ -133,7 +133,7 @@ const mapping = {
loop: [
'nested',
{
- condition: (entity) => entity.type === 'product',
+ condition: (entity) => entity.entity === 'product',
map: { id: 'data.id', name: 'data.name' },
},
],
diff --git a/website/docs/sources/web/browser/tagging.mdx b/website/docs/sources/web/browser/tagging.mdx
index 3fc38d27a..5d2bf8a8d 100644
--- a/website/docs/sources/web/browser/tagging.mdx
+++ b/website/docs/sources/web/browser/tagging.mdx
@@ -537,13 +537,13 @@ This example will lead to the following event on load:
"event": "mother view",
"data": { "label": "caring" },
"nested": [
- { "type": "son", "data": { "age": 23 } },
+ { "entity": "son", "data": { "age": 23 } },
{
- "type": "daughter",
+ "entity": "daughter",
"data": { "age": 32 },
- "nested": [{ "type": "baby", "data": { "status": "infant" } }],
+ "nested": [{ "entity": "baby", "data": { "status": "infant" } }],
},
- { "type": "baby", "data": { "status": "infant" } },
+ { "entity": "baby", "data": { "status": "infant" } },
],
// other properties omitted
}
From 01501a1c3e80ea66a7bda137ef739796761b7755 Mon Sep 17 00:00:00 2001
From: alexander
Date: Sat, 6 Sep 2025 14:27:19 +0200
Subject: [PATCH 09/13] more type to entity
---
.../gcp/src/bigquery/__tests__/index.test.ts | 2 +-
packages/web/sources/browser/src/walker.ts | 22 +++++++++----------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts b/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
index 97a029a15..84502a60e 100644
--- a/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
+++ b/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
@@ -88,7 +88,7 @@ describe('Server Destination BigQuery', () => {
custom: '{"completely":"random"}',
user: '{"id":"us3r","device":"c00k13","session":"s3ss10n"}',
nested:
- '[{"type":"child","data":{"is":"subordinated"},"nested":[],"context":{"element":["child",0]}}]',
+ '[{"entity":"child","data":{"is":"subordinated"},"nested":[],"context":{"element":["child",0]}}]',
trigger: 'test',
timing: 3.14,
group: 'gr0up',
diff --git a/packages/web/sources/browser/src/walker.ts b/packages/web/sources/browser/src/walker.ts
index bc63d6254..9a0b0484d 100644
--- a/packages/web/sources/browser/src/walker.ts
+++ b/packages/web/sources/browser/src/walker.ts
@@ -123,20 +123,20 @@ export function getEvents(
// Use page as default entity if no one was set
if (!entities.length) {
- const type = 'page';
+ const entity = 'page';
// Only use explicit page properties and ignore generic properties
- const entitySelector = `[${getElbAttributeName(prefix, type)}]`;
+ const entitySelector = `[${getElbAttributeName(prefix, entity)}]`;
// Get matching properties from the element and its parents
const [data, context] = getThisAndParentProperties(
target,
entitySelector,
prefix,
- type,
+ entity,
);
entities.push({
- type, // page
+ entity, // page
data, // Consider only upper data
nested: [], // Skip nested in this faked page case
context,
@@ -146,7 +146,7 @@ export function getEvents(
// Return a list of full events
entities.forEach((entity) => {
events.push({
- entity: entity.type,
+ entity: entity.entity,
action: triggerAction.action,
data: entity.data,
trigger,
@@ -261,15 +261,15 @@ function getEntity(
origin?: Element,
filter?: Walker.Filter,
): WalkerOS.Entity | null {
- const type = getAttribute(element, getElbAttributeName(prefix));
+ const entity = getAttribute(element, getElbAttributeName(prefix));
// It's not a (valid) entity element or should be filtered
- if (!type || (filter && !filter[type])) return null;
+ if (!entity || (filter && !filter[entity])) return null;
const scopeElems = [element]; // All related elements
const dataSelector = `[${getElbAttributeName(
prefix,
- type,
+ entity,
)}],[${getElbAttributeName(prefix, '')}]`; // [data-elb-entity,data-elb-]
const linkName = getElbAttributeName(prefix, Const.Commands.Link, false); // data-elblink
@@ -279,7 +279,7 @@ function getEntity(
origin || element,
dataSelector,
prefix,
- type,
+ entity,
);
// Add linked elements (data-elblink)
@@ -315,7 +315,7 @@ function getEntity(
propertyElems.forEach((child) => {
// Eventually override closer properties
genericData = assign(genericData, getElbValues(prefix, child, ''));
- data = assign(data, getElbValues(prefix, child, type));
+ data = assign(data, getElbValues(prefix, child, entity));
});
// Merge properties with the hierarchy generic > data > parent
@@ -333,7 +333,7 @@ function getEntity(
);
});
- return { type, data, context, nested };
+ return { entity, data, context, nested };
}
function getParent(prefix: string, elem: HTMLElement): HTMLElement | null {
From c3e9f421d4f380ade7dbc57232cbcfb0ac5d5d4a Mon Sep 17 00:00:00 2001
From: alexander
Date: Sat, 6 Sep 2025 15:07:16 +0200
Subject: [PATCH 10/13] removed quickstarts
---
.../src/__tests__/advanced-examples.test.ts | 110 -------
.../src/__tests__/collector/basic.test.ts | 26 --
.../src/__tests__/ga4-complete.test.ts | 17 --
.../src/__tests__/server-destinations.test.ts | 50 ----
.../src/__tests__/setup-advanced.ts | 66 -----
apps/quickstart/src/__tests__/setup.ts | 11 -
.../__tests__/walkerjs-with-sources.test.ts | 9 -
.../quickstart/src/__tests__/walkerjs.test.ts | 17 --
.../web-destinations-complete.test.ts | 71 -----
.../src/__tests__/web-destinations.test.ts | 45 ---
.../src/__tests__/web-sources.test.ts | 29 --
apps/quickstart/src/collector/basic.ts | 65 -----
apps/quickstart/src/consent/management.ts | 195 -------------
.../src/mappings/custom-functions.ts | 154 ----------
.../src/performance/batch-processing.ts | 268 ------------------
.../quickstart/src/server-destinations/aws.ts | 93 ------
.../quickstart/src/server-destinations/gcp.ts | 33 ---
.../src/server-destinations/meta-capi.ts | 46 ---
apps/quickstart/src/walkerjs/basic.ts | 15 -
apps/quickstart/src/walkerjs/with-sources.ts | 55 ----
apps/quickstart/src/web-browser/basic.ts | 24 --
apps/quickstart/src/web-dataLayer/basic.ts | 10 -
apps/quickstart/src/web-destinations/api.ts | 79 ------
.../web-destinations/custom-destination.ts | 142 ----------
.../src/web-destinations/ga4-complete.ts | 78 -----
.../src/web-destinations/gtag-ads.ts | 63 ----
.../src/web-destinations/gtag-complete.ts | 116 --------
.../src/web-destinations/meta-pixel.ts | 84 ------
.../src/web-destinations/piwikpro.ts | 114 --------
.../src/web-destinations/plausible.ts | 52 ----
package-lock.json | 20 +-
package.json | 5 +-
32 files changed, 3 insertions(+), 2159 deletions(-)
delete mode 100644 apps/quickstart/src/__tests__/advanced-examples.test.ts
delete mode 100644 apps/quickstart/src/__tests__/collector/basic.test.ts
delete mode 100644 apps/quickstart/src/__tests__/ga4-complete.test.ts
delete mode 100644 apps/quickstart/src/__tests__/server-destinations.test.ts
delete mode 100644 apps/quickstart/src/__tests__/setup-advanced.ts
delete mode 100644 apps/quickstart/src/__tests__/setup.ts
delete mode 100644 apps/quickstart/src/__tests__/walkerjs-with-sources.test.ts
delete mode 100644 apps/quickstart/src/__tests__/walkerjs.test.ts
delete mode 100644 apps/quickstart/src/__tests__/web-destinations-complete.test.ts
delete mode 100644 apps/quickstart/src/__tests__/web-destinations.test.ts
delete mode 100644 apps/quickstart/src/__tests__/web-sources.test.ts
delete mode 100644 apps/quickstart/src/collector/basic.ts
delete mode 100644 apps/quickstart/src/consent/management.ts
delete mode 100644 apps/quickstart/src/mappings/custom-functions.ts
delete mode 100644 apps/quickstart/src/performance/batch-processing.ts
delete mode 100644 apps/quickstart/src/server-destinations/aws.ts
delete mode 100644 apps/quickstart/src/server-destinations/gcp.ts
delete mode 100644 apps/quickstart/src/server-destinations/meta-capi.ts
delete mode 100644 apps/quickstart/src/walkerjs/basic.ts
delete mode 100644 apps/quickstart/src/walkerjs/with-sources.ts
delete mode 100644 apps/quickstart/src/web-browser/basic.ts
delete mode 100644 apps/quickstart/src/web-dataLayer/basic.ts
delete mode 100644 apps/quickstart/src/web-destinations/api.ts
delete mode 100644 apps/quickstart/src/web-destinations/custom-destination.ts
delete mode 100644 apps/quickstart/src/web-destinations/ga4-complete.ts
delete mode 100644 apps/quickstart/src/web-destinations/gtag-ads.ts
delete mode 100644 apps/quickstart/src/web-destinations/gtag-complete.ts
delete mode 100644 apps/quickstart/src/web-destinations/meta-pixel.ts
delete mode 100644 apps/quickstart/src/web-destinations/piwikpro.ts
delete mode 100644 apps/quickstart/src/web-destinations/plausible.ts
diff --git a/apps/quickstart/src/__tests__/advanced-examples.test.ts b/apps/quickstart/src/__tests__/advanced-examples.test.ts
deleted file mode 100644
index 6ecf13fae..000000000
--- a/apps/quickstart/src/__tests__/advanced-examples.test.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import {
- setupCustomDestination,
- trackCustomDestinationEvents,
-} from '../web-destinations/custom-destination';
-import {
- setupConsentManagement,
- handleConsentChoice,
- trackConsentedEvents,
-} from '../consent/management';
-import {
- setupCustomMappingFunctions,
- trackCustomMappedEvents,
-} from '../mappings/custom-functions';
-import {
- setupBatchProcessing,
- simulateHighVolumeTracking,
-} from '../performance/batch-processing';
-
-// Mock fetch for the custom destination
-global.fetch = jest.fn().mockResolvedValue({
- ok: true,
- status: 200,
- statusText: 'OK',
-});
-
-describe('Advanced Examples', () => {
- describe('Custom Destination', () => {
- it('creates collector with custom destination', async () => {
- const { collector, elb } = await setupCustomDestination();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks custom destination events without errors', async () => {
- const { collector, elb } = await setupCustomDestination();
- await expect(trackCustomDestinationEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Consent Management', () => {
- it('creates collector with consent setup', async () => {
- const { collector, elb } = await setupConsentManagement();
- expect(collector).toBeDefined();
- expect(collector.allowed).toBe(false); // Initially disabled
- expect(elb).toBeDefined();
- });
-
- it('handles consent choices', async () => {
- const { collector, elb } = await setupConsentManagement();
-
- // Test accept consent
- await expect(
- handleConsentChoice(collector, 'accept'),
- ).resolves.not.toThrow();
- expect(collector.allowed).toBe(true);
-
- // Test reject consent
- await expect(
- handleConsentChoice(collector, 'reject'),
- ).resolves.not.toThrow();
- expect(collector.allowed).toBe(false);
-
- // Test custom consent
- await expect(
- handleConsentChoice(collector, 'customize', {
- analytics: true,
- advertising: false,
- functional: true,
- }),
- ).resolves.not.toThrow();
- expect(collector.allowed).toBe(true);
- });
-
- it('tracks consented events without errors', async () => {
- const { collector, elb } = await setupConsentManagement();
- await expect(trackConsentedEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Custom Mapping Functions', () => {
- it('creates collector with custom mappings', async () => {
- const { collector, elb } = await setupCustomMappingFunctions();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks events with custom mappings without errors', async () => {
- const { collector, elb } = await setupCustomMappingFunctions();
- await expect(trackCustomMappedEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Batch Processing', () => {
- it('creates collector with batch processing', async () => {
- const { collector, elb } = await setupBatchProcessing();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('simulates high-volume tracking without errors', async () => {
- const { collector, elb } = await setupBatchProcessing();
- // Test that we can call the elb function without errors
- // Skip the full simulation to avoid timeout issues in tests
- await expect(elb('test event', { test: true })).resolves.not.toThrow();
- });
- });
-});
diff --git a/apps/quickstart/src/__tests__/collector/basic.test.ts b/apps/quickstart/src/__tests__/collector/basic.test.ts
deleted file mode 100644
index 35294fdb0..000000000
--- a/apps/quickstart/src/__tests__/collector/basic.test.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import {
- setupCollector,
- setupCollectorWithConfig,
- trackPageView,
- trackUserAction,
-} from '../../collector/basic';
-
-describe('Collector Basic Examples', () => {
- it('creates basic collector', async () => {
- const { collector, elb } = await setupCollector();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('creates collector with console destination', async () => {
- const { collector, elb } = await setupCollectorWithConfig();
- expect(collector.destinations.console).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks events without errors', async () => {
- const { collector, elb } = await setupCollector();
- await expect(trackPageView(elb)).resolves.not.toThrow();
- await expect(trackUserAction(elb)).resolves.not.toThrow();
- });
-});
diff --git a/apps/quickstart/src/__tests__/ga4-complete.test.ts b/apps/quickstart/src/__tests__/ga4-complete.test.ts
deleted file mode 100644
index 515675816..000000000
--- a/apps/quickstart/src/__tests__/ga4-complete.test.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {
- setupGA4Complete,
- trackGA4Events,
-} from '../web-destinations/ga4-complete';
-
-describe('GA4 Complete Example', () => {
- it('creates collector instance', async () => {
- const { collector, elb } = await setupGA4Complete();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks all GA4 events without errors', async () => {
- const { elb } = await setupGA4Complete();
- await expect(trackGA4Events(elb)).resolves.not.toThrow();
- });
-});
diff --git a/apps/quickstart/src/__tests__/server-destinations.test.ts b/apps/quickstart/src/__tests__/server-destinations.test.ts
deleted file mode 100644
index edb1e54bd..000000000
--- a/apps/quickstart/src/__tests__/server-destinations.test.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import {
- setupAWSFirehose,
- trackServerEvents,
-} from '../server-destinations/aws';
-import { setupGCPPubSub, publishToGCP } from '../server-destinations/gcp';
-import {
- setupMetaCAPI,
- trackServerConversions,
-} from '../server-destinations/meta-capi';
-
-describe('Server Destination Examples', () => {
- describe('AWS Firehose', () => {
- it('creates collector for AWS', async () => {
- const { collector, elb } = await setupAWSFirehose();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks server events without errors', async () => {
- const { collector, elb } = await setupAWSFirehose();
- await expect(trackServerEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('GCP Pub/Sub', () => {
- it('creates collector for GCP', async () => {
- const { collector, elb } = await setupGCPPubSub();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('publishes to GCP without errors', async () => {
- const { collector, elb } = await setupGCPPubSub();
- await expect(publishToGCP(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Meta CAPI', () => {
- it('creates collector for Meta CAPI', async () => {
- const { collector, elb } = await setupMetaCAPI();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks server conversions without errors', async () => {
- const { collector, elb } = await setupMetaCAPI();
- await expect(trackServerConversions(elb)).resolves.not.toThrow();
- });
- });
-});
diff --git a/apps/quickstart/src/__tests__/setup-advanced.ts b/apps/quickstart/src/__tests__/setup-advanced.ts
deleted file mode 100644
index af35bd150..000000000
--- a/apps/quickstart/src/__tests__/setup-advanced.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-// Setup file for advanced examples tests
-
-// Mock DOM environment
-const mockElement = {
- src: '',
- async: false,
- onload: null as (() => void) | null,
-};
-
-const mockDocument = {
- createElement: jest.fn().mockReturnValue(mockElement),
- head: {
- appendChild: jest.fn(),
- },
- referrer: 'https://google.com',
- addEventListener: jest.fn(),
- removeEventListener: jest.fn(),
-};
-
-const mockWindow = {
- location: {
- hostname: 'example.com',
- },
- elb: jest.fn(),
-};
-
-const mockNavigator = {
- userAgent:
- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
-};
-
-const mockPerformance = {
- timing: {
- navigationStart: 1000,
- loadEventEnd: 2000,
- domContentLoadedEventEnd: 1500,
- },
- getEntriesByType: jest
- .fn()
- .mockReturnValue([{ name: 'first-contentful-paint', startTime: 800 }]),
- now: jest.fn().mockReturnValue(1000),
-};
-
-// Mock fetch
-const mockFetch = jest.fn().mockResolvedValue({
- ok: true,
- status: 200,
- statusText: 'OK',
- json: async () => ({ success: true }),
-});
-
-// Apply mocks to global
-Object.defineProperty(global, 'document', { value: mockDocument });
-Object.defineProperty(global, 'window', { value: mockWindow });
-Object.defineProperty(global, 'navigator', { value: mockNavigator });
-Object.defineProperty(global, 'performance', { value: mockPerformance });
-Object.defineProperty(global, 'fetch', { value: mockFetch });
-
-export {
- mockElement,
- mockDocument,
- mockWindow,
- mockNavigator,
- mockPerformance,
- mockFetch,
-};
diff --git a/apps/quickstart/src/__tests__/setup.ts b/apps/quickstart/src/__tests__/setup.ts
deleted file mode 100644
index bc656c41f..000000000
--- a/apps/quickstart/src/__tests__/setup.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import '@testing-library/jest-dom';
-
-declare global {
- interface Window {
- dataLayer: unknown;
- }
-}
-
-if (typeof window !== 'undefined') {
- window.dataLayer = [];
-}
diff --git a/apps/quickstart/src/__tests__/walkerjs-with-sources.test.ts b/apps/quickstart/src/__tests__/walkerjs-with-sources.test.ts
deleted file mode 100644
index 79376a520..000000000
--- a/apps/quickstart/src/__tests__/walkerjs-with-sources.test.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { trackWithWalkerSources } from '../walkerjs/with-sources';
-
-describe('Walker.js with Sources', () => {
- it('tracks events without errors', async () => {
- const mockElb = jest.fn();
- await expect(trackWithWalkerSources(mockElb)).resolves.not.toThrow();
- expect(mockElb).toHaveBeenCalled();
- });
-});
diff --git a/apps/quickstart/src/__tests__/walkerjs.test.ts b/apps/quickstart/src/__tests__/walkerjs.test.ts
deleted file mode 100644
index ae5e803b4..000000000
--- a/apps/quickstart/src/__tests__/walkerjs.test.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { setupWalkerJS, initWalkerJS } from '../walkerjs/basic';
-
-describe('Walker.js Examples', () => {
- beforeEach(() => {
- document.head.innerHTML = '';
- });
-
- it('creates walker.js script element', () => {
- const script = setupWalkerJS();
- expect(script.src).toContain('walker.js');
- expect(script.async).toBe(true);
- });
-
- it('initializes walker.js without errors', () => {
- expect(() => initWalkerJS()).not.toThrow();
- });
-});
diff --git a/apps/quickstart/src/__tests__/web-destinations-complete.test.ts b/apps/quickstart/src/__tests__/web-destinations-complete.test.ts
deleted file mode 100644
index cd4f28ff6..000000000
--- a/apps/quickstart/src/__tests__/web-destinations-complete.test.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import {
- setupGtagComplete,
- trackGtagEvents,
-} from '../web-destinations/gtag-complete';
-import {
- setupPiwikPro,
- trackPiwikProEvents,
-} from '../web-destinations/piwikpro';
-import {
- setupPlausible,
- trackPlausibleEvents,
-} from '../web-destinations/plausible';
-import { setupAPIDestination, trackAPIEvents } from '../web-destinations/api';
-
-describe('Complete Web Destination Examples', () => {
- describe('Gtag Complete', () => {
- it('creates collector instance', async () => {
- const { collector, elb } = await setupGtagComplete();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks gtag events without errors', async () => {
- const { collector, elb } = await setupGtagComplete();
- await expect(trackGtagEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('PiwikPro', () => {
- it('creates collector instance', async () => {
- const { collector, elb } = await setupPiwikPro();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks PiwikPro events without errors', async () => {
- const { collector, elb } = await setupPiwikPro();
- await expect(trackPiwikProEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Plausible', () => {
- it('creates collector instance', async () => {
- const { collector, elb } = await setupPlausible();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks Plausible events without errors', async () => {
- const { collector, elb } = await setupPlausible();
- await expect(trackPlausibleEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('API with Mapping', () => {
- it('creates collector instance', async () => {
- const { collector, elb } = await setupAPIDestination();
- expect(collector).toBeDefined();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks API events without errors', async () => {
- const { collector, elb } = await setupAPIDestination();
- await expect(trackAPIEvents(elb)).resolves.not.toThrow();
- });
- });
-});
diff --git a/apps/quickstart/src/__tests__/web-destinations.test.ts b/apps/quickstart/src/__tests__/web-destinations.test.ts
deleted file mode 100644
index 59b589875..000000000
--- a/apps/quickstart/src/__tests__/web-destinations.test.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import {
- setupGoogleAds,
- trackAdsConversions,
-} from '../web-destinations/gtag-ads';
-import {
- setupMetaPixel,
- trackMetaEvents,
-} from '../web-destinations/meta-pixel';
-import { setupAPIDestination } from '../web-destinations/api';
-
-describe('Web Destination Examples', () => {
- describe('Google Ads', () => {
- it('creates collector for Google Ads', async () => {
- const { collector, elb } = await setupGoogleAds();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks conversions without errors', async () => {
- const { collector, elb } = await setupGoogleAds();
- await expect(trackAdsConversions(elb)).resolves.not.toThrow();
- });
- });
-
- describe('Meta Pixel', () => {
- it('creates collector for Meta Pixel', async () => {
- const { collector, elb } = await setupMetaPixel();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('tracks Meta events without errors', async () => {
- const { collector, elb } = await setupMetaPixel();
- await expect(trackMetaEvents(elb)).resolves.not.toThrow();
- });
- });
-
- describe('API Destination', () => {
- it('creates basic API collector', async () => {
- const { collector, elb } = await setupAPIDestination();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
- });
-});
diff --git a/apps/quickstart/src/__tests__/web-sources.test.ts b/apps/quickstart/src/__tests__/web-sources.test.ts
deleted file mode 100644
index 6da96c7d6..000000000
--- a/apps/quickstart/src/__tests__/web-sources.test.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {
- setupBrowserTracking,
- setupBrowserWithConsole,
-} from '../web-browser/basic';
-import { setupDataLayer } from '../web-dataLayer/basic';
-
-describe('Web Source Examples', () => {
- describe('Browser Source', () => {
- it('creates collector', async () => {
- const { collector, elb } = await setupBrowserTracking();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
-
- it('creates collector with console', async () => {
- const { collector, elb } = await setupBrowserWithConsole();
- expect(collector.destinations.console).toBeDefined();
- expect(elb).toBeDefined();
- });
- });
-
- describe('DataLayer Source', () => {
- it('creates collector', async () => {
- const { collector, elb } = await setupDataLayer();
- expect(collector.push).toBeDefined();
- expect(elb).toBeDefined();
- });
- });
-});
diff --git a/apps/quickstart/src/collector/basic.ts b/apps/quickstart/src/collector/basic.ts
deleted file mode 100644
index 146775eec..000000000
--- a/apps/quickstart/src/collector/basic.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { createSource } from '@walkeros/core';
-import { sourceBrowser } from '@walkeros/web-source-browser';
-import type { Collector, WalkerOS } from '@walkeros/core';
-
-export async function setupCollector(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file - basic setup
- const trackingConfig = {
- run: true,
- sources: {
- browser: createSource(sourceBrowser, {
- settings: {
- scope: document.body,
- },
- }),
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function setupCollectorWithConfig(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file with console destination
- const trackingConfig = {
- run: true,
- sources: {
- browser: createSource(sourceBrowser, {
- settings: {
- scope: document.body,
- },
- }),
- },
- destinations: {
- console: {
- type: 'console',
- push: (event: WalkerOS.Event) => console.log('Event:', event),
- config: {},
- },
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function trackPageView(elb: WalkerOS.Elb): Promise {
- await elb('page view', {
- title: 'Home Page',
- path: '/',
- });
-}
-
-export async function trackUserAction(elb: WalkerOS.Elb): Promise {
- await elb('button click', {
- id: 'cta-button',
- text: 'Get Started',
- });
-}
diff --git a/apps/quickstart/src/consent/management.ts b/apps/quickstart/src/consent/management.ts
deleted file mode 100644
index 4646764f3..000000000
--- a/apps/quickstart/src/consent/management.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationGtag } from '@walkeros/web-destination-gtag';
-import { destinationMeta } from '@walkeros/web-destination-meta';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupConsentManagement(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- gtag: {
- ...destinationGtag,
- config: {
- settings: {
- ga4: { measurementId: 'G-XXXXXXXXXX' },
- },
- mapping: {
- // Map consent events
- walker: {
- consent: {
- name: 'consent_update',
- data: {
- map: {
- analytics_storage: 'analytics_storage',
- ad_storage: 'ad_storage',
- },
- },
- },
- },
- },
- },
- },
- meta: {
- ...destinationMeta,
- config: {
- settings: {
- pixelId: 'YOUR_PIXEL_ID',
- },
- mapping: {
- // Map consent events for Meta
- walker: {
- consent: {
- name: 'consent_granted',
- data: {
- map: {
- consent_type: 'ad_storage',
- },
- },
- },
- },
- },
- },
- },
- },
- });
-
- // Initially disable all tracking until consent is given
- collector.allowed = false;
-
- return { collector, elb };
-}
-
-export async function handleConsentChoice(
- collector: Collector.Instance,
- consentType: 'accept' | 'reject' | 'customize',
- customConsent?: {
- analytics: boolean;
- advertising: boolean;
- functional: boolean;
- },
-): Promise {
- let consentState: WalkerOS.Consent = {};
-
- switch (consentType) {
- case 'accept':
- // User accepts all tracking
- consentState = {
- functional: true,
- analytics: true,
- marketing: true,
- ad_storage: true,
- analytics_storage: true,
- ad_user_data: true,
- ad_personalization: true,
- };
- collector.allowed = true;
- break;
-
- case 'reject':
- // User rejects all non-essential tracking
- consentState = {
- functional: true, // Essential cookies only
- analytics: false,
- marketing: false,
- ad_storage: false,
- analytics_storage: false,
- ad_user_data: false,
- ad_personalization: false,
- };
- collector.allowed = false;
- break;
-
- case 'customize':
- // User customizes consent preferences
- if (customConsent) {
- consentState = {
- functional: true, // Always required
- analytics: customConsent.analytics,
- marketing: customConsent.advertising,
- ad_storage: customConsent.advertising,
- analytics_storage: customConsent.analytics,
- ad_user_data: customConsent.advertising,
- ad_personalization: customConsent.advertising,
- };
- collector.allowed =
- customConsent.analytics || customConsent.advertising;
- }
- break;
- }
-
- // Update consent state
- await collector.push({
- event: 'walker consent',
- data: consentState,
- context: {},
- globals: {},
- custom: {},
- user: {},
- nested: [],
- consent: {},
- id: '',
- trigger: '',
- entity: 'walker',
- action: 'consent',
- timestamp: Date.now(),
- timing: 0,
- group: '',
- count: 0,
- version: { source: '0.0.7', tagging: 0 },
- source: { type: 'collector', id: '', previous_id: '' },
- });
-
- console.log(`Consent updated: ${consentType}`, consentState);
-}
-
-export async function trackConsentedEvents(elb: WalkerOS.Elb): Promise {
- // This event will only be sent if consent allows it
- await elb('page view', {
- title: 'Consent Demo Page',
- category: 'demo',
- });
-
- // Marketing events require marketing consent
- await elb('product view', {
- id: 'demo-product',
- name: 'Consent Example Product',
- price: 29.99,
- });
-
- // Functional events (like error tracking) might always be allowed
- await elb('error occurred', {
- type: 'javascript',
- message: 'Demo error for testing',
- severity: 'low',
- });
-}
-
-// Simulate consent banner interaction
-export async function simulateConsentBanner(
- elb: WalkerOS.Elb,
- collector: Collector.Instance,
-): Promise {
- console.log('🍪 Consent banner shown');
-
- // Simulate user clicking "Accept All"
- setTimeout(async () => {
- console.log('✅ User accepted all cookies');
- await handleConsentChoice(collector, 'accept');
-
- // Now tracking events will be sent
- await trackConsentedEvents(elb);
- }, 1000);
-
- // Alternative: Simulate custom consent
- // setTimeout(async () => {
- // console.log('⚙️ User customized consent');
- // await handleConsentChoice(collector, 'customize', {
- // analytics: true,
- // advertising: false,
- // functional: true,
- // });
- // await trackConsentedEvents(elb);
- // }, 1000);
-}
diff --git a/apps/quickstart/src/mappings/custom-functions.ts b/apps/quickstart/src/mappings/custom-functions.ts
deleted file mode 100644
index a3fcfae00..000000000
--- a/apps/quickstart/src/mappings/custom-functions.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationGtag } from '@walkeros/web-destination-gtag';
-import type { WalkerOS, Destination, Collector } from '@walkeros/core';
-
-// Custom destination with advanced mapping functions
-const advancedMappingDestination: Destination.Instance = {
- type: 'advanced-mapping',
-
- config: {},
-
- init() {
- console.log('Advanced mapping destination initialized');
- },
-
- async push(event, { config }) {
- // Apply custom mappings
- const mappedData = applyCustomMappings(event);
-
- console.log('Advanced Mapping Result:', {
- original: event,
- mapped: mappedData,
- });
- },
-};
-
-// Custom mapping utility functions
-function applyCustomMappings(event: WalkerOS.Event) {
- const mapped: Record = {};
-
- // Currency formatting function
- const formatCurrency = (value: number, currency = 'USD') => {
- return new Intl.NumberFormat('en-US', {
- style: 'currency',
- currency,
- }).format(value);
- };
-
- // Time-based segmentation
- const getTimeSegment = () => {
- const hour = new Date().getHours();
- if (hour >= 6 && hour < 12) return 'morning';
- if (hour >= 12 && hour < 17) return 'afternoon';
- if (hour >= 17 && hour < 22) return 'evening';
- return 'night';
- };
-
- // Apply mappings based on event type
- switch (event.entity) {
- case 'product':
- mapped.item = {
- id: event.data.id,
- name: event.data.name,
- price_formatted: formatCurrency(
- typeof event.data.price === 'number' ? event.data.price : 0,
- ),
- category:
- typeof event.data.category === 'string'
- ? event.data.category
- : 'Uncategorized',
- in_stock: typeof event.data.stock === 'number' && event.data.stock > 0,
- };
- break;
-
- case 'order':
- mapped.transaction = {
- id: event.data.id,
- revenue_formatted: formatCurrency(
- typeof event.data.total === 'number' ? event.data.total : 0,
- ),
- is_high_value:
- typeof event.data.total === 'number' && event.data.total > 100,
- order_day_segment: getTimeSegment(),
- };
- break;
-
- default:
- mapped.generic = {
- event_type: event.entity,
- action: event.action,
- timestamp_iso: new Date(event.timestamp).toISOString(),
- time_segment: getTimeSegment(),
- };
- }
-
- return mapped;
-}
-
-export async function setupCustomMappingFunctions(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- // Advanced mapping destination
- advanced: {
- ...advancedMappingDestination,
- config: {
- settings: {},
- },
- },
- // GA4 with custom mapping
- gtag: {
- ...destinationGtag,
- config: {
- settings: {
- ga4: { measurementId: 'G-XXXXXXXXXX' },
- },
- mapping: {
- product: {
- view: {
- name: 'view_item',
- settings: { ga4: {} },
- data: {
- map: {
- currency: { value: 'USD' },
- value: 'data.price',
- },
- },
- },
- },
- },
- },
- },
- },
- });
-
- return { collector, elb };
-}
-
-export async function trackCustomMappedEvents(
- elb: WalkerOS.Elb,
-): Promise {
- // Track product with rich data
- await elb('product view', {
- id: 'prod-123',
- name: 'Wireless Headphones',
- price: 129.99,
- category: 'Electronics',
- stock: 15,
- });
-
- // Track order
- await elb('order complete', {
- id: 'order-456',
- total: 259.98,
- currency: 'USD',
- });
-
- // Track custom event
- await elb('feature used', {
- feature: 'custom-mapping',
- success: true,
- });
-}
diff --git a/apps/quickstart/src/performance/batch-processing.ts b/apps/quickstart/src/performance/batch-processing.ts
deleted file mode 100644
index 06509780b..000000000
--- a/apps/quickstart/src/performance/batch-processing.ts
+++ /dev/null
@@ -1,268 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationAPI } from '@walkeros/web-destination-api';
-import type { WalkerOS, Destination, Collector } from '@walkeros/core';
-
-// Custom batching destination for high-performance event processing
-const batchingDestination: Destination.Instance = {
- type: 'batching',
-
- config: {},
-
- init({ config }) {
- const { settings } = config;
-
- if (!settings || typeof settings !== 'object') {
- console.log('Batch destination initialized with default settings');
- return;
- }
-
- // Initialize batch processing
- const settingsObj = settings as Record;
- const batchSize =
- typeof settingsObj.batchSize === 'number' ? settingsObj.batchSize : 10;
- const flushInterval =
- typeof settingsObj.flushInterval === 'number'
- ? settingsObj.flushInterval
- : 5000;
- const maxWaitTime =
- typeof settingsObj.maxWaitTime === 'number'
- ? settingsObj.maxWaitTime
- : 30000;
-
- console.log(
- `Batch destination initialized: size=${batchSize}, interval=${flushInterval}ms`,
- );
- },
-
- async pushBatch(events, { config }) {
- const { settings } = config;
- const batchId = Date.now().toString(36);
-
- // Handle batch as array
- const eventsArray = Array.isArray(events) ? events : [];
- console.log(
- `📦 Processing batch ${batchId} with ${eventsArray.length} events`,
- );
-
- try {
- // Simulate API call with batched events
- const payload = {
- batch_id: batchId,
- timestamp: new Date().toISOString(),
- events: eventsArray.map((event: WalkerOS.Event) => ({
- event_name: event.event,
- event_data: event.data,
- user_id:
- event.user && typeof event.user === 'object' && 'id' in event.user
- ? String(event.user.id)
- : undefined,
- session_id:
- event.context?.session &&
- typeof event.context.session === 'object' &&
- 'id' in event.context.session
- ? String(event.context.session.id)
- : undefined,
- timestamp: event.timestamp,
- })),
- metadata: {
- source: 'walkerOS-batch',
- version: '1.0',
- total_events: eventsArray.length,
- },
- };
-
- // In production, this would be an actual API call
- const settingsObj =
- settings && typeof settings === 'object'
- ? (settings as Record)
- : {};
- const endpoint =
- typeof settingsObj.endpoint === 'string' ? settingsObj.endpoint : null;
-
- if (endpoint) {
- const headers =
- settingsObj.headers && typeof settingsObj.headers === 'object'
- ? (settingsObj.headers as Record)
- : {};
-
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- ...headers,
- },
- body: JSON.stringify(payload),
- });
-
- if (!response.ok) {
- throw new Error(`Batch API failed: ${response.status}`);
- }
- }
-
- console.log(`✅ Batch ${batchId} sent successfully`);
- return { ok: true };
- } catch (error) {
- console.error(`❌ Batch ${batchId} failed:`, error);
- throw error;
- }
- },
-
- async push(event, context) {
- // Fallback for single events (shouldn't be called when pushBatch is available)
- console.log('Single event fallback:', event.event);
- },
-};
-
-export async function setupBatchProcessing(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- // High-performance batch destination
- batch: {
- ...batchingDestination,
- config: {
- settings: {
- endpoint: 'https://api.example.com/events/batch',
- batchSize: 5, // Small batch for demo
- flushInterval: 3000, // 3 seconds
- maxWaitTime: 10000, // 10 seconds max wait
- headers: {
- Authorization: 'Bearer batch-api-token',
- 'X-Batch-Source': 'walkerOS',
- },
- },
- },
- },
- // Regular API destination for comparison
- api_single: {
- ...destinationAPI,
- config: {
- settings: {
- url: 'https://api.example.com/events/single',
- headers: {
- Authorization: 'Bearer single-api-token',
- },
- },
- mapping: {
- // Send all events to single endpoint
- '*': {
- '*': {
- name: 'tracked_event',
- data: {
- map: {
- event_type: 'event',
- event_action: 'action',
- properties: 'data',
- },
- },
- },
- },
- },
- },
- },
- },
- });
-
- return { collector, elb };
-}
-
-// Simulate high-volume event tracking
-export async function simulateHighVolumeTracking(
- elb: WalkerOS.Elb,
-): Promise {
- console.log('🚀 Starting high-volume event simulation...');
-
- const eventTypes = [
- { entity: 'page', action: 'view' },
- { entity: 'product', action: 'view' },
- { entity: 'product', action: 'add' },
- { entity: 'button', action: 'click' },
- { entity: 'form', action: 'submit' },
- { entity: 'video', action: 'play' },
- { entity: 'search', action: 'perform' },
- ];
-
- const sampleData = [
- { title: 'Homepage', category: 'navigation' },
- { id: 'prod-001', name: 'Product A', price: 29.99 },
- { id: 'prod-002', name: 'Product B', price: 49.99 },
- { label: 'CTA Button', position: 'header' },
- { type: 'newsletter', success: true },
- { id: 'video-123', duration: 120 },
- { query: 'wireless headphones', results: 25 },
- ];
-
- // Send events rapidly to trigger batching
- for (let i = 0; i < 10; i++) {
- const eventType = eventTypes[i % eventTypes.length];
- const data = sampleData[i % sampleData.length];
-
- await elb(`${eventType.entity} ${eventType.action}`, {
- ...data,
- sequence: i + 1,
- timestamp: Date.now(),
- });
-
- // Very small delay for testing
- await new Promise((resolve) => setTimeout(resolve, 1));
- }
-
- console.log('📊 High-volume simulation completed');
-}
-
-// Performance comparison: batched vs individual requests
-export async function comparePerformance(elb: WalkerOS.Elb): Promise {
- console.log('⚡ Starting performance comparison...');
-
- const events = Array.from({ length: 50 }, (_, i) => ({
- entity: 'performance',
- action: 'test',
- data: {
- test_id: `perf-test-${i}`,
- batch_number: Math.floor(i / 10),
- sequence: i,
- },
- }));
-
- // Measure batched processing time
- const batchStart = performance.now();
-
- for (const event of events) {
- await elb(`${event.entity} ${event.action}`, event.data);
- }
-
- // Wait for batches to flush
- await new Promise((resolve) => setTimeout(resolve, 5000));
-
- const batchEnd = performance.now();
- const batchDuration = batchEnd - batchStart;
-
- console.log(`📈 Performance Results:`);
- console.log(` Total events: ${events.length}`);
- console.log(` Batch processing time: ${batchDuration.toFixed(2)}ms`);
- console.log(
- ` Average per event: ${(batchDuration / events.length).toFixed(2)}ms`,
- );
-}
-
-// Monitor batch queue status
-export function monitorBatchQueue(collector: Collector.Instance): void {
- // Check queue status periodically
- const monitor = setInterval(() => {
- const queueInfo = {
- pending_events: 'Queue monitoring not directly available',
- destinations: Object.keys(collector.destinations).length,
- timestamp: new Date().toISOString(),
- };
-
- console.log('📋 Queue Status:', queueInfo);
- }, 10000); // Every 10 seconds
-
- // Clean up after 1 minute
- setTimeout(() => {
- clearInterval(monitor);
- console.log('🛑 Queue monitoring stopped');
- }, 60000);
-}
diff --git a/apps/quickstart/src/server-destinations/aws.ts b/apps/quickstart/src/server-destinations/aws.ts
deleted file mode 100644
index 2d99f3b06..000000000
--- a/apps/quickstart/src/server-destinations/aws.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { createDestination } from '@walkeros/core';
-import { destinationFirehose } from '@walkeros/server-destination-aws';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupAWSFirehose(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file - AWS Firehose server destination
- const trackingConfig = {
- run: true,
- globals: {
- environment: 'production',
- service: 'api-server',
- },
- destinations: {
- aws: createDestination(destinationFirehose, {
- settings: {
- firehose: {
- streamName: 'your-firehose-stream',
- region: 'us-east-1',
- config: {
- credentials: {
- accessKeyId: process.env.AWS_ACCESS_KEY_ID || '',
- secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || '',
- },
- },
- },
- },
- mapping: {
- user: {
- signup: {
- name: 'user_registration',
- data: {
- map: {
- user_id: 'user.id',
- email: 'user.email',
- signup_source: 'data.source',
- plan_type: 'data.plan',
- },
- },
- },
- },
- subscription: {
- purchase: {
- name: 'subscription_created',
- data: {
- map: {
- user_id: 'user.id',
- plan: 'data.plan',
- amount: 'data.amount',
- currency: 'data.currency',
- billing_period: 'data.period',
- },
- },
- },
- },
- },
- }),
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function trackServerEvents(elb: WalkerOS.Elb): Promise {
- await elb({
- event: 'user signup',
- user: {
- id: 'user-123',
- email: 'user@example.com',
- },
- data: {
- plan: 'premium',
- source: 'organic',
- },
- });
-
- await elb({
- event: 'subscription purchase',
- user: {
- id: 'user-123',
- },
- data: {
- plan: 'premium',
- amount: 99.99,
- currency: 'USD',
- period: 'monthly',
- },
- });
-}
diff --git a/apps/quickstart/src/server-destinations/gcp.ts b/apps/quickstart/src/server-destinations/gcp.ts
deleted file mode 100644
index 6ff305630..000000000
--- a/apps/quickstart/src/server-destinations/gcp.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupGCPPubSub(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector();
- return { collector, elb };
-}
-
-export const gcpPubSubConfig = {
- settings: {
- projectId: 'your-gcp-project',
- topicName: 'walkerOS-events',
- credentials: {
- client_email: process.env.GCP_CLIENT_EMAIL || '',
- private_key: process.env.GCP_PRIVATE_KEY || '',
- },
- },
-};
-
-export async function publishToGCP(elb: WalkerOS.Elb): Promise {
- await elb('api request', {
- endpoint: '/api/v1/users',
- method: 'POST',
- });
-
- await elb('job complete', {
- jobId: 'job-789',
- type: 'data-processing',
- });
-}
diff --git a/apps/quickstart/src/server-destinations/meta-capi.ts b/apps/quickstart/src/server-destinations/meta-capi.ts
deleted file mode 100644
index 0737d4cd6..000000000
--- a/apps/quickstart/src/server-destinations/meta-capi.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupMetaCAPI(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector();
- return { collector, elb };
-}
-
-export const metaCAPIConfig = {
- settings: {
- pixelId: 'YOUR_PIXEL_ID',
- accessToken: process.env.META_ACCESS_TOKEN || '',
- test_event_code: process.env.META_TEST_EVENT_CODE,
- },
-};
-
-export async function trackServerConversions(elb: WalkerOS.Elb): Promise {
- await elb({
- event: 'order complete',
- user: {
- id: 'user-456',
- email: 'customer@example.com',
- },
- data: {
- id: 'order-789',
- total: 199.99,
- currency: 'USD',
- },
- });
-
- await elb({
- event: 'form submit',
- user: {
- id: 'user-789',
- email: 'lead@example.com',
- phone: '+1234567890',
- },
- data: {
- type: 'contact',
- value: 100,
- },
- });
-}
diff --git a/apps/quickstart/src/walkerjs/basic.ts b/apps/quickstart/src/walkerjs/basic.ts
deleted file mode 100644
index 9c4d91645..000000000
--- a/apps/quickstart/src/walkerjs/basic.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-export function setupWalkerJS(): HTMLScriptElement {
- const script = document.createElement('script');
- script.src =
- 'https://cdn.jsdelivr.net/npm/@walkeros/walker.js@latest/dist/index.browser.js';
- script.async = true;
- document.head.appendChild(script);
- return script;
-}
-
-export function initWalkerJS(): void {
- const script = setupWalkerJS();
- script.onload = () => {
- console.log('Walker.js loaded');
- };
-}
diff --git a/apps/quickstart/src/walkerjs/with-sources.ts b/apps/quickstart/src/walkerjs/with-sources.ts
deleted file mode 100644
index f9a9f5d4b..000000000
--- a/apps/quickstart/src/walkerjs/with-sources.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-// Walker.js bundle includes browser source by default
-export async function setupWalkerWithSources(): Promise {
- // Load walker.js bundle from CDN
- await new Promise((resolve) => {
- const script = document.createElement('script');
- script.src =
- 'https://cdn.jsdelivr.net/npm/@walkeros/walker.js@latest/dist/index.browser.js';
- script.async = true;
- script.onload = () => resolve();
- document.head.appendChild(script);
- });
-
- // Walker.js automatically initializes with browser source
- // which tracks DOM elements with data-elb attributes
- return (window as Record).elb;
-}
-
-export async function trackWithWalkerSources(elb: unknown): Promise {
- // Type the elb function safely
- const elbFn = elb as (
- command: string,
- config: Record,
- ) => Promise;
-
- // Configure browser source to track specific attributes
- await elbFn('walker config', {
- source: {
- browser: {
- // Track elements with data-track attributes
- dataLayer: true,
- // Enable click tracking
- click: true,
- // Enable view tracking (intersection observer)
- view: true,
- },
- },
- });
-
- // Add a destination to see the events
- await elbFn('walker destination', {
- push: (event: Record) => {
- console.log('Walker.js Event:', {
- event: event.event,
- data: event.data,
- trigger: event.trigger,
- });
- },
- });
-
- // Trigger a custom event
- await elbFn('button click', {
- label: 'Sign Up',
- position: 'header',
- });
-}
diff --git a/apps/quickstart/src/web-browser/basic.ts b/apps/quickstart/src/web-browser/basic.ts
deleted file mode 100644
index 108259f40..000000000
--- a/apps/quickstart/src/web-browser/basic.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupBrowserTracking(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector();
- return { collector, elb };
-}
-
-export async function setupBrowserWithConsole(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- console: {
- push: (event) => console.log('Event:', event),
- },
- },
- });
- return { collector, elb };
-}
diff --git a/apps/quickstart/src/web-dataLayer/basic.ts b/apps/quickstart/src/web-dataLayer/basic.ts
deleted file mode 100644
index 81859d1fd..000000000
--- a/apps/quickstart/src/web-dataLayer/basic.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupDataLayer(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector();
- return { collector, elb };
-}
diff --git a/apps/quickstart/src/web-destinations/api.ts b/apps/quickstart/src/web-destinations/api.ts
deleted file mode 100644
index 96f70cadf..000000000
--- a/apps/quickstart/src/web-destinations/api.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { createSource, createDestination } from '@walkeros/core';
-import { destinationAPI } from '@walkeros/web-destination-api';
-import { sourceBrowser } from '@walkeros/web-source-browser';
-import type { WalkerOS, Collector, Source } from '@walkeros/core';
-
-export async function setupAPIDestination(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file - API destination setup
- const trackingConfig = {
- run: true,
- globals: {
- environment: 'production',
- api_version: 'v1',
- },
- sources: {
- browser: createSource(sourceBrowser, {
- settings: {
- scope: document.body,
- session: true,
- },
- }),
- },
- destinations: {
- api: createDestination(destinationAPI, {
- settings: {
- url: 'https://api.example.com/events',
- headers: {
- 'X-API-Key': 'your-api-key',
- 'Content-Type': 'application/json',
- },
- },
- mapping: {
- page: {
- view: {
- name: 'pageview',
- data: {
- map: {
- url: 'data.url',
- title: 'data.title',
- timestamp: 'timestamp',
- },
- },
- },
- },
- order: {
- complete: {
- name: 'purchase',
- data: {
- map: {
- order_id: 'data.id',
- revenue: 'data.total',
- currency: 'data.currency',
- },
- },
- },
- },
- },
- }),
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function trackAPIEvents(elb: WalkerOS.Elb): Promise {
- await elb('page view', {
- url: '/products',
- title: 'Products Page',
- });
-
- await elb('order complete', {
- id: 'order-999',
- total: 249.99,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/custom-destination.ts b/apps/quickstart/src/web-destinations/custom-destination.ts
deleted file mode 100644
index 17655e4c1..000000000
--- a/apps/quickstart/src/web-destinations/custom-destination.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import type { WalkerOS, Destination, Collector } from '@walkeros/core';
-
-// Custom destination that sends events to a webhook
-const customWebhookDestination: Destination.Instance = {
- type: 'webhook',
-
- config: {},
-
- init({ config }) {
- const { settings } = config;
- const settingsObj =
- settings && typeof settings === 'object'
- ? (settings as Record)
- : {};
- if (!settingsObj.url || typeof settingsObj.url !== 'string') {
- console.warn('Custom webhook destination: URL not configured');
- return false;
- }
- console.log('Custom webhook destination initialized');
- },
-
- async push(event, { config }) {
- const { settings } = config;
- const settingsObj =
- settings && typeof settings === 'object'
- ? (settings as Record)
- : {};
-
- if (!settingsObj.url || typeof settingsObj.url !== 'string') {
- console.warn(
- 'Custom webhook destination: No URL configured, skipping event',
- );
- return;
- }
-
- // Send to webhook
- try {
- const headers =
- settingsObj.headers && typeof settingsObj.headers === 'object'
- ? (settingsObj.headers as Record)
- : {};
-
- const response = await fetch(settingsObj.url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- ...headers,
- },
- body: JSON.stringify({
- timestamp: new Date().toISOString(),
- event: event.event,
- data: event.data,
- user: event.user,
- session: event.context?.session,
- }),
- });
-
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
-
- console.log('Event sent to webhook:', event.event);
- } catch (error) {
- console.error('Failed to send event to webhook:', error);
- throw error;
- }
- },
-};
-
-export async function setupCustomDestination(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- webhook: {
- ...customWebhookDestination,
- config: {
- settings: {
- url: 'https://webhook.site/unique-id',
- headers: {
- Authorization: 'Bearer your-api-token',
- 'X-Source': 'walkerOS-quickstart',
- },
- },
- mapping: {
- // Map page views to custom event name
- page: {
- view: {
- settings: {
- eventName: 'pageview_tracked',
- additionalData: {
- source: 'walkerOS',
- version: '1.0',
- },
- },
- },
- },
- // Map purchases with custom data
- order: {
- complete: {
- settings: {
- eventName: 'purchase_completed',
- additionalData: {
- channel: 'web',
- currency: 'USD',
- },
- },
- },
- },
- },
- },
- },
- },
- });
-
- return { collector, elb };
-}
-
-export async function trackCustomDestinationEvents(
- elb: WalkerOS.Elb,
-): Promise {
- // Track page view
- await elb('page view', {
- title: 'Custom Destination Demo',
- url: '/demo',
- });
-
- // Track purchase
- await elb('order complete', {
- id: 'order-12345',
- total: 99.99,
- items: 2,
- });
-
- // Track custom event
- await elb('feature used', {
- feature: 'custom-destination',
- success: true,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/ga4-complete.ts b/apps/quickstart/src/web-destinations/ga4-complete.ts
deleted file mode 100644
index 100391326..000000000
--- a/apps/quickstart/src/web-destinations/ga4-complete.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationGtag } from '@walkeros/web-destination-gtag';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupGA4Complete(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- gtag: {
- ...destinationGtag,
- config: {
- settings: {
- ga4: {
- measurementId: 'G-XXXXXXXXXX',
- },
- },
- mapping: {
- // Page view
- page: {
- view: {
- name: 'page_view',
- settings: { ga4: {} },
- },
- },
- // Product events
- product: {
- view: {
- name: 'view_item',
- settings: { ga4: {} },
- data: {
- map: {
- currency: { value: 'USD' },
- value: 'data.price',
- },
- },
- },
- },
- // Purchase event
- order: {
- complete: {
- name: 'purchase',
- settings: { ga4: {} },
- data: {
- map: {
- transaction_id: 'data.id',
- value: 'data.total',
- currency: { value: 'USD' },
- },
- },
- },
- },
- },
- },
- },
- },
- });
- return { collector, elb };
-}
-
-export async function trackGA4Events(elb: WalkerOS.Elb): Promise {
- await elb('page view', {
- title: 'Home Page',
- path: '/',
- });
-
- await elb('product view', {
- id: 'prod-123',
- name: 'Red Sneakers',
- price: 99.99,
- });
-
- await elb('order complete', {
- id: 'order-456',
- total: 109.98,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/gtag-ads.ts b/apps/quickstart/src/web-destinations/gtag-ads.ts
deleted file mode 100644
index 20e85a70b..000000000
--- a/apps/quickstart/src/web-destinations/gtag-ads.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationGtag } from '@walkeros/web-destination-gtag';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupGoogleAds(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- gtag: {
- ...destinationGtag,
- config: {
- settings: {
- ads: {
- conversionId: 'AW-XXXXXXXXX',
- },
- },
- mapping: {
- order: {
- complete: {
- name: 'conversion',
- settings: { ads: {} },
- data: {
- map: {
- value: 'data.total',
- currency: 'data.currency',
- transaction_id: 'data.id',
- },
- },
- },
- },
- form: {
- submit: {
- name: 'conversion',
- settings: { ads: { conversionLabel: 'LEAD' } },
- data: {
- map: {
- value: { value: 0, key: 'data.value' },
- },
- },
- },
- },
- },
- },
- },
- },
- });
- return { collector, elb };
-}
-
-export async function trackAdsConversions(elb: WalkerOS.Elb): Promise {
- await elb('order complete', {
- id: 'order-789',
- total: 129.99,
- currency: 'USD',
- });
-
- await elb('form submit', {
- type: 'lead',
- value: 50,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/gtag-complete.ts b/apps/quickstart/src/web-destinations/gtag-complete.ts
deleted file mode 100644
index 91b9da9db..000000000
--- a/apps/quickstart/src/web-destinations/gtag-complete.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { createSource, createDestination } from '@walkeros/core';
-import { destinationGtag } from '@walkeros/web-destination-gtag';
-import { sourceBrowser } from '@walkeros/web-source-browser';
-import type { WalkerOS, Collector, Source } from '@walkeros/core';
-
-export async function setupGtagComplete(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file approach - complete tracking setup
- const trackingConfig = {
- run: true,
- globals: {
- environment: 'production',
- version: '1.0.0',
- },
- sources: {
- browser: createSource(sourceBrowser, {
- settings: {
- scope: document.body,
- session: true,
- },
- }),
- },
- destinations: {
- gtag: createDestination(destinationGtag, {
- settings: {
- ga4: {
- measurementId: 'G-XXXXXXXXXX',
- },
- ads: {
- conversionId: 'AW-XXXXXXXXX',
- },
- gtm: {
- containerId: 'GTM-XXXXXXX',
- },
- },
- mapping: {
- // GA4 Purchase mapping
- order: {
- complete: {
- name: 'purchase',
- settings: {
- ga4: { include: ['data'] },
- },
- data: {
- map: {
- transaction_id: 'data.id',
- value: 'data.total',
- currency: { value: 'USD', key: 'data.currency' },
- },
- },
- },
- },
- // Google Ads conversion mapping
- form: {
- submit: {
- name: 'conversion',
- settings: {
- ads: { label: 'LEAD' },
- },
- data: {
- map: {
- value: { value: 0, key: 'data.value' },
- currency: { value: 'USD' },
- },
- },
- },
- },
- // GTM custom event
- product: {
- view: {
- name: 'product_view',
- settings: {
- gtm: {},
- },
- data: {
- map: {
- product_id: 'data.id',
- product_name: 'data.name',
- value: 'data.price',
- },
- },
- },
- },
- },
- }),
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function trackGtagEvents(elb: WalkerOS.Elb): Promise {
- // GA4 purchase event
- await elb('order complete', {
- id: 'order-123',
- total: 99.99,
- currency: 'USD',
- });
-
- // Google Ads lead conversion
- await elb('form submit', {
- type: 'lead',
- value: 50,
- });
-
- // GTM product view
- await elb('product view', {
- id: 'prod-456',
- name: 'Blue Jacket',
- price: 79.99,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/meta-pixel.ts b/apps/quickstart/src/web-destinations/meta-pixel.ts
deleted file mode 100644
index d2364f804..000000000
--- a/apps/quickstart/src/web-destinations/meta-pixel.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { createSource, createDestination } from '@walkeros/core';
-import { destinationMeta } from '@walkeros/web-destination-meta';
-import { sourceBrowser } from '@walkeros/web-source-browser';
-import type { WalkerOS, Collector, Source } from '@walkeros/core';
-
-export async function setupMetaPixel(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- // Single big config file - Meta Pixel tracking setup
- const trackingConfig = {
- run: true,
- globals: {
- environment: 'production',
- currency: 'USD',
- },
- sources: {
- browser: createSource(sourceBrowser, {
- settings: {
- scope: document.body,
- session: true,
- },
- }),
- },
- destinations: {
- meta: createDestination(destinationMeta, {
- settings: {
- pixelId: 'YOUR_PIXEL_ID',
- },
- mapping: {
- page: {
- view: { name: 'PageView' },
- },
- product: {
- add: {
- name: 'AddToCart',
- data: {
- map: {
- value: 'data.price',
- currency: 'data.currency',
- content_ids: ['data.id'],
- content_name: 'data.name',
- },
- },
- },
- },
- order: {
- complete: {
- name: 'Purchase',
- data: {
- map: {
- value: 'data.total',
- currency: 'data.currency',
- content_ids: ['data.id'],
- },
- },
- },
- },
- },
- }),
- },
- };
-
- const { collector, elb } = await createCollector(trackingConfig);
- return { collector, elb };
-}
-
-export async function trackMetaEvents(elb: WalkerOS.Elb): Promise {
- await elb('page view');
-
- await elb('product add', {
- id: 'prod-456',
- name: 'Summer Dress',
- price: 49.99,
- currency: 'USD',
- });
-
- await elb('order complete', {
- id: 'order-123',
- total: 99.98,
- currency: 'USD',
- });
-}
diff --git a/apps/quickstart/src/web-destinations/piwikpro.ts b/apps/quickstart/src/web-destinations/piwikpro.ts
deleted file mode 100644
index 5d239f1a7..000000000
--- a/apps/quickstart/src/web-destinations/piwikpro.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationPiwikPro } from '@walkeros/web-destination-piwikpro';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupPiwikPro(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- piwikpro: {
- ...destinationPiwikPro,
- config: {
- settings: {
- appId: 'XXX-XXX-XXX-XXX-XXX',
- url: 'https://your-instance.piwik.pro/',
- },
- mapping: {
- // Product view to ecommerceProductDetailView
- product: {
- view: {
- name: 'ecommerceProductDetailView',
- data: {
- set: [
- {
- set: [
- {
- map: {
- sku: 'data.id',
- name: 'data.name',
- price: 'data.price',
- quantity: { value: 1 },
- },
- },
- ],
- },
- {
- map: {
- currencyCode: { value: 'EUR' },
- },
- },
- ],
- },
- },
- // Product add to ecommerceAddToCart
- add: {
- name: 'ecommerceAddToCart',
- data: {
- set: [
- {
- set: [
- {
- map: {
- sku: 'data.id',
- name: 'data.name',
- price: 'data.price',
- quantity: { value: 1 },
- },
- },
- ],
- },
- {
- map: {
- currencyCode: { value: 'EUR' },
- },
- },
- ],
- },
- },
- },
- // Order complete to ecommerceOrder
- order: {
- complete: {
- name: 'ecommerceOrder',
- data: {
- set: [
- {
- map: {
- orderId: 'data.id',
- grandTotal: 'data.total',
- currencyCode: { value: 'EUR' },
- },
- },
- ],
- },
- },
- },
- },
- },
- },
- },
- });
-
- return { collector, elb };
-}
-
-export async function trackPiwikProEvents(elb: WalkerOS.Elb): Promise {
- await elb('product view', {
- id: 'SKU-123',
- name: 'Blue T-Shirt',
- price: 29.99,
- });
-
- await elb('product add', {
- id: 'SKU-456',
- name: 'Red Shoes',
- price: 89.99,
- });
-
- await elb('order complete', {
- id: 'order-789',
- total: 149.99,
- });
-}
diff --git a/apps/quickstart/src/web-destinations/plausible.ts b/apps/quickstart/src/web-destinations/plausible.ts
deleted file mode 100644
index ca9b413c4..000000000
--- a/apps/quickstart/src/web-destinations/plausible.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { createCollector } from '@walkeros/collector';
-import { destinationPlausible } from '@walkeros/web-destination-plausible';
-import type { WalkerOS, Collector } from '@walkeros/core';
-
-export async function setupPlausible(): Promise<{
- collector: Collector.Instance;
- elb: WalkerOS.Elb;
-}> {
- const { collector, elb } = await createCollector({
- destinations: {
- plausible: {
- ...destinationPlausible,
- config: {
- settings: {
- domain: 'yourdomain.com',
- apiHost: 'https://plausible.io',
- },
- mapping: {
- // Custom goal tracking
- form: {
- submit: {
- name: 'Contact Form',
- },
- },
- file: {
- download: {
- name: 'Download',
- data: {
- map: {
- filename: 'data.filename',
- },
- },
- },
- },
- },
- },
- },
- },
- });
-
- return { collector, elb };
-}
-
-export async function trackPlausibleEvents(elb: WalkerOS.Elb): Promise {
- await elb('form submit', {
- type: 'contact',
- });
-
- await elb('file download', {
- filename: 'whitepaper.pdf',
- });
-}
diff --git a/package-lock.json b/package-lock.json
index 555c37773..5a9631a6c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,6 @@
"packages/web/destinations/*",
"packages/web/sources/*",
"apps/walkerjs",
- "apps/quickstart",
"apps/storybook-addon",
"apps/demos/react",
"apps/demos/storybook",
@@ -1576,6 +1575,7 @@
"apps/quickstart": {
"name": "@walkeros/quickstart",
"version": "0.0.4",
+ "extraneous": true,
"license": "MIT",
"dependencies": {
"@walkeros/collector": "0.0.8",
@@ -1601,20 +1601,6 @@
"jest-environment-jsdom": "^29.7.0"
}
},
- "apps/quickstart/node_modules/@walkeros/web-source-browser": {
- "version": "0.0.9",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/elbwalker"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@walkeros/collector": "0.0.8",
- "@walkeros/web-core": "0.0.8"
- }
- },
"apps/storybook-addon": {
"name": "@walkeros/storybook-addon",
"version": "0.0.2",
@@ -15370,10 +15356,6 @@
"resolved": "packages/config/jest",
"link": true
},
- "node_modules/@walkeros/quickstart": {
- "resolved": "apps/quickstart",
- "link": true
- },
"node_modules/@walkeros/server-core": {
"resolved": "packages/server/core",
"link": true
diff --git a/package.json b/package.json
index 27c03ab84..697a21a32 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,6 @@
"packages/web/destinations/*",
"packages/web/sources/*",
"apps/walkerjs",
- "apps/quickstart",
"apps/storybook-addon",
"apps/demos/react",
"apps/demos/storybook",
@@ -23,9 +22,9 @@
"clean": "turbo run clean",
"dev": "turbo run dev --output-logs=errors-only",
"format": "prettier --write .",
- "lint": "turbo run lint --output-logs=errors-only",
+ "lint": "turbo run lint --filter=!@walkeros/website --output-logs=errors-only",
"publish-packages": "npm run build lint test && changeset version && changeset publish",
- "test": "turbo run test --output-logs=errors-only",
+ "test": "turbo run test --filter=!@walkeros/website --output-logs=errors-only",
"prepare": "is-ci || husky"
},
"devDependencies": {
From abfd22c6834f68bb14cbabe51a870bad9294f684 Mon Sep 17 00:00:00 2001
From: alexander
Date: Sat, 6 Sep 2025 15:09:03 +0200
Subject: [PATCH 11/13] lint updates
---
apps/demos/storybook/eslint.config.js | 39 +++++++++------------------
packages/config/eslint/index.mjs | 1 +
packages/config/jest/src/index.mjs | 16 +++++++++++
3 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/apps/demos/storybook/eslint.config.js b/apps/demos/storybook/eslint.config.js
index b72eb5acb..139d2ac15 100644
--- a/apps/demos/storybook/eslint.config.js
+++ b/apps/demos/storybook/eslint.config.js
@@ -1,29 +1,16 @@
-// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format
+import baseConfig from '@walkeros/eslint/web.mjs';
import storybook from 'eslint-plugin-storybook';
-import js from '@eslint/js';
-import globals from 'globals';
-import reactHooks from 'eslint-plugin-react-hooks';
-import reactRefresh from 'eslint-plugin-react-refresh';
-import tseslint from 'typescript-eslint';
-import { globalIgnores } from 'eslint/config';
-
-export default tseslint.config(
- [
- globalIgnores(['dist']),
- {
- files: ['**/*.{ts,tsx}'],
- extends: [
- js.configs.recommended,
- tseslint.configs.recommended,
- reactHooks.configs['recommended-latest'],
- reactRefresh.configs.vite,
- ],
- languageOptions: {
- ecmaVersion: 2020,
- globals: globals.browser,
- },
+export default [
+ {
+ ignores: ['storybook-static/**'],
+ },
+ ...baseConfig,
+ ...storybook.configs['flat/recommended'],
+ {
+ files: ['**/*.stories.{js,ts,tsx}'],
+ rules: {
+ // Storybook-specific rule overrides if needed
},
- ],
- storybook.configs['flat/recommended'],
-);
+ },
+];
diff --git a/packages/config/eslint/index.mjs b/packages/config/eslint/index.mjs
index d675768f5..76c55b70c 100644
--- a/packages/config/eslint/index.mjs
+++ b/packages/config/eslint/index.mjs
@@ -8,6 +8,7 @@ export default [
ignores: [
'**/coverage/**',
'**/dist/**',
+ '**/build/**',
'**/node_modules/**',
'**/__mocks__/**',
],
diff --git a/packages/config/jest/src/index.mjs b/packages/config/jest/src/index.mjs
index cf5c50cfa..5c548ffd7 100644
--- a/packages/config/jest/src/index.mjs
+++ b/packages/config/jest/src/index.mjs
@@ -78,6 +78,22 @@ const config = {
moduleDirectories: ['node_modules', 'src'],
extensionsToTreatAsEsm: ['.ts', '.tsx'],
moduleNameMapper: getModuleMapper(),
+
+ // Performance settings - fixed values for consistent behavior
+ maxWorkers: 4,
+ testTimeout: 30000,
+ forceExit: true,
+ clearMocks: true,
+ restoreMocks: true,
+ detectOpenHandles: true,
+
+ // Enhanced ignore patterns
+ testPathIgnorePatterns: [
+ '/node_modules/',
+ '/dist/',
+ '/build/',
+ '/coverage/'
+ ],
};
export default config;
From 7f999b7b3a7b66c13b1aa3bb43dcc6d4de74b9c7 Mon Sep 17 00:00:00 2001
From: alexander
Date: Sun, 7 Sep 2025 21:36:42 +0200
Subject: [PATCH 12/13] name
---
AGENT.md | 4 +-
apps/walkerjs/package.json | 2 +-
.../src/__tests__/destination.test.ts | 22 ++++----
.../src/__tests__/integration.test.ts | 4 +-
apps/walkerjs/src/destination.ts | 2 +-
package-lock.json | 16 +-----
packages/collector/src/destination.ts | 6 +--
packages/collector/src/handle.ts | 10 ++--
.../core/src/__tests__/eventGenerator.test.ts | 8 +--
packages/core/src/__tests__/mapping.test.ts | 34 ++++++------
packages/core/src/__tests__/validate.test.ts | 54 +++++++++----------
packages/core/src/eventGenerator.ts | 8 +--
packages/core/src/mapping.ts | 2 +-
packages/core/src/types/walkeros.ts | 2 +-
packages/core/src/validate.ts | 12 ++---
packages/server/core/README.md | 2 +-
.../core/src/__tests__/collector.test.ts | 2 +-
.../core/src/__tests__/destination.test.ts | 20 +++----
.../gcp/src/bigquery/__tests__/index.test.ts | 2 +-
packages/server/destinations/meta/src/push.ts | 2 +-
.../core/src/__tests__/sessionStart.test.ts | 4 +-
packages/web/core/src/session/sessionStart.ts | 2 +-
.../gtag/src/__tests__/ga4.test.ts | 2 +-
.../gtag/src/__tests__/gtm.test.ts | 3 +-
.../web/destinations/gtag/src/ga4/push.ts | 2 +-
.../web/destinations/gtag/src/gtm/push.ts | 2 +-
.../web/destinations/meta/src/index.test.ts | 2 +-
packages/web/destinations/meta/src/index.ts | 6 +--
.../web/destinations/piwikpro/src/index.ts | 4 +-
.../web/destinations/plausible/src/index.ts | 2 +-
.../browser/src/__tests__/edgeCases.test.ts | 1 -
.../browser/src/__tests__/elbLayer.test.ts | 22 ++++----
.../browser/src/__tests__/integration.test.ts | 10 ++--
.../browser/src/__tests__/translation.test.ts | 16 +++---
.../browser/src/__tests__/trigger.test.ts | 6 +--
.../web/sources/browser/src/translation.ts | 4 +-
packages/web/sources/browser/src/trigger.ts | 2 +-
.../src/__tests__/consent-simple.test.ts | 14 ++---
.../dataLayer/src/__tests__/enhanced.test.ts | 21 +++-----
.../dataLayer/src/__tests__/filter.test.ts | 16 +++---
.../src/__tests__/integration.test.ts | 20 +++----
.../dataLayer/src/__tests__/minimal.test.ts | 12 ++---
.../web/sources/dataLayer/src/interceptor.ts | 13 ++---
website/docs/core/server.mdx | 2 +-
website/docs/destinations/event-mapping.mdx | 12 ++---
website/docs/getting-started/event-model.mdx | 2 +-
website/docs/sources/web/browser/tagging.mdx | 2 +-
47 files changed, 194 insertions(+), 224 deletions(-)
diff --git a/AGENT.md b/AGENT.md
index c7c40e055..a128dcb02 100644
--- a/AGENT.md
+++ b/AGENT.md
@@ -127,7 +127,7 @@ All events follow this consistent structure:
```typescript
{
- event: 'product view', // ENTITY ACTION format
+ name: 'product view', // ENTITY ACTION format
data: { // Entity-specific properties
id: 'P123',
name: 'Laptop',
@@ -488,7 +488,7 @@ it('processes events correctly', async () => {
});
await collector.push('page view', {});
expect(mockDestination.push).toHaveBeenCalledWith(
- expect.objectContaining({ event: 'page view' }),
+ expect.objectContaining({ name: 'page view' }),
expect.any(Object),
);
});
diff --git a/apps/walkerjs/package.json b/apps/walkerjs/package.json
index aabe81cbb..8297ca9ca 100644
--- a/apps/walkerjs/package.json
+++ b/apps/walkerjs/package.json
@@ -37,7 +37,7 @@
"@walkeros/core": "0.0.8",
"@walkeros/collector": "0.0.8",
"@walkeros/web-core": "0.0.8",
- "@walkeros/web-source-browser": "0.0.9",
+ "@walkeros/web-source-browser": "0.0.10",
"@walkeros/web-source-datalayer": "0.0.8"
},
"devDependencies": {
diff --git a/apps/walkerjs/src/__tests__/destination.test.ts b/apps/walkerjs/src/__tests__/destination.test.ts
index 0964740c2..936ed2b0d 100644
--- a/apps/walkerjs/src/__tests__/destination.test.ts
+++ b/apps/walkerjs/src/__tests__/destination.test.ts
@@ -20,7 +20,7 @@ describe('Destination Tests', () => {
test('should push event to dataLayer', () => {
const destination = dataLayerDestination();
const event = {
- event: 'foo bar',
+ name: 'foo bar',
} as unknown as WalkerOS.Event;
destination.push(event, {} as unknown as Destination.PushContext);
expect(mockDataLayer).toHaveBeenCalledWith(event);
@@ -29,7 +29,7 @@ describe('Destination Tests', () => {
test('should not push events from dataLayer source', () => {
const destination = dataLayerDestination();
const event = {
- event: 'foo bar',
+ name: 'foo bar',
source: {
type: 'dataLayer',
},
@@ -41,7 +41,7 @@ describe('Destination Tests', () => {
test('should push context data when available', () => {
const destination = dataLayerDestination();
const event = {
- event: 'foo bar',
+ name: 'foo bar',
} as unknown as WalkerOS.Event;
const contextData = { custom: 'data' };
destination.push(event, {
@@ -56,16 +56,16 @@ describe('Destination Tests', () => {
const destination = dataLayerDestination();
const batch = {
key: 'test-batch',
- data: [{ event: 'event1' }, { event: 'event2' }],
+ data: [{ name: 'event1' }, { name: 'event2' }],
events: [],
} as unknown as Destination.Batch;
destination.pushBatch?.(batch, {} as unknown as Destination.PushContext);
expect(mockDataLayer).toHaveBeenCalledWith({
- event: 'batch',
+ name: 'batch',
batched_event: 'test-batch',
- events: [{ event: 'event1' }, { event: 'event2' }],
+ events: [{ name: 'event1' }, { name: 'event2' }],
});
});
@@ -74,15 +74,15 @@ describe('Destination Tests', () => {
const batch = {
key: 'test-batch',
data: [],
- events: [{ event: 'fallback1' }, { event: 'fallback2' }],
+ events: [{ name: 'fallback1' }, { name: 'fallback2' }],
} as unknown as Destination.Batch;
destination.pushBatch?.(batch, {} as unknown as Destination.PushContext);
expect(mockDataLayer).toHaveBeenCalledWith({
- event: 'batch',
+ name: 'batch',
batched_event: 'test-batch',
- events: [{ event: 'fallback1' }, { event: 'fallback2' }],
+ events: [{ name: 'fallback1' }, { name: 'fallback2' }],
});
});
});
@@ -98,7 +98,7 @@ describe('Destination Tests', () => {
test('should handle events with non-object source', () => {
const destination = dataLayerDestination();
const event = {
- event: 'foo bar',
+ name: 'foo bar',
source: 'string source',
} as unknown as WalkerOS.Event;
destination.push(event, {} as unknown as Destination.PushContext);
@@ -108,7 +108,7 @@ describe('Destination Tests', () => {
test('should handle events with dataLayer-like source type', () => {
const destination = dataLayerDestination();
const event = {
- event: 'foo bar',
+ name: 'foo bar',
source: {
type: 'custom-dataLayer-source',
},
diff --git a/apps/walkerjs/src/__tests__/integration.test.ts b/apps/walkerjs/src/__tests__/integration.test.ts
index e280df5f8..51bb9f860 100644
--- a/apps/walkerjs/src/__tests__/integration.test.ts
+++ b/apps/walkerjs/src/__tests__/integration.test.ts
@@ -104,7 +104,7 @@ describe('Walker.js Integration Tests', () => {
const event = mockPush.mock.calls[0][0] as unknown as WalkerOS.Event;
expect(event).toMatchObject({
- event: 'product add',
+ name: 'product add',
data: {
id: 123,
name: 'Test Product',
@@ -135,7 +135,7 @@ describe('Walker.js Integration Tests', () => {
expect(mockPush).toHaveBeenCalled();
const event = mockPush.mock.calls[0][0] as unknown as WalkerOS.Event;
- expect(event.event).toBe('order complete');
+ expect(event.name).toBe('order complete');
expect(event.data).toMatchObject({
transaction_id: 'TRX123',
value: 99.99,
diff --git a/apps/walkerjs/src/destination.ts b/apps/walkerjs/src/destination.ts
index db7a36e68..8ccb6d048 100644
--- a/apps/walkerjs/src/destination.ts
+++ b/apps/walkerjs/src/destination.ts
@@ -23,7 +23,7 @@ export function dataLayerDestination(): Destination.InitDestination {
},
pushBatch: (batch) => {
dataLayerPush({
- event: 'batch',
+ name: 'batch',
batched_event: batch.key,
events: batch.data.length ? batch.data : batch.events,
});
diff --git a/package-lock.json b/package-lock.json
index 5a9631a6c..a38b8974a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2463,7 +2463,7 @@
"@walkeros/collector": "0.0.8",
"@walkeros/core": "0.0.8",
"@walkeros/web-core": "0.0.8",
- "@walkeros/web-source-browser": "0.0.9",
+ "@walkeros/web-source-browser": "0.0.10",
"@walkeros/web-source-datalayer": "0.0.8"
},
"devDependencies": {
@@ -2473,20 +2473,6 @@
"jest-environment-jsdom": "^29.7.0"
}
},
- "apps/walkerjs/node_modules/@walkeros/web-source-browser": {
- "version": "0.0.9",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/elbwalker"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@walkeros/collector": "0.0.8",
- "@walkeros/web-core": "0.0.8"
- }
- },
"node_modules/@adobe/css-tools": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
diff --git a/packages/collector/src/destination.ts b/packages/collector/src/destination.ts
index 8c065d8a3..c71f564f5 100644
--- a/packages/collector/src/destination.ts
+++ b/packages/collector/src/destination.ts
@@ -56,14 +56,14 @@ export function createPush(
// Event format: event object or string
const partialEvent =
typeof eventOrCommand === 'string'
- ? { event: eventOrCommand }
+ ? { name: eventOrCommand }
: (eventOrCommand as WalkerOS.DeepPartialEvent);
const enrichedEvent = prepareEvent(partialEvent);
const { event, command } = createEventOrCommand(
collector,
- enrichedEvent.event,
+ enrichedEvent.name,
enrichedEvent,
);
@@ -347,7 +347,7 @@ export async function destinationPush(
if (eventMapping.ignore) return false;
// Check to use specific event names
- if (eventMapping.name) event.event = eventMapping.name;
+ if (eventMapping.name) event.name = eventMapping.name;
// Transform event to a custom data
if (eventMapping.data) {
diff --git a/packages/collector/src/handle.ts b/packages/collector/src/handle.ts
index 205c1e3d1..06031f0a6 100644
--- a/packages/collector/src/handle.ts
+++ b/packages/collector/src/handle.ts
@@ -115,13 +115,13 @@ export function createEventOrCommand(
nameOrEvent,
'' as string,
)
- ? { event: nameOrEvent, ...defaults }
+ ? { name: nameOrEvent, ...defaults }
: { ...defaults, ...(nameOrEvent || {}) };
- if (!partialEvent.event) throw new Error('Event name is required');
+ if (!partialEvent.name) throw new Error('Event name is required');
// Check for valid entity and action event format
- const [entityValue, actionValue] = partialEvent.event.split(' ');
+ const [entityValue, actionValue] = partialEvent.name.split(' ');
if (!entityValue || !actionValue) throw new Error('Event name is invalid');
// It's a walker command
@@ -141,7 +141,7 @@ export function createEventOrCommand(
// Extract properties with default fallbacks
const {
- event = `${entityValue} ${actionValue}`,
+ name = `${entityValue} ${actionValue}`,
data = {},
context = {},
globals = collector.globals,
@@ -162,7 +162,7 @@ export function createEventOrCommand(
} = partialEvent;
const fullEvent: WalkerOS.Event = {
- event,
+ name,
data,
context,
globals,
diff --git a/packages/core/src/__tests__/eventGenerator.test.ts b/packages/core/src/__tests__/eventGenerator.test.ts
index 90a38c57e..0ac788df9 100644
--- a/packages/core/src/__tests__/eventGenerator.test.ts
+++ b/packages/core/src/__tests__/eventGenerator.test.ts
@@ -7,7 +7,7 @@ describe('createEvent', () => {
const id = `${timestamp}-${group}-${count}`;
const defaultEvent = {
- event: 'entity action',
+ name: 'entity action',
data: {
string: 'foo',
number: 1,
@@ -54,7 +54,7 @@ describe('createEvent', () => {
test('getEvent', () => {
expect(getEvent('page view')).toStrictEqual(
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
data: {
domain: 'www.example.com',
title: 'walkerOS documentation',
@@ -71,7 +71,7 @@ describe('createEvent', () => {
expect(getEvent('page view', { data: { id: '/custom' } })).toStrictEqual(
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
data: { id: '/custom' },
trigger: 'load',
entity: 'page',
@@ -81,7 +81,7 @@ describe('createEvent', () => {
expect(getEvent('promotion visible')).toStrictEqual(
expect.objectContaining({
- event: 'promotion visible',
+ name: 'promotion visible',
data: {
name: 'Setting up tracking easily',
position: 'hero',
diff --git a/packages/core/src/__tests__/mapping.test.ts b/packages/core/src/__tests__/mapping.test.ts
index b83a22a65..2d2dd446d 100644
--- a/packages/core/src/__tests__/mapping.test.ts
+++ b/packages/core/src/__tests__/mapping.test.ts
@@ -14,7 +14,7 @@ describe('getMappingEvent', () => {
expect(
await getMappingEvent(
- { event: 'page view' },
+ { name: 'page view' },
{ page: { view: pageViewConfig } },
),
).toStrictEqual({
@@ -27,7 +27,7 @@ describe('getMappingEvent', () => {
const entityAsterisksConfig = { name: 'entity_*' };
expect(
await getMappingEvent(
- { event: 'page random' },
+ { name: 'page random' },
{ page: { '*': entityAsterisksConfig } },
),
).toStrictEqual({
@@ -38,7 +38,7 @@ describe('getMappingEvent', () => {
const asterisksActionConfig = { name: '*_view' };
expect(
await getMappingEvent(
- { event: 'random view' },
+ { name: 'random view' },
{ '*': { view: asterisksActionConfig } },
),
).toStrictEqual({
@@ -56,28 +56,28 @@ describe('getMappingEvent', () => {
};
expect(
- await getMappingEvent({ event: 'not existing' }, mapping),
+ await getMappingEvent({ name: 'not existing' }, mapping),
).toStrictEqual({
eventMapping: { name: 'asterisk' },
mappingKey: '* *',
});
expect(
- await getMappingEvent({ event: 'asterisk action' }, mapping),
+ await getMappingEvent({ name: 'asterisk action' }, mapping),
).toStrictEqual({
eventMapping: { name: 'action' },
mappingKey: '* action',
});
expect(
- await getMappingEvent({ event: 'foo something' }, mapping),
+ await getMappingEvent({ name: 'foo something' }, mapping),
).toStrictEqual({
eventMapping: { name: 'foo_asterisk' },
mappingKey: 'foo *',
});
expect(
- await getMappingEvent({ event: 'bar something' }, mapping),
+ await getMappingEvent({ name: 'bar something' }, mapping),
).toStrictEqual({
eventMapping: { name: 'asterisk' },
mappingKey: '* *',
@@ -103,7 +103,7 @@ describe('getMappingEvent', () => {
};
expect(
- await getMappingEvent({ event: 'order complete' }, mapping),
+ await getMappingEvent({ name: 'order complete' }, mapping),
).toStrictEqual({
eventMapping: (mapping.order!.complete as Array)[1],
mappingKey: 'order complete',
@@ -111,7 +111,7 @@ describe('getMappingEvent', () => {
expect(
await getMappingEvent(
- { event: 'order complete', globals: { env: 'prod' } },
+ { name: 'order complete', globals: { env: 'prod' } },
mapping,
),
).toStrictEqual({
@@ -204,11 +204,11 @@ describe('getMappingValue', () => {
});
test('fn', async () => {
- const pageView = createEvent({ event: 'page view' });
- const pageClick = createEvent({ event: 'page click' });
+ const pageView = createEvent({ name: 'page view' });
+ const pageClick = createEvent({ name: 'page click' });
const mockFn = jest.fn((event) => {
- if (event.event === 'page view') return 'foo';
+ if (event.name === 'page view') return 'foo';
return 'bar';
});
@@ -248,11 +248,11 @@ describe('getMappingValue', () => {
loop: [
'this',
{
- key: 'event',
+ key: 'name',
},
],
}),
- ).toStrictEqual([event.event]);
+ ).toStrictEqual([event.name]);
});
test('set', async () => {
@@ -260,7 +260,7 @@ describe('getMappingValue', () => {
expect(
await getMappingValue(event, {
- set: ['event', 'data', { value: 'static' }, { fn: () => 'fn' }],
+ set: ['name', 'data', { value: 'static' }, { fn: () => 'fn' }],
}),
).toStrictEqual(['order complete', event.data, 'static', 'fn']);
});
@@ -421,12 +421,12 @@ describe('getMappingValue', () => {
test('condition', async () => {
const mockCondition = jest.fn((event) => {
- return event.event === 'page view';
+ return event.name === 'page view';
});
// Condition met
expect(
- await getMappingValue(createEvent({ event: 'page view' }), {
+ await getMappingValue(createEvent({ name: 'page view' }), {
key: 'data.string',
condition: mockCondition,
}),
diff --git a/packages/core/src/__tests__/validate.test.ts b/packages/core/src/__tests__/validate.test.ts
index 089d9854f..9bf7189a7 100644
--- a/packages/core/src/__tests__/validate.test.ts
+++ b/packages/core/src/__tests__/validate.test.ts
@@ -6,11 +6,11 @@ describe('validate', () => {
// should return valid event with missing properties filled
expect(
validateEvent({
- event: 'e a',
+ name: 'e a',
data: { k: 'v' },
}),
).toStrictEqual({
- event: 'e a',
+ name: 'e a',
data: { k: 'v' },
context: {},
custom: {},
@@ -33,7 +33,7 @@ describe('validate', () => {
// should throw error for invalid event name
expect(() =>
validateEvent({
- event: 'e',
+ name: 'e',
}),
).toThrow('Invalid event name');
@@ -42,27 +42,27 @@ describe('validate', () => {
validateEvent({
data: { key: 'value' },
}),
- ).toThrow('Missing or invalid event, entity, or action');
+ ).toThrow('Missing or invalid name, entity, or action');
// long event names
expect(
validateEvent({
- event: 'e ' + 'a'.repeat(256),
- }).event,
+ name: 'e ' + 'a'.repeat(256),
+ }).name,
).toHaveLength(255);
expect(() =>
validateEvent(
{
- event: 'e ' + 'a'.repeat(11),
+ name: 'e ' + 'a'.repeat(11),
},
- [{ e: { '*': { event: { maxLength: 10, strict: true } } } }],
+ [{ e: { '*': { name: { maxLength: 10, strict: true } } } }],
),
).toThrow('Value exceeds maxLength');
// should throw error for invalid type
expect(
validateEvent({
- event: 'some event',
+ name: 'some event',
data: 'invalid type',
}),
).toHaveProperty('data', {});
@@ -70,7 +70,7 @@ describe('validate', () => {
// should throw error for extra properties
expect(() =>
validateEvent({
- event: 'some event',
+ name: 'some event',
extraProp: 'should not be here',
}),
).not.toHaveProperty('extraProp');
@@ -87,7 +87,7 @@ describe('validate', () => {
expect(
validateEvent(
{
- event: 'e a',
+ name: 'e a',
data: { k: 'v', remove: 'me' },
},
contract,
@@ -96,7 +96,7 @@ describe('validate', () => {
expect(() =>
validateEvent(
{
- event: 'e s',
+ name: 'e s',
data: { k: 'v', remove: 'me' },
},
contract,
@@ -107,7 +107,7 @@ describe('validate', () => {
expect(() =>
validateEvent(
{
- event: 'p r',
+ name: 'p r',
data: {},
},
requireContract,
@@ -116,7 +116,7 @@ describe('validate', () => {
expect(
validateEvent(
{
- event: 'a n',
+ name: 'a n',
},
requireContract,
),
@@ -125,7 +125,7 @@ describe('validate', () => {
// should remove unknown properties
expect(
validateEvent({
- event: 'some event',
+ name: 'some event',
randomProp: 123, // doesn't belong here
}),
).not.toHaveProperty('randomProp');
@@ -133,7 +133,7 @@ describe('validate', () => {
// should throw error for invalid number range
expect(
validateEvent({
- event: 'e a',
+ name: 'e a',
count: -1, // should be >= 0
}),
).toHaveProperty('count', 0);
@@ -143,7 +143,7 @@ describe('validate', () => {
{
entity: {
throw: {
- event: {
+ name: {
validate: (
value: unknown,
key: string,
@@ -155,7 +155,7 @@ describe('validate', () => {
},
},
name: {
- event: {
+ name: {
validate: () => {
// With great power comes great responsibility...
return 'invalideventname';
@@ -173,14 +173,14 @@ describe('validate', () => {
},
];
expect(() =>
- validateEvent({ event: 'entity throw' }, customValidationContract),
+ validateEvent({ name: 'entity throw' }, customValidationContract),
).toThrow('Custom');
expect(
- validateEvent({ event: 'entity name' }, customValidationContract),
- ).toHaveProperty('event', 'invalideventname'); // If one really wants
+ validateEvent({ name: 'entity name' }, customValidationContract),
+ ).toHaveProperty('name', 'invalideventname'); // If one really wants
expect(
validateEvent(
- { event: 'entity type', data: {} },
+ { name: 'entity type', data: {} },
customValidationContract,
),
).toHaveProperty('data', {}); // If one really wants
@@ -188,10 +188,10 @@ describe('validate', () => {
// should validate wildcard rules
expect(
validateEvent({
- event: 'product add',
+ name: 'product add',
data: { id: '123', price: 9.99 },
}),
- ).toMatchObject({ event: 'product add', data: { id: '123', price: 9.99 } });
+ ).toMatchObject({ name: 'product add', data: { id: '123', price: 9.99 } });
const typeContract = {
e: {
@@ -208,7 +208,7 @@ describe('validate', () => {
expect(() =>
validateEvent(
{
- event: 'e a',
+ name: 'e a',
globals: {
n: 'no number',
},
@@ -219,7 +219,7 @@ describe('validate', () => {
expect(
validateEvent(
{
- event: 'e a',
+ name: 'e a',
globals: {
n: 1,
k: 'v',
@@ -227,6 +227,6 @@ describe('validate', () => {
},
[typeContract],
),
- ).toMatchObject({ event: 'e a' });
+ ).toMatchObject({ name: 'e a' });
});
});
diff --git a/packages/core/src/eventGenerator.ts b/packages/core/src/eventGenerator.ts
index 6fe48ea7d..930155d84 100644
--- a/packages/core/src/eventGenerator.ts
+++ b/packages/core/src/eventGenerator.ts
@@ -19,7 +19,7 @@ export function createEvent(
const id = `${timestamp}-${group}-${count}`;
const defaultEvent: WalkerOS.Event = {
- event: 'entity action',
+ name: 'entity action',
data: {
string: 'foo',
number: 1,
@@ -67,8 +67,8 @@ export function createEvent(
// Update conditions
// Entity and action from event
- if (props.event) {
- const [entity, action] = props.event.split(' ') ?? [];
+ if (props.name) {
+ const [entity, action] = props.name.split(' ') ?? [];
if (entity && action) {
event.entity = entity;
@@ -270,5 +270,5 @@ export function getEvent(
},
};
- return createEvent({ ...defaultEvents[name], ...props, event: name });
+ return createEvent({ ...defaultEvents[name], ...props, name: name });
}
diff --git a/packages/core/src/mapping.ts b/packages/core/src/mapping.ts
index d6580f0c6..8b556442b 100644
--- a/packages/core/src/mapping.ts
+++ b/packages/core/src/mapping.ts
@@ -16,7 +16,7 @@ export async function getMappingEvent(
event: WalkerOS.PartialEvent,
mapping?: Mapping.Rules,
): Promise {
- const [entity, action] = (event.event || '').split(' ');
+ const [entity, action] = (event.name || '').split(' ');
if (!mapping || !entity || !action) return {};
let eventMapping: Mapping.Rule | undefined;
diff --git a/packages/core/src/types/walkeros.ts b/packages/core/src/types/walkeros.ts
index 4b103c42c..7e30d9932 100644
--- a/packages/core/src/types/walkeros.ts
+++ b/packages/core/src/types/walkeros.ts
@@ -16,7 +16,7 @@ export type Events = Array;
export type PartialEvent = Partial;
export type DeepPartialEvent = DeepPartial;
export interface Event {
- event: string;
+ name: string;
data: Properties;
context: OrderedProperties;
globals: Properties;
diff --git a/packages/core/src/validate.ts b/packages/core/src/validate.ts
index c8b61a458..31ade7fe4 100644
--- a/packages/core/src/validate.ts
+++ b/packages/core/src/validate.ts
@@ -20,9 +20,9 @@ export function validateEvent(
let entity: string;
let action: string;
- // Check if event.event is available and it's a string
- if (isSameType(obj.event, '')) {
- event = obj.event;
+ // Check if event.name is available and it's a string
+ if (isSameType(obj.name, '')) {
+ event = obj.name;
[entity, action] = event.split(' ');
if (!entity || !action) throwError('Invalid event name');
} else if (isSameType(obj.entity, '') && isSameType(obj.action, '')) {
@@ -30,13 +30,13 @@ export function validateEvent(
action = obj.action;
event = `${entity} ${action}`;
} else {
- throwError('Missing or invalid event, entity, or action');
+ throwError('Missing or invalid name, entity, or action');
}
const basicContract: Schema.Contract = {
'*': {
'*': {
- event: { maxLength: 255 }, // @TODO as general rule?
+ name: { maxLength: 255 }, // @TODO as general rule?
user: { allowedKeys: ['id', 'device', 'session'] },
consent: { allowedValues: [true, false] },
timestamp: { min: 0 },
@@ -49,7 +49,7 @@ export function validateEvent(
};
const basicEvent: WalkerOS.Event = {
- event,
+ name: event,
data: {},
context: {},
custom: {},
diff --git a/packages/server/core/README.md b/packages/server/core/README.md
index 63bc7b66d..1e4e35dc1 100644
--- a/packages/server/core/README.md
+++ b/packages/server/core/README.md
@@ -31,7 +31,7 @@ sends HTTP requests using Node.js built-in modules (`http`/`https`).
```js
// Simple POST request
const response = await sendServer('https://api.example.com/events', {
- event: 'page view',
+ name: 'page view',
data: { url: '/home' },
});
diff --git a/packages/server/core/src/__tests__/collector.test.ts b/packages/server/core/src/__tests__/collector.test.ts
index aae5bbc2b..005282a34 100644
--- a/packages/server/core/src/__tests__/collector.test.ts
+++ b/packages/server/core/src/__tests__/collector.test.ts
@@ -88,7 +88,7 @@ describe('Server Collector', () => {
tagging: 42,
});
const event = {
- event: 'e a',
+ name: 'e a',
data: {},
context: {},
custom: {},
diff --git a/packages/server/core/src/__tests__/destination.test.ts b/packages/server/core/src/__tests__/destination.test.ts
index 689f2e066..55341c428 100644
--- a/packages/server/core/src/__tests__/destination.test.ts
+++ b/packages/server/core/src/__tests__/destination.test.ts
@@ -138,12 +138,12 @@ describe('Destination', () => {
expect(eventCall).toHaveBeenCalledWith({ ...mockEvent, ...changes });
jest.clearAllMocks();
- await elb({ ...mockEvent, event: 'entity rename' });
+ await elb({ ...mockEvent, name: 'entity rename' });
expect(mockDestination.push).toHaveBeenCalledWith(
expect.objectContaining({
...mockEvent,
...changes,
- event: 'NewEventName',
+ name: 'NewEventName',
}),
expect.objectContaining({
mapping: eventMapping,
@@ -162,7 +162,7 @@ describe('Destination', () => {
expect(mockDestination.push).toHaveBeenCalledTimes(1);
expect(mockDestination.push).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'custom',
+ name: 'custom',
}),
expect.objectContaining({
mapping: eventMapping,
@@ -182,7 +182,7 @@ describe('Destination', () => {
result = await elb(mockEvent);
expect(mockPush).toHaveBeenCalledWith(
- expect.objectContaining({ event: 'entity action' }),
+ expect.objectContaining({ name: 'entity action' }),
expect.objectContaining({
mapping: eventMapping,
data: 'bar',
@@ -265,7 +265,7 @@ describe('Destination', () => {
expect(second).toHaveBeenCalledTimes(1);
expect(first).toHaveBeenCalledWith({
...mockEvent,
- event: 'new name',
+ name: 'new name',
custom: { foo: 'bar' },
});
expect(second).toHaveBeenCalledWith({ ...mockEvent });
@@ -359,11 +359,11 @@ describe('Destination', () => {
// DLQ
expect(collector.destinations['initFail'].dlq).toContainEqual([
- expect.objectContaining({ event: mockEvent.event }),
+ expect.objectContaining({ name: mockEvent.name }),
new Error('init kaputt'),
]);
expect(collector.destinations['pushFail'].dlq).toContainEqual([
- expect.objectContaining({ event: mockEvent.event }),
+ expect.objectContaining({ name: mockEvent.name }),
new Error('push kaputt'),
]);
});
@@ -420,7 +420,7 @@ describe('Destination', () => {
const event = createEvent();
const policy = {
- event: {
+ name: {
value: 'new name',
},
'data.string': { value: 'bar' },
@@ -447,7 +447,7 @@ describe('Destination', () => {
expect(mockPush).toHaveBeenCalledWith({
...event,
- event: 'new name',
+ name: 'new name',
data: expect.objectContaining({
string: 'bar',
number: undefined, // Redacted due to missing consent
@@ -476,7 +476,7 @@ describe('Destination', () => {
expect(mockPushWithEnvironment).toHaveBeenCalledWith(
expect.objectContaining({
- event: mockEvent.event,
+ name: mockEvent.name,
}),
expect.objectContaining({
env: expect.objectContaining({
diff --git a/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts b/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
index 84502a60e..9ed25df0c 100644
--- a/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
+++ b/packages/server/destinations/gcp/src/bigquery/__tests__/index.test.ts
@@ -77,7 +77,7 @@ describe('Server Destination BigQuery', () => {
expect(mockFn).toHaveBeenCalledWith('insert', [
{
timestamp: expect.any(Date),
- event: 'entity action',
+ name: 'entity action',
id: event.id,
entity: 'entity',
action: 'action',
diff --git a/packages/server/destinations/meta/src/push.ts b/packages/server/destinations/meta/src/push.ts
index 951ada14e..3589214d2 100644
--- a/packages/server/destinations/meta/src/push.ts
+++ b/packages/server/destinations/meta/src/push.ts
@@ -51,7 +51,7 @@ export const push: PushFn = async function (
delete userData.fbclid;
}
const serverEvent: ServerEventParameters = {
- event_name: event.event,
+ event_name: event.name,
event_id: event.id,
event_time: Math.round((event.timestamp || Date.now()) / 1000),
action_source,
diff --git a/packages/web/core/src/__tests__/sessionStart.test.ts b/packages/web/core/src/__tests__/sessionStart.test.ts
index 590e8b08e..3a4d9b45f 100644
--- a/packages/web/core/src/__tests__/sessionStart.test.ts
+++ b/packages/web/core/src/__tests__/sessionStart.test.ts
@@ -142,7 +142,7 @@ describe('sessionStart', () => {
expect.any(Object),
);
expect(mockElb).toHaveBeenNthCalledWith(2, {
- event: 'session start',
+ name: 'session start',
data: expect.any(Object),
});
});
@@ -166,7 +166,7 @@ describe('sessionStart', () => {
test('Callback default elb calls', () => {
const session = sessionStart({ data: { isNew: true, isStart: true } });
expect(mockElb).toHaveBeenCalledWith({
- event: 'session start',
+ name: 'session start',
data: session,
});
});
diff --git a/packages/web/core/src/session/sessionStart.ts b/packages/web/core/src/session/sessionStart.ts
index 2facf2f3b..80c010f68 100644
--- a/packages/web/core/src/session/sessionStart.ts
+++ b/packages/web/core/src/session/sessionStart.ts
@@ -105,7 +105,7 @@ const defaultCb: SessionCallback = (
if (session.isStart) {
// Convert session start to an event object
elb({
- event: 'session start',
+ name: 'session start',
data: session,
});
}
diff --git a/packages/web/destinations/gtag/src/__tests__/ga4.test.ts b/packages/web/destinations/gtag/src/__tests__/ga4.test.ts
index d3efca6f8..809a43230 100644
--- a/packages/web/destinations/gtag/src/__tests__/ga4.test.ts
+++ b/packages/web/destinations/gtag/src/__tests__/ga4.test.ts
@@ -83,7 +83,7 @@ describe('GA4 Implementation', () => {
describe('pushGA4Event', () => {
const mockEvent = {
- event: 'page view',
+ name: 'page view',
data: {},
timestamp: 1234567890,
id: 'test-id',
diff --git a/packages/web/destinations/gtag/src/__tests__/gtm.test.ts b/packages/web/destinations/gtag/src/__tests__/gtm.test.ts
index 27a70e7fe..5727638b3 100644
--- a/packages/web/destinations/gtag/src/__tests__/gtm.test.ts
+++ b/packages/web/destinations/gtag/src/__tests__/gtm.test.ts
@@ -72,7 +72,7 @@ describe('GTM Implementation', () => {
describe('pushGTMEvent', () => {
const mockEvent = {
- event: 'product view',
+ name: 'product view',
entity: 'product',
action: 'view',
data: { id: 'product-1', name: 'Test Product' },
@@ -108,6 +108,7 @@ describe('GTM Implementation', () => {
expect(mockDataLayer).toHaveLength(1);
expect(mockDataLayer[0]).toEqual({
event: 'product view',
+ name: 'product view',
entity: 'product',
action: 'view',
data: { id: 'product-1', name: 'Test Product' },
diff --git a/packages/web/destinations/gtag/src/ga4/push.ts b/packages/web/destinations/gtag/src/ga4/push.ts
index ff6167b63..6579beaf3 100644
--- a/packages/web/destinations/gtag/src/ga4/push.ts
+++ b/packages/web/destinations/gtag/src/ga4/push.ts
@@ -31,7 +31,7 @@ export function pushGA4Event(
};
// Event name (snake_case default)
- let eventName = event.event; // Assume custom mapped name
+ let eventName = event.name; // Assume custom mapped name
if (settings.snakeCase !== false) {
// Use snake case if not disabled
eventName = normalizeEventName(eventName);
diff --git a/packages/web/destinations/gtag/src/gtm/push.ts b/packages/web/destinations/gtag/src/gtm/push.ts
index 8822e94dc..adaf62794 100644
--- a/packages/web/destinations/gtag/src/gtm/push.ts
+++ b/packages/web/destinations/gtag/src/gtm/push.ts
@@ -12,7 +12,7 @@ export function pushGTMEvent(
env?: DestinationWeb.Environment,
): void {
const { window } = getEnvironment(env);
- const obj = { event: event.event }; // Use the name mapping by default
+ const obj = { event: event.name }; // Use the name mapping by default
(window.dataLayer as unknown[]).push({
...obj,
diff --git a/packages/web/destinations/meta/src/index.test.ts b/packages/web/destinations/meta/src/index.test.ts
index 5b9fb663b..4caf42235 100644
--- a/packages/web/destinations/meta/src/index.test.ts
+++ b/packages/web/destinations/meta/src/index.test.ts
@@ -102,7 +102,7 @@ describe('Destination Meta Pixel', () => {
await elb(event);
expect(mockFn).toHaveBeenCalledWith(
'track',
- event.event,
+ event.name,
{},
{ eventID: event.id },
);
diff --git a/packages/web/destinations/meta/src/index.ts b/packages/web/destinations/meta/src/index.ts
index 9fb400a8f..24fea659c 100644
--- a/packages/web/destinations/meta/src/index.ts
+++ b/packages/web/destinations/meta/src/index.ts
@@ -40,12 +40,12 @@ export const destinationMeta: Destination = {
const fbq = window.fbq as facebook.Pixel.Event;
// page view
- if (event.event === 'page view' && !mapping.settings) {
+ if (event.name === 'page view' && !mapping.settings) {
// Define a custom mapping
- event.event = 'PageView';
+ event.name = 'PageView';
}
- const eventName = track || trackCustom || event.event;
+ const eventName = track || trackCustom || event.name;
fbq(
trackCustom ? 'trackCustom' : 'track',
diff --git a/packages/web/destinations/piwikpro/src/index.ts b/packages/web/destinations/piwikpro/src/index.ts
index 532e35127..38de4e0b4 100644
--- a/packages/web/destinations/piwikpro/src/index.ts
+++ b/packages/web/destinations/piwikpro/src/index.ts
@@ -49,7 +49,7 @@ export const destinationPiwikPro: Destination = {
const paq = (window as Window)._paq!.push;
// Send pageviews if not disabled
- if (event.event === 'page view' && !mapping.settings) {
+ if (event.name === 'page view' && !mapping.settings) {
paq(['trackPageView', await getMappingValue(event, 'data.title')]);
return;
}
@@ -58,7 +58,7 @@ export const destinationPiwikPro: Destination = {
const parameters = isArray(data) ? data : [data];
- paq([event.event, ...parameters]);
+ paq([event.name, ...parameters]);
if (eventMapping.goalId) {
const goalValue = eventMapping.goalValue
diff --git a/packages/web/destinations/plausible/src/index.ts b/packages/web/destinations/plausible/src/index.ts
index 14b35fee5..4055e0368 100644
--- a/packages/web/destinations/plausible/src/index.ts
+++ b/packages/web/destinations/plausible/src/index.ts
@@ -35,7 +35,7 @@ export const destinationPlausible: Destination = {
const { window } = getEnvironment(env);
const plausible = (window as Window).plausible!;
- plausible(`${event.event}`, params);
+ plausible(`${event.name}`, params);
},
};
diff --git a/packages/web/sources/browser/src/__tests__/edgeCases.test.ts b/packages/web/sources/browser/src/__tests__/edgeCases.test.ts
index 7f15ae98d..a1e7b2c4d 100644
--- a/packages/web/sources/browser/src/__tests__/edgeCases.test.ts
+++ b/packages/web/sources/browser/src/__tests__/edgeCases.test.ts
@@ -1,4 +1,3 @@
-/* eslint-disable jest/no-disabled-tests */
import type { WalkerOS, Collector } from '@walkeros/core';
import { createCollector } from '@walkeros/collector';
import { createBrowserSource } from './test-utils';
diff --git a/packages/web/sources/browser/src/__tests__/elbLayer.test.ts b/packages/web/sources/browser/src/__tests__/elbLayer.test.ts
index dd5119eb9..04ca3553b 100644
--- a/packages/web/sources/browser/src/__tests__/elbLayer.test.ts
+++ b/packages/web/sources/browser/src/__tests__/elbLayer.test.ts
@@ -134,11 +134,11 @@ describe('Elb Layer', () => {
// Then regular events
expect(mockPush).toHaveBeenNthCalledWith(
3,
- expect.objectContaining({ event: 'product' }),
+ expect.objectContaining({ name: 'product' }),
);
expect(mockPush).toHaveBeenNthCalledWith(
4,
- expect.objectContaining({ event: 'page' }),
+ expect.objectContaining({ name: 'page' }),
);
});
@@ -157,7 +157,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledTimes(1);
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'test_event',
+ name: 'test_event',
data: { key: 'value' },
context: { context: 'test' },
trigger: 'load',
@@ -167,7 +167,7 @@ describe('Elb Layer', () => {
test('handles object commands', () => {
const eventObject: WalkerOS.DeepPartialEvent = {
- event: 'custom_event',
+ name: 'custom_event',
data: { test: 'data' },
context: { page: ['home', 0] as [string, number] },
};
@@ -241,7 +241,7 @@ describe('Elb Layer', () => {
});
expect(mockPush).toHaveBeenNthCalledWith(
2,
- expect.objectContaining({ event: 'page' }),
+ expect.objectContaining({ name: 'page' }),
);
expect(mockPush).toHaveBeenNthCalledWith(
3,
@@ -268,7 +268,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'entity_name',
+ name: 'entity_name',
data: { prop: 'value' },
context: { ctx: 'context' },
trigger: 'trigger_type',
@@ -337,7 +337,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'test_event',
+ name: 'test_event',
data: { key: 'value' },
trigger: 'load',
}),
@@ -355,7 +355,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'immediate_event',
+ name: 'immediate_event',
data: { test: true },
}),
);
@@ -380,7 +380,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'product',
+ name: 'product',
data: expect.objectContaining({
id: 123, // Values are cast by castValue utility
name: 'Test Product',
@@ -401,7 +401,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'page',
+ name: 'page',
data: expect.objectContaining({
id: '/test-page',
}),
@@ -444,7 +444,7 @@ describe('Elb Layer', () => {
expect(mockPush).toHaveBeenCalledTimes(1);
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
data: expect.objectContaining({
id: '/walker-run-test',
}),
diff --git a/packages/web/sources/browser/src/__tests__/integration.test.ts b/packages/web/sources/browser/src/__tests__/integration.test.ts
index dfbf1bbf3..372e876cd 100644
--- a/packages/web/sources/browser/src/__tests__/integration.test.ts
+++ b/packages/web/sources/browser/src/__tests__/integration.test.ts
@@ -53,7 +53,7 @@ describe('Browser Source Integration Tests', () => {
// Should have processed the event with source information
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'product view',
+ name: 'product view',
data: expect.objectContaining({
id: 123,
name: 'Test Product',
@@ -101,7 +101,7 @@ describe('Browser Source Integration Tests', () => {
// Should have processed the pageview event
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
trigger: 'load',
data: expect.objectContaining({
id: '/test-page',
@@ -129,7 +129,7 @@ describe('Browser Source Integration Tests', () => {
// Should have processed the click
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'cta press',
+ name: 'cta press',
entity: 'cta',
action: 'press',
trigger: 'click',
@@ -161,7 +161,7 @@ describe('Browser Source Integration Tests', () => {
expect(mockPush).toHaveBeenNthCalledWith(
2,
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
data: expect.objectContaining({ id: '/test-page', title: 'Home' }),
context: { url: '/' },
trigger: 'load',
@@ -170,7 +170,7 @@ describe('Browser Source Integration Tests', () => {
expect(mockPush).toHaveBeenNthCalledWith(
3,
expect.objectContaining({
- event: 'product click',
+ name: 'product click',
data: { id: '123' },
context: { position: 1 },
trigger: 'click',
diff --git a/packages/web/sources/browser/src/__tests__/translation.test.ts b/packages/web/sources/browser/src/__tests__/translation.test.ts
index d91f8cf32..7e427910a 100644
--- a/packages/web/sources/browser/src/__tests__/translation.test.ts
+++ b/packages/web/sources/browser/src/__tests__/translation.test.ts
@@ -66,7 +66,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'test event',
+ name: 'test event',
data: { id: 123 },
context: { page: ['test', 0] },
source: {
@@ -90,7 +90,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: '123',
+ name: '123',
data: { value: 'test' },
context: { context: ['info', 0] },
source: {
@@ -114,7 +114,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'test event',
+ name: 'test event',
data: {}, // Should be empty object, not { value: 'primitive string data' }
context: { page: ['test', 0] },
source: {
@@ -143,7 +143,7 @@ describe('Translation Layer', () => {
test('does not add source information to object events', async () => {
// Test object event - should pass through as-is
const eventObject = {
- event: 'custom event',
+ name: 'custom event',
data: { test: true },
source: { type: 'custom', id: 'custom-id', previous_id: '' },
};
@@ -224,7 +224,7 @@ describe('Translation Layer', () => {
// Should have processed both events with source info
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'product',
+ name: 'product',
data: { id: '123' },
context: { position: 1 },
trigger: 'click',
@@ -238,7 +238,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'page',
+ name: 'page',
data: { title: 'Test' },
trigger: 'load',
source: {
@@ -265,7 +265,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledTimes(1);
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'product view',
+ name: 'product view',
data: { id: 123 },
trigger: 'load',
source: {
@@ -389,7 +389,7 @@ describe('Translation Layer', () => {
expect(mockPush).toHaveBeenCalledWith(
expect.objectContaining({
- event: '',
+ name: '',
data: { test: true },
source: {
type: 'browser',
diff --git a/packages/web/sources/browser/src/__tests__/trigger.test.ts b/packages/web/sources/browser/src/__tests__/trigger.test.ts
index cf5fc1784..4a0f791c8 100644
--- a/packages/web/sources/browser/src/__tests__/trigger.test.ts
+++ b/packages/web/sources/browser/src/__tests__/trigger.test.ts
@@ -132,7 +132,7 @@ describe('Trigger System', () => {
// Should NOT trigger page view (pageview now only fires on walker run)
expect(mockCollector.push).not.toHaveBeenCalledWith(
expect.objectContaining({
- event: 'page view',
+ name: 'page view',
}),
);
@@ -216,7 +216,7 @@ describe('Trigger System', () => {
expect(mockCollector.push).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'entity action',
+ name: 'entity action',
entity: 'entity',
action: 'action',
trigger: Triggers.Click,
@@ -449,7 +449,7 @@ describe('Trigger System', () => {
// Should have called push with entity load event
expect(mockCollector.push).toHaveBeenCalledWith(
expect.objectContaining({
- event: 'entity load',
+ name: 'entity load',
trigger: 'load',
}),
);
diff --git a/packages/web/sources/browser/src/translation.ts b/packages/web/sources/browser/src/translation.ts
index bdd17b311..cd65ef760 100644
--- a/packages/web/sources/browser/src/translation.ts
+++ b/packages/web/sources/browser/src/translation.ts
@@ -40,7 +40,7 @@ export function translateToCoreCollector(
// Extract entity name from event string
const [entity] = String(
- isObject(eventOrCommand) ? eventOrCommand.event : eventOrCommand,
+ isObject(eventOrCommand) ? eventOrCommand.name : eventOrCommand,
).split(' ');
// Get data and context either from elements or parameters
@@ -82,7 +82,7 @@ export function translateToCoreCollector(
// Build unified event from various elb usage patterns
const event: WalkerOS.DeepPartialEvent = {
- event: String(eventOrCommand || ''),
+ name: String(eventOrCommand || ''),
data: eventData,
context: eventContext,
nested,
diff --git a/packages/web/sources/browser/src/trigger.ts b/packages/web/sources/browser/src/trigger.ts
index 3cbee637e..16bb7e069 100644
--- a/packages/web/sources/browser/src/trigger.ts
+++ b/packages/web/sources/browser/src/trigger.ts
@@ -157,7 +157,7 @@ export async function handleTrigger(
return Promise.all(
events.map((event: Walker.Event) =>
translateToCoreCollector(context, {
- event: `${event.entity} ${event.action}`,
+ name: `${event.entity} ${event.action}`,
...event,
trigger,
}),
diff --git a/packages/web/sources/dataLayer/src/__tests__/consent-simple.test.ts b/packages/web/sources/dataLayer/src/__tests__/consent-simple.test.ts
index 360b611c8..b71191fa9 100644
--- a/packages/web/sources/dataLayer/src/__tests__/consent-simple.test.ts
+++ b/packages/web/sources/dataLayer/src/__tests__/consent-simple.test.ts
@@ -38,9 +38,8 @@ describe('DataLayer Source - Consent Mode (Simple)', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer consent update',
+ name: 'dataLayer consent update',
data: {
- event: 'consent update',
ad_storage: 'denied',
analytics_storage: 'granted',
},
@@ -65,9 +64,8 @@ describe('DataLayer Source - Consent Mode (Simple)', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer consent default',
+ name: 'dataLayer consent default',
data: {
- event: 'consent default',
ad_storage: 'denied',
analytics_storage: 'denied',
},
@@ -93,9 +91,8 @@ describe('DataLayer Source - Consent Mode (Simple)', () => {
// Should have processed the existing event
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer consent update',
+ name: 'dataLayer consent update',
data: {
- event: 'consent update',
ad_storage: 'granted',
analytics_storage: 'denied',
},
@@ -133,15 +130,12 @@ describe('DataLayer Source - Consent Mode (Simple)', () => {
expect(collectedEvents).toHaveLength(3);
expect(collectedEvents[0].data).toMatchObject({
- event: 'consent update',
ad_storage: 'granted',
});
expect(collectedEvents[1].data).toMatchObject({
- event: 'consent update',
analytics_storage: 'granted',
});
expect(collectedEvents[2].data).toMatchObject({
- event: 'consent update',
ad_storage: 'denied',
});
});
@@ -155,6 +149,6 @@ describe('DataLayer Source - Consent Mode (Simple)', () => {
getDataLayer().push(['consent', 'update', { ad_storage: 'granted' }]);
expect(collectedEvents).toHaveLength(1);
- expect(collectedEvents[0].event).toBe('gtag consent update');
+ expect(collectedEvents[0].name).toBe('gtag consent update');
});
});
diff --git a/packages/web/sources/dataLayer/src/__tests__/enhanced.test.ts b/packages/web/sources/dataLayer/src/__tests__/enhanced.test.ts
index d5134c217..296017c0b 100644
--- a/packages/web/sources/dataLayer/src/__tests__/enhanced.test.ts
+++ b/packages/web/sources/dataLayer/src/__tests__/enhanced.test.ts
@@ -42,9 +42,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer consent update',
+ name: 'dataLayer consent update',
data: {
- event: 'consent update',
ad_storage: 'granted',
analytics_storage: 'denied',
},
@@ -69,9 +68,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer purchase',
+ name: 'dataLayer purchase',
data: {
- event: 'purchase',
transaction_id: '123',
value: 25.99,
},
@@ -95,9 +93,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer config GA_MEASUREMENT_ID',
+ name: 'dataLayer config GA_MEASUREMENT_ID',
data: {
- event: 'config GA_MEASUREMENT_ID',
send_page_view: false,
},
});
@@ -114,9 +111,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer set currency',
+ name: 'dataLayer set currency',
data: {
- event: 'set currency',
value: 'EUR',
},
});
@@ -133,9 +129,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer set custom',
+ name: 'dataLayer set custom',
data: {
- event: 'set custom',
currency: 'EUR',
country: 'DE',
},
@@ -153,9 +148,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer custom_event',
+ name: 'dataLayer custom_event',
data: {
- event: 'custom_event',
user_id: 'user123',
},
});
@@ -205,9 +199,8 @@ describe('DataLayer Source - Enhanced with gtag support', () => {
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer consent update',
+ name: 'dataLayer consent update',
data: {
- event: 'consent update',
ad_storage: 'granted',
},
});
diff --git a/packages/web/sources/dataLayer/src/__tests__/filter.test.ts b/packages/web/sources/dataLayer/src/__tests__/filter.test.ts
index d1786f12b..2a51763b6 100644
--- a/packages/web/sources/dataLayer/src/__tests__/filter.test.ts
+++ b/packages/web/sources/dataLayer/src/__tests__/filter.test.ts
@@ -44,8 +44,8 @@ describe('DataLayer Source - Filtering', () => {
expect(mockFilter).toHaveBeenCalledTimes(3);
expect(collectedEvents).toHaveLength(2);
- expect(collectedEvents[0].event).toBe('dataLayer allowed_event');
- expect(collectedEvents[1].event).toBe('dataLayer consent update');
+ expect(collectedEvents[0].name).toBe('dataLayer allowed_event');
+ expect(collectedEvents[1].name).toBe('dataLayer consent update');
});
test('filter with consent events only', () => {
@@ -72,8 +72,8 @@ describe('DataLayer Source - Filtering', () => {
]);
expect(collectedEvents).toHaveLength(2);
- expect(collectedEvents[0].event).toBe('dataLayer consent update');
- expect(collectedEvents[1].event).toBe('dataLayer consent default');
+ expect(collectedEvents[0].name).toBe('dataLayer consent update');
+ expect(collectedEvents[1].name).toBe('dataLayer consent default');
});
test('filter processes existing events', () => {
@@ -102,8 +102,8 @@ describe('DataLayer Source - Filtering', () => {
// Should have processed 2 events (filtered out 'existing_bad')
expect(collectedEvents).toHaveLength(2);
- expect(collectedEvents[0].event).toBe('dataLayer existing_good');
- expect(collectedEvents[1].event).toBe('dataLayer consent update');
+ expect(collectedEvents[0].name).toBe('dataLayer existing_good');
+ expect(collectedEvents[1].name).toBe('dataLayer consent update');
});
test('handles filter errors gracefully', () => {
@@ -121,7 +121,7 @@ describe('DataLayer Source - Filtering', () => {
getDataLayer().push({ event: 'test_event', data: 'test' });
expect(collectedEvents).toHaveLength(1);
- expect(collectedEvents[0].event).toBe('dataLayer test_event');
+ expect(collectedEvents[0].name).toBe('dataLayer test_event');
});
test('filter return value determines processing', () => {
@@ -145,6 +145,6 @@ describe('DataLayer Source - Filtering', () => {
getDataLayer().push({ event: 'event2', data: 'test' });
expect(collectedEvents).toHaveLength(1);
- expect(collectedEvents[0].event).toBe('dataLayer event1');
+ expect(collectedEvents[0].name).toBe('dataLayer event1');
});
});
diff --git a/packages/web/sources/dataLayer/src/__tests__/integration.test.ts b/packages/web/sources/dataLayer/src/__tests__/integration.test.ts
index bc5a74051..0ea0e3d44 100644
--- a/packages/web/sources/dataLayer/src/__tests__/integration.test.ts
+++ b/packages/web/sources/dataLayer/src/__tests__/integration.test.ts
@@ -71,9 +71,8 @@ describe('DataLayer Source - Integration', () => {
// Check all consent events were processed
expect(collectedEvents[0]).toMatchObject({
- event: 'gtag consent default',
+ name: 'gtag consent default',
data: {
- event: 'consent default',
ad_storage: 'denied',
analytics_storage: 'denied',
ad_user_data: 'denied',
@@ -82,17 +81,14 @@ describe('DataLayer Source - Integration', () => {
});
expect(collectedEvents[1]).toMatchObject({
- event: 'gtag consent update',
+ name: 'gtag consent update',
data: {
- event: 'consent update',
analytics_storage: 'granted',
},
});
expect(collectedEvents[2]).toMatchObject({
- event: 'gtag consent update',
data: {
- event: 'consent update',
ad_storage: 'granted',
ad_user_data: 'granted',
},
@@ -123,7 +119,7 @@ describe('DataLayer Source - Integration', () => {
expect(collectedEvents).toHaveLength(5);
- const eventNames = collectedEvents.map((e) => e.event);
+ const eventNames = collectedEvents.map((e) => e.name);
expect(eventNames).toEqual([
'dataLayer consent update',
'dataLayer purchase',
@@ -150,10 +146,10 @@ describe('DataLayer Source - Integration', () => {
expect(collectedEvents).toHaveLength(4);
// Check order: existing events first, then new events
- expect(collectedEvents[0].event).toBe('dataLayer consent default');
- expect(collectedEvents[1].event).toBe('dataLayer existing_event');
- expect(collectedEvents[2].event).toBe('dataLayer consent update');
- expect(collectedEvents[3].event).toBe('dataLayer new_event');
+ expect(collectedEvents[0].name).toBe('dataLayer consent default');
+ expect(collectedEvents[1].name).toBe('dataLayer existing_event');
+ expect(collectedEvents[2].name).toBe('dataLayer consent update');
+ expect(collectedEvents[3].name).toBe('dataLayer new_event');
});
test('error handling and robustness', () => {
@@ -191,7 +187,7 @@ describe('DataLayer Source - Integration', () => {
// Should have processed 3 good events (bad_filter is invalid gtag format)
expect(collectedEvents).toHaveLength(3);
- const eventNames = collectedEvents.map((e) => e.event);
+ const eventNames = collectedEvents.map((e) => e.name);
expect(eventNames).toEqual([
'dataLayer consent update',
'dataLayer after_error',
diff --git a/packages/web/sources/dataLayer/src/__tests__/minimal.test.ts b/packages/web/sources/dataLayer/src/__tests__/minimal.test.ts
index 093bbb1f7..4574c10ff 100644
--- a/packages/web/sources/dataLayer/src/__tests__/minimal.test.ts
+++ b/packages/web/sources/dataLayer/src/__tests__/minimal.test.ts
@@ -61,8 +61,8 @@ describe('DataLayer Source - Minimal', () => {
// Should have captured the event immediately (synchronous)
expect(collectedEvents).toHaveLength(1);
expect(collectedEvents[0]).toMatchObject({
- event: 'dataLayer test_event',
- data: { event: 'test_event', test: 'data' },
+ name: 'dataLayer test_event',
+ data: { test: 'data' },
source: { type: 'dataLayer' },
});
});
@@ -81,8 +81,8 @@ describe('DataLayer Source - Minimal', () => {
// Should have processed both existing events
expect(collectedEvents).toHaveLength(2);
- expect(collectedEvents[0].event).toBe('dataLayer existing_event_1');
- expect(collectedEvents[1].event).toBe('dataLayer existing_event_2');
+ expect(collectedEvents[0].name).toBe('dataLayer existing_event_1');
+ expect(collectedEvents[1].name).toBe('dataLayer existing_event_2');
});
test('ignores non-object events', () => {
@@ -124,7 +124,7 @@ describe('DataLayer Source - Minimal', () => {
getDataLayer().push({ event: 'test_event', data: 'test' });
expect(collectedEvents).toHaveLength(1);
- expect(collectedEvents[0].event).toBe('custom test_event');
+ expect(collectedEvents[0].name).toBe('custom test_event');
});
test('uses custom dataLayer name', () => {
@@ -144,6 +144,6 @@ describe('DataLayer Source - Minimal', () => {
});
expect(collectedEvents).toHaveLength(1);
- expect(collectedEvents[0].event).toBe('dataLayer test_event');
+ expect(collectedEvents[0].name).toBe('dataLayer test_event');
});
});
diff --git a/packages/web/sources/dataLayer/src/interceptor.ts b/packages/web/sources/dataLayer/src/interceptor.ts
index 2b27e0df8..e7afcd077 100644
--- a/packages/web/sources/dataLayer/src/interceptor.ts
+++ b/packages/web/sources/dataLayer/src/interceptor.ts
@@ -110,11 +110,11 @@ function processEvent(
}
const prefix = settings.prefix || 'dataLayer';
- const eventName = `${prefix} ${transformedEvent.event}`;
+ const eventName = `${prefix} ${transformedEvent.name}`;
// Create WalkerOS event structure
const walkerEvent: WalkerOS.Event = {
- event: eventName,
+ name: eventName,
data: transformedEvent as WalkerOS.Properties,
context: {},
globals: {},
@@ -151,10 +151,11 @@ function processEvent(
*/
function transformDataLayerEvent(
rawEvent: unknown,
-): { event: string; [key: string]: unknown } | null {
+): { name: string; [key: string]: unknown } | null {
// Handle direct object format: { event: 'test', data: 'value' }
if (isObject(rawEvent) && isString(rawEvent.event)) {
- return rawEvent as { event: string; [key: string]: unknown };
+ const { event, ...rest } = rawEvent;
+ return { name: event, ...rest };
}
// Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]
@@ -177,7 +178,7 @@ function transformDataLayerEvent(
*/
function transformGtagArgs(
args: unknown[],
-): { event: string; [key: string]: unknown } | null {
+): { name: string; [key: string]: unknown } | null {
const [command, action, params] = args;
if (!isString(command)) return null;
@@ -234,7 +235,7 @@ function transformGtagArgs(
}
return {
- event: eventName,
+ name: eventName,
...eventData,
};
}
diff --git a/website/docs/core/server.mdx b/website/docs/core/server.mdx
index b73144bf1..3ac875514 100644
--- a/website/docs/core/server.mdx
+++ b/website/docs/core/server.mdx
@@ -32,7 +32,7 @@ sends HTTP requests using Node.js built-in modules (`http`/`https`).
```js
// Simple POST request
const response = await sendServer('https://api.example.com/events', {
- event: 'page view',
+ name: 'page view',
data: { url: '/home' },
});
diff --git a/website/docs/destinations/event-mapping.mdx b/website/docs/destinations/event-mapping.mdx
index 234d886d2..94ed03861 100644
--- a/website/docs/destinations/event-mapping.mdx
+++ b/website/docs/destinations/event-mapping.mdx
@@ -54,7 +54,7 @@ Map specific entity-action combinations to custom event names:
showMiddle={false}
labelInput="Configuration"
input={`await getMappingEvent(
- { event: 'product view' },
+ { name: 'product view' },
{
product: {
view: { name: 'product_viewed' },
@@ -78,7 +78,7 @@ Use wildcards (`*`) to match multiple entities or actions:
showMiddle={false}
labelInput="Configuration"
input={`await getMappingEvent(
- { event: 'product click' },
+ { name: 'product click' },
{
product: {
'*': { name: 'product_interaction' },
@@ -106,7 +106,7 @@ Use conditions to apply different mappings based on event properties:
labelInput="Configuration"
input={`await getMappingEvent(
{
- event: 'order complete',
+ name: 'order complete',
data: { value: 100 },
},
{
@@ -138,7 +138,7 @@ Skip processing certain events by setting `ignore: true`:
showMiddle={false}
labelInput="Configuration"
input={`await getMappingEvent(
- { event: 'test event' },
+ { name: 'test event' },
{
test: {
event: { ignore: true },
@@ -198,7 +198,7 @@ Return static values using the `value` property:
showMiddle={false}
labelInput="Configuration"
input={`await getMappingValue(
- { event: 'page view' },
+ { name: 'page view' },
{ value: 'pageview' }
);`}
output={`"pageview"`}
@@ -333,7 +333,7 @@ const destination = {
}),
push: (event, { data }) => {
// Use mapped data
- gtag('event', event.event, data);
+ gtag('event', event.name, data);
},
config: {
mapping: {
diff --git a/website/docs/getting-started/event-model.mdx b/website/docs/getting-started/event-model.mdx
index 2e49620db..ea0115d84 100644
--- a/website/docs/getting-started/event-model.mdx
+++ b/website/docs/getting-started/event-model.mdx
@@ -46,7 +46,7 @@ static, their content can be defined dynamically with different value types.
```js
{
- event: 'promotion view', // Name as a combination of entity and action
+ name: 'promotion view', // Name as a combination of entity and action
data: {
// Arbitrary properties related to the entity
name: 'Setting up tracking easily',
diff --git a/website/docs/sources/web/browser/tagging.mdx b/website/docs/sources/web/browser/tagging.mdx
index 5d2bf8a8d..9edbccda2 100644
--- a/website/docs/sources/web/browser/tagging.mdx
+++ b/website/docs/sources/web/browser/tagging.mdx
@@ -63,7 +63,7 @@ Tag a page...
```js
{
- event: 'promotion view', // Name as a combination of entity and action
+ name: 'promotion view', // Name as a combination of entity and action
data: {
// Arbitrary properties related to the entity
name: 'Setting up tracking easily',
From 116d8a368df655b658bd8ac76aa24cb2ead1ffae Mon Sep 17 00:00:00 2001
From: alexander
Date: Sun, 7 Sep 2025 22:15:14 +0200
Subject: [PATCH 13/13] 0.1.0
---
apps/demos/storybook/CHANGELOG.md | 11 +++++++++++
apps/demos/storybook/package.json | 2 +-
apps/storybook-addon/CHANGELOG.md | 13 +++++++++++++
apps/storybook-addon/package.json | 2 +-
apps/walkerjs/CHANGELOG.md | 15 +++++++++++++++
apps/walkerjs/package.json | 12 ++++++------
packages/collector/CHANGELOG.md | 11 +++++++++++
packages/collector/package.json | 4 ++--
packages/core/CHANGELOG.md | 6 ++++++
packages/core/package.json | 2 +-
packages/core/src/types/flow.ts | 13 +++++++++++++
packages/core/src/types/index.ts | 1 +
packages/server/core/CHANGELOG.md | 11 +++++++++++
packages/server/core/package.json | 4 ++--
packages/server/destinations/aws/CHANGELOG.md | 11 +++++++++++
packages/server/destinations/aws/package.json | 4 ++--
packages/server/destinations/gcp/CHANGELOG.md | 11 +++++++++++
packages/server/destinations/gcp/package.json | 4 ++--
packages/server/destinations/meta/CHANGELOG.md | 12 ++++++++++++
packages/server/destinations/meta/package.json | 6 +++---
packages/web/core/CHANGELOG.md | 11 +++++++++++
packages/web/core/package.json | 4 ++--
packages/web/destinations/api/CHANGELOG.md | 11 +++++++++++
packages/web/destinations/api/package.json | 4 ++--
packages/web/destinations/gtag/CHANGELOG.md | 11 +++++++++++
packages/web/destinations/gtag/package.json | 4 ++--
packages/web/destinations/meta/CHANGELOG.md | 11 +++++++++++
packages/web/destinations/meta/package.json | 4 ++--
packages/web/destinations/piwikpro/CHANGELOG.md | 12 ++++++++++++
packages/web/destinations/piwikpro/package.json | 6 +++---
packages/web/destinations/plausible/CHANGELOG.md | 11 +++++++++++
packages/web/destinations/plausible/package.json | 4 ++--
packages/web/sources/browser/CHANGELOG.md | 12 ++++++++++++
packages/web/sources/browser/package.json | 6 +++---
packages/web/sources/dataLayer/CHANGELOG.md | 12 ++++++++++++
packages/web/sources/dataLayer/package.json | 6 +++---
website/CHANGELOG.md | 11 +++++++++++
website/package.json | 2 +-
38 files changed, 257 insertions(+), 40 deletions(-)
create mode 100644 packages/core/src/types/flow.ts
diff --git a/apps/demos/storybook/CHANGELOG.md b/apps/demos/storybook/CHANGELOG.md
index e309f893a..f59a918ae 100644
--- a/apps/demos/storybook/CHANGELOG.md
+++ b/apps/demos/storybook/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/storybook-demo
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-source-browser@0.1.0
+
## 0.0.1
### Patch Changes
diff --git a/apps/demos/storybook/package.json b/apps/demos/storybook/package.json
index 286ee46b8..335a7886e 100644
--- a/apps/demos/storybook/package.json
+++ b/apps/demos/storybook/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/storybook-demo",
"private": true,
- "version": "0.0.1",
+ "version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/apps/storybook-addon/CHANGELOG.md b/apps/storybook-addon/CHANGELOG.md
index e32dfefa5..a7dadd2e7 100644
--- a/apps/storybook-addon/CHANGELOG.md
+++ b/apps/storybook-addon/CHANGELOG.md
@@ -1,5 +1,18 @@
# @walkeros/storybook-addon
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-source-browser@0.1.0
+ - @walkeros/web-core@0.1.0
+ - @walkeros/core@0.1.0
+
## 0.0.2
### Patch Changes
diff --git a/apps/storybook-addon/package.json b/apps/storybook-addon/package.json
index 9d335d1b2..3216fa944 100644
--- a/apps/storybook-addon/package.json
+++ b/apps/storybook-addon/package.json
@@ -1,6 +1,6 @@
{
"name": "@walkeros/storybook-addon",
- "version": "0.0.2",
+ "version": "0.1.0",
"description": "Integrate walkerOS tagging support for data collection",
"keywords": [
"tracking",
diff --git a/apps/walkerjs/CHANGELOG.md b/apps/walkerjs/CHANGELOG.md
index 92102d3e4..5687bcd48 100644
--- a/apps/walkerjs/CHANGELOG.md
+++ b/apps/walkerjs/CHANGELOG.md
@@ -1,5 +1,20 @@
# @walkeros/walker.js
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-source-datalayer@0.1.0
+ - @walkeros/web-source-browser@0.1.0
+ - @walkeros/collector@0.1.0
+ - @walkeros/web-core@0.1.0
+ - @walkeros/core@0.1.0
+
## 0.0.10
### Patch Changes
diff --git a/apps/walkerjs/package.json b/apps/walkerjs/package.json
index 8297ca9ca..f3a314ff5 100644
--- a/apps/walkerjs/package.json
+++ b/apps/walkerjs/package.json
@@ -1,6 +1,6 @@
{
"name": "@walkeros/walker.js",
- "version": "0.0.10",
+ "version": "0.1.0",
"description": "Ready-to-use walkerOS bundle with browser source, collector, and dataLayer support",
"license": "MIT",
"main": "./dist/index.js",
@@ -34,11 +34,11 @@
"preview": "npm run build && npx serve -l 3333 examples"
},
"dependencies": {
- "@walkeros/core": "0.0.8",
- "@walkeros/collector": "0.0.8",
- "@walkeros/web-core": "0.0.8",
- "@walkeros/web-source-browser": "0.0.10",
- "@walkeros/web-source-datalayer": "0.0.8"
+ "@walkeros/core": "0.1.0",
+ "@walkeros/collector": "0.1.0",
+ "@walkeros/web-core": "0.1.0",
+ "@walkeros/web-source-browser": "0.1.0",
+ "@walkeros/web-source-datalayer": "0.1.0"
},
"devDependencies": {
"@swc/jest": "^0.2.36",
diff --git a/packages/collector/CHANGELOG.md b/packages/collector/CHANGELOG.md
index f65bc58bb..a275e8007 100644
--- a/packages/collector/CHANGELOG.md
+++ b/packages/collector/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/collector
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/collector/package.json b/packages/collector/package.json
index 15c6158e1..7e43a05fa 100644
--- a/packages/collector/package.json
+++ b/packages/collector/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/collector",
"description": "Unified platform-agnostic collector for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8"
+ "@walkeros/core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index 1db854f26..a52710d47 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -1,5 +1,11 @@
# @walkeros/core
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
## 0.0.8
### Patch Changes
diff --git a/packages/core/package.json b/packages/core/package.json
index 1d1fe353b..8ef84f3e7 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/core",
"description": "Core types and platform-agnostic utilities for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
diff --git a/packages/core/src/types/flow.ts b/packages/core/src/types/flow.ts
new file mode 100644
index 000000000..b74da3cf4
--- /dev/null
+++ b/packages/core/src/types/flow.ts
@@ -0,0 +1,13 @@
+import type { Collector } from '.';
+
+/**
+ * Flow configuration interface for dynamic walkerOS setup
+ * Used by bundlers and other tools to configure walkerOS dynamically
+ */
+export interface Config {
+ /** Collector configuration - uses existing Collector.Config from core */
+ collector: Collector.Config;
+
+ /** NPM packages required for this configuration */
+ packages: Record;
+}
diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts
index 622c63d5c..711118534 100644
--- a/packages/core/src/types/index.ts
+++ b/packages/core/src/types/index.ts
@@ -2,6 +2,7 @@ export * as Collector from './collector';
export * as Data from './data';
export * as Destination from './destination';
export * as Elb from './elb';
+export * as Flow from './flow';
export * as Handler from './handler';
export * as Hooks from './hooks';
export * as Mapping from './mapping';
diff --git a/packages/server/core/CHANGELOG.md b/packages/server/core/CHANGELOG.md
index c39416a15..1d75d0c53 100644
--- a/packages/server/core/CHANGELOG.md
+++ b/packages/server/core/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/server-core
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/server/core/package.json b/packages/server/core/package.json
index dddf15e72..5a2c34912 100644
--- a/packages/server/core/package.json
+++ b/packages/server/core/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/server-core",
"description": "Server-specific utilities for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -25,7 +25,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8"
+ "@walkeros/core": "0.1.0"
},
"repository": {
"url": "git+https://github.com/elbwalker/walkerOS.git",
diff --git a/packages/server/destinations/aws/CHANGELOG.md b/packages/server/destinations/aws/CHANGELOG.md
index 5447b0969..9cbc6b3e0 100644
--- a/packages/server/destinations/aws/CHANGELOG.md
+++ b/packages/server/destinations/aws/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/server-destination-aws
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/server-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/server/destinations/aws/package.json b/packages/server/destinations/aws/package.json
index e0c707b4a..b01044dd8 100644
--- a/packages/server/destinations/aws/package.json
+++ b/packages/server/destinations/aws/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/server-destination-aws",
"description": "AWS server destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -31,7 +31,7 @@
},
"dependencies": {
"@aws-sdk/client-firehose": "^3.606.0",
- "@walkeros/server-core": "0.0.8"
+ "@walkeros/server-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/server/destinations/gcp/CHANGELOG.md b/packages/server/destinations/gcp/CHANGELOG.md
index b73dd59cd..fe994d386 100644
--- a/packages/server/destinations/gcp/CHANGELOG.md
+++ b/packages/server/destinations/gcp/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/server-destination-gcp
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/server-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/server/destinations/gcp/package.json b/packages/server/destinations/gcp/package.json
index 66eaef746..b2ad09537 100644
--- a/packages/server/destinations/gcp/package.json
+++ b/packages/server/destinations/gcp/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/server-destination-gcp",
"description": "Google Cloud Platform server destination for walkerOS (BigQuery)",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -19,7 +19,7 @@
},
"dependencies": {
"@google-cloud/bigquery": "^7.8.0",
- "@walkeros/server-core": "0.0.8"
+ "@walkeros/server-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/server/destinations/meta/CHANGELOG.md b/packages/server/destinations/meta/CHANGELOG.md
index 65cc713a2..1d2282d0e 100644
--- a/packages/server/destinations/meta/CHANGELOG.md
+++ b/packages/server/destinations/meta/CHANGELOG.md
@@ -1,5 +1,17 @@
# @walkeros/server-destination-meta
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/server-core@0.1.0
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/server/destinations/meta/package.json b/packages/server/destinations/meta/package.json
index d68d87ffb..816d39e21 100644
--- a/packages/server/destinations/meta/package.json
+++ b/packages/server/destinations/meta/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/server-destination-meta",
"description": "Meta server destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,8 +30,8 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8",
- "@walkeros/server-core": "0.0.8"
+ "@walkeros/core": "0.1.0",
+ "@walkeros/server-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/web/core/CHANGELOG.md b/packages/web/core/CHANGELOG.md
index cd87ca624..cb7b20f54 100644
--- a/packages/web/core/CHANGELOG.md
+++ b/packages/web/core/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/web-core
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/core/package.json b/packages/web/core/package.json
index 5e05f5c75..958994dd1 100644
--- a/packages/web/core/package.json
+++ b/packages/web/core/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-core",
"description": "Web-specific utilities for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -25,7 +25,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8"
+ "@walkeros/core": "0.1.0"
},
"repository": {
"url": "git+https://github.com/elbwalker/walkerOS.git",
diff --git a/packages/web/destinations/api/CHANGELOG.md b/packages/web/destinations/api/CHANGELOG.md
index 716560787..fbd288fc3 100644
--- a/packages/web/destinations/api/CHANGELOG.md
+++ b/packages/web/destinations/api/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/web-destination-api
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/destinations/api/package.json b/packages/web/destinations/api/package.json
index 2cfcd928b..e506d5f31 100644
--- a/packages/web/destinations/api/package.json
+++ b/packages/web/destinations/api/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-destination-api",
"description": "Web API destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,7 +30,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/web-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/web/destinations/gtag/CHANGELOG.md b/packages/web/destinations/gtag/CHANGELOG.md
index 967dbd47f..bbf08ddd6 100644
--- a/packages/web/destinations/gtag/CHANGELOG.md
+++ b/packages/web/destinations/gtag/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/web-destination-gtag
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/destinations/gtag/package.json b/packages/web/destinations/gtag/package.json
index add413adc..e2aa2fa42 100644
--- a/packages/web/destinations/gtag/package.json
+++ b/packages/web/destinations/gtag/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-destination-gtag",
"description": "Unified Google destination for walkerOS (GA4, Ads, GTM)",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -25,7 +25,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/web-core": "0.1.0"
},
"repository": {
"url": "git+https://github.com/elbwalker/walkerOS.git",
diff --git a/packages/web/destinations/meta/CHANGELOG.md b/packages/web/destinations/meta/CHANGELOG.md
index 4d5eac3e7..45baad711 100644
--- a/packages/web/destinations/meta/CHANGELOG.md
+++ b/packages/web/destinations/meta/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/web-destination-meta
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/destinations/meta/package.json b/packages/web/destinations/meta/package.json
index edfd61a9e..12508396c 100644
--- a/packages/web/destinations/meta/package.json
+++ b/packages/web/destinations/meta/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-destination-meta",
"description": "Meta pixel web destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,7 +30,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/web-core": "0.1.0"
},
"devDependencies": {
"@types/facebook-pixel": "^0.0.31"
diff --git a/packages/web/destinations/piwikpro/CHANGELOG.md b/packages/web/destinations/piwikpro/CHANGELOG.md
index 10f76662e..4e7371336 100644
--- a/packages/web/destinations/piwikpro/CHANGELOG.md
+++ b/packages/web/destinations/piwikpro/CHANGELOG.md
@@ -1,5 +1,17 @@
# @walkeros/web-destination-piwikpro
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-core@0.1.0
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/destinations/piwikpro/package.json b/packages/web/destinations/piwikpro/package.json
index ce819dc82..1681be6e8 100644
--- a/packages/web/destinations/piwikpro/package.json
+++ b/packages/web/destinations/piwikpro/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-destination-piwikpro",
"description": "Piwik PRO destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,8 +30,8 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8",
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/core": "0.1.0",
+ "@walkeros/web-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/web/destinations/plausible/CHANGELOG.md b/packages/web/destinations/plausible/CHANGELOG.md
index c27ca1a3d..256daf1e0 100644
--- a/packages/web/destinations/plausible/CHANGELOG.md
+++ b/packages/web/destinations/plausible/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/web-destination-plausible
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/web-core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/destinations/plausible/package.json b/packages/web/destinations/plausible/package.json
index bf2fd51ef..f894ee246 100644
--- a/packages/web/destinations/plausible/package.json
+++ b/packages/web/destinations/plausible/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-destination-plausible",
"description": "Plausible web destination for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,7 +30,7 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/web-core": "0.1.0"
},
"devDependencies": {},
"repository": {
diff --git a/packages/web/sources/browser/CHANGELOG.md b/packages/web/sources/browser/CHANGELOG.md
index 1d72b3a7b..97115fb5a 100644
--- a/packages/web/sources/browser/CHANGELOG.md
+++ b/packages/web/sources/browser/CHANGELOG.md
@@ -1,5 +1,17 @@
# @walkeros/web-source-browser
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/collector@0.1.0
+ - @walkeros/web-core@0.1.0
+
## 0.0.10
### Patch Changes
diff --git a/packages/web/sources/browser/package.json b/packages/web/sources/browser/package.json
index 528033dd5..02a993f51 100644
--- a/packages/web/sources/browser/package.json
+++ b/packages/web/sources/browser/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-source-browser",
"description": "Browser DOM source for walkerOS",
- "version": "0.0.10",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -25,8 +25,8 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/collector": "0.0.8",
- "@walkeros/web-core": "0.0.8"
+ "@walkeros/collector": "0.1.0",
+ "@walkeros/web-core": "0.1.0"
},
"repository": {
"url": "git+https://github.com/elbwalker/walkerOS.git",
diff --git a/packages/web/sources/dataLayer/CHANGELOG.md b/packages/web/sources/dataLayer/CHANGELOG.md
index 434d7ccec..df4153983 100644
--- a/packages/web/sources/dataLayer/CHANGELOG.md
+++ b/packages/web/sources/dataLayer/CHANGELOG.md
@@ -1,5 +1,17 @@
# @walkeros/web-source-datalayer
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/collector@0.1.0
+ - @walkeros/core@0.1.0
+
## 0.0.8
### Patch Changes
diff --git a/packages/web/sources/dataLayer/package.json b/packages/web/sources/dataLayer/package.json
index 3816cd5e2..5ada0cb5a 100644
--- a/packages/web/sources/dataLayer/package.json
+++ b/packages/web/sources/dataLayer/package.json
@@ -1,7 +1,7 @@
{
"name": "@walkeros/web-source-datalayer",
"description": "DataLayer source for walkerOS",
- "version": "0.0.8",
+ "version": "0.1.0",
"license": "MIT",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
@@ -30,8 +30,8 @@
"update": "npx npm-check-updates -u && npm update"
},
"dependencies": {
- "@walkeros/core": "0.0.8",
- "@walkeros/collector": "0.0.8"
+ "@walkeros/core": "0.1.0",
+ "@walkeros/collector": "0.1.0"
},
"devDependencies": {
"@types/gtag.js": "^0.0.20"
diff --git a/website/CHANGELOG.md b/website/CHANGELOG.md
index a0c20e7d8..5fd001ba2 100644
--- a/website/CHANGELOG.md
+++ b/website/CHANGELOG.md
@@ -1,5 +1,16 @@
# @walkeros/website
+## 0.1.0
+
+### Minor Changes
+
+- fixes
+
+### Patch Changes
+
+- Updated dependencies
+ - @walkeros/core@0.1.0
+
## 0.0.1
### Patch Changes
diff --git a/website/package.json b/website/package.json
index 25ae14752..6a18167b6 100644
--- a/website/package.json
+++ b/website/package.json
@@ -1,6 +1,6 @@
{
"name": "@walkeros/website",
- "version": "0.0.1",
+ "version": "0.1.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",