@syntrologie/runtime-sdk 0.2.12 → 0.2.14
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/dist/SmartCanvasApp.js +57 -2
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/bootstrap.d.ts +14 -0
- package/dist/bootstrap.js +102 -4
- package/dist/bootstrap.js.map +1 -1
- package/dist/experiments/registry.d.ts +5 -0
- package/dist/experiments/registry.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +3 -1
- package/dist/hooks/useShadowCanvasConfig.js +1 -0
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/metrics/index.d.ts +4 -0
- package/dist/metrics/index.js +5 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/sessionMetrics.d.ts +101 -0
- package/dist/metrics/sessionMetrics.js +178 -0
- package/dist/metrics/sessionMetrics.js.map +1 -0
- package/dist/overlays/runtime/overlay/highlight.d.ts +2 -0
- package/dist/overlays/runtime/overlay/highlight.js +17 -9
- package/dist/overlays/runtime/overlay/highlight.js.map +1 -1
- package/dist/overlays/runtime/overlay/runner.js +5 -3
- package/dist/overlays/runtime/overlay/runner.js.map +1 -1
- package/dist/smart-canvas.esm.js +11 -11
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +319 -17
- package/dist/smart-canvas.js.map +3 -3
- package/dist/smart-canvas.min.js +11 -11
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/telemetry/adapters/posthog.d.ts +24 -0
- package/dist/telemetry/adapters/posthog.js +58 -9
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/telemetry/registry.d.ts +9 -4
- package/dist/telemetry/registry.js.map +1 -1
- package/dist/telemetry/types.d.ts +15 -0
- package/dist/types.d.ts +8 -0
- package/package.json +1 -1
package/dist/SmartCanvasApp.js
CHANGED
|
@@ -5,9 +5,62 @@ import { useShadowCanvasConfig } from "./hooks/useShadowCanvasConfig";
|
|
|
5
5
|
import { createCanvasConfigFetcher } from "./configFetcher";
|
|
6
6
|
import { useCanvasOverlays } from "./hooks/useCanvasOverlays";
|
|
7
7
|
import { useHostPatches } from "./hooks/useHostPatches";
|
|
8
|
+
/**
|
|
9
|
+
* Check if current route is allowed based on routes config
|
|
10
|
+
*/
|
|
11
|
+
function isRouteAllowed(routes, pathname) {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
if (!routes)
|
|
14
|
+
return true;
|
|
15
|
+
// If include is specified, route must match one of the patterns
|
|
16
|
+
if ((_a = routes.include) === null || _a === void 0 ? void 0 : _a.length) {
|
|
17
|
+
return routes.include.some(pattern => matchRoute(pattern, pathname));
|
|
18
|
+
}
|
|
19
|
+
// If exclude is specified, route must NOT match any patterns
|
|
20
|
+
if ((_b = routes.exclude) === null || _b === void 0 ? void 0 : _b.length) {
|
|
21
|
+
return !routes.exclude.some(pattern => matchRoute(pattern, pathname));
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Simple route matching - supports exact match and wildcard suffix
|
|
27
|
+
* Examples: "/login" matches "/login", "/admin/*" matches "/admin/users"
|
|
28
|
+
*/
|
|
29
|
+
function matchRoute(pattern, pathname) {
|
|
30
|
+
if (pattern.endsWith("/*")) {
|
|
31
|
+
const prefix = pattern.slice(0, -2);
|
|
32
|
+
return pathname === prefix || pathname.startsWith(prefix + "/");
|
|
33
|
+
}
|
|
34
|
+
return pathname === pattern;
|
|
35
|
+
}
|
|
8
36
|
export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatureKey = "smart-canvas-config-uri", configFeatureKey = "smart-canvas-config", fetchCredentials = "include", pollIntervalMs, experiments, telemetry, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey = "smart-canvas-overlay-uri", overlayFetchCredentials = "include", footerSlot, launcherLabel, canvasHost, customRenderers, theme, }) {
|
|
9
37
|
var _a, _b, _c;
|
|
10
38
|
const [open, setOpen] = useState(controller.getState().open);
|
|
39
|
+
const [pathname, setPathname] = useState(() => typeof window !== "undefined" ? window.location.pathname : "/");
|
|
40
|
+
// Track route changes (for SPAs)
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (typeof window === "undefined")
|
|
43
|
+
return;
|
|
44
|
+
const updatePathname = () => setPathname(window.location.pathname);
|
|
45
|
+
// Listen for popstate (back/forward navigation)
|
|
46
|
+
window.addEventListener("popstate", updatePathname);
|
|
47
|
+
// Intercept pushState/replaceState for SPA navigation
|
|
48
|
+
const originalPushState = history.pushState;
|
|
49
|
+
const originalReplaceState = history.replaceState;
|
|
50
|
+
history.pushState = function (...args) {
|
|
51
|
+
originalPushState.apply(this, args);
|
|
52
|
+
updatePathname();
|
|
53
|
+
};
|
|
54
|
+
history.replaceState = function (...args) {
|
|
55
|
+
originalReplaceState.apply(this, args);
|
|
56
|
+
updatePathname();
|
|
57
|
+
};
|
|
58
|
+
return () => {
|
|
59
|
+
window.removeEventListener("popstate", updatePathname);
|
|
60
|
+
history.pushState = originalPushState;
|
|
61
|
+
history.replaceState = originalReplaceState;
|
|
62
|
+
};
|
|
63
|
+
}, []);
|
|
11
64
|
const derivedFetcher = useMemo(() => {
|
|
12
65
|
if (fetcher)
|
|
13
66
|
return fetcher;
|
|
@@ -76,9 +129,11 @@ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatur
|
|
|
76
129
|
...theme, // any direct overrides from theme prop
|
|
77
130
|
};
|
|
78
131
|
}, [configState.theme, theme]);
|
|
79
|
-
//
|
|
132
|
+
// Check if current route is allowed
|
|
133
|
+
const routeAllowed = isRouteAllowed(configState.routes, pathname);
|
|
134
|
+
// Only return null after loading completes with no content or excluded route
|
|
80
135
|
// (Don't return null while loading - that causes a flash of nothing)
|
|
81
|
-
if (!configState.isLoading && !hasContent) {
|
|
136
|
+
if (!configState.isLoading && (!hasContent || !routeAllowed)) {
|
|
82
137
|
return null;
|
|
83
138
|
}
|
|
84
139
|
return (_jsx(ShadowCanvasOverlay, { tiles: configState.tiles, isLoading: configState.isLoading, error: configState.error, canvasTitle: configState.canvasTitle, telemetry: telemetry, launcherLabel: launcherLabel !== null && launcherLabel !== void 0 ? launcherLabel : (_a = configState.launcher) === null || _a === void 0 ? void 0 : _a.label, launcherAnimate: (_b = configState.launcher) === null || _b === void 0 ? void 0 : _b.animate, launcherAnimationStyle: (_c = configState.launcher) === null || _c === void 0 ? void 0 : _c.animationStyle, footerSlot: footerSlot, isOpen: open, onToggle: () => controller.toggle(), customRenderers: customRenderers, displayMode: configState.displayMode, theme: mergedTheme }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartCanvasApp.js","sourceRoot":"","sources":["../src/SmartCanvasApp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAa,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"SmartCanvasApp.js","sourceRoot":"","sources":["../src/SmartCanvasApp.tsx"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { decodeToken, encodeToken } from "./token";
|
|
14
14
|
import { SmartCanvasConfig, SmartCanvasHandle } from "./api";
|
|
15
|
+
import { SessionMetricTracker } from "./metrics";
|
|
15
16
|
import type { ExperimentClient } from "./experiments/types";
|
|
16
17
|
import type { TelemetryClient } from "./telemetry/types";
|
|
17
18
|
import type { CanvasConfigFetcher } from "./types";
|
|
@@ -35,6 +36,14 @@ export interface SyntroInitOptions {
|
|
|
35
36
|
* The token's telemetry credentials (t field) are still used if present.
|
|
36
37
|
*/
|
|
37
38
|
fetcher?: CanvasConfigFetcher;
|
|
39
|
+
/**
|
|
40
|
+
* Enable session-based metric tracking.
|
|
41
|
+
* When true, a SessionMetricTracker is created that tracks metrics during
|
|
42
|
+
* the user's session and updates GrowthBook attributes in real-time.
|
|
43
|
+
*
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
enableSessionMetrics?: boolean;
|
|
38
47
|
}
|
|
39
48
|
export interface SyntroInitResult {
|
|
40
49
|
/**
|
|
@@ -49,6 +58,11 @@ export interface SyntroInitResult {
|
|
|
49
58
|
* The telemetry client, if telemetry is configured in the token.
|
|
50
59
|
*/
|
|
51
60
|
telemetry?: TelemetryClient;
|
|
61
|
+
/**
|
|
62
|
+
* The session metric tracker, if enableSessionMetrics is true.
|
|
63
|
+
* Use this to track session-based metrics for real-time targeting.
|
|
64
|
+
*/
|
|
65
|
+
sessionMetrics?: SessionMetricTracker;
|
|
52
66
|
}
|
|
53
67
|
/**
|
|
54
68
|
* Initialize the Syntro SDK with a single token.
|
package/dist/bootstrap.js
CHANGED
|
@@ -16,6 +16,7 @@ import { createTelemetryClient } from "./telemetry/registry";
|
|
|
16
16
|
import { createConfigFetcher } from "./fetchers/registry";
|
|
17
17
|
import { createCanvasConfigFetcher } from "./configFetcher";
|
|
18
18
|
import { createSmartCanvas } from "./api";
|
|
19
|
+
import { createSessionMetricTracker } from "./metrics";
|
|
19
20
|
/**
|
|
20
21
|
* Get environment variable, supporting both Vite and Next.js patterns.
|
|
21
22
|
*/
|
|
@@ -54,6 +55,58 @@ function isEditorMode() {
|
|
|
54
55
|
});
|
|
55
56
|
return hasToken;
|
|
56
57
|
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Segment Attribute Caching (localStorage)
|
|
60
|
+
// ============================================================================
|
|
61
|
+
const SEGMENT_CACHE_KEY = 'syntro_segment_attributes';
|
|
62
|
+
/**
|
|
63
|
+
* Load cached segment attributes from localStorage.
|
|
64
|
+
* Returns cached values for instant Phase 1 evaluation.
|
|
65
|
+
*/
|
|
66
|
+
function loadCachedSegmentAttributes() {
|
|
67
|
+
if (typeof window === 'undefined')
|
|
68
|
+
return {};
|
|
69
|
+
try {
|
|
70
|
+
const cached = localStorage.getItem(SEGMENT_CACHE_KEY);
|
|
71
|
+
if (cached) {
|
|
72
|
+
const attrs = JSON.parse(cached);
|
|
73
|
+
console.log('[Syntro Bootstrap] Loaded cached segment attributes:', attrs);
|
|
74
|
+
return attrs;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.warn('[Syntro Bootstrap] Failed to load cached segment attributes:', err);
|
|
79
|
+
}
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Save segment attributes to localStorage for faster future loads.
|
|
84
|
+
*/
|
|
85
|
+
function cacheSegmentAttributes(attrs) {
|
|
86
|
+
if (typeof window === 'undefined')
|
|
87
|
+
return;
|
|
88
|
+
try {
|
|
89
|
+
localStorage.setItem(SEGMENT_CACHE_KEY, JSON.stringify(attrs));
|
|
90
|
+
console.log('[Syntro Bootstrap] Cached segment attributes:', attrs);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.warn('[Syntro Bootstrap] Failed to cache segment attributes:', err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract segment flags (in_segment_*) from PostHog feature flags.
|
|
98
|
+
*/
|
|
99
|
+
function extractSegmentFlags(allFlags) {
|
|
100
|
+
if (!allFlags)
|
|
101
|
+
return {};
|
|
102
|
+
const segmentFlags = {};
|
|
103
|
+
for (const [key, value] of Object.entries(allFlags)) {
|
|
104
|
+
if (key.startsWith('in_segment_')) {
|
|
105
|
+
segmentFlags[key] = value === true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return segmentFlags;
|
|
109
|
+
}
|
|
57
110
|
/**
|
|
58
111
|
* Initialize the Syntro SDK with a single token.
|
|
59
112
|
*
|
|
@@ -116,20 +169,55 @@ async function init(options) {
|
|
|
116
169
|
const editorUrl = getEnvVar("NEXT_PUBLIC_SYNTRO_EDITOR_URL")
|
|
117
170
|
|| getEnvVar("VITE_SYNTRO_EDITOR_URL")
|
|
118
171
|
|| ((_b = options.canvas) === null || _b === void 0 ? void 0 : _b.editorUrl);
|
|
119
|
-
//
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// PHASE 1: Load cached segment attributes for instant evaluation
|
|
174
|
+
// ============================================================================
|
|
175
|
+
const cachedSegmentAttrs = loadCachedSegmentAttributes();
|
|
176
|
+
console.log('[Syntro Bootstrap] Phase 1: Using cached segment attributes:', cachedSegmentAttrs);
|
|
177
|
+
// Will be set when experiments client is created
|
|
178
|
+
let experiments;
|
|
179
|
+
// Callback for when PostHog feature flags are loaded (Phase 2)
|
|
180
|
+
const onFeatureFlagsLoaded = (allFlags) => {
|
|
181
|
+
var _a, _b, _c;
|
|
182
|
+
console.log('[Syntro Bootstrap] Phase 2: PostHog feature flags loaded');
|
|
183
|
+
// Extract segment flags (in_segment_*)
|
|
184
|
+
const segmentFlags = extractSegmentFlags(allFlags);
|
|
185
|
+
console.log('[Syntro Bootstrap] Segment flags from PostHog:', segmentFlags);
|
|
186
|
+
// Cache for next page load
|
|
187
|
+
cacheSegmentAttributes(segmentFlags);
|
|
188
|
+
// Update GrowthBook with fresh segment attributes
|
|
189
|
+
if (experiments) {
|
|
190
|
+
// Get current session metrics if available
|
|
191
|
+
const sessionAttrs = (_b = (_a = sessionMetrics === null || sessionMetrics === void 0 ? void 0 : sessionMetrics.getAll) === null || _a === void 0 ? void 0 : _a.call(sessionMetrics)) !== null && _b !== void 0 ? _b : {};
|
|
192
|
+
// Merge session metrics + segment flags and update GrowthBook
|
|
193
|
+
const updatedAttrs = { ...sessionAttrs, ...segmentFlags };
|
|
194
|
+
console.log('[Syntro Bootstrap] Updating GrowthBook with attributes:', updatedAttrs);
|
|
195
|
+
(_c = experiments.setAttributes) === null || _c === void 0 ? void 0 : _c.call(experiments, updatedAttrs);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
// Initialize telemetry client with feature flags callback
|
|
120
199
|
let telemetry;
|
|
121
200
|
if (payload === null || payload === void 0 ? void 0 : payload.t) {
|
|
122
201
|
telemetry = createTelemetryClient("posthog", {
|
|
123
202
|
apiKey: payload.t,
|
|
124
203
|
apiHost: telemetryHost, // undefined falls back to adapter default
|
|
204
|
+
// Enable PostHog feature flags for segment membership
|
|
205
|
+
enableFeatureFlags: true,
|
|
206
|
+
// Wire up callback for when flags are loaded (Phase 2)
|
|
207
|
+
onFeatureFlagsLoaded,
|
|
125
208
|
});
|
|
126
209
|
}
|
|
127
|
-
//
|
|
128
|
-
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// Initialize experiment client with CACHED attributes (Phase 1)
|
|
212
|
+
// PostHog will update these when /decide returns (Phase 2)
|
|
213
|
+
// ============================================================================
|
|
214
|
+
let sessionMetrics;
|
|
129
215
|
if (payload === null || payload === void 0 ? void 0 : payload.e) {
|
|
130
216
|
experiments = createExperimentClient("growthbook", {
|
|
131
217
|
clientKey: payload.e,
|
|
132
218
|
apiHost: experimentHost, // undefined falls back to adapter default
|
|
219
|
+
// Phase 1: Use cached segment attributes for instant evaluation
|
|
220
|
+
attributes: cachedSegmentAttrs,
|
|
133
221
|
// Wire experiment tracking to telemetry provider
|
|
134
222
|
onExperimentViewed: (telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackExperiment)
|
|
135
223
|
? (key, variationId, variationName) => {
|
|
@@ -161,6 +249,16 @@ async function init(options) {
|
|
|
161
249
|
// Default: use experiments-based fetcher (GrowthBook config or URI)
|
|
162
250
|
fetcher = createCanvasConfigFetcher({ experiments });
|
|
163
251
|
}
|
|
252
|
+
// Create session metric tracker if enabled
|
|
253
|
+
if (options.enableSessionMetrics) {
|
|
254
|
+
sessionMetrics = createSessionMetricTracker({
|
|
255
|
+
experiments,
|
|
256
|
+
onMetricChange: (key, value) => {
|
|
257
|
+
console.log(`[Syntro Bootstrap] Session metric changed: ${key} = ${value}`);
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
console.log('[Syntro Bootstrap] SessionMetricTracker created');
|
|
261
|
+
}
|
|
164
262
|
// Create canvas with integrations
|
|
165
263
|
const canvas = await createSmartCanvas({
|
|
166
264
|
...options.canvas,
|
|
@@ -168,7 +266,7 @@ async function init(options) {
|
|
|
168
266
|
integrations: { experiments, telemetry },
|
|
169
267
|
editorUrl,
|
|
170
268
|
});
|
|
171
|
-
return { canvas, experiments, telemetry };
|
|
269
|
+
return { canvas, experiments, telemetry, sessionMetrics };
|
|
172
270
|
}
|
|
173
271
|
/**
|
|
174
272
|
* The Syntro namespace for single-token initialization.
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAsB,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAwC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,11 @@ import type { ExperimentClient } from "./types";
|
|
|
10
10
|
export interface CreateExperimentClientConfig {
|
|
11
11
|
clientKey: string;
|
|
12
12
|
apiHost?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Initial user attributes for targeting.
|
|
15
|
+
* Used for segment-based targeting.
|
|
16
|
+
*/
|
|
17
|
+
attributes?: Record<string, unknown>;
|
|
13
18
|
/**
|
|
14
19
|
* Callback fired when a user is assigned to an experiment.
|
|
15
20
|
* Use this to send experiment data to your analytics provider.
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import type { CanvasConfigFetcher, TileConfig, CanvasThemeConfig, LauncherConfig } from "../types";
|
|
1
|
+
import type { CanvasConfigFetcher, TileConfig, CanvasThemeConfig, LauncherConfig, RoutesConfig } from "../types";
|
|
2
2
|
import type { Patch } from "../hostPatcher/core/types";
|
|
3
3
|
import type { ExperimentClient } from "../experiments/types";
|
|
4
4
|
export interface UseShadowCanvasConfigOptions {
|
|
@@ -23,5 +23,7 @@ export interface ShadowCanvasConfigState {
|
|
|
23
23
|
theme?: CanvasThemeConfig;
|
|
24
24
|
/** Launcher button configuration */
|
|
25
25
|
launcher?: LauncherConfig;
|
|
26
|
+
/** Route filtering configuration */
|
|
27
|
+
routes?: RoutesConfig;
|
|
26
28
|
}
|
|
27
29
|
export declare function useShadowCanvasConfig({ fetcher, pollIntervalMs, experiments, }: UseShadowCanvasConfigOptions): ShadowCanvasConfigState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAgClE,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE,CACxC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,CAAC,CAAC,KAAK,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,KAAK,mCAAI,CAAC,CAAC,CAAA,EAAA,CAAC,CAAC;AAE7D,MAAM,UAAU,qBAAqB,CAAC,EACpC,OAAO,EACP,cAAc,GAAG,KAAK,EACtB,WAAW,GACkB;IAC7B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B;QAC1D,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,IAAI,CAAC;YACH,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,GAAiB,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,QAAQ,CAAC;gBACP,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;gBACvB,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClB,GAAG,IAAI;gBACP,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAC5D,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,cAAc;YAAE,OAAO;QAC5B,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from "./configFetcher";
|
|
|
14
14
|
export * from "./overlays/types";
|
|
15
15
|
export * from "./overlays/schema";
|
|
16
16
|
export * from "./overlays/fetcher";
|
|
17
|
+
export * from "./metrics";
|
|
17
18
|
export { Syntro } from "./bootstrap";
|
|
18
19
|
export type { SyntroInitOptions, SyntroInitResult } from "./bootstrap";
|
|
19
20
|
export { encodeToken, decodeToken } from "./token";
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,8 @@ export * from "./configFetcher";
|
|
|
14
14
|
export * from "./overlays/types";
|
|
15
15
|
export * from "./overlays/schema";
|
|
16
16
|
export * from "./overlays/fetcher";
|
|
17
|
+
// Metrics for session-based targeting
|
|
18
|
+
export * from "./metrics";
|
|
17
19
|
// Single-token initialization
|
|
18
20
|
export { Syntro } from "./bootstrap";
|
|
19
21
|
export { encodeToken, decodeToken } from "./token";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC,sCAAsC;AACtC,cAAc,WAAW,CAAC;AAE1B,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAE3B,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionMetricTracker - Real-time session-based metrics for segment targeting.
|
|
3
|
+
*
|
|
4
|
+
* This module tracks metrics during a user's session and updates GrowthBook
|
|
5
|
+
* attributes in real-time, enabling instant segment targeting without waiting
|
|
6
|
+
* for batch PostHog cohort computation.
|
|
7
|
+
*
|
|
8
|
+
* Use cases:
|
|
9
|
+
* - "Show action plan after 3+ button clicks in this session"
|
|
10
|
+
* - "Target users who viewed 5+ products this session"
|
|
11
|
+
* - "Trigger intervention when user hovers a CTA 2+ times"
|
|
12
|
+
*/
|
|
13
|
+
import type { ExperimentClient } from "../experiments/types";
|
|
14
|
+
/**
|
|
15
|
+
* Options for creating a SessionMetricTracker.
|
|
16
|
+
*/
|
|
17
|
+
export interface SessionMetricTrackerOptions {
|
|
18
|
+
/**
|
|
19
|
+
* The experiment client to update attributes on.
|
|
20
|
+
* When a metric changes, the session_${metricKey} attribute is updated.
|
|
21
|
+
*/
|
|
22
|
+
experiments?: ExperimentClient;
|
|
23
|
+
/**
|
|
24
|
+
* Prefix for attribute keys sent to GrowthBook.
|
|
25
|
+
* @default "session_"
|
|
26
|
+
*/
|
|
27
|
+
attributePrefix?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Callback fired when any metric value changes.
|
|
30
|
+
* Useful for debugging or custom integrations.
|
|
31
|
+
*/
|
|
32
|
+
onMetricChange?: (key: string, newValue: number) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Tracks session-based metrics for real-time segment targeting.
|
|
36
|
+
*/
|
|
37
|
+
export declare class SessionMetricTracker {
|
|
38
|
+
private metrics;
|
|
39
|
+
private experiments?;
|
|
40
|
+
private attributePrefix;
|
|
41
|
+
private onMetricChange?;
|
|
42
|
+
constructor(options?: SessionMetricTrackerOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Increment a metric by the specified amount.
|
|
45
|
+
*
|
|
46
|
+
* @param metricKey - The metric to increment (e.g., "button_clicks", "page_views")
|
|
47
|
+
* @param amount - Amount to increment by (default: 1)
|
|
48
|
+
* @returns The new metric value
|
|
49
|
+
*/
|
|
50
|
+
increment(metricKey: string, amount?: number): number;
|
|
51
|
+
/**
|
|
52
|
+
* Set a metric to a specific value.
|
|
53
|
+
*
|
|
54
|
+
* @param metricKey - The metric to set
|
|
55
|
+
* @param value - The value to set
|
|
56
|
+
*/
|
|
57
|
+
set(metricKey: string, value: number): void;
|
|
58
|
+
/**
|
|
59
|
+
* Get the current value of a metric.
|
|
60
|
+
*
|
|
61
|
+
* @param metricKey - The metric to get
|
|
62
|
+
* @returns The current value (0 if not set)
|
|
63
|
+
*/
|
|
64
|
+
get(metricKey: string): number;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a metric meets or exceeds a threshold.
|
|
67
|
+
*
|
|
68
|
+
* @param metricKey - The metric to check
|
|
69
|
+
* @param threshold - The threshold value
|
|
70
|
+
* @returns True if metric >= threshold
|
|
71
|
+
*/
|
|
72
|
+
meetsThreshold(metricKey: string, threshold: number): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Get all current metric values.
|
|
75
|
+
*
|
|
76
|
+
* @returns Record of metric keys to values
|
|
77
|
+
*/
|
|
78
|
+
getAll(): Record<string, number>;
|
|
79
|
+
/**
|
|
80
|
+
* Reset a specific metric to zero.
|
|
81
|
+
*
|
|
82
|
+
* @param metricKey - The metric to reset
|
|
83
|
+
*/
|
|
84
|
+
reset(metricKey: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Reset all metrics (clear the session).
|
|
87
|
+
*/
|
|
88
|
+
resetAll(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Update the experiment client (useful if experiments client changes).
|
|
91
|
+
*/
|
|
92
|
+
setExperiments(experiments: ExperimentClient): void;
|
|
93
|
+
private updateExperimentAttributes;
|
|
94
|
+
private syncAllToExperiments;
|
|
95
|
+
private loadFromStorage;
|
|
96
|
+
private saveToStorage;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a SessionMetricTracker instance.
|
|
100
|
+
*/
|
|
101
|
+
export declare function createSessionMetricTracker(options?: SessionMetricTrackerOptions): SessionMetricTracker;
|