@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
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { ExperimentClient } from '../experiments/types';
|
|
2
|
+
import type { ConfigFetcher, FetchResult } from './types';
|
|
3
3
|
export interface ExperimentsFetcherOptions {
|
|
4
4
|
/**
|
|
5
5
|
* Experiment client instance (e.g., from createGrowthBookClient).
|
|
6
6
|
*/
|
|
7
7
|
client: ExperimentClient;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Single feature key for the monolithic config (legacy mode).
|
|
10
10
|
* @default "smart-canvas-config"
|
|
11
11
|
*/
|
|
12
12
|
featureKey?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Feature key for the variant manifest (lists active variant flag keys).
|
|
15
|
+
* When set, enables multi-flag mode.
|
|
16
|
+
*/
|
|
17
|
+
manifestKey?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Prefix for convention-based variant flag discovery.
|
|
20
|
+
* All GrowthBook features matching this prefix will be evaluated.
|
|
21
|
+
* Used as fallback when manifestKey is not set or returns empty.
|
|
22
|
+
*/
|
|
23
|
+
variantFlagPrefix?: string;
|
|
13
24
|
}
|
|
14
25
|
/**
|
|
15
26
|
* Fetches config from an experiment/feature flag system.
|
|
@@ -24,8 +35,19 @@ export declare class ExperimentsFetcher implements ConfigFetcher {
|
|
|
24
35
|
readonly name = "experiments";
|
|
25
36
|
private client;
|
|
26
37
|
private featureKey;
|
|
38
|
+
private manifestKey?;
|
|
39
|
+
private variantFlagPrefix?;
|
|
27
40
|
constructor(options: ExperimentsFetcherOptions);
|
|
28
41
|
fetch(): Promise<FetchResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve config from multiple variant feature flags.
|
|
44
|
+
* Returns the first active variant config, or null if none match.
|
|
45
|
+
*/
|
|
46
|
+
private fetchMultiFlag;
|
|
47
|
+
/**
|
|
48
|
+
* Get variant flag keys from manifest or prefix discovery.
|
|
49
|
+
*/
|
|
50
|
+
private getVariantFlagKeys;
|
|
29
51
|
}
|
|
30
52
|
/**
|
|
31
53
|
* Factory function for creating an experiments-based fetcher.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { resolveVariantConfigs } from './mergeConfigs';
|
|
1
2
|
/**
|
|
2
3
|
* URL parameters for forcing experiment variations in preview mode.
|
|
3
4
|
* Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1
|
|
4
5
|
*/
|
|
5
|
-
const PREVIEW_EXP_PARAM =
|
|
6
|
-
const PREVIEW_VAR_PARAM =
|
|
6
|
+
const PREVIEW_EXP_PARAM = 'syntro_exp';
|
|
7
|
+
const PREVIEW_VAR_PARAM = 'syntro_var';
|
|
7
8
|
/**
|
|
8
9
|
* Fetches config from an experiment/feature flag system.
|
|
9
10
|
*
|
|
@@ -16,15 +17,17 @@ const PREVIEW_VAR_PARAM = "syntro_var";
|
|
|
16
17
|
export class ExperimentsFetcher {
|
|
17
18
|
constructor(options) {
|
|
18
19
|
var _a;
|
|
19
|
-
this.name =
|
|
20
|
+
this.name = 'experiments';
|
|
20
21
|
this.client = options.client;
|
|
21
|
-
this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a :
|
|
22
|
+
this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a : 'smart-canvas-config';
|
|
23
|
+
this.manifestKey = options.manifestKey;
|
|
24
|
+
this.variantFlagPrefix = options.variantFlagPrefix;
|
|
22
25
|
}
|
|
23
26
|
async fetch() {
|
|
24
27
|
var _a, _b;
|
|
25
28
|
const start = performance.now();
|
|
26
29
|
// Check for preview URL params to force a specific variation
|
|
27
|
-
if (typeof window !==
|
|
30
|
+
if (typeof window !== 'undefined') {
|
|
28
31
|
const params = new URLSearchParams(window.location.search);
|
|
29
32
|
const expName = params.get(PREVIEW_EXP_PARAM);
|
|
30
33
|
const varIndex = params.get(PREVIEW_VAR_PARAM);
|
|
@@ -36,9 +39,20 @@ export class ExperimentsFetcher {
|
|
|
36
39
|
}
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
|
-
//
|
|
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
|
|
40
54
|
const config = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.featureKey, null);
|
|
41
|
-
if (!config || typeof config !==
|
|
55
|
+
if (!config || typeof config !== 'object') {
|
|
42
56
|
throw new Error(`[SmartCanvas] Feature "${this.featureKey}" not found or invalid. ` +
|
|
43
57
|
`Ensure the feature is configured in your experiment platform.`);
|
|
44
58
|
}
|
|
@@ -46,12 +60,45 @@ export class ExperimentsFetcher {
|
|
|
46
60
|
return {
|
|
47
61
|
config: config,
|
|
48
62
|
meta: {
|
|
49
|
-
source:
|
|
63
|
+
source: 'experiments',
|
|
50
64
|
fetchTimeMs,
|
|
51
65
|
cached: true,
|
|
52
66
|
},
|
|
53
67
|
};
|
|
54
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
|
+
}
|
|
55
102
|
}
|
|
56
103
|
/**
|
|
57
104
|
* Factory function for creating an experiments-based fetcher.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AA4BvC;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAkB;IAQ7B,YAAY,OAAkC;;QAPrC,SAAI,GAAG,aAAa,CAAC;QAQ5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,mCAAI,qBAAqB,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhC,6DAA6D;QAC7D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAE/C,IAAI,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,kBAAkB,KAAK,EAAE,CAAC,CAAC;oBACtF,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBAC9C,OAAO;oBACL,MAAM;oBACN,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;iBAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,eAAe,mDAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,UAAU,0BAA0B;gBACjE,+DAA+D,CAClE,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE9C,OAAO;YACL,MAAM,EAAE,MAA8B;YACtC,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa;gBACrB,WAAW;gBACX,MAAM,EAAE,IAAI;aACb;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE9C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,kBAAkB;;QACxB,qBAAqB;QACrB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,eAAe,mDAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACvE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,MAAM,IAAI,GAAI,QAAyC,CAAC,aAAa,CAAC;gBACtE,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACzD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACjD,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAkB,CAAC,CACxC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/fetchers/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { ConfigFetcher, FetchResult } from
|
|
2
|
-
export { ExperimentsFetcher, createExperimentsFetcher, type ExperimentsFetcherOptions, } from
|
|
3
|
-
export { CdnFetcher, createCdnFetcher, type CdnFetcherOptions
|
|
1
|
+
export type { ConfigFetcher, FetchResult } from './types';
|
|
2
|
+
export { ExperimentsFetcher, createExperimentsFetcher, type ExperimentsFetcherOptions, } from './experimentsFetcher';
|
|
3
|
+
export { CdnFetcher, createCdnFetcher, type CdnFetcherOptions } from './cdnFetcher';
|
package/dist/fetchers/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Experiments-based fetcher (GrowthBook, LaunchDarkly, etc.)
|
|
2
|
-
export { ExperimentsFetcher, createExperimentsFetcher, } from
|
|
2
|
+
export { ExperimentsFetcher, createExperimentsFetcher, } from './experimentsFetcher';
|
|
3
3
|
// CDN fetcher with UUID-based paths
|
|
4
|
-
export { CdnFetcher, createCdnFetcher
|
|
4
|
+
export { CdnFetcher, createCdnFetcher } from './cdnFetcher';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ExperimentClient } from '../experiments/types';
|
|
2
|
+
import type { CanvasConfigResponse } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Partial config as returned by a single variant feature flag.
|
|
5
|
+
* Variant flags may only contain a subset of CanvasConfigResponse fields.
|
|
6
|
+
*/
|
|
7
|
+
export type VariantFlagValue = Partial<CanvasConfigResponse> & {
|
|
8
|
+
overlays?: unknown[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Strategy for resolving multiple active variant configs into one.
|
|
12
|
+
*
|
|
13
|
+
* Currently: "first-match" — returns the first non-empty variant config.
|
|
14
|
+
* Future: "merge" — concatenate tiles/actions/overlays from all variants.
|
|
15
|
+
*/
|
|
16
|
+
export type MergeStrategy = 'first-match';
|
|
17
|
+
/**
|
|
18
|
+
* Resolve multiple variant feature flags into a single CanvasConfigResponse.
|
|
19
|
+
*
|
|
20
|
+
* Evaluates each flag key against the experiment client and applies the
|
|
21
|
+
* configured strategy. Currently uses "first-match": the first flag that
|
|
22
|
+
* returns a non-empty config wins.
|
|
23
|
+
*
|
|
24
|
+
* @param client - Experiment client to evaluate feature flags
|
|
25
|
+
* @param keys - Ordered list of variant flag keys to evaluate
|
|
26
|
+
* @param _strategy - Resolution strategy (reserved for future use)
|
|
27
|
+
* @returns Resolved config, or null if no flags are active
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveVariantConfigs(client: ExperimentClient, keys: string[], _strategy?: MergeStrategy): CanvasConfigResponse | null;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve multiple variant feature flags into a single CanvasConfigResponse.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates each flag key against the experiment client and applies the
|
|
5
|
+
* configured strategy. Currently uses "first-match": the first flag that
|
|
6
|
+
* returns a non-empty config wins.
|
|
7
|
+
*
|
|
8
|
+
* @param client - Experiment client to evaluate feature flags
|
|
9
|
+
* @param keys - Ordered list of variant flag keys to evaluate
|
|
10
|
+
* @param _strategy - Resolution strategy (reserved for future use)
|
|
11
|
+
* @returns Resolved config, or null if no flags are active
|
|
12
|
+
*/
|
|
13
|
+
export function resolveVariantConfigs(client, keys, _strategy = 'first-match') {
|
|
14
|
+
var _a, _b, _c, _d;
|
|
15
|
+
for (const key of keys) {
|
|
16
|
+
const value = (_a = client.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(client, key, null);
|
|
17
|
+
if (!value || typeof value !== 'object')
|
|
18
|
+
continue;
|
|
19
|
+
const variant = value;
|
|
20
|
+
const hasTiles = variant.tiles && variant.tiles.length > 0;
|
|
21
|
+
const hasActions = variant.actions && variant.actions.length > 0;
|
|
22
|
+
if (hasTiles || hasActions) {
|
|
23
|
+
return {
|
|
24
|
+
tiles: (_b = variant.tiles) !== null && _b !== void 0 ? _b : [],
|
|
25
|
+
actions: (_c = variant.actions) !== null && _c !== void 0 ? _c : [],
|
|
26
|
+
fetchedAt: (_d = variant.fetchedAt) !== null && _d !== void 0 ? _d : new Date().toISOString(),
|
|
27
|
+
...(variant.schemaVersion && { schemaVersion: variant.schemaVersion }),
|
|
28
|
+
...(variant.configVersion && { configVersion: variant.configVersion }),
|
|
29
|
+
...(variant.canvasTitle && { canvasTitle: variant.canvasTitle }),
|
|
30
|
+
...(variant.theme && { theme: variant.theme }),
|
|
31
|
+
...(variant.launcher && { launcher: variant.launcher }),
|
|
32
|
+
...(variant.routes && { routes: variant.routes }),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mergeConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeConfigs.js","sourceRoot":"","sources":["../../src/fetchers/mergeConfigs.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAwB,EACxB,IAAc,EACd,YAA2B,aAAa;;IAExC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,eAAe,uDAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAElD,MAAM,OAAO,GAAG,KAAyB,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEjE,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,KAAK,EAAE,MAAA,OAAO,CAAC,KAAK,mCAAI,EAAE;gBAC1B,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE;gBAC9B,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACxD,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* This allows the bootstrap module to dynamically create
|
|
6
6
|
* fetchers based on token configuration.
|
|
7
7
|
*/
|
|
8
|
-
import { createCdnFetcher } from
|
|
9
|
-
import { createExperimentsFetcher } from
|
|
8
|
+
import { createCdnFetcher } from './cdnFetcher';
|
|
9
|
+
import { createExperimentsFetcher } from './experimentsFetcher';
|
|
10
10
|
/**
|
|
11
11
|
* Default CDN base URL for config fetching.
|
|
12
12
|
*/
|
|
13
|
-
export const DEFAULT_CDN_BASE_URL =
|
|
13
|
+
export const DEFAULT_CDN_BASE_URL = 'https://cdn.syntrologie.com/configs';
|
|
14
14
|
const fetchers = {
|
|
15
15
|
/**
|
|
16
16
|
* CDN fetcher - fetches config from Syntrologie CDN.
|
|
@@ -51,7 +51,7 @@ const fetchers = {
|
|
|
51
51
|
export function createConfigFetcher(type, options = {}) {
|
|
52
52
|
const factory = fetchers[type];
|
|
53
53
|
if (!factory) {
|
|
54
|
-
throw new Error(`Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(
|
|
54
|
+
throw new Error(`Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(', ')}`);
|
|
55
55
|
}
|
|
56
56
|
return factory(options);
|
|
57
57
|
}
|
package/dist/fetchers/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { ExperimentClient } from
|
|
2
|
-
import type
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
1
|
+
import type { ExperimentClient } from '../experiments/types';
|
|
2
|
+
import { type OverlayRecipeFetcher } from '../overlays/fetcher';
|
|
3
|
+
import type { CanvasRecipe } from '../overlays/types';
|
|
4
|
+
import type { SmartCanvasRuntime } from '../runtime';
|
|
5
|
+
import type { TelemetryClient } from '../telemetry/types';
|
|
5
6
|
export type OverlayRecipesFetcher = () => Promise<CanvasRecipe[] | CanvasRecipe | undefined>;
|
|
6
7
|
export interface UseCanvasOverlaysOptions {
|
|
7
8
|
fetcher?: OverlayRecipeFetcher;
|
|
@@ -12,6 +13,8 @@ export interface UseCanvasOverlaysOptions {
|
|
|
12
13
|
credentials?: RequestCredentials;
|
|
13
14
|
experiments?: ExperimentClient;
|
|
14
15
|
telemetry?: TelemetryClient;
|
|
16
|
+
/** v2 Runtime for EventBus publishing */
|
|
17
|
+
runtime?: SmartCanvasRuntime;
|
|
15
18
|
canvasHost?: HTMLElement | null;
|
|
16
19
|
}
|
|
17
|
-
export declare function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, canvasHost, }: UseCanvasOverlaysOptions): void;
|
|
20
|
+
export declare function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, runtime, canvasHost, }: UseCanvasOverlaysOptions): void;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { useEffect, useMemo } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { registerRecipes, clearRecipes } from
|
|
5
|
-
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
import { CanvasEvents } from '../events/normalizers/canvas';
|
|
3
|
+
import { createOverlayRecipeFetcher } from '../overlays/fetcher';
|
|
4
|
+
import { registerRecipes, clearRecipes } from '../overlays/recipeRegistry';
|
|
5
|
+
import { CanvasRecipeZ } from '../overlays/schema';
|
|
6
|
+
export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, runtime, canvasHost, }) {
|
|
6
7
|
const derivedFetcher = useMemo(() => {
|
|
7
8
|
// Priority 1: Use explicit recipes fetcher if provided (for multiple recipes)
|
|
8
9
|
if (recipesFetcher)
|
|
@@ -27,7 +28,7 @@ export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureK
|
|
|
27
28
|
if (!derivedFetcher)
|
|
28
29
|
return;
|
|
29
30
|
let cancelled = false;
|
|
30
|
-
|
|
31
|
+
const cleanups = [];
|
|
31
32
|
(async () => {
|
|
32
33
|
var _a, _b;
|
|
33
34
|
try {
|
|
@@ -40,40 +41,88 @@ export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureK
|
|
|
40
41
|
return;
|
|
41
42
|
// Register recipes so TileCard can look them up for navigation
|
|
42
43
|
registerRecipes(recipes);
|
|
43
|
-
const mod = await import(
|
|
44
|
+
const mod = await import('../overlays/runtime');
|
|
44
45
|
const overlayRoot = mod.ensureOverlayRoot();
|
|
45
46
|
const resolve = mod.createAnchorResolver({ canvasHost });
|
|
46
47
|
const ctx = {
|
|
47
48
|
overlayRoot,
|
|
48
49
|
resolve,
|
|
49
50
|
canvasHost,
|
|
50
|
-
telemetry: telemetry
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
telemetry: telemetry
|
|
52
|
+
? {
|
|
53
|
+
setPersonPropertiesOnce: (_a = telemetry.setPersonPropertiesOnce) === null || _a === void 0 ? void 0 : _a.bind(telemetry),
|
|
54
|
+
}
|
|
55
|
+
: undefined,
|
|
53
56
|
onEvent: (name, payload) => {
|
|
54
|
-
var _a, _b;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
var _a, _b, _c, _d;
|
|
58
|
+
// Telemetry tracking (PostHog)
|
|
59
|
+
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, name, (_b = payload === null || payload === void 0 ? void 0 : payload.stepId) !== null && _b !== void 0 ? _b : '', 'overlay');
|
|
60
|
+
// EventBus publishing (v2 runtime)
|
|
61
|
+
if (runtime) {
|
|
62
|
+
const recipeId = payload === null || payload === void 0 ? void 0 : payload.recipeId;
|
|
63
|
+
const stepId = payload === null || payload === void 0 ? void 0 : payload.stepId;
|
|
64
|
+
// Map overlay event names to normalized events
|
|
65
|
+
let event;
|
|
66
|
+
switch (name) {
|
|
67
|
+
case 'syntro_overlay_exposed':
|
|
68
|
+
event = CanvasEvents.overlayStepViewed(recipeId, 0, stepId);
|
|
69
|
+
break;
|
|
70
|
+
case 'syntro_overlay_dismissed':
|
|
71
|
+
event = CanvasEvents.overlayDismissed(recipeId, undefined, undefined);
|
|
72
|
+
break;
|
|
73
|
+
case 'syntro_overlay_action':
|
|
74
|
+
event = CanvasEvents.tileAction(stepId, (_c = payload === null || payload === void 0 ? void 0 : payload.actionId) !== null && _c !== void 0 ? _c : '', 'overlay');
|
|
75
|
+
break;
|
|
76
|
+
case 'syntro_tour_step':
|
|
77
|
+
event = CanvasEvents.overlayStepViewed(recipeId, 0, stepId);
|
|
78
|
+
break;
|
|
79
|
+
case 'syntro_tour_action':
|
|
80
|
+
event = CanvasEvents.tileAction(stepId, (_d = payload === null || payload === void 0 ? void 0 : payload.actionId) !== null && _d !== void 0 ? _d : '', 'overlay');
|
|
81
|
+
break;
|
|
82
|
+
case 'syntro_tour_end':
|
|
83
|
+
if ((payload === null || payload === void 0 ? void 0 : payload.reason) === 'completed') {
|
|
84
|
+
event = CanvasEvents.overlayCompleted(recipeId);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
event = CanvasEvents.overlayDismissed(recipeId, undefined, undefined);
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case 'syntro_anchor_missing':
|
|
91
|
+
// Custom event for anchor missing
|
|
92
|
+
event = CanvasEvents.custom('anchor_missing', payload);
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
// Pass through as custom canvas event
|
|
96
|
+
event = CanvasEvents.custom(name, payload);
|
|
97
|
+
}
|
|
98
|
+
if (event) {
|
|
99
|
+
runtime.events.publish(event.name, event.props, event.source);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
58
102
|
},
|
|
59
103
|
};
|
|
60
104
|
// Run all recipes
|
|
61
105
|
for (const recipe of recipes) {
|
|
62
106
|
if (!((_b = recipe === null || recipe === void 0 ? void 0 : recipe.steps) === null || _b === void 0 ? void 0 : _b.length) || cancelled)
|
|
63
107
|
continue;
|
|
108
|
+
// Publish overlay started event
|
|
109
|
+
if (runtime) {
|
|
110
|
+
const event = CanvasEvents.overlayStarted(recipe.id, recipe.title);
|
|
111
|
+
runtime.events.publish(event.name, event.props, event.source);
|
|
112
|
+
}
|
|
64
113
|
const cleanup = await mod.runOverlays(recipe, ctx);
|
|
65
114
|
cleanups.push(cleanup);
|
|
66
115
|
}
|
|
67
116
|
}
|
|
68
117
|
catch (err) {
|
|
69
|
-
console.warn(
|
|
118
|
+
console.warn('[SmartCanvas] overlays failed', err);
|
|
70
119
|
}
|
|
71
120
|
})();
|
|
72
121
|
return () => {
|
|
73
122
|
cancelled = true;
|
|
74
|
-
cleanups.forEach(fn => fn === null || fn === void 0 ? void 0 : fn());
|
|
123
|
+
cleanups.forEach((fn) => fn === null || fn === void 0 ? void 0 : fn());
|
|
75
124
|
clearRecipes();
|
|
76
125
|
};
|
|
77
|
-
}, [derivedFetcher, telemetry, canvasHost]);
|
|
126
|
+
}, [derivedFetcher, telemetry, runtime, canvasHost]);
|
|
78
127
|
}
|
|
79
128
|
//# sourceMappingURL=useCanvasOverlays.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCanvasOverlays.js","sourceRoot":"","sources":["../../src/hooks/useCanvasOverlays.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useCanvasOverlays.js","sourceRoot":"","sources":["../../src/hooks/useCanvasOverlays.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Patch, Policy } from
|
|
2
|
-
import type { TelemetryClient } from
|
|
1
|
+
import type { Patch, Policy } from '../hostPatcher/core/types';
|
|
2
|
+
import type { TelemetryClient } from '../telemetry/types';
|
|
3
3
|
export interface UseHostPatchesOptions {
|
|
4
4
|
patches?: Patch[];
|
|
5
5
|
telemetry?: TelemetryClient;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { useEffect } from
|
|
2
|
-
import { applyPatch, revertPatch } from
|
|
3
|
-
import { defaultPolicy } from
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { applyPatch, revertPatch } from '../hostPatcher/core/patcher';
|
|
3
|
+
import { defaultPolicy } from '../hostPatcher/policy/defaultPolicy';
|
|
4
4
|
export function useHostPatches({ patches, telemetry, policy = defaultPolicy, canvasHost, }) {
|
|
5
5
|
useEffect(() => {
|
|
6
6
|
if (!patches || patches.length === 0)
|
|
@@ -12,15 +12,15 @@ export function useHostPatches({ patches, telemetry, policy = defaultPolicy, can
|
|
|
12
12
|
shadowHost: canvasHost,
|
|
13
13
|
policy,
|
|
14
14
|
onLog: telemetry
|
|
15
|
-
? (level,
|
|
15
|
+
? (level, _msg, _data) => { var _a; return (_a = telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, `syntro_patch_${level}`, patch.id, 'overlay'); }
|
|
16
16
|
: undefined,
|
|
17
17
|
});
|
|
18
18
|
if (result.ok) {
|
|
19
19
|
applied.push(patch.id);
|
|
20
|
-
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry,
|
|
20
|
+
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'syntro_patch_applied', patch.id, 'overlay');
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
23
|
-
(_b = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _b === void 0 ? void 0 : _b.call(telemetry,
|
|
23
|
+
(_b = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _b === void 0 ? void 0 : _b.call(telemetry, 'syntro_patch_failed', patch.id, 'overlay');
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
26
|
return () => {
|
|
@@ -28,10 +28,10 @@ export function useHostPatches({ patches, telemetry, policy = defaultPolicy, can
|
|
|
28
28
|
var _a;
|
|
29
29
|
try {
|
|
30
30
|
revertPatch(id);
|
|
31
|
-
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry,
|
|
31
|
+
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'syntro_patch_reverted', id, 'overlay');
|
|
32
32
|
}
|
|
33
33
|
catch (err) {
|
|
34
|
-
console.warn(
|
|
34
|
+
console.warn('[SmartCanvas] failed to revert patch', id, err);
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHostPatches.js","sourceRoot":"","sources":["../../src/hooks/useHostPatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"useHostPatches.js","sourceRoot":"","sources":["../../src/hooks/useHostPatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAUpE,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,MAAM,GAAG,aAAa,EACtB,UAAU,GACY;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;gBAC/B,UAAU,EAAE,UAAU;gBACtB,MAAM;gBACN,KAAK,EAAE,SAAS;oBACd,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WACrB,OAAA,MAAA,SAAS,CAAC,WAAW,0DAAG,gBAAgB,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA,EAAA;oBACzE,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,sBAAsB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,qBAAqB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;;gBACrB,IAAI,CAAC;oBACH,WAAW,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,uBAAuB,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;gBACnE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type { SmartCanvasRuntime } from "../runtime";
|
|
1
|
+
import type { ExperimentClient } from '../experiments/types';
|
|
2
|
+
import type { SmartCanvasRuntime } from '../runtime';
|
|
3
|
+
import type { CanvasConfigFetcher, TileConfig, CanvasThemeConfig, LauncherConfig, RoutesConfig, ActionStep } from '../types';
|
|
5
4
|
export interface UseShadowCanvasConfigOptions {
|
|
6
5
|
fetcher: CanvasConfigFetcher;
|
|
7
6
|
pollIntervalMs?: number;
|
|
@@ -17,11 +16,8 @@ export interface ShadowCanvasConfigState {
|
|
|
17
16
|
fetchedAt?: string;
|
|
18
17
|
canvasTitle?: string;
|
|
19
18
|
configVersion?: string;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
overlayRecipe?: import('../overlays/types').CanvasRecipe;
|
|
23
|
-
/** Multiple overlay recipes (tours) */
|
|
24
|
-
overlayRecipes?: import('../overlays/types').CanvasRecipe[];
|
|
19
|
+
/** Actions to execute (tooltips, highlights, DOM changes, etc.) */
|
|
20
|
+
actions: ActionStep[];
|
|
25
21
|
displayMode?: 'standard' | 'focused';
|
|
26
22
|
/** Theme configuration from the canvas config (workspace settings) */
|
|
27
23
|
theme?: CanvasThemeConfig;
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo, useState } from
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { debug } from '../logger';
|
|
2
3
|
const sortTiles = (tiles) => [...tiles].sort((a, b) => { var _a, _b; return ((_a = a.order) !== null && _a !== void 0 ? _a : 0) - ((_b = b.order) !== null && _b !== void 0 ? _b : 0); });
|
|
3
4
|
export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experiments, runtime, }) {
|
|
4
5
|
const [state, setState] = useState({
|
|
5
6
|
tiles: [],
|
|
7
|
+
actions: [],
|
|
6
8
|
isLoading: true,
|
|
7
9
|
});
|
|
8
10
|
const load = useCallback(async () => {
|
|
9
11
|
try {
|
|
10
12
|
setState((prev) => ({ ...prev, isLoading: true, error: undefined }));
|
|
11
13
|
const response = await fetcher();
|
|
14
|
+
debug('SmartCanvas Config', 'Raw config response', response);
|
|
12
15
|
let tiles = response.tiles || [];
|
|
13
16
|
// Update runtime routes config if provided
|
|
14
17
|
if (runtime && response.routes) {
|
|
@@ -27,15 +30,14 @@ export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experim
|
|
|
27
30
|
// v1: Use legacy experiment filtering only
|
|
28
31
|
tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));
|
|
29
32
|
}
|
|
33
|
+
debug('SmartCanvas Config', `Tile count after filtering: ${tiles.length}`);
|
|
30
34
|
setState({
|
|
31
35
|
tiles: sortTiles(tiles),
|
|
36
|
+
actions: response.actions || [],
|
|
32
37
|
isLoading: false,
|
|
33
38
|
fetchedAt: response.fetchedAt,
|
|
34
39
|
canvasTitle: response.canvasTitle,
|
|
35
40
|
configVersion: response.configVersion,
|
|
36
|
-
patches: response.patches,
|
|
37
|
-
overlayRecipe: response.overlayRecipe,
|
|
38
|
-
overlayRecipes: response.overlayRecipes,
|
|
39
41
|
theme: response.theme,
|
|
40
42
|
launcher: response.launcher,
|
|
41
43
|
routes: response.routes,
|
|
@@ -45,7 +47,7 @@ export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experim
|
|
|
45
47
|
setState((prev) => ({
|
|
46
48
|
...prev,
|
|
47
49
|
isLoading: false,
|
|
48
|
-
error: err instanceof Error ? err.message :
|
|
50
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
49
51
|
}));
|
|
50
52
|
}
|
|
51
53
|
}, [experiments, fetcher, runtime]);
|
|
@@ -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":"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"}
|