@syntrologie/runtime-sdk 2.1.0 → 2.2.0-canary.1
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 +50 -43
- package/README.md +7 -7
- package/dist/RuntimeProvider.d.ts +1 -1
- package/dist/ShadowRootContext.d.ts +19 -0
- package/dist/SmartCanvasApp.d.ts +3 -3
- package/dist/SmartCanvasElement.d.ts +7 -2
- package/dist/SmartCanvasPortal.d.ts +1 -1
- package/dist/actions/executors/index.d.ts +3 -3
- package/dist/actions/executors/tour.d.ts +1 -1
- package/dist/actions/index.d.ts +4 -3
- package/dist/actions/schema.d.ts +1229 -0
- package/dist/actions/schema.js +67 -0
- package/dist/actions/schema.js.map +7 -0
- package/dist/adaptives/adaptive-chatbot/index.js +4 -4
- package/dist/adaptives/adaptive-chatbot/index.js.map +4 -4
- package/dist/adaptives/adaptive-content/index.js +2 -2
- package/dist/adaptives/adaptive-content/index.js.map +4 -4
- package/dist/adaptives/adaptive-faq/index.js +23 -6
- package/dist/adaptives/adaptive-faq/index.js.map +4 -4
- package/dist/adaptives/adaptive-gamification/index.js.map +1 -1
- package/dist/adaptives/adaptive-nav/index.js +22 -7
- package/dist/adaptives/adaptive-nav/index.js.map +4 -4
- package/dist/adaptives/adaptive-overlays/index.js +13 -13
- package/dist/adaptives/adaptive-overlays/index.js.map +4 -4
- package/dist/api.d.ts +2 -2
- package/dist/apps/examples/gamification-app.example.d.ts +4 -4
- package/dist/apps/index.d.ts +7 -7
- package/dist/blocks/data/index.d.ts +1 -1
- package/dist/blocks/index.d.ts +2 -2
- package/dist/blocks/interactive/index.d.ts +1 -1
- package/dist/blocks/notification/NotificationBlock.d.ts +1 -1
- package/dist/blocks/notification/index.d.ts +1 -1
- package/dist/bootstrap.d.ts +4 -4
- package/dist/chunk-AYTRRBR5.js +251 -0
- package/dist/chunk-AYTRRBR5.js.map +7 -0
- package/dist/chunk-HJKAXD5S.js +7921 -0
- package/dist/chunk-HJKAXD5S.js.map +7 -0
- package/dist/components/ShadowCanvasOverlay.d.ts +2 -2
- package/dist/components/TileCard.d.ts +1 -1
- package/dist/context/ContextManager.d.ts +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/decisions/engine.d.ts +1 -1
- package/dist/decisions/index.d.ts +3 -3
- package/dist/decisions/schema.d.ts +24 -24
- package/dist/decisions/strategies/rules.d.ts +1 -1
- package/dist/decisions/strategies/score.d.ts +1 -1
- package/dist/editorLoader.d.ts +4 -4
- package/dist/events/EventAccumulator.d.ts +1 -1
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/index.d.ts +7 -6
- package/dist/events/registerConfigPredicates.d.ts +19 -0
- package/dist/experiments/adapters/growthbook.d.ts +1 -1
- package/dist/experiments/index.d.ts +2 -2
- package/dist/experiments/registry.d.ts +1 -1
- package/dist/fetchers/index.d.ts +2 -2
- package/dist/hooks/useShadowCanvasConfig.d.ts +1 -1
- package/dist/hostPatcher/index.d.ts +2 -2
- package/dist/index.d.ts +24 -21
- package/dist/index.js +816 -75
- package/dist/index.js.map +7 -1
- package/dist/metrics/index.d.ts +1 -1
- package/dist/notifications/index.d.ts +6 -6
- package/dist/overlays/runtime/index.d.ts +3 -3
- package/dist/overlays/runtime/overlay/root.d.ts +17 -1
- package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
- package/dist/react.js +90 -134
- package/dist/react.js.map +7 -1
- package/dist/render/RenderContext.d.ts +2 -2
- package/dist/render/index.d.ts +2 -2
- package/dist/render/types.d.ts +2 -2
- package/dist/runtime.d.ts +8 -8
- package/dist/smart-canvas.esm.js +127 -124
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +17160 -16782
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +127 -124
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +1 -1
- package/dist/state/helpers/cooldowns.d.ts +1 -1
- package/dist/state/helpers/dismissals.d.ts +1 -1
- package/dist/state/helpers/frequency.d.ts +1 -1
- package/dist/state/index.d.ts +3 -3
- package/dist/surfaces/index.d.ts +3 -3
- package/dist/surfaces/positioning.d.ts +1 -1
- package/dist/telemetry/adapters/posthog.d.ts +2 -2
- package/dist/telemetry/index.d.ts +3 -3
- package/dist/telemetry/registry.d.ts +1 -1
- package/dist/theme/ThemeProvider.d.ts +1 -1
- package/dist/theme/extractHostTheme.d.ts +1 -1
- package/dist/theme/index.d.ts +4 -4
- package/dist/types-only.d.ts +1 -1
- package/dist/types-only.js +1 -11
- package/dist/types-only.js.map +7 -1
- package/dist/types.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/widgets/index.d.ts +1 -1
- package/package.json +24 -17
- package/schema/canvas-config.base.schema.json +351 -0
- package/schema/canvas-config.schema.json +3202 -440
- package/scripts/validate-config.mjs +54 -58
- package/dist/RuntimeProvider.js +0 -113
- package/dist/RuntimeProvider.js.map +0 -1
- package/dist/SmartCanvasApp.js +0 -143
- package/dist/SmartCanvasApp.js.map +0 -1
- package/dist/SmartCanvasElement.js +0 -138
- package/dist/SmartCanvasElement.js.map +0 -1
- package/dist/SmartCanvasPortal.js +0 -17
- package/dist/SmartCanvasPortal.js.map +0 -1
- package/dist/actions/ActionEngine.js +0 -272
- package/dist/actions/ActionEngine.js.map +0 -1
- package/dist/actions/executors/index.js +0 -240
- package/dist/actions/executors/index.js.map +0 -1
- package/dist/actions/executors/tour.js +0 -332
- package/dist/actions/executors/tour.js.map +0 -1
- package/dist/actions/index.js +0 -12
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/types.js +0 -8
- package/dist/actions/types.js.map +0 -1
- package/dist/actions/validation.js +0 -577
- package/dist/actions/validation.js.map +0 -1
- package/dist/antiFlicker.js +0 -39
- package/dist/antiFlicker.js.map +0 -1
- package/dist/api.js +0 -205
- package/dist/api.js.map +0 -1
- package/dist/apps/AppContext.js +0 -91
- package/dist/apps/AppContext.js.map +0 -1
- package/dist/apps/AppLoader.js +0 -293
- package/dist/apps/AppLoader.js.map +0 -1
- package/dist/apps/AppRegistry.js +0 -317
- package/dist/apps/AppRegistry.js.map +0 -1
- package/dist/apps/examples/gamification-app.example.js +0 -329
- package/dist/apps/examples/gamification-app.example.js.map +0 -1
- package/dist/apps/index.js +0 -16
- package/dist/apps/index.js.map +0 -1
- package/dist/apps/types.js +0 -8
- package/dist/apps/types.js.map +0 -1
- package/dist/blocks/data/ComparisonBlock.js +0 -95
- package/dist/blocks/data/ComparisonBlock.js.map +0 -1
- package/dist/blocks/data/StatsBlock.js +0 -102
- package/dist/blocks/data/StatsBlock.js.map +0 -1
- package/dist/blocks/data/index.js +0 -3
- package/dist/blocks/data/index.js.map +0 -1
- package/dist/blocks/index.js +0 -93
- package/dist/blocks/index.js.map +0 -1
- package/dist/blocks/interactive/ChecklistBlock.js +0 -111
- package/dist/blocks/interactive/ChecklistBlock.js.map +0 -1
- package/dist/blocks/interactive/RatingBlock.js +0 -147
- package/dist/blocks/interactive/RatingBlock.js.map +0 -1
- package/dist/blocks/interactive/index.js +0 -3
- package/dist/blocks/interactive/index.js.map +0 -1
- package/dist/blocks/notification/NotificationBlock.js +0 -171
- package/dist/blocks/notification/NotificationBlock.js.map +0 -1
- package/dist/blocks/notification/index.js +0 -2
- package/dist/blocks/notification/index.js.map +0 -1
- package/dist/blocks/theme-tokens.js +0 -25
- package/dist/blocks/theme-tokens.js.map +0 -1
- package/dist/bootstrap.js +0 -448
- package/dist/bootstrap.js.map +0 -1
- package/dist/bundle-entry.js +0 -9
- package/dist/bundle-entry.js.map +0 -1
- package/dist/components/ShadowCanvasOverlay.js +0 -327
- package/dist/components/ShadowCanvasOverlay.js.map +0 -1
- package/dist/components/TileCard.js +0 -103
- package/dist/components/TileCard.js.map +0 -1
- package/dist/components/TileWheel.js +0 -50
- package/dist/components/TileWheel.js.map +0 -1
- package/dist/config-validator.js +0 -173
- package/dist/config-validator.js.map +0 -1
- package/dist/configFetcher.js +0 -131
- package/dist/configFetcher.js.map +0 -1
- package/dist/context/ContextManager.js +0 -269
- package/dist/context/ContextManager.js.map +0 -1
- package/dist/context/index.js +0 -7
- package/dist/context/index.js.map +0 -1
- package/dist/context/schema.js +0 -50
- package/dist/context/schema.js.map +0 -1
- package/dist/context/types.js +0 -8
- package/dist/context/types.js.map +0 -1
- package/dist/controller.js +0 -34
- package/dist/controller.js.map +0 -1
- package/dist/decisions/engine.js +0 -117
- package/dist/decisions/engine.js.map +0 -1
- package/dist/decisions/index.js +0 -10
- package/dist/decisions/index.js.map +0 -1
- package/dist/decisions/schema.js +0 -151
- package/dist/decisions/schema.js.map +0 -1
- package/dist/decisions/strategies/rules.js +0 -166
- package/dist/decisions/strategies/rules.js.map +0 -1
- package/dist/decisions/strategies/score.js +0 -29
- package/dist/decisions/strategies/score.js.map +0 -1
- package/dist/decisions/types.js +0 -2
- package/dist/decisions/types.js.map +0 -1
- package/dist/earlyPatcher.js +0 -20
- package/dist/earlyPatcher.js.map +0 -1
- package/dist/editorLoader.js +0 -254
- package/dist/editorLoader.js.map +0 -1
- package/dist/events/EventAccumulator.js +0 -101
- package/dist/events/EventAccumulator.js.map +0 -1
- package/dist/events/EventBus.js +0 -152
- package/dist/events/EventBus.js.map +0 -1
- package/dist/events/index.js +0 -11
- package/dist/events/index.js.map +0 -1
- package/dist/events/normalizers/canvas.js +0 -116
- package/dist/events/normalizers/canvas.js.map +0 -1
- package/dist/events/normalizers/posthog.js +0 -171
- package/dist/events/normalizers/posthog.js.map +0 -1
- package/dist/events/schema.js +0 -30
- package/dist/events/schema.js.map +0 -1
- package/dist/events/types.js +0 -54
- package/dist/events/types.js.map +0 -1
- package/dist/experiments/adapters/growthbook.js +0 -81
- package/dist/experiments/adapters/growthbook.js.map +0 -1
- package/dist/experiments/index.js +0 -4
- package/dist/experiments/index.js.map +0 -1
- package/dist/experiments/registry.js +0 -30
- package/dist/experiments/registry.js.map +0 -1
- package/dist/experiments/types.js +0 -2
- package/dist/experiments/types.js.map +0 -1
- package/dist/fetchers/cdnFetcher.js +0 -96
- package/dist/fetchers/cdnFetcher.js.map +0 -1
- package/dist/fetchers/experimentsFetcher.js +0 -109
- package/dist/fetchers/experimentsFetcher.js.map +0 -1
- package/dist/fetchers/index.js +0 -5
- package/dist/fetchers/index.js.map +0 -1
- package/dist/fetchers/mergeConfigs.js +0 -38
- package/dist/fetchers/mergeConfigs.js.map +0 -1
- package/dist/fetchers/registry.js +0 -58
- package/dist/fetchers/registry.js.map +0 -1
- package/dist/fetchers/types.js +0 -2
- package/dist/fetchers/types.js.map +0 -1
- package/dist/hooks/useCanvasOverlays.js +0 -128
- package/dist/hooks/useCanvasOverlays.js.map +0 -1
- package/dist/hooks/useHostPatches.js +0 -40
- package/dist/hooks/useHostPatches.js.map +0 -1
- package/dist/hooks/useShadowCanvasConfig.js +0 -63
- package/dist/hooks/useShadowCanvasConfig.js.map +0 -1
- package/dist/hostPatcher/core/patcher.js +0 -181
- package/dist/hostPatcher/core/patcher.js.map +0 -1
- package/dist/hostPatcher/core/sanitizer.js +0 -66
- package/dist/hostPatcher/core/sanitizer.js.map +0 -1
- package/dist/hostPatcher/core/types.js +0 -2
- package/dist/hostPatcher/core/types.js.map +0 -1
- package/dist/hostPatcher/index.js +0 -7
- package/dist/hostPatcher/index.js.map +0 -1
- package/dist/hostPatcher/policy/defaultPolicy.js +0 -23
- package/dist/hostPatcher/policy/defaultPolicy.js.map +0 -1
- package/dist/hostPatcher/utils/anchors.js +0 -105
- package/dist/hostPatcher/utils/anchors.js.map +0 -1
- package/dist/hostPatcher/utils/observer.js +0 -11
- package/dist/hostPatcher/utils/observer.js.map +0 -1
- package/dist/logger.js +0 -81
- package/dist/logger.js.map +0 -1
- package/dist/metrics/index.js +0 -5
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/sessionMetrics.js +0 -178
- package/dist/metrics/sessionMetrics.js.map +0 -1
- package/dist/notifications/NotificationToastStack.js +0 -118
- package/dist/notifications/NotificationToastStack.js.map +0 -1
- package/dist/notifications/index.js +0 -6
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/matcher.js +0 -66
- package/dist/notifications/matcher.js.map +0 -1
- package/dist/notifications/types.js +0 -13
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/useNotifications.js +0 -104
- package/dist/notifications/useNotifications.js.map +0 -1
- package/dist/notifications/useNotifyWatcher.js +0 -62
- package/dist/notifications/useNotifyWatcher.js.map +0 -1
- package/dist/overlays/fetcher.js +0 -15
- package/dist/overlays/fetcher.js.map +0 -1
- package/dist/overlays/recipeRegistry.js +0 -32
- package/dist/overlays/recipeRegistry.js.map +0 -1
- package/dist/overlays/runtime/anchor/resolve.js +0 -87
- package/dist/overlays/runtime/anchor/resolve.js.map +0 -1
- package/dist/overlays/runtime/index.js +0 -8
- package/dist/overlays/runtime/index.js.map +0 -1
- package/dist/overlays/runtime/overlay/highlight.js +0 -160
- package/dist/overlays/runtime/overlay/highlight.js.map +0 -1
- package/dist/overlays/runtime/overlay/modal.js +0 -78
- package/dist/overlays/runtime/overlay/modal.js.map +0 -1
- package/dist/overlays/runtime/overlay/root.js +0 -297
- package/dist/overlays/runtime/overlay/root.js.map +0 -1
- package/dist/overlays/runtime/overlay/runner.js +0 -602
- package/dist/overlays/runtime/overlay/runner.js.map +0 -1
- package/dist/overlays/runtime/overlay/tooltip.js +0 -232
- package/dist/overlays/runtime/overlay/tooltip.js.map +0 -1
- package/dist/overlays/runtime/utils/dom.js +0 -12
- package/dist/overlays/runtime/utils/dom.js.map +0 -1
- package/dist/overlays/schema.js +0 -52
- package/dist/overlays/schema.js.map +0 -1
- package/dist/overlays/types.js +0 -2
- package/dist/overlays/types.js.map +0 -1
- package/dist/render/RenderContext.js +0 -69
- package/dist/render/RenderContext.js.map +0 -1
- package/dist/render/index.js +0 -3
- package/dist/render/index.js.map +0 -1
- package/dist/render/types.js +0 -2
- package/dist/render/types.js.map +0 -1
- package/dist/runtime.js +0 -237
- package/dist/runtime.js.map +0 -1
- package/dist/state/StateStore.js +0 -176
- package/dist/state/StateStore.js.map +0 -1
- package/dist/state/helpers/cooldowns.js +0 -31
- package/dist/state/helpers/cooldowns.js.map +0 -1
- package/dist/state/helpers/dismissals.js +0 -34
- package/dist/state/helpers/dismissals.js.map +0 -1
- package/dist/state/helpers/frequency.js +0 -43
- package/dist/state/helpers/frequency.js.map +0 -1
- package/dist/state/index.js +0 -7
- package/dist/state/index.js.map +0 -1
- package/dist/state/schema.js +0 -25
- package/dist/state/schema.js.map +0 -1
- package/dist/state/types.js +0 -9
- package/dist/state/types.js.map +0 -1
- package/dist/store/example.js +0 -43
- package/dist/store/example.js.map +0 -1
- package/dist/store/mini-effector.js +0 -88
- package/dist/store/mini-effector.js.map +0 -1
- package/dist/surfaces/Surfaces.js +0 -361
- package/dist/surfaces/Surfaces.js.map +0 -1
- package/dist/surfaces/index.js +0 -12
- package/dist/surfaces/index.js.map +0 -1
- package/dist/surfaces/positioning.js +0 -228
- package/dist/surfaces/positioning.js.map +0 -1
- package/dist/surfaces/types.js +0 -23
- package/dist/surfaces/types.js.map +0 -1
- package/dist/telemetry/adapters/noop.js +0 -42
- package/dist/telemetry/adapters/noop.js.map +0 -1
- package/dist/telemetry/adapters/posthog.js +0 -180
- package/dist/telemetry/adapters/posthog.js.map +0 -1
- package/dist/telemetry/index.js +0 -4
- package/dist/telemetry/index.js.map +0 -1
- package/dist/telemetry/registry.js +0 -29
- package/dist/telemetry/registry.js.map +0 -1
- package/dist/telemetry/types.js +0 -2
- package/dist/telemetry/types.js.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -109
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/defaultTheme.js +0 -190
- package/dist/theme/defaultTheme.js.map +0 -1
- package/dist/theme/extractHostTheme.js +0 -259
- package/dist/theme/extractHostTheme.js.map +0 -1
- package/dist/theme/index.js +0 -7
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/types.js +0 -6
- package/dist/theme/types.js.map +0 -1
- package/dist/token.js +0 -44
- package/dist/token.js.map +0 -1
- package/dist/types.js +0 -17
- package/dist/types.js.map +0 -1
- package/dist/version.js +0 -14
- package/dist/version.js.map +0 -1
- package/dist/widgets/WidgetRegistry.js +0 -190
- package/dist/widgets/WidgetRegistry.js.map +0 -1
- package/dist/widgets/index.js +0 -7
- package/dist/widgets/index.js.map +0 -1
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { StandardEvents, EVENT_SCHEMA_VERSION } from '../types';
|
|
2
|
-
/**
|
|
3
|
-
* Map PostHog event names to normalized event names.
|
|
4
|
-
*/
|
|
5
|
-
const POSTHOG_EVENT_MAP = {
|
|
6
|
-
// Autocapture events
|
|
7
|
-
$autocapture: 'ui.click', // Default autocapture is usually clicks
|
|
8
|
-
$click: StandardEvents.UI_CLICK,
|
|
9
|
-
$scroll: StandardEvents.UI_SCROLL,
|
|
10
|
-
$input: StandardEvents.UI_INPUT,
|
|
11
|
-
$change: StandardEvents.UI_CHANGE,
|
|
12
|
-
$submit: StandardEvents.UI_SUBMIT,
|
|
13
|
-
// Navigation events
|
|
14
|
-
$pageview: StandardEvents.NAV_PAGE_VIEW,
|
|
15
|
-
$pageleave: StandardEvents.NAV_PAGE_LEAVE,
|
|
16
|
-
// Session events
|
|
17
|
-
$session_start: 'session.start',
|
|
18
|
-
// Identify events
|
|
19
|
-
$identify: 'user.identify',
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Extract the normalized event name from a PostHog event.
|
|
23
|
-
*/
|
|
24
|
-
function getEventName(phEvent) {
|
|
25
|
-
var _a, _b;
|
|
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
|
-
}
|
|
31
|
-
// Check mapped events
|
|
32
|
-
if (POSTHOG_EVENT_MAP[eventName]) {
|
|
33
|
-
return POSTHOG_EVENT_MAP[eventName];
|
|
34
|
-
}
|
|
35
|
-
// For autocapture, check the element type to determine the action
|
|
36
|
-
if (eventName === '$autocapture') {
|
|
37
|
-
const tagName = (_a = phEvent.properties) === null || _a === void 0 ? void 0 : _a.$tag_name;
|
|
38
|
-
const eventType = (_b = phEvent.properties) === null || _b === void 0 ? void 0 : _b.$event_type;
|
|
39
|
-
if (eventType === 'submit')
|
|
40
|
-
return StandardEvents.UI_SUBMIT;
|
|
41
|
-
if (eventType === 'change')
|
|
42
|
-
return StandardEvents.UI_CHANGE;
|
|
43
|
-
if (tagName === 'input' || tagName === 'textarea')
|
|
44
|
-
return StandardEvents.UI_INPUT;
|
|
45
|
-
return StandardEvents.UI_CLICK;
|
|
46
|
-
}
|
|
47
|
-
// For custom events, prefix with "posthog." to namespace them
|
|
48
|
-
if (!eventName.startsWith('$')) {
|
|
49
|
-
return `posthog.${eventName}`;
|
|
50
|
-
}
|
|
51
|
-
// Pass through other $ events as-is but normalized
|
|
52
|
-
return eventName.replace('$', 'posthog.');
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Extract relevant properties from a PostHog event.
|
|
56
|
-
*/
|
|
57
|
-
function extractProps(phEvent) {
|
|
58
|
-
var _a;
|
|
59
|
-
const props = {};
|
|
60
|
-
const phProps = phEvent.properties || {};
|
|
61
|
-
// Element info — $tag_name may be a top-level property OR only inside $elements[0].
|
|
62
|
-
// PostHog v1.300+ often omits the top-level $tag_name for autocapture events,
|
|
63
|
-
// so fall back to $elements[0].tag_name when available.
|
|
64
|
-
const elements = phProps.$elements;
|
|
65
|
-
if (phProps.$tag_name) {
|
|
66
|
-
props.tagName = phProps.$tag_name;
|
|
67
|
-
}
|
|
68
|
-
else if ((_a = elements === null || elements === void 0 ? void 0 : elements[0]) === null || _a === void 0 ? void 0 : _a.tag_name) {
|
|
69
|
-
props.tagName = elements[0].tag_name;
|
|
70
|
-
}
|
|
71
|
-
if (phProps.$el_text)
|
|
72
|
-
props.elementText = phProps.$el_text;
|
|
73
|
-
if (elements)
|
|
74
|
-
props.elements = elements;
|
|
75
|
-
// URL/page info
|
|
76
|
-
if (phProps.$current_url)
|
|
77
|
-
props.url = phProps.$current_url;
|
|
78
|
-
if (phProps.$pathname)
|
|
79
|
-
props.pathname = phProps.$pathname;
|
|
80
|
-
if (phProps.$host)
|
|
81
|
-
props.host = phProps.$host;
|
|
82
|
-
// Device/viewport info
|
|
83
|
-
if (phProps.$viewport_width)
|
|
84
|
-
props.viewportWidth = phProps.$viewport_width;
|
|
85
|
-
if (phProps.$viewport_height)
|
|
86
|
-
props.viewportHeight = phProps.$viewport_height;
|
|
87
|
-
// Session info
|
|
88
|
-
if (phProps.$session_id)
|
|
89
|
-
props.sessionId = phProps.$session_id;
|
|
90
|
-
// Scroll-specific properties
|
|
91
|
-
if (phProps.$scroll_depth)
|
|
92
|
-
props.scrollDepth = phProps.$scroll_depth;
|
|
93
|
-
if (phProps.$scroll_percentage)
|
|
94
|
-
props.scrollPercentage = phProps.$scroll_percentage;
|
|
95
|
-
// Original event name
|
|
96
|
-
props.originalEvent = phEvent.event;
|
|
97
|
-
return props;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Normalize a PostHog event into a NormalizedEvent.
|
|
101
|
-
*/
|
|
102
|
-
export function normalizePostHogEvent(phEvent) {
|
|
103
|
-
// Parse timestamp
|
|
104
|
-
let ts;
|
|
105
|
-
if (typeof phEvent.timestamp === 'number') {
|
|
106
|
-
ts = phEvent.timestamp;
|
|
107
|
-
}
|
|
108
|
-
else if (typeof phEvent.timestamp === 'string') {
|
|
109
|
-
ts = new Date(phEvent.timestamp).getTime();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
ts = Date.now();
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
ts,
|
|
116
|
-
name: getEventName(phEvent),
|
|
117
|
-
source: 'posthog',
|
|
118
|
-
props: extractProps(phEvent),
|
|
119
|
-
schemaVersion: EVENT_SCHEMA_VERSION,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Check if a PostHog event should be normalized.
|
|
124
|
-
* Filters out internal/system events that aren't useful for adaptives.
|
|
125
|
-
*/
|
|
126
|
-
export function shouldNormalizeEvent(phEvent) {
|
|
127
|
-
const eventName = phEvent.event;
|
|
128
|
-
if (typeof eventName !== 'string')
|
|
129
|
-
return false;
|
|
130
|
-
// Skip internal PostHog events
|
|
131
|
-
const skipEvents = [
|
|
132
|
-
'$feature_flag_called',
|
|
133
|
-
'$feature_flags',
|
|
134
|
-
'$groups',
|
|
135
|
-
'$groupidentify',
|
|
136
|
-
'$set',
|
|
137
|
-
'$set_once',
|
|
138
|
-
'$unset',
|
|
139
|
-
'$create_alias',
|
|
140
|
-
'$capture_metrics',
|
|
141
|
-
'$performance_event',
|
|
142
|
-
'$web_vitals',
|
|
143
|
-
'$exception',
|
|
144
|
-
'$dead_click',
|
|
145
|
-
'$heatmap',
|
|
146
|
-
];
|
|
147
|
-
if (skipEvents.includes(eventName)) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Create a function that hooks into PostHog's onCapture callback
|
|
154
|
-
* and normalizes events into the EventBus.
|
|
155
|
-
*/
|
|
156
|
-
export function createPostHogNormalizer(publishFn) {
|
|
157
|
-
return (eventName, properties) => {
|
|
158
|
-
if (typeof eventName !== 'string')
|
|
159
|
-
return;
|
|
160
|
-
const phEvent = {
|
|
161
|
-
event: eventName,
|
|
162
|
-
properties,
|
|
163
|
-
timestamp: Date.now(),
|
|
164
|
-
};
|
|
165
|
-
if (shouldNormalizeEvent(phEvent)) {
|
|
166
|
-
const normalizedEvent = normalizePostHogEvent(phEvent);
|
|
167
|
-
publishFn(normalizedEvent);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=posthog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/events/normalizers/posthog.ts"],"names":[],"mappings":"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"}
|
package/dist/events/schema.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod schemas for event validation.
|
|
3
|
-
*/
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
export const EventSourceZ = z.enum(['posthog', 'canvas', 'derived']);
|
|
6
|
-
export const NormalizedEventZ = z.object({
|
|
7
|
-
ts: z.number(),
|
|
8
|
-
name: z.string(),
|
|
9
|
-
source: EventSourceZ,
|
|
10
|
-
props: z.record(z.string(), z.unknown()).optional(),
|
|
11
|
-
schemaVersion: z.string(),
|
|
12
|
-
});
|
|
13
|
-
export const EventFilterZ = z.object({
|
|
14
|
-
names: z.array(z.string()).optional(),
|
|
15
|
-
patterns: z.array(z.string()).optional(),
|
|
16
|
-
sources: z.array(EventSourceZ).optional(),
|
|
17
|
-
});
|
|
18
|
-
/**
|
|
19
|
-
* Validate a NormalizedEvent object.
|
|
20
|
-
*/
|
|
21
|
-
export function validateNormalizedEvent(data) {
|
|
22
|
-
return NormalizedEventZ.safeParse(data);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Validate an EventFilter object.
|
|
26
|
-
*/
|
|
27
|
-
export function validateEventFilter(data) {
|
|
28
|
-
return EventFilterZ.safeParse(data);
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Event Bus Types
|
|
3
|
-
*
|
|
4
|
-
* The EventBus provides a normalized event stream that unifies events from
|
|
5
|
-
* PostHog autocapture, Canvas events, and derived behavioral signals.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Standard event names used by the runtime.
|
|
9
|
-
*/
|
|
10
|
-
export const StandardEvents = {
|
|
11
|
-
// UI events (from PostHog autocapture)
|
|
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
|
-
// Navigation events
|
|
18
|
-
NAV_PAGE_VIEW: 'nav.page_view',
|
|
19
|
-
NAV_PAGE_LEAVE: 'nav.page_leave',
|
|
20
|
-
// Canvas events
|
|
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
|
-
// Overlay/tour events
|
|
28
|
-
OVERLAY_STARTED: 'overlay.started',
|
|
29
|
-
OVERLAY_COMPLETED: 'overlay.completed',
|
|
30
|
-
OVERLAY_DISMISSED: 'overlay.dismissed',
|
|
31
|
-
OVERLAY_STEP_VIEWED: 'overlay.step_viewed',
|
|
32
|
-
// Derived behavioral signals (Phase 3)
|
|
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
|
-
// Notification events
|
|
42
|
-
NOTIFICATION_SHOWN: 'notification.shown',
|
|
43
|
-
NOTIFICATION_CLICKED: 'notification.clicked',
|
|
44
|
-
NOTIFICATION_DISMISSED: 'notification.dismissed',
|
|
45
|
-
NOTIFICATION_DEEP_LINK: 'notification.deep_link',
|
|
46
|
-
// Surface events
|
|
47
|
-
SURFACE_MOUNTED: 'surface.mounted',
|
|
48
|
-
SURFACE_UNMOUNTED: 'surface.unmounted',
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Current schema version for normalized events.
|
|
52
|
-
*/
|
|
53
|
-
export const EVENT_SCHEMA_VERSION = '1.0.0';
|
|
54
|
-
//# sourceMappingURL=types.js.map
|
package/dist/events/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,sBAAsB;IACtB,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,sBAAsB,EAAE,wBAAwB;IAChD,sBAAsB,EAAE,wBAAwB;IAEhD,iBAAiB;IACjB,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GrowthBook adapter for the ExperimentClient interface.
|
|
3
|
-
*
|
|
4
|
-
* This file is INTERNAL - consumers should only import from experiments/types.ts
|
|
5
|
-
* and use the ExperimentClient interface.
|
|
6
|
-
*/
|
|
7
|
-
import { GrowthBook } from '@growthbook/growthbook';
|
|
8
|
-
/**
|
|
9
|
-
* Default API host for GrowthBook experiments.
|
|
10
|
-
*/
|
|
11
|
-
export const DEFAULT_EXPERIMENT_API_HOST = 'https://experiment.syntrologie.com';
|
|
12
|
-
/**
|
|
13
|
-
* Internal adapter that implements ExperimentClient using GrowthBook.
|
|
14
|
-
*/
|
|
15
|
-
export class GrowthBookAdapter {
|
|
16
|
-
constructor(options = {}) {
|
|
17
|
-
var _a, _b;
|
|
18
|
-
if (options.client) {
|
|
19
|
-
this.gb = options.client;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
// Set up tracking callback to bridge to telemetry
|
|
23
|
-
const trackingCallback = options.onExperimentViewed
|
|
24
|
-
? (experiment, result) => {
|
|
25
|
-
options.onExperimentViewed(experiment.key, result.variationId, typeof result.value === 'string' ? result.value : `variation_${result.variationId}`);
|
|
26
|
-
}
|
|
27
|
-
: undefined;
|
|
28
|
-
this.gb = new GrowthBook({
|
|
29
|
-
...options,
|
|
30
|
-
apiHost: (_a = options.apiHost) !== null && _a !== void 0 ? _a : DEFAULT_EXPERIMENT_API_HOST,
|
|
31
|
-
// Enable dev mode for URL param overrides (?syntro_exp=xxx&syntro_var=N)
|
|
32
|
-
// Set to false in production if you want to disable preview functionality
|
|
33
|
-
enableDevMode: (_b = options.enableDevMode) !== null && _b !== void 0 ? _b : true,
|
|
34
|
-
// Wire up experiment tracking callback
|
|
35
|
-
trackingCallback,
|
|
36
|
-
});
|
|
37
|
-
if (options.autoInit) {
|
|
38
|
-
this.gb.init({ streaming: true });
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Access to the underlying GrowthBook instance.
|
|
44
|
-
* Only use this internally - don't expose to consumers.
|
|
45
|
-
*/
|
|
46
|
-
get _internal() {
|
|
47
|
-
return this.gb;
|
|
48
|
-
}
|
|
49
|
-
async refreshFeatures() {
|
|
50
|
-
await this.gb.loadFeatures();
|
|
51
|
-
}
|
|
52
|
-
setAttributes(attrs) {
|
|
53
|
-
this.gb.setAttributes(attrs);
|
|
54
|
-
}
|
|
55
|
-
setForcedVariations(variations) {
|
|
56
|
-
this.gb.setForcedVariations(variations);
|
|
57
|
-
}
|
|
58
|
-
getFeatureValue(key, fallback) {
|
|
59
|
-
return this.gb.getFeatureValue(key, fallback);
|
|
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
|
-
}
|
|
69
|
-
shouldRenderRectangle(_tile) {
|
|
70
|
-
// Legacy experiment-based filtering has been removed.
|
|
71
|
-
// Tile visibility is now managed via WidgetRegistry and runtime.filterTiles().
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Create an ExperimentClient backed by GrowthBook.
|
|
77
|
-
*/
|
|
78
|
-
export function createGrowthBookClient(options = {}) {
|
|
79
|
-
return new GrowthBookAdapter(options);
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=growthbook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,KAAiB;QACrC,sDAAsD;QACtD,+EAA+E;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAoC,EAAE;IAC3E,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/experiments/index.ts"],"names":[],"mappings":"AAGA,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Experiment provider registry.
|
|
3
|
-
*
|
|
4
|
-
* Maps provider names to their adapter factories.
|
|
5
|
-
* This allows the bootstrap module to dynamically create
|
|
6
|
-
* experiment clients based on token configuration.
|
|
7
|
-
*/
|
|
8
|
-
import { createGrowthBookClient, } from './adapters/growthbook';
|
|
9
|
-
const adapters = {
|
|
10
|
-
growthbook: (config) => createGrowthBookClient({
|
|
11
|
-
...config,
|
|
12
|
-
autoInit: true,
|
|
13
|
-
}),
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Create an experiment client for the specified provider.
|
|
17
|
-
*
|
|
18
|
-
* @param provider - Provider name (e.g., "growthbook")
|
|
19
|
-
* @param config - Provider-specific configuration
|
|
20
|
-
* @returns An ExperimentClient instance
|
|
21
|
-
* @throws Error if the provider is not supported
|
|
22
|
-
*/
|
|
23
|
-
export function createExperimentClient(provider, config) {
|
|
24
|
-
const factory = adapters[provider];
|
|
25
|
-
if (!factory) {
|
|
26
|
-
throw new Error(`Unknown experiment provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`);
|
|
27
|
-
}
|
|
28
|
-
return factory(config);
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/experiments/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,sBAAsB,GAGvB,MAAM,uBAAuB,CAAC;AAK/B,MAAM,QAAQ,GAAmC;IAC/C,UAAU,EAAE,CAAC,MAAgC,EAAE,EAAE,CAC/C,sBAAsB,CAAC;QACrB,GAAG,MAAM;QACT,QAAQ,EAAE,IAAI;KACf,CAAC;CACL,CAAC;AAiBF;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,MAAoC;IAEpC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,gBAAgB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/experiments/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Allowed CDN hosts for config fetching.
|
|
3
|
-
*/
|
|
4
|
-
const ALLOWED_CDN_HOSTS = ['cdn.syntrologie.com', 'localhost', '127.0.0.1'];
|
|
5
|
-
/**
|
|
6
|
-
* Validates that a CDN URL is from an allowed host.
|
|
7
|
-
*/
|
|
8
|
-
function validateCdnUrl(url) {
|
|
9
|
-
try {
|
|
10
|
-
const parsed = new URL(url);
|
|
11
|
-
const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
|
|
12
|
-
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
13
|
-
console.warn('[SmartCanvas] CDN URL must use HTTPS:', url);
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
const isAllowed = ALLOWED_CDN_HOSTS.some((host) => parsed.hostname === host);
|
|
17
|
-
if (!isAllowed) {
|
|
18
|
-
console.warn('[SmartCanvas] CDN host not in allowlist:', parsed.hostname);
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
console.warn('[SmartCanvas] Invalid CDN URL:', url);
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Fetches config from CDN using UUID-based paths.
|
|
30
|
-
*
|
|
31
|
-
* Security: Config paths use UUIDs which are unguessable.
|
|
32
|
-
* Each client has a unique config path that cannot be enumerated.
|
|
33
|
-
*
|
|
34
|
-
* Performance: CDN-cached with long TTL for versioned configs.
|
|
35
|
-
*/
|
|
36
|
-
export class CdnFetcher {
|
|
37
|
-
constructor(options) {
|
|
38
|
-
this.name = 'cdn';
|
|
39
|
-
this.url = `${options.baseUrl}/${options.configId}.json`;
|
|
40
|
-
this.integrity = options.integrity;
|
|
41
|
-
if (!validateCdnUrl(this.url)) {
|
|
42
|
-
throw new Error(`[SmartCanvas] CDN URL not allowed: ${this.url}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
async fetch() {
|
|
46
|
-
var _a;
|
|
47
|
-
const start = performance.now();
|
|
48
|
-
const response = await fetch(this.url, {
|
|
49
|
-
credentials: 'omit', // Never send cookies to CDN
|
|
50
|
-
cache: 'default',
|
|
51
|
-
});
|
|
52
|
-
if (!response.ok) {
|
|
53
|
-
throw new Error(`[SmartCanvas] Failed to fetch config from CDN (${response.status})`);
|
|
54
|
-
}
|
|
55
|
-
const text = await response.text();
|
|
56
|
-
// Verify integrity if provided
|
|
57
|
-
if (this.integrity) {
|
|
58
|
-
const hash = await computeSha384(text);
|
|
59
|
-
const expected = this.integrity.replace('sha384-', '');
|
|
60
|
-
if (hash !== expected) {
|
|
61
|
-
throw new Error(`[SmartCanvas] Config integrity check failed. Expected ${expected}, got ${hash}`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const config = JSON.parse(text);
|
|
65
|
-
const fetchTimeMs = performance.now() - start;
|
|
66
|
-
// Check cache headers
|
|
67
|
-
const cacheControl = response.headers.get('cache-control');
|
|
68
|
-
const age = response.headers.get('age');
|
|
69
|
-
return {
|
|
70
|
-
config,
|
|
71
|
-
meta: {
|
|
72
|
-
source: 'cdn',
|
|
73
|
-
fetchTimeMs,
|
|
74
|
-
cached: (_a = cacheControl === null || cacheControl === void 0 ? void 0 : cacheControl.includes('public')) !== null && _a !== void 0 ? _a : false,
|
|
75
|
-
cacheAge: age ? parseInt(age, 10) : undefined,
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Compute SHA-384 hash in base64 format (for SRI).
|
|
82
|
-
*/
|
|
83
|
-
async function computeSha384(content) {
|
|
84
|
-
const encoder = new TextEncoder();
|
|
85
|
-
const data = encoder.encode(content);
|
|
86
|
-
const hashBuffer = await crypto.subtle.digest('SHA-384', data);
|
|
87
|
-
const hashArray = new Uint8Array(hashBuffer);
|
|
88
|
-
return btoa(String.fromCharCode(...hashArray));
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Factory function for creating a CDN fetcher.
|
|
92
|
-
*/
|
|
93
|
-
export function createCdnFetcher(options) {
|
|
94
|
-
return new CdnFetcher(options);
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=cdnFetcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdnFetcher.js","sourceRoot":"","sources":["../../src/fetchers/cdnFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { resolveVariantConfigs } from './mergeConfigs';
|
|
2
|
-
/**
|
|
3
|
-
* URL parameters for forcing experiment variations in preview mode.
|
|
4
|
-
* Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1
|
|
5
|
-
*/
|
|
6
|
-
const PREVIEW_EXP_PARAM = 'syntro_exp';
|
|
7
|
-
const PREVIEW_VAR_PARAM = 'syntro_var';
|
|
8
|
-
/**
|
|
9
|
-
* Fetches config from an experiment/feature flag system.
|
|
10
|
-
*
|
|
11
|
-
* Security: Config is scoped to the experiment client's environment/SDK key.
|
|
12
|
-
* Each client only sees their own config.
|
|
13
|
-
*
|
|
14
|
-
* Performance: No network request needed if features are already cached.
|
|
15
|
-
* Config is delivered with the feature flag payload.
|
|
16
|
-
*/
|
|
17
|
-
export class ExperimentsFetcher {
|
|
18
|
-
constructor(options) {
|
|
19
|
-
var _a;
|
|
20
|
-
this.name = 'experiments';
|
|
21
|
-
this.client = options.client;
|
|
22
|
-
this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a : 'smart-canvas-config';
|
|
23
|
-
this.manifestKey = options.manifestKey;
|
|
24
|
-
this.variantFlagPrefix = options.variantFlagPrefix;
|
|
25
|
-
}
|
|
26
|
-
async fetch() {
|
|
27
|
-
var _a, _b;
|
|
28
|
-
const start = performance.now();
|
|
29
|
-
// Check for preview URL params to force a specific variation
|
|
30
|
-
if (typeof window !== 'undefined') {
|
|
31
|
-
const params = new URLSearchParams(window.location.search);
|
|
32
|
-
const expName = params.get(PREVIEW_EXP_PARAM);
|
|
33
|
-
const varIndex = params.get(PREVIEW_VAR_PARAM);
|
|
34
|
-
if (expName && varIndex !== null && this.client.setForcedVariations) {
|
|
35
|
-
const index = parseInt(varIndex, 10);
|
|
36
|
-
if (!isNaN(index)) {
|
|
37
|
-
console.log(`[SmartCanvas] Preview mode: forcing "${expName}" to variation ${index}`);
|
|
38
|
-
this.client.setForcedVariations({ [expName]: index });
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// Multi-flag mode: evaluate multiple feature flags and merge configs
|
|
43
|
-
if (this.manifestKey || this.variantFlagPrefix) {
|
|
44
|
-
const config = this.fetchMultiFlag();
|
|
45
|
-
if (config) {
|
|
46
|
-
const fetchTimeMs = performance.now() - start;
|
|
47
|
-
return {
|
|
48
|
-
config,
|
|
49
|
-
meta: { source: 'experiments', fetchTimeMs, cached: true },
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// Legacy single-flag mode
|
|
54
|
-
const config = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.featureKey, null);
|
|
55
|
-
if (!config || typeof config !== 'object') {
|
|
56
|
-
throw new Error(`[SmartCanvas] Feature "${this.featureKey}" not found or invalid. ` +
|
|
57
|
-
`Ensure the feature is configured in your experiment platform.`);
|
|
58
|
-
}
|
|
59
|
-
const fetchTimeMs = performance.now() - start;
|
|
60
|
-
return {
|
|
61
|
-
config: config,
|
|
62
|
-
meta: {
|
|
63
|
-
source: 'experiments',
|
|
64
|
-
fetchTimeMs,
|
|
65
|
-
cached: true,
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Resolve config from multiple variant feature flags.
|
|
71
|
-
* Returns the first active variant config, or null if none match.
|
|
72
|
-
*/
|
|
73
|
-
fetchMultiFlag() {
|
|
74
|
-
const variantKeys = this.getVariantFlagKeys();
|
|
75
|
-
if (!variantKeys || variantKeys.length === 0) {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
return resolveVariantConfigs(this.client, variantKeys);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Get variant flag keys from manifest or prefix discovery.
|
|
82
|
-
*/
|
|
83
|
-
getVariantFlagKeys() {
|
|
84
|
-
var _a, _b;
|
|
85
|
-
// Try manifest first
|
|
86
|
-
if (this.manifestKey) {
|
|
87
|
-
const manifest = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.manifestKey, null);
|
|
88
|
-
if (manifest && typeof manifest === 'object') {
|
|
89
|
-
const keys = manifest.variant_flags;
|
|
90
|
-
if (keys && keys.length > 0) {
|
|
91
|
-
return keys;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Fall back to prefix-based discovery using getAllFeatures
|
|
96
|
-
if (this.variantFlagPrefix && this.client.getAllFeatures) {
|
|
97
|
-
const allFeatures = this.client.getAllFeatures();
|
|
98
|
-
return Object.keys(allFeatures).filter((key) => key.startsWith(this.variantFlagPrefix));
|
|
99
|
-
}
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Factory function for creating an experiments-based fetcher.
|
|
105
|
-
*/
|
|
106
|
-
export function createExperimentsFetcher(options) {
|
|
107
|
-
return new ExperimentsFetcher(options);
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=experimentsFetcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"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"}
|
package/dist/fetchers/index.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// Experiments-based fetcher (GrowthBook, LaunchDarkly, etc.)
|
|
2
|
-
export { ExperimentsFetcher, createExperimentsFetcher, } from './experimentsFetcher';
|
|
3
|
-
// CDN fetcher with UUID-based paths
|
|
4
|
-
export { CdnFetcher, createCdnFetcher } from './cdnFetcher';
|
|
5
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchers/index.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAE9B,oCAAoC;AACpC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA0B,MAAM,cAAc,CAAC"}
|