@syntrologie/runtime-sdk 0.2.21 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CAPABILITIES.md +944 -440
- package/README.md +395 -66
- package/dist/RuntimeProvider.d.ts +51 -0
- package/dist/RuntimeProvider.js +113 -0
- package/dist/RuntimeProvider.js.map +1 -0
- package/dist/SmartCanvasApp.d.ts +16 -10
- package/dist/SmartCanvasApp.js +47 -51
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/SmartCanvasElement.d.ts +5 -5
- package/dist/SmartCanvasElement.js +24 -14
- package/dist/SmartCanvasElement.js.map +1 -1
- package/dist/SmartCanvasPortal.d.ts +2 -2
- package/dist/SmartCanvasPortal.js +2 -2
- package/dist/SmartCanvasPortal.js.map +1 -1
- package/dist/actions/ActionEngine.d.ts +11 -0
- package/dist/actions/ActionEngine.js +272 -0
- package/dist/actions/ActionEngine.js.map +1 -0
- package/dist/actions/executors/index.d.ts +116 -0
- package/dist/actions/executors/index.js +240 -0
- package/dist/actions/executors/index.js.map +1 -0
- package/dist/actions/executors/tour.d.ts +18 -0
- package/dist/actions/executors/tour.js +332 -0
- package/dist/actions/executors/tour.js.map +1 -0
- package/dist/actions/index.d.ts +10 -0
- package/dist/actions/index.js +12 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/types.d.ts +399 -0
- package/dist/actions/types.js +8 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/actions/validation.d.ts +14 -0
- package/dist/actions/validation.js +577 -0
- package/dist/actions/validation.js.map +1 -0
- package/dist/adaptives/adaptive-chatbot/index.js +9 -0
- package/dist/adaptives/adaptive-chatbot/index.js.map +7 -0
- package/dist/adaptives/adaptive-content/index.js +2 -0
- package/dist/adaptives/adaptive-content/index.js.map +7 -0
- package/dist/adaptives/adaptive-faq/index.js +11 -0
- package/dist/adaptives/adaptive-faq/index.js.map +7 -0
- package/dist/adaptives/adaptive-gamification/index.js +2 -0
- package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
- package/dist/adaptives/adaptive-nav/index.js +11 -0
- package/dist/adaptives/adaptive-nav/index.js.map +7 -0
- package/dist/adaptives/adaptive-overlays/index.js +91 -0
- package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
- package/dist/antiFlicker.js +1 -1
- package/dist/api.d.ts +40 -26
- package/dist/api.js +87 -60
- package/dist/api.js.map +1 -1
- package/dist/apps/AppContext.d.ts +31 -0
- package/dist/apps/AppContext.js +91 -0
- package/dist/apps/AppContext.js.map +1 -0
- package/dist/apps/AppLoader.d.ts +85 -0
- package/dist/apps/AppLoader.js +282 -0
- package/dist/apps/AppLoader.js.map +1 -0
- package/dist/apps/AppRegistry.d.ts +102 -0
- package/dist/apps/AppRegistry.js +317 -0
- package/dist/apps/AppRegistry.js.map +1 -0
- package/dist/apps/examples/gamification-app.example.d.ts +305 -0
- package/dist/apps/examples/gamification-app.example.js +329 -0
- package/dist/apps/examples/gamification-app.example.js.map +1 -0
- package/dist/apps/index.d.ts +14 -0
- package/dist/apps/index.js +16 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/types.d.ts +231 -0
- package/dist/apps/types.js +8 -0
- package/dist/apps/types.js.map +1 -0
- package/dist/blocks/data/ComparisonBlock.d.ts +1 -1
- package/dist/blocks/data/ComparisonBlock.js +40 -40
- package/dist/blocks/data/ComparisonBlock.js.map +1 -1
- package/dist/blocks/data/StatsBlock.d.ts +1 -1
- package/dist/blocks/data/StatsBlock.js +42 -44
- package/dist/blocks/data/StatsBlock.js.map +1 -1
- package/dist/blocks/data/index.d.ts +2 -2
- package/dist/blocks/data/index.js +2 -2
- package/dist/blocks/index.d.ts +5 -5
- package/dist/blocks/index.js +29 -30
- package/dist/blocks/index.js.map +1 -1
- package/dist/blocks/interactive/ChecklistBlock.d.ts +1 -1
- package/dist/blocks/interactive/ChecklistBlock.js +60 -60
- package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
- package/dist/blocks/interactive/RatingBlock.d.ts +1 -1
- package/dist/blocks/interactive/RatingBlock.js +73 -65
- package/dist/blocks/interactive/RatingBlock.js.map +1 -1
- package/dist/blocks/interactive/index.d.ts +2 -2
- package/dist/blocks/interactive/index.js +2 -2
- package/dist/blocks/notification/NotificationBlock.d.ts +2 -2
- package/dist/blocks/notification/NotificationBlock.js +68 -64
- package/dist/blocks/notification/NotificationBlock.js.map +1 -1
- package/dist/blocks/notification/index.d.ts +1 -1
- package/dist/blocks/notification/index.js +1 -1
- package/dist/bootstrap.d.ts +32 -8
- package/dist/bootstrap.js +218 -102
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.d.ts +6 -6
- package/dist/components/ShadowCanvasOverlay.js +156 -118
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.d.ts +5 -5
- package/dist/components/TileCard.js +205 -154
- package/dist/components/TileCard.js.map +1 -1
- package/dist/components/TileWheel.d.ts +3 -3
- package/dist/components/TileWheel.js +29 -7
- package/dist/components/TileWheel.js.map +1 -1
- package/dist/config-validator.d.ts +49 -0
- package/dist/config-validator.js +173 -0
- package/dist/config-validator.js.map +1 -0
- package/dist/configFetcher.d.ts +7 -3
- package/dist/configFetcher.js +70 -29
- package/dist/configFetcher.js.map +1 -1
- package/dist/context/ContextManager.d.ts +3 -3
- package/dist/context/ContextManager.js +19 -18
- package/dist/context/ContextManager.js.map +1 -1
- package/dist/context/index.d.ts +4 -4
- package/dist/context/index.js +3 -3
- package/dist/context/schema.d.ts +9 -9
- package/dist/context/schema.js +2 -2
- package/dist/context/schema.js.map +1 -1
- package/dist/decisions/engine.d.ts +5 -5
- package/dist/decisions/engine.js +13 -13
- package/dist/decisions/engine.js.map +1 -1
- package/dist/decisions/index.d.ts +6 -6
- package/dist/decisions/index.js +5 -5
- package/dist/decisions/schema.d.ts +131 -131
- package/dist/decisions/schema.js +21 -21
- package/dist/decisions/schema.js.map +1 -1
- package/dist/decisions/strategies/rules.d.ts +1 -1
- package/dist/decisions/strategies/rules.js +24 -24
- package/dist/decisions/strategies/rules.js.map +1 -1
- package/dist/decisions/strategies/score.d.ts +1 -1
- package/dist/decisions/strategies/score.js +3 -3
- package/dist/decisions/types.d.ts +19 -19
- package/dist/earlyPatcher.d.ts +8 -20
- package/dist/earlyPatcher.js +13 -62
- package/dist/earlyPatcher.js.map +1 -1
- package/dist/editorLoader.d.ts +19 -7
- package/dist/editorLoader.js +154 -97
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/EventBus.d.ts +3 -3
- package/dist/events/EventBus.js +5 -7
- package/dist/events/EventBus.js.map +1 -1
- package/dist/events/index.d.ts +6 -6
- package/dist/events/index.js +5 -5
- package/dist/events/normalizers/canvas.d.ts +2 -2
- package/dist/events/normalizers/canvas.js +3 -3
- package/dist/events/normalizers/canvas.js.map +1 -1
- package/dist/events/normalizers/posthog.d.ts +25 -1
- package/dist/events/normalizers/posthog.js +35 -27
- package/dist/events/normalizers/posthog.js.map +1 -1
- package/dist/events/schema.d.ts +13 -13
- package/dist/events/schema.js +3 -3
- package/dist/events/schema.js.map +1 -1
- package/dist/events/types.d.ts +7 -1
- package/dist/events/types.js +29 -21
- package/dist/events/types.js.map +1 -1
- package/dist/experiments/adapters/growthbook.d.ts +5 -4
- package/dist/experiments/adapters/growthbook.js +14 -6
- package/dist/experiments/adapters/growthbook.js.map +1 -1
- package/dist/experiments/index.d.ts +3 -3
- package/dist/experiments/index.js +1 -1
- package/dist/experiments/registry.d.ts +2 -2
- package/dist/experiments/registry.js +2 -2
- package/dist/experiments/types.d.ts +10 -1
- package/dist/fetchers/cdnFetcher.d.ts +1 -1
- package/dist/fetchers/cdnFetcher.js +4 -8
- package/dist/fetchers/cdnFetcher.js.map +1 -1
- package/dist/fetchers/experimentsFetcher.d.ts +25 -3
- package/dist/fetchers/experimentsFetcher.js +55 -8
- package/dist/fetchers/experimentsFetcher.js.map +1 -1
- package/dist/fetchers/index.d.ts +3 -3
- package/dist/fetchers/index.js +2 -2
- package/dist/fetchers/index.js.map +1 -1
- package/dist/fetchers/mergeConfigs.d.ts +29 -0
- package/dist/fetchers/mergeConfigs.js +38 -0
- package/dist/fetchers/mergeConfigs.js.map +1 -0
- package/dist/fetchers/registry.d.ts +1 -1
- package/dist/fetchers/registry.js +4 -4
- package/dist/fetchers/types.d.ts +1 -1
- package/dist/hooks/useCanvasOverlays.d.ts +8 -5
- package/dist/hooks/useCanvasOverlays.js +66 -17
- package/dist/hooks/useCanvasOverlays.js.map +1 -1
- package/dist/hooks/useHostPatches.d.ts +2 -2
- package/dist/hooks/useHostPatches.js +8 -8
- package/dist/hooks/useHostPatches.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +5 -9
- package/dist/hooks/useShadowCanvasConfig.js +7 -5
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/hostPatcher/core/patcher.d.ts +1 -1
- package/dist/hostPatcher/core/patcher.js +18 -9
- package/dist/hostPatcher/core/patcher.js.map +1 -1
- package/dist/hostPatcher/core/sanitizer.js +24 -3
- package/dist/hostPatcher/core/sanitizer.js.map +1 -1
- package/dist/hostPatcher/policy/defaultPolicy.js +15 -5
- package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
- package/dist/hostPatcher/utils/anchors.js +4 -6
- package/dist/hostPatcher/utils/anchors.js.map +1 -1
- package/dist/index.d.ts +34 -27
- package/dist/index.js +51 -24
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +29 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/sessionMetrics.d.ts +1 -1
- package/dist/metrics/sessionMetrics.js +6 -6
- package/dist/overlays/fetcher.d.ts +2 -2
- package/dist/overlays/fetcher.js +13 -15
- package/dist/overlays/fetcher.js.map +1 -1
- package/dist/overlays/recipeRegistry.js +2 -2
- package/dist/overlays/recipeRegistry.js.map +1 -1
- package/dist/overlays/runtime/anchor/resolve.js +1 -1
- package/dist/overlays/runtime/anchor/resolve.js.map +1 -1
- package/dist/overlays/runtime/index.d.ts +7 -7
- package/dist/overlays/runtime/index.js +7 -7
- package/dist/overlays/runtime/overlay/highlight.js +39 -39
- package/dist/overlays/runtime/overlay/highlight.js.map +1 -1
- package/dist/overlays/runtime/overlay/modal.js +5 -5
- package/dist/overlays/runtime/overlay/modal.js.map +1 -1
- package/dist/overlays/runtime/overlay/root.js +1 -1
- package/dist/overlays/runtime/overlay/runner.js +88 -28
- package/dist/overlays/runtime/overlay/runner.js.map +1 -1
- package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
- package/dist/overlays/runtime/overlay/tooltip.js +13 -15
- package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
- package/dist/overlays/runtime/utils/dom.js +4 -1
- package/dist/overlays/runtime/utils/dom.js.map +1 -1
- package/dist/overlays/schema.d.ts +146 -146
- package/dist/overlays/schema.js +12 -8
- package/dist/overlays/schema.js.map +1 -1
- package/dist/react.d.ts +7 -7
- package/dist/react.js +4 -4
- package/dist/react.js.map +1 -1
- package/dist/render/RenderContext.d.ts +2 -2
- package/dist/render/RenderContext.js +5 -5
- package/dist/render/RenderContext.js.map +1 -1
- package/dist/render/index.d.ts +3 -3
- package/dist/render/index.js +1 -1
- package/dist/render/types.d.ts +4 -4
- package/dist/runtime.d.ts +32 -8
- package/dist/runtime.js +109 -13
- package/dist/runtime.js.map +1 -1
- package/dist/smart-canvas.esm.js +144 -55
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +14688 -11455
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +145 -55
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +1 -7
- package/dist/state/StateStore.js +15 -9
- package/dist/state/StateStore.js.map +1 -1
- package/dist/state/helpers/cooldowns.d.ts +1 -1
- package/dist/state/helpers/cooldowns.js +1 -1
- package/dist/state/helpers/dismissals.d.ts +1 -1
- package/dist/state/helpers/dismissals.js +1 -1
- package/dist/state/helpers/frequency.d.ts +1 -1
- package/dist/state/helpers/frequency.js +1 -1
- package/dist/state/index.d.ts +4 -4
- package/dist/state/index.js +3 -3
- package/dist/state/schema.d.ts +1 -1
- package/dist/state/schema.js +1 -1
- package/dist/store/example.d.ts +1 -0
- package/dist/store/example.js +43 -0
- package/dist/store/example.js.map +1 -0
- package/dist/store/mini-effector.d.ts +46 -0
- package/dist/store/mini-effector.js +88 -0
- package/dist/store/mini-effector.js.map +1 -0
- package/dist/surfaces/Surfaces.d.ts +11 -0
- package/dist/surfaces/Surfaces.js +361 -0
- package/dist/surfaces/Surfaces.js.map +1 -0
- package/dist/surfaces/index.d.ts +9 -0
- package/dist/surfaces/index.js +12 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/positioning.d.ts +50 -0
- package/dist/surfaces/positioning.js +228 -0
- package/dist/surfaces/positioning.js.map +1 -0
- package/dist/surfaces/types.d.ts +167 -0
- package/dist/surfaces/types.js +23 -0
- package/dist/surfaces/types.js.map +1 -0
- package/dist/telemetry/adapters/noop.d.ts +12 -0
- package/dist/telemetry/adapters/noop.js +42 -0
- package/dist/telemetry/adapters/noop.js.map +1 -0
- package/dist/telemetry/adapters/posthog.d.ts +8 -2
- package/dist/telemetry/adapters/posthog.js +36 -14
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -3
- package/dist/telemetry/index.js +3 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/registry.d.ts +2 -9
- package/dist/telemetry/registry.js +4 -2
- package/dist/telemetry/registry.js.map +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/theme/ThemeProvider.d.ts +2 -2
- package/dist/theme/ThemeProvider.js +21 -21
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/defaultTheme.d.ts +4 -5
- package/dist/theme/defaultTheme.js +127 -118
- package/dist/theme/defaultTheme.js.map +1 -1
- package/dist/theme/extractHostTheme.d.ts +1 -1
- package/dist/theme/extractHostTheme.js +43 -45
- package/dist/theme/extractHostTheme.js.map +1 -1
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.js +3 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/types.d.ts +2 -2
- package/dist/token.d.ts +2 -0
- package/dist/token.js +3 -6
- package/dist/token.js.map +1 -1
- package/dist/types-only.d.ts +32 -0
- package/dist/types-only.js +11 -0
- package/dist/types-only.js.map +1 -0
- package/dist/types.d.ts +89 -56
- package/dist/types.js +14 -2
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +13 -0
- package/dist/version.js +14 -0
- package/dist/version.js.map +1 -0
- package/dist/widgets/WidgetRegistry.d.ts +145 -0
- package/dist/widgets/WidgetRegistry.js +191 -0
- package/dist/widgets/WidgetRegistry.js.map +1 -0
- package/dist/widgets/index.d.ts +7 -0
- package/dist/widgets/index.js +7 -0
- package/dist/widgets/index.js.map +1 -0
- package/package.json +35 -15
- package/schema/canvas-config.schema.json +488 -254
- package/schema/runtime-context.schema.json +1 -5
|
@@ -2,8 +2,32 @@
|
|
|
2
2
|
* PostHog Event Normalizer
|
|
3
3
|
*
|
|
4
4
|
* Transforms PostHog autocapture events into normalized events for the EventBus.
|
|
5
|
+
*
|
|
6
|
+
* This module is automatically wired up during `Syntro.init()` when PostHog
|
|
7
|
+
* credentials are provided in the token. The flow is:
|
|
8
|
+
*
|
|
9
|
+
* 1. PostHog captures user interactions (clicks, scrolls, navigation, etc.)
|
|
10
|
+
* 2. PostHog's `eventCaptured` callback fires
|
|
11
|
+
* 3. `createPostHogNormalizer()` transforms the event to a NormalizedEvent
|
|
12
|
+
* 4. The normalized event is published to the EventBus
|
|
13
|
+
*
|
|
14
|
+
* This allows canvas components and decision strategies to react to user
|
|
15
|
+
* interactions with the main webapp, not just canvas-specific events.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // In bootstrap.ts (already wired up automatically)
|
|
20
|
+
* const normalizer = createPostHogNormalizer((event) => {
|
|
21
|
+
* eventBus.publishEvent(event);
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // PostHog adapter calls normalizer on each capture
|
|
25
|
+
* posthog.on('eventCaptured', normalizer);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @see RUNTIME_V2_REFERENCE.md for the full event mapping table
|
|
5
29
|
*/
|
|
6
|
-
import type { NormalizedEvent } from
|
|
30
|
+
import type { NormalizedEvent } from '../types';
|
|
7
31
|
/**
|
|
8
32
|
* PostHog event structure (simplified).
|
|
9
33
|
*/
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { StandardEvents, EVENT_SCHEMA_VERSION } from
|
|
1
|
+
import { StandardEvents, EVENT_SCHEMA_VERSION } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Map PostHog event names to normalized event names.
|
|
4
4
|
*/
|
|
5
5
|
const POSTHOG_EVENT_MAP = {
|
|
6
6
|
// Autocapture events
|
|
7
|
-
$autocapture:
|
|
7
|
+
$autocapture: 'ui.click', // Default autocapture is usually clicks
|
|
8
8
|
$click: StandardEvents.UI_CLICK,
|
|
9
9
|
$scroll: StandardEvents.UI_SCROLL,
|
|
10
10
|
$input: StandardEvents.UI_INPUT,
|
|
@@ -14,9 +14,9 @@ const POSTHOG_EVENT_MAP = {
|
|
|
14
14
|
$pageview: StandardEvents.NAV_PAGE_VIEW,
|
|
15
15
|
$pageleave: StandardEvents.NAV_PAGE_LEAVE,
|
|
16
16
|
// Session events
|
|
17
|
-
$session_start:
|
|
17
|
+
$session_start: 'session.start',
|
|
18
18
|
// Identify events
|
|
19
|
-
$identify:
|
|
19
|
+
$identify: 'user.identify',
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
22
|
* Extract the normalized event name from a PostHog event.
|
|
@@ -24,28 +24,32 @@ const POSTHOG_EVENT_MAP = {
|
|
|
24
24
|
function getEventName(phEvent) {
|
|
25
25
|
var _a, _b;
|
|
26
26
|
const eventName = phEvent.event;
|
|
27
|
+
// Defensive guard: PostHog's eventCaptured can emit non-string event names
|
|
28
|
+
if (typeof eventName !== 'string') {
|
|
29
|
+
return 'posthog.unknown';
|
|
30
|
+
}
|
|
27
31
|
// Check mapped events
|
|
28
32
|
if (POSTHOG_EVENT_MAP[eventName]) {
|
|
29
33
|
return POSTHOG_EVENT_MAP[eventName];
|
|
30
34
|
}
|
|
31
35
|
// For autocapture, check the element type to determine the action
|
|
32
|
-
if (eventName ===
|
|
36
|
+
if (eventName === '$autocapture') {
|
|
33
37
|
const tagName = (_a = phEvent.properties) === null || _a === void 0 ? void 0 : _a.$tag_name;
|
|
34
38
|
const eventType = (_b = phEvent.properties) === null || _b === void 0 ? void 0 : _b.$event_type;
|
|
35
|
-
if (eventType ===
|
|
39
|
+
if (eventType === 'submit')
|
|
36
40
|
return StandardEvents.UI_SUBMIT;
|
|
37
|
-
if (eventType ===
|
|
41
|
+
if (eventType === 'change')
|
|
38
42
|
return StandardEvents.UI_CHANGE;
|
|
39
|
-
if (tagName ===
|
|
43
|
+
if (tagName === 'input' || tagName === 'textarea')
|
|
40
44
|
return StandardEvents.UI_INPUT;
|
|
41
45
|
return StandardEvents.UI_CLICK;
|
|
42
46
|
}
|
|
43
47
|
// For custom events, prefix with "posthog." to namespace them
|
|
44
|
-
if (!eventName.startsWith(
|
|
48
|
+
if (!eventName.startsWith('$')) {
|
|
45
49
|
return `posthog.${eventName}`;
|
|
46
50
|
}
|
|
47
51
|
// Pass through other $ events as-is but normalized
|
|
48
|
-
return eventName.replace(
|
|
52
|
+
return eventName.replace('$', 'posthog.');
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
55
|
* Extract relevant properties from a PostHog event.
|
|
@@ -90,10 +94,10 @@ function extractProps(phEvent) {
|
|
|
90
94
|
export function normalizePostHogEvent(phEvent) {
|
|
91
95
|
// Parse timestamp
|
|
92
96
|
let ts;
|
|
93
|
-
if (typeof phEvent.timestamp ===
|
|
97
|
+
if (typeof phEvent.timestamp === 'number') {
|
|
94
98
|
ts = phEvent.timestamp;
|
|
95
99
|
}
|
|
96
|
-
else if (typeof phEvent.timestamp ===
|
|
100
|
+
else if (typeof phEvent.timestamp === 'string') {
|
|
97
101
|
ts = new Date(phEvent.timestamp).getTime();
|
|
98
102
|
}
|
|
99
103
|
else {
|
|
@@ -102,7 +106,7 @@ export function normalizePostHogEvent(phEvent) {
|
|
|
102
106
|
return {
|
|
103
107
|
ts,
|
|
104
108
|
name: getEventName(phEvent),
|
|
105
|
-
source:
|
|
109
|
+
source: 'posthog',
|
|
106
110
|
props: extractProps(phEvent),
|
|
107
111
|
schemaVersion: EVENT_SCHEMA_VERSION,
|
|
108
112
|
};
|
|
@@ -113,22 +117,24 @@ export function normalizePostHogEvent(phEvent) {
|
|
|
113
117
|
*/
|
|
114
118
|
export function shouldNormalizeEvent(phEvent) {
|
|
115
119
|
const eventName = phEvent.event;
|
|
120
|
+
if (typeof eventName !== 'string')
|
|
121
|
+
return false;
|
|
116
122
|
// Skip internal PostHog events
|
|
117
123
|
const skipEvents = [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
124
|
+
'$feature_flag_called',
|
|
125
|
+
'$feature_flags',
|
|
126
|
+
'$groups',
|
|
127
|
+
'$groupidentify',
|
|
128
|
+
'$set',
|
|
129
|
+
'$set_once',
|
|
130
|
+
'$unset',
|
|
131
|
+
'$create_alias',
|
|
132
|
+
'$capture_metrics',
|
|
133
|
+
'$performance_event',
|
|
134
|
+
'$web_vitals',
|
|
135
|
+
'$exception',
|
|
136
|
+
'$dead_click',
|
|
137
|
+
'$heatmap',
|
|
132
138
|
];
|
|
133
139
|
if (skipEvents.includes(eventName)) {
|
|
134
140
|
return false;
|
|
@@ -141,6 +147,8 @@ export function shouldNormalizeEvent(phEvent) {
|
|
|
141
147
|
*/
|
|
142
148
|
export function createPostHogNormalizer(publishFn) {
|
|
143
149
|
return (eventName, properties) => {
|
|
150
|
+
if (typeof eventName !== 'string')
|
|
151
|
+
return;
|
|
144
152
|
const phEvent = {
|
|
145
153
|
event: eventName,
|
|
146
154
|
properties,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/events/normalizers/posthog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/events/normalizers/posthog.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAWhE;;GAEG;AACH,MAAM,iBAAiB,GAA2B;IAChD,qBAAqB;IACrB,YAAY,EAAE,UAAU,EAAE,wCAAwC;IAClE,MAAM,EAAE,cAAc,CAAC,QAAQ;IAC/B,OAAO,EAAE,cAAc,CAAC,SAAS;IACjC,MAAM,EAAE,cAAc,CAAC,QAAQ;IAC/B,OAAO,EAAE,cAAc,CAAC,SAAS;IACjC,OAAO,EAAE,cAAc,CAAC,SAAS;IAEjC,oBAAoB;IACpB,SAAS,EAAE,cAAc,CAAC,aAAa;IACvC,UAAU,EAAE,cAAc,CAAC,cAAc;IAEzC,iBAAiB;IACjB,cAAc,EAAE,eAAe;IAE/B,kBAAkB;IAClB,SAAS,EAAE,eAAe;CAC3B,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CAAC,OAAqB;;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAEhC,2EAA2E;IAC3E,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,sBAAsB;IACtB,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,kEAAkE;IAClE,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,UAAU,0CAAE,SAA+B,CAAC;QACpE,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,UAAU,0CAAE,WAAiC,CAAC;QAExE,IAAI,SAAS,KAAK,QAAQ;YAAE,OAAO,cAAc,CAAC,SAAS,CAAC;QAC5D,IAAI,SAAS,KAAK,QAAQ;YAAE,OAAO,cAAc,CAAC,SAAS,CAAC;QAC5D,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,UAAU;YAAE,OAAO,cAAc,CAAC,QAAQ,CAAC;QAElF,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,mDAAmD;IACnD,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAqB;IACzC,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAEzC,eAAe;IACf,IAAI,OAAO,CAAC,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IACzD,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3D,IAAI,OAAO,CAAC,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAE1D,gBAAgB;IAChB,IAAI,OAAO,CAAC,YAAY;QAAE,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3D,IAAI,OAAO,CAAC,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;IAE9C,uBAAuB;IACvB,IAAI,OAAO,CAAC,eAAe;QAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAC3E,IAAI,OAAO,CAAC,gBAAgB;QAAE,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAE9E,eAAe;IACf,IAAI,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAE/D,6BAA6B;IAC7B,IAAI,OAAO,CAAC,aAAa;QAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IACrE,IAAI,OAAO,CAAC,kBAAkB;QAAE,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAEpF,sBAAsB;IACtB,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAEpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAqB;IACzD,kBAAkB;IAClB,IAAI,EAAU,CAAC;IACf,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC1C,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACjD,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,EAAE;QACF,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC;QAC3B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;QAC5B,aAAa,EAAE,oBAAoB;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAChC,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEhD,+BAA+B;IAC/B,MAAM,UAAU,GAAG;QACjB,sBAAsB;QACtB,gBAAgB;QAChB,SAAS;QACT,gBAAgB;QAChB,MAAM;QACN,WAAW;QACX,QAAQ;QACR,eAAe;QACf,kBAAkB;QAClB,oBAAoB;QACpB,aAAa;QACb,YAAY;QACZ,aAAa;QACb,UAAU;KACX,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,SAA2C;IAE3C,OAAO,CAAC,SAAiB,EAAE,UAAoC,EAAE,EAAE;QACjE,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO;QAC1C,MAAM,OAAO,GAAiB;YAC5B,KAAK,EAAE,SAAS;YAChB,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACvD,SAAS,CAAC,eAAe,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/events/schema.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Zod schemas for event validation.
|
|
3
3
|
*/
|
|
4
|
-
import { z } from
|
|
4
|
+
import { z } from 'zod';
|
|
5
5
|
export declare const EventSourceZ: z.ZodEnum<["posthog", "canvas", "derived"]>;
|
|
6
6
|
export declare const NormalizedEventZ: z.ZodObject<{
|
|
7
7
|
ts: z.ZodNumber;
|
|
@@ -10,16 +10,16 @@ export declare const NormalizedEventZ: z.ZodObject<{
|
|
|
10
10
|
props: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
11
11
|
schemaVersion: z.ZodString;
|
|
12
12
|
}, "strip", z.ZodTypeAny, {
|
|
13
|
-
source: "
|
|
13
|
+
source: "posthog" | "canvas" | "derived";
|
|
14
14
|
name: string;
|
|
15
|
-
ts: number;
|
|
16
15
|
schemaVersion: string;
|
|
16
|
+
ts: number;
|
|
17
17
|
props?: Record<string, unknown> | undefined;
|
|
18
18
|
}, {
|
|
19
|
-
source: "
|
|
19
|
+
source: "posthog" | "canvas" | "derived";
|
|
20
20
|
name: string;
|
|
21
|
-
ts: number;
|
|
22
21
|
schemaVersion: string;
|
|
22
|
+
ts: number;
|
|
23
23
|
props?: Record<string, unknown> | undefined;
|
|
24
24
|
}>;
|
|
25
25
|
export declare const EventFilterZ: z.ZodObject<{
|
|
@@ -29,26 +29,26 @@ export declare const EventFilterZ: z.ZodObject<{
|
|
|
29
29
|
}, "strip", z.ZodTypeAny, {
|
|
30
30
|
names?: string[] | undefined;
|
|
31
31
|
patterns?: string[] | undefined;
|
|
32
|
-
sources?: ("
|
|
32
|
+
sources?: ("posthog" | "canvas" | "derived")[] | undefined;
|
|
33
33
|
}, {
|
|
34
34
|
names?: string[] | undefined;
|
|
35
35
|
patterns?: string[] | undefined;
|
|
36
|
-
sources?: ("
|
|
36
|
+
sources?: ("posthog" | "canvas" | "derived")[] | undefined;
|
|
37
37
|
}>;
|
|
38
38
|
/**
|
|
39
39
|
* Validate a NormalizedEvent object.
|
|
40
40
|
*/
|
|
41
41
|
export declare function validateNormalizedEvent(data: unknown): z.SafeParseReturnType<{
|
|
42
|
-
source: "
|
|
42
|
+
source: "posthog" | "canvas" | "derived";
|
|
43
43
|
name: string;
|
|
44
|
-
ts: number;
|
|
45
44
|
schemaVersion: string;
|
|
45
|
+
ts: number;
|
|
46
46
|
props?: Record<string, unknown> | undefined;
|
|
47
47
|
}, {
|
|
48
|
-
source: "
|
|
48
|
+
source: "posthog" | "canvas" | "derived";
|
|
49
49
|
name: string;
|
|
50
|
-
ts: number;
|
|
51
50
|
schemaVersion: string;
|
|
51
|
+
ts: number;
|
|
52
52
|
props?: Record<string, unknown> | undefined;
|
|
53
53
|
}>;
|
|
54
54
|
/**
|
|
@@ -57,11 +57,11 @@ export declare function validateNormalizedEvent(data: unknown): z.SafeParseRetur
|
|
|
57
57
|
export declare function validateEventFilter(data: unknown): z.SafeParseReturnType<{
|
|
58
58
|
names?: string[] | undefined;
|
|
59
59
|
patterns?: string[] | undefined;
|
|
60
|
-
sources?: ("
|
|
60
|
+
sources?: ("posthog" | "canvas" | "derived")[] | undefined;
|
|
61
61
|
}, {
|
|
62
62
|
names?: string[] | undefined;
|
|
63
63
|
patterns?: string[] | undefined;
|
|
64
|
-
sources?: ("
|
|
64
|
+
sources?: ("posthog" | "canvas" | "derived")[] | undefined;
|
|
65
65
|
}>;
|
|
66
66
|
/**
|
|
67
67
|
* Type inference from Zod schema.
|
package/dist/events/schema.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Zod schemas for event validation.
|
|
3
3
|
*/
|
|
4
|
-
import { z } from
|
|
5
|
-
export const EventSourceZ = z.enum([
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export const EventSourceZ = z.enum(['posthog', 'canvas', 'derived']);
|
|
6
6
|
export const NormalizedEventZ = z.object({
|
|
7
7
|
ts: z.number(),
|
|
8
8
|
name: z.string(),
|
|
9
9
|
source: EventSourceZ,
|
|
10
|
-
props: z.record(z.unknown()).optional(),
|
|
10
|
+
props: z.record(z.string(), z.unknown()).optional(),
|
|
11
11
|
schemaVersion: z.string(),
|
|
12
12
|
});
|
|
13
13
|
export const EventFilterZ = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/events/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/events/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,OAAO,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,OAAO,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/events/types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
/**
|
|
8
8
|
* Event sources in the runtime.
|
|
9
9
|
*/
|
|
10
|
-
export type EventSource =
|
|
10
|
+
export type EventSource = 'posthog' | 'canvas' | 'derived';
|
|
11
11
|
/**
|
|
12
12
|
* Normalized event structure for the event bus.
|
|
13
13
|
*/
|
|
@@ -66,6 +66,12 @@ export declare const StandardEvents: {
|
|
|
66
66
|
readonly BEHAVIOR_RAGE_CLICK: "behavior.rage_click";
|
|
67
67
|
readonly BEHAVIOR_HESITATION: "behavior.hesitation";
|
|
68
68
|
readonly BEHAVIOR_CONFUSION: "behavior.confusion";
|
|
69
|
+
readonly ACTION_APPLIED: "action.applied";
|
|
70
|
+
readonly ACTION_REVERTED: "action.reverted";
|
|
71
|
+
readonly ACTION_FAILED: "action.failed";
|
|
72
|
+
readonly ACTION_CTA_CLICKED: "action.cta_clicked";
|
|
73
|
+
readonly SURFACE_MOUNTED: "surface.mounted";
|
|
74
|
+
readonly SURFACE_UNMOUNTED: "surface.unmounted";
|
|
69
75
|
};
|
|
70
76
|
/**
|
|
71
77
|
* Current schema version for normalized events.
|
package/dist/events/types.js
CHANGED
|
@@ -9,33 +9,41 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export const StandardEvents = {
|
|
11
11
|
// UI events (from PostHog autocapture)
|
|
12
|
-
UI_CLICK:
|
|
13
|
-
UI_SCROLL:
|
|
14
|
-
UI_INPUT:
|
|
15
|
-
UI_CHANGE:
|
|
16
|
-
UI_SUBMIT:
|
|
12
|
+
UI_CLICK: 'ui.click',
|
|
13
|
+
UI_SCROLL: 'ui.scroll',
|
|
14
|
+
UI_INPUT: 'ui.input',
|
|
15
|
+
UI_CHANGE: 'ui.change',
|
|
16
|
+
UI_SUBMIT: 'ui.submit',
|
|
17
17
|
// Navigation events
|
|
18
|
-
NAV_PAGE_VIEW:
|
|
19
|
-
NAV_PAGE_LEAVE:
|
|
18
|
+
NAV_PAGE_VIEW: 'nav.page_view',
|
|
19
|
+
NAV_PAGE_LEAVE: 'nav.page_leave',
|
|
20
20
|
// Canvas events
|
|
21
|
-
CANVAS_OPENED:
|
|
22
|
-
CANVAS_CLOSED:
|
|
23
|
-
TILE_VIEWED:
|
|
24
|
-
TILE_EXPANDED:
|
|
25
|
-
TILE_COLLAPSED:
|
|
26
|
-
TILE_ACTION:
|
|
21
|
+
CANVAS_OPENED: 'canvas.opened',
|
|
22
|
+
CANVAS_CLOSED: 'canvas.closed',
|
|
23
|
+
TILE_VIEWED: 'tile.viewed',
|
|
24
|
+
TILE_EXPANDED: 'tile.expanded',
|
|
25
|
+
TILE_COLLAPSED: 'tile.collapsed',
|
|
26
|
+
TILE_ACTION: 'tile.action',
|
|
27
27
|
// Overlay/tour events
|
|
28
|
-
OVERLAY_STARTED:
|
|
29
|
-
OVERLAY_COMPLETED:
|
|
30
|
-
OVERLAY_DISMISSED:
|
|
31
|
-
OVERLAY_STEP_VIEWED:
|
|
28
|
+
OVERLAY_STARTED: 'overlay.started',
|
|
29
|
+
OVERLAY_COMPLETED: 'overlay.completed',
|
|
30
|
+
OVERLAY_DISMISSED: 'overlay.dismissed',
|
|
31
|
+
OVERLAY_STEP_VIEWED: 'overlay.step_viewed',
|
|
32
32
|
// Derived behavioral signals (Phase 3)
|
|
33
|
-
BEHAVIOR_RAGE_CLICK:
|
|
34
|
-
BEHAVIOR_HESITATION:
|
|
35
|
-
BEHAVIOR_CONFUSION:
|
|
33
|
+
BEHAVIOR_RAGE_CLICK: 'behavior.rage_click',
|
|
34
|
+
BEHAVIOR_HESITATION: 'behavior.hesitation',
|
|
35
|
+
BEHAVIOR_CONFUSION: 'behavior.confusion',
|
|
36
|
+
// Action events
|
|
37
|
+
ACTION_APPLIED: 'action.applied',
|
|
38
|
+
ACTION_REVERTED: 'action.reverted',
|
|
39
|
+
ACTION_FAILED: 'action.failed',
|
|
40
|
+
ACTION_CTA_CLICKED: 'action.cta_clicked',
|
|
41
|
+
// Surface events
|
|
42
|
+
SURFACE_MOUNTED: 'surface.mounted',
|
|
43
|
+
SURFACE_UNMOUNTED: 'surface.unmounted',
|
|
36
44
|
};
|
|
37
45
|
/**
|
|
38
46
|
* Current schema version for normalized events.
|
|
39
47
|
*/
|
|
40
|
-
export const EVENT_SCHEMA_VERSION =
|
|
48
|
+
export const EVENT_SCHEMA_VERSION = '1.0.0';
|
|
41
49
|
//# sourceMappingURL=types.js.map
|
package/dist/events/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAEhC,gBAAgB;IAChB,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAE1C,uCAAuC;IACvC,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6CH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAEhC,gBAAgB;IAChB,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAE1C,uCAAuC;IACvC,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;IAExC,gBAAgB;IAChB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,kBAAkB,EAAE,oBAAoB;IAExC,iBAAiB;IACjB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC"}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* This file is INTERNAL - consumers should only import from experiments/types.ts
|
|
5
5
|
* and use the ExperimentClient interface.
|
|
6
6
|
*/
|
|
7
|
-
import { GrowthBook } from
|
|
8
|
-
import type { Context as GrowthBookInitOptions } from
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
7
|
+
import { GrowthBook } from '@growthbook/growthbook';
|
|
8
|
+
import type { Context as GrowthBookInitOptions } from '@growthbook/growthbook';
|
|
9
|
+
import type { TileConfig } from '../../types';
|
|
10
|
+
import type { ExperimentClient } from '../types';
|
|
11
11
|
/**
|
|
12
12
|
* Callback fired when a user is assigned to an experiment.
|
|
13
13
|
*/
|
|
@@ -53,6 +53,7 @@ export declare class GrowthBookAdapter implements ExperimentClient {
|
|
|
53
53
|
setAttributes(attrs: Record<string, unknown>): void;
|
|
54
54
|
setForcedVariations(variations: Record<string, number>): void;
|
|
55
55
|
getFeatureValue<T>(key: string, fallback: T): T;
|
|
56
|
+
getAllFeatures(): Record<string, unknown>;
|
|
56
57
|
shouldRenderRectangle(tile: TileConfig): boolean;
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* This file is INTERNAL - consumers should only import from experiments/types.ts
|
|
5
5
|
* and use the ExperimentClient interface.
|
|
6
6
|
*/
|
|
7
|
-
import { GrowthBook } from
|
|
7
|
+
import { GrowthBook } from '@growthbook/growthbook';
|
|
8
8
|
/**
|
|
9
9
|
* Default API host for GrowthBook experiments.
|
|
10
10
|
*/
|
|
11
|
-
export const DEFAULT_EXPERIMENT_API_HOST =
|
|
11
|
+
export const DEFAULT_EXPERIMENT_API_HOST = 'https://experiment.syntrologie.com';
|
|
12
12
|
/**
|
|
13
13
|
* Internal adapter that implements ExperimentClient using GrowthBook.
|
|
14
14
|
*/
|
|
@@ -22,7 +22,7 @@ export class GrowthBookAdapter {
|
|
|
22
22
|
// Set up tracking callback to bridge to telemetry
|
|
23
23
|
const trackingCallback = options.onExperimentViewed
|
|
24
24
|
? (experiment, result) => {
|
|
25
|
-
options.onExperimentViewed(experiment.key, result.variationId, typeof result.value ===
|
|
25
|
+
options.onExperimentViewed(experiment.key, result.variationId, typeof result.value === 'string' ? result.value : `variation_${result.variationId}`);
|
|
26
26
|
}
|
|
27
27
|
: undefined;
|
|
28
28
|
this.gb = new GrowthBook({
|
|
@@ -58,8 +58,16 @@ export class GrowthBookAdapter {
|
|
|
58
58
|
getFeatureValue(key, fallback) {
|
|
59
59
|
return this.gb.getFeatureValue(key, fallback);
|
|
60
60
|
}
|
|
61
|
+
getAllFeatures() {
|
|
62
|
+
const features = this.gb.getFeatures();
|
|
63
|
+
const result = {};
|
|
64
|
+
for (const key of Object.keys(features)) {
|
|
65
|
+
result[key] = this.gb.getFeatureValue(key, null);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
61
69
|
shouldRenderRectangle(tile) {
|
|
62
|
-
const experiment = tile
|
|
70
|
+
const { experiment } = tile;
|
|
63
71
|
if (!experiment)
|
|
64
72
|
return true;
|
|
65
73
|
if (!experiment.featureKey)
|
|
@@ -67,10 +75,10 @@ export class GrowthBookAdapter {
|
|
|
67
75
|
const value = this.gb.getFeatureValue(experiment.featureKey, null);
|
|
68
76
|
if (value === null || value === undefined)
|
|
69
77
|
return false;
|
|
70
|
-
if (typeof experiment.variationId ===
|
|
78
|
+
if (typeof experiment.variationId === 'number') {
|
|
71
79
|
return Number(value) === experiment.variationId;
|
|
72
80
|
}
|
|
73
|
-
if (typeof experiment.variationValue !==
|
|
81
|
+
if (typeof experiment.variationValue !== 'undefined') {
|
|
74
82
|
return value === experiment.variationValue;
|
|
75
83
|
}
|
|
76
84
|
if (experiment.predicate) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"growthbook.js","sourceRoot":"","sources":["../../../src/experiments/adapters/growthbook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAepD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AA4BhF;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAG5B,YAAY,UAAoC,EAAE;;QAChD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB;gBACjD,CAAC,CAAC,CAAC,UAA+B,EAAE,MAAuB,EAAE,EAAE;oBAC3D,OAAO,CAAC,kBAAmB,CACzB,UAAU,CAAC,GAAG,EACd,MAAM,CAAC,WAAW,EAClB,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,WAAW,EAAE,CACpF,CAAC;gBACJ,CAAC;gBACH,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC;gBACvB,GAAG,OAAO;gBACV,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,2BAA2B;gBACvD,yEAAyE;gBACzE,0EAA0E;gBAC1E,aAAa,EAAE,MAAA,OAAO,CAAC,aAAa,mCAAI,IAAI;gBAC5C,uCAAuC;gBACvC,gBAAgB;aACjB,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,KAA8B;QAC1C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,mBAAmB,CAAC,UAAkC;QACpD,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAI,GAAW,EAAE,QAAW;QACzC,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAM,CAAC;IACrD,CAAC;IAED,cAAc;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qBAAqB,CAAC,IAAgB;QACpC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAExD,IAAI,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;YACrD,OAAO,KAAK,KAAK,UAAU,CAAC,cAAc,CAAC;QAC7C,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAoC,EAAE;IAC3E,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { ExperimentClient, SyntroExperimentClient } from
|
|
2
|
-
export { createGrowthBookClient } from
|
|
3
|
-
export type { GrowthBookAdapterOptions } from
|
|
1
|
+
export type { ExperimentClient, SyntroExperimentClient } from './types';
|
|
2
|
+
export { createGrowthBookClient } from './adapters/growthbook';
|
|
3
|
+
export type { GrowthBookAdapterOptions } from './adapters/growthbook';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Adapter factory - consumers use this to create clients
|
|
2
2
|
// but don't need to know about the internal implementation
|
|
3
|
-
export { createGrowthBookClient } from
|
|
3
|
+
export { createGrowthBookClient } from './adapters/growthbook';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* This allows the bootstrap module to dynamically create
|
|
6
6
|
* experiment clients based on token configuration.
|
|
7
7
|
*/
|
|
8
|
-
import { ExperimentTrackingCallback } from
|
|
9
|
-
import type { ExperimentClient } from
|
|
8
|
+
import { ExperimentTrackingCallback } from './adapters/growthbook';
|
|
9
|
+
import type { ExperimentClient } from './types';
|
|
10
10
|
export interface CreateExperimentClientConfig {
|
|
11
11
|
clientKey: string;
|
|
12
12
|
apiHost?: string;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* This allows the bootstrap module to dynamically create
|
|
6
6
|
* experiment clients based on token configuration.
|
|
7
7
|
*/
|
|
8
|
-
import { createGrowthBookClient, } from
|
|
8
|
+
import { createGrowthBookClient, } from './adapters/growthbook';
|
|
9
9
|
const adapters = {
|
|
10
10
|
growthbook: (config) => createGrowthBookClient({
|
|
11
11
|
...config,
|
|
@@ -23,7 +23,7 @@ const adapters = {
|
|
|
23
23
|
export function createExperimentClient(provider, config) {
|
|
24
24
|
const factory = adapters[provider];
|
|
25
25
|
if (!factory) {
|
|
26
|
-
throw new Error(`Unknown experiment provider: ${provider}. Supported: ${Object.keys(adapters).join(
|
|
26
|
+
throw new Error(`Unknown experiment provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`);
|
|
27
27
|
}
|
|
28
28
|
return factory(config);
|
|
29
29
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TileConfig } from
|
|
1
|
+
import type { TileConfig } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Clean interface for experiment/feature flag clients.
|
|
4
4
|
*
|
|
@@ -23,6 +23,15 @@ export interface ExperimentClient {
|
|
|
23
23
|
* @param variations Map of experiment tracking key to variation index
|
|
24
24
|
*/
|
|
25
25
|
setForcedVariations?(variations: Record<string, number>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Refresh/load feature flags from the server.
|
|
28
|
+
*/
|
|
29
|
+
refreshFeatures?(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get all loaded features (for prefix-based discovery).
|
|
32
|
+
* Returns a map of feature key -> feature value.
|
|
33
|
+
*/
|
|
34
|
+
getAllFeatures?(): Record<string, unknown>;
|
|
26
35
|
}
|
|
27
36
|
/**
|
|
28
37
|
* @deprecated Use ExperimentClient instead
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Allowed CDN hosts for config fetching.
|
|
3
3
|
*/
|
|
4
|
-
const ALLOWED_CDN_HOSTS = [
|
|
5
|
-
'cdn.syntrologie.com',
|
|
6
|
-
'localhost',
|
|
7
|
-
'127.0.0.1'
|
|
8
|
-
];
|
|
4
|
+
const ALLOWED_CDN_HOSTS = ['cdn.syntrologie.com', 'localhost', '127.0.0.1'];
|
|
9
5
|
/**
|
|
10
6
|
* Validates that a CDN URL is from an allowed host.
|
|
11
7
|
*/
|
|
@@ -17,7 +13,7 @@ function validateCdnUrl(url) {
|
|
|
17
13
|
console.warn('[SmartCanvas] CDN URL must use HTTPS:', url);
|
|
18
14
|
return false;
|
|
19
15
|
}
|
|
20
|
-
const isAllowed = ALLOWED_CDN_HOSTS.some(host => parsed.hostname === host);
|
|
16
|
+
const isAllowed = ALLOWED_CDN_HOSTS.some((host) => parsed.hostname === host);
|
|
21
17
|
if (!isAllowed) {
|
|
22
18
|
console.warn('[SmartCanvas] CDN host not in allowlist:', parsed.hostname);
|
|
23
19
|
return false;
|
|
@@ -39,7 +35,7 @@ function validateCdnUrl(url) {
|
|
|
39
35
|
*/
|
|
40
36
|
export class CdnFetcher {
|
|
41
37
|
constructor(options) {
|
|
42
|
-
this.name =
|
|
38
|
+
this.name = 'cdn';
|
|
43
39
|
this.url = `${options.baseUrl}/${options.configId}.json`;
|
|
44
40
|
this.integrity = options.integrity;
|
|
45
41
|
if (!validateCdnUrl(this.url)) {
|
|
@@ -73,7 +69,7 @@ export class CdnFetcher {
|
|
|
73
69
|
return {
|
|
74
70
|
config,
|
|
75
71
|
meta: {
|
|
76
|
-
source:
|
|
72
|
+
source: 'cdn',
|
|
77
73
|
fetchTimeMs,
|
|
78
74
|
cached: (_a = cacheControl === null || cacheControl === void 0 ? void 0 : cacheControl.includes('public')) !== null && _a !== void 0 ? _a : false,
|
|
79
75
|
cacheAge: age ? parseInt(age, 10) : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdnFetcher.js","sourceRoot":"","sources":["../../src/fetchers/cdnFetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cdnFetcher.js","sourceRoot":"","sources":["../../src/fetchers/cdnFetcher.ts"],"names":[],"mappings":"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"}
|