@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
package/dist/api.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import type {
|
|
1
|
+
/**
|
|
2
|
+
* SmartCanvas API
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the SmartCanvas SDK. Creates and manages the canvas element,
|
|
5
|
+
* handles configuration, and coordinates between the ActionEngine and UI.
|
|
6
|
+
*/
|
|
7
|
+
import type { CanvasTheme } from './components/ShadowCanvasOverlay';
|
|
8
|
+
import type { ExperimentClient } from './experiments/types';
|
|
9
|
+
import type { OverlayRecipeFetcher } from './overlays/fetcher';
|
|
10
|
+
import type { RenderProps, ActionHandler, AppearanceConfig } from './render/types';
|
|
11
|
+
import type { SmartCanvasRuntime } from './runtime';
|
|
12
|
+
import { SmartCanvasElement } from './SmartCanvasElement';
|
|
13
|
+
import type { TelemetryClient } from './telemetry/types';
|
|
14
|
+
import type { CanvasConfigFetcher, CanvasConfigResponse } from './types';
|
|
8
15
|
export interface SmartCanvasIntegrations {
|
|
9
16
|
experiments?: ExperimentClient;
|
|
10
17
|
telemetry?: TelemetryClient;
|
|
@@ -27,16 +34,16 @@ export interface SmartCanvasConfig {
|
|
|
27
34
|
timeout?: number;
|
|
28
35
|
className?: string;
|
|
29
36
|
};
|
|
30
|
-
earlyPatching?: boolean;
|
|
31
37
|
editorUrl?: string;
|
|
32
38
|
theme?: Partial<CanvasTheme>;
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* v2 Runtime instance.
|
|
41
|
+
* Required for action execution. If not provided, actions will not be applied.
|
|
42
|
+
*/
|
|
43
|
+
runtime?: SmartCanvasRuntime;
|
|
34
44
|
autoDetectTheme?: boolean;
|
|
35
|
-
/** Theme appearance overrides (CSS variables, base theme) */
|
|
36
45
|
appearance?: AppearanceConfig;
|
|
37
|
-
/** Render props for customizing tile/block rendering */
|
|
38
46
|
renderProps?: RenderProps;
|
|
39
|
-
/** Action handlers for interactive blocks */
|
|
40
47
|
actionHandlers?: ActionHandler;
|
|
41
48
|
}
|
|
42
49
|
/**
|
|
@@ -45,32 +52,39 @@ export interface SmartCanvasConfig {
|
|
|
45
52
|
export interface MountableComponent {
|
|
46
53
|
mount(container: HTMLElement, props: any): void | (() => void);
|
|
47
54
|
}
|
|
48
|
-
export type { TileComponent, TileComponentProps } from
|
|
55
|
+
export type { TileComponent, TileComponentProps } from './types';
|
|
56
|
+
/**
|
|
57
|
+
* Handle for interacting with a SmartCanvas instance.
|
|
58
|
+
*/
|
|
49
59
|
export interface SmartCanvasHandle {
|
|
50
60
|
el: SmartCanvasElement;
|
|
51
61
|
open(): void;
|
|
52
62
|
close(): void;
|
|
53
63
|
destroy(): void;
|
|
54
64
|
setTokens(tokens: Record<string, string>): void;
|
|
55
|
-
getConfig(): Promise<any>;
|
|
56
|
-
updateConfig(newConfig: any): void;
|
|
57
|
-
setEnabled(enabled: boolean): void;
|
|
58
|
-
registerComponent(key: string, component: MountableComponent): void;
|
|
59
|
-
setOverrideFetcher(fetcher: any): void;
|
|
60
65
|
/**
|
|
61
|
-
*
|
|
62
|
-
* Used by editor SDK to tag crawler sessions with canonical IDs.
|
|
66
|
+
* Get the current config.
|
|
63
67
|
*/
|
|
64
|
-
|
|
68
|
+
getConfig(): Promise<CanvasConfigResponse>;
|
|
65
69
|
/**
|
|
66
|
-
*
|
|
70
|
+
* Update the config and re-apply actions.
|
|
71
|
+
* This is the primary way to modify what the canvas displays.
|
|
67
72
|
*/
|
|
68
|
-
|
|
73
|
+
updateConfig(newConfig: CanvasConfigResponse): Promise<void>;
|
|
69
74
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
75
|
+
* Enable or disable the canvas.
|
|
76
|
+
* When disabled, all actions are reverted.
|
|
72
77
|
*/
|
|
78
|
+
setEnabled(enabled: boolean): Promise<void>;
|
|
79
|
+
registerComponent(key: string, component: MountableComponent): void;
|
|
80
|
+
setOverrideFetcher(fetcher: CanvasConfigFetcher): void;
|
|
81
|
+
registerTelemetryProperties(properties: Record<string, unknown>): void;
|
|
82
|
+
getSessionId(): string | undefined;
|
|
73
83
|
startSessionRecording(): void;
|
|
84
|
+
/**
|
|
85
|
+
* v2 Runtime instance for context, events, state, and decisions.
|
|
86
|
+
*/
|
|
87
|
+
runtime?: SmartCanvasRuntime;
|
|
74
88
|
}
|
|
75
89
|
export declare const createSmartCanvas: (config?: SmartCanvasConfig) => Promise<SmartCanvasHandle>;
|
|
76
90
|
declare global {
|
|
@@ -80,4 +94,4 @@ declare global {
|
|
|
80
94
|
};
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
|
-
export { getAntiFlickerSnippet } from
|
|
97
|
+
export { getAntiFlickerSnippet } from './antiFlicker';
|
package/dist/api.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SmartCanvas API
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the SmartCanvas SDK. Creates and manages the canvas element,
|
|
5
|
+
* handles configuration, and coordinates between the ActionEngine and UI.
|
|
6
|
+
*/
|
|
7
|
+
import { initAntiFlicker } from './antiFlicker';
|
|
8
|
+
import { createCanvasConfigFetcher } from './configFetcher';
|
|
9
|
+
import { loadEditorSdk, getActiveSdkMode } from './editorLoader';
|
|
10
|
+
import { registerSmartCanvasElement } from './SmartCanvasElement';
|
|
6
11
|
export const createSmartCanvas = async (config = {}) => {
|
|
7
|
-
var _a, _b, _c
|
|
8
|
-
if (typeof window ===
|
|
9
|
-
throw new Error(
|
|
12
|
+
var _a, _b, _c;
|
|
13
|
+
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
|
14
|
+
throw new Error('SmartCanvas can only be created in a browser-like environment');
|
|
10
15
|
}
|
|
11
16
|
// Initialize anti-flicker if enabled
|
|
12
17
|
let removeAntiFlicker = null;
|
|
@@ -14,62 +19,90 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
14
19
|
const antiFlickerConfig = typeof config.antiFlicker === 'object' ? config.antiFlicker : {};
|
|
15
20
|
removeAntiFlicker = initAntiFlicker(antiFlickerConfig);
|
|
16
21
|
}
|
|
17
|
-
//
|
|
22
|
+
// State
|
|
18
23
|
let currentConfig = null;
|
|
19
24
|
let currentFetcher = null;
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
let currentBatchHandle = null;
|
|
26
|
+
let isEnabled = true;
|
|
27
|
+
const { runtime } = config;
|
|
28
|
+
/**
|
|
29
|
+
* Apply actions from config via ActionEngine.
|
|
30
|
+
*/
|
|
31
|
+
async function applyActions(actions) {
|
|
32
|
+
if (!(runtime === null || runtime === void 0 ? void 0 : runtime.actions) || actions.length === 0) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Revert previous actions
|
|
36
|
+
if (currentBatchHandle === null || currentBatchHandle === void 0 ? void 0 : currentBatchHandle.isApplied()) {
|
|
37
|
+
await currentBatchHandle.revertAll();
|
|
38
|
+
}
|
|
39
|
+
// Apply new actions
|
|
40
|
+
currentBatchHandle = await runtime.actions.applyBatch(actions);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Revert all current actions.
|
|
44
|
+
*/
|
|
45
|
+
async function revertActions() {
|
|
46
|
+
if (currentBatchHandle === null || currentBatchHandle === void 0 ? void 0 : currentBatchHandle.isApplied()) {
|
|
47
|
+
await currentBatchHandle.revertAll();
|
|
48
|
+
currentBatchHandle = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Apply initial config if fetcher provided
|
|
52
|
+
if (config.fetcher) {
|
|
22
53
|
try {
|
|
23
54
|
currentFetcher = config.fetcher;
|
|
24
55
|
const canvasConfig = await config.fetcher();
|
|
25
|
-
currentConfig = canvasConfig;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
applyPatchesEarly({
|
|
29
|
-
patches,
|
|
30
|
-
onComplete: () => {
|
|
31
|
-
// Remove anti-flicker after patches are applied
|
|
32
|
-
if (removeAntiFlicker) {
|
|
33
|
-
removeAntiFlicker();
|
|
34
|
-
removeAntiFlicker = null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
56
|
+
currentConfig = canvasConfig;
|
|
57
|
+
if (canvasConfig.actions && canvasConfig.actions.length > 0 && (runtime === null || runtime === void 0 ? void 0 : runtime.actions)) {
|
|
58
|
+
await applyActions(canvasConfig.actions);
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
catch (error) {
|
|
41
|
-
console.error('[SmartCanvas] Error applying
|
|
62
|
+
console.error('[SmartCanvas] Error fetching/applying initial config:', error);
|
|
42
63
|
}
|
|
43
64
|
}
|
|
44
|
-
// Remove anti-flicker
|
|
65
|
+
// Remove anti-flicker
|
|
45
66
|
if (removeAntiFlicker) {
|
|
46
67
|
removeAntiFlicker();
|
|
47
68
|
}
|
|
48
|
-
//
|
|
69
|
+
// Load editor SDK if in editor/audit mode
|
|
49
70
|
const sdkMode = getActiveSdkMode();
|
|
50
71
|
if (sdkMode) {
|
|
51
72
|
console.log(`[SmartCanvas] Loading editor SDK for ${sdkMode} mode`);
|
|
52
|
-
// We don't await this so the runtime SDK can continue initializing
|
|
53
73
|
loadEditorSdk(config.editorUrl).catch(console.error);
|
|
54
74
|
}
|
|
75
|
+
// Create the canvas element
|
|
55
76
|
registerSmartCanvasElement();
|
|
56
|
-
const host = document.createElement(
|
|
77
|
+
const host = document.createElement('smart-canvas');
|
|
57
78
|
if (config.tokens) {
|
|
58
79
|
for (const [key, value] of Object.entries(config.tokens)) {
|
|
59
80
|
host.style.setProperty(key, value);
|
|
60
81
|
}
|
|
61
82
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
83
|
+
// Wait for body to exist if running in <head>
|
|
84
|
+
const appendToTarget = () => {
|
|
85
|
+
var _a;
|
|
86
|
+
const target = (_a = config.target) !== null && _a !== void 0 ? _a : document.body;
|
|
87
|
+
if (target) {
|
|
88
|
+
target.appendChild(host);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
if (document.body) {
|
|
92
|
+
appendToTarget();
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Script running before body exists - wait for DOMContentLoaded
|
|
96
|
+
document.addEventListener('DOMContentLoaded', appendToTarget, { once: true });
|
|
97
|
+
}
|
|
98
|
+
const experiments = (_a = config.integrations) === null || _a === void 0 ? void 0 : _a.experiments;
|
|
99
|
+
const telemetry = (_b = config.integrations) === null || _b === void 0 ? void 0 : _b.telemetry;
|
|
100
|
+
const fetcher = (_c = config.fetcher) !== null && _c !== void 0 ? _c : createCanvasConfigFetcher({
|
|
67
101
|
configUri: config.configUri,
|
|
68
102
|
experiments,
|
|
69
103
|
featureKey: config.configUriFeatureKey,
|
|
70
104
|
credentials: config.fetchCredentials,
|
|
71
105
|
});
|
|
72
|
-
// Store the initial fetcher if not already set
|
|
73
106
|
if (!currentFetcher) {
|
|
74
107
|
currentFetcher = fetcher;
|
|
75
108
|
}
|
|
@@ -78,6 +111,7 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
78
111
|
pollIntervalMs: config.pollIntervalMs,
|
|
79
112
|
experiments,
|
|
80
113
|
telemetry,
|
|
114
|
+
runtime,
|
|
81
115
|
overlayFetcher: config.overlayFetcher,
|
|
82
116
|
overlayConfigUri: config.overlayConfigUri,
|
|
83
117
|
overlayConfigFeatureKey: config.overlayConfigFeatureKey,
|
|
@@ -95,14 +129,16 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
95
129
|
el: host,
|
|
96
130
|
open: () => host.open(),
|
|
97
131
|
close: () => host.close(),
|
|
98
|
-
destroy: () =>
|
|
132
|
+
destroy: () => {
|
|
133
|
+
revertActions();
|
|
134
|
+
host.remove();
|
|
135
|
+
},
|
|
99
136
|
setTokens: (tokens) => {
|
|
100
137
|
for (const [key, value] of Object.entries(tokens)) {
|
|
101
138
|
host.style.setProperty(key, value);
|
|
102
139
|
}
|
|
103
140
|
},
|
|
104
141
|
getConfig: async () => {
|
|
105
|
-
// Use current fetcher to get fresh config
|
|
106
142
|
if (currentFetcher) {
|
|
107
143
|
try {
|
|
108
144
|
const freshConfig = await currentFetcher();
|
|
@@ -113,27 +149,23 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
113
149
|
console.error('[SmartCanvas] Error fetching config:', error);
|
|
114
150
|
}
|
|
115
151
|
}
|
|
116
|
-
return currentConfig;
|
|
152
|
+
return currentConfig !== null && currentConfig !== void 0 ? currentConfig : { tiles: [], actions: [], fetchedAt: '' };
|
|
117
153
|
},
|
|
118
|
-
updateConfig: (newConfig) => {
|
|
154
|
+
updateConfig: async (newConfig) => {
|
|
119
155
|
currentConfig = newConfig;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (patches.length > 0) {
|
|
123
|
-
applyPatchesEarly({ patches });
|
|
156
|
+
if (isEnabled) {
|
|
157
|
+
await applyActions(newConfig.actions);
|
|
124
158
|
}
|
|
125
159
|
},
|
|
126
|
-
setEnabled: (enabled) => {
|
|
160
|
+
setEnabled: async (enabled) => {
|
|
161
|
+
isEnabled = enabled;
|
|
127
162
|
if (enabled) {
|
|
128
163
|
if (currentConfig) {
|
|
129
|
-
|
|
130
|
-
if (patches.length > 0) {
|
|
131
|
-
applyPatchesEarly({ patches });
|
|
132
|
-
}
|
|
164
|
+
await applyActions(currentConfig.actions);
|
|
133
165
|
}
|
|
134
166
|
}
|
|
135
167
|
else {
|
|
136
|
-
|
|
168
|
+
await revertActions();
|
|
137
169
|
}
|
|
138
170
|
},
|
|
139
171
|
registerComponent: (key, Component) => host.registerComponent(key, Component),
|
|
@@ -145,20 +177,15 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
145
177
|
var _a;
|
|
146
178
|
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.register) === null || _a === void 0 ? void 0 : _a.call(telemetry, properties);
|
|
147
179
|
},
|
|
148
|
-
getSessionId: () => {
|
|
149
|
-
var _a;
|
|
150
|
-
return (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.getSessionId) === null || _a === void 0 ? void 0 : _a.call(telemetry);
|
|
151
|
-
},
|
|
180
|
+
getSessionId: () => { var _a; return (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.getSessionId) === null || _a === void 0 ? void 0 : _a.call(telemetry); },
|
|
152
181
|
startSessionRecording: () => {
|
|
153
182
|
var _a;
|
|
154
183
|
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.startSessionRecording) === null || _a === void 0 ? void 0 : _a.call(telemetry);
|
|
155
184
|
},
|
|
185
|
+
runtime,
|
|
156
186
|
};
|
|
157
|
-
// Expose handle for editor SDK access
|
|
158
|
-
|
|
159
|
-
// In dev mode: always expose (for debugging)
|
|
160
|
-
// In production: never expose (security)
|
|
161
|
-
if (typeof window !== "undefined") {
|
|
187
|
+
// Expose handle for editor SDK access (only in editor/dev mode)
|
|
188
|
+
if (typeof window !== 'undefined') {
|
|
162
189
|
const isDev = process.env.NODE_ENV === 'development';
|
|
163
190
|
if (sdkMode || isDev) {
|
|
164
191
|
window.__smartCanvasHandle = handle;
|
|
@@ -167,8 +194,8 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
167
194
|
return handle;
|
|
168
195
|
};
|
|
169
196
|
// Export anti-flicker snippet for inline usage
|
|
170
|
-
export { getAntiFlickerSnippet } from
|
|
171
|
-
if (typeof window !==
|
|
197
|
+
export { getAntiFlickerSnippet } from './antiFlicker';
|
|
198
|
+
if (typeof window !== 'undefined') {
|
|
172
199
|
window.SmartCanvas = {
|
|
173
200
|
async create(config) {
|
|
174
201
|
return createSmartCanvas(config);
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Context
|
|
3
|
+
*
|
|
4
|
+
* Provides a sandboxed runtime context for apps.
|
|
5
|
+
* Apps receive an AppContext when they activate, giving them controlled
|
|
6
|
+
* access to runtime functionality.
|
|
7
|
+
*/
|
|
8
|
+
import type { SmartCanvasRuntime } from '../runtime';
|
|
9
|
+
import type { AppContext } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Options for creating an AppContext.
|
|
12
|
+
*/
|
|
13
|
+
export interface CreateAppContextOptions {
|
|
14
|
+
/** The app ID */
|
|
15
|
+
appId: string;
|
|
16
|
+
/** The runtime instance */
|
|
17
|
+
runtime: SmartCanvasRuntime;
|
|
18
|
+
/** Whether this is a built-in app (prevents executor override) */
|
|
19
|
+
isBuiltIn?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a sandboxed AppContext for an app.
|
|
23
|
+
*
|
|
24
|
+
* The context provides controlled access to runtime functionality,
|
|
25
|
+
* with state namespaced to the app.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createAppContext(options: CreateAppContextOptions): AppContext;
|
|
28
|
+
/**
|
|
29
|
+
* Clean up all resources registered by an app context.
|
|
30
|
+
*/
|
|
31
|
+
export declare function cleanupAppContext(appId: string, runtime: SmartCanvasRuntime): void;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Context
|
|
3
|
+
*
|
|
4
|
+
* Provides a sandboxed runtime context for apps.
|
|
5
|
+
* Apps receive an AppContext when they activate, giving them controlled
|
|
6
|
+
* access to runtime functionality.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create a sandboxed AppContext for an app.
|
|
10
|
+
*
|
|
11
|
+
* The context provides controlled access to runtime functionality,
|
|
12
|
+
* with state namespaced to the app.
|
|
13
|
+
*/
|
|
14
|
+
export function createAppContext(options) {
|
|
15
|
+
const { appId, runtime, isBuiltIn = false } = options;
|
|
16
|
+
const _statePrefix = `app:${appId}:`;
|
|
17
|
+
// Track registered actions and widgets for cleanup
|
|
18
|
+
const registeredActions = [];
|
|
19
|
+
const registeredWidgets = [];
|
|
20
|
+
// Get or create namespaced storage for this app
|
|
21
|
+
const appStorage = runtime.state.ns(`app:${appId}`);
|
|
22
|
+
const context = {
|
|
23
|
+
appId,
|
|
24
|
+
// Namespaced state access (using session storage scoped to this app)
|
|
25
|
+
state: {
|
|
26
|
+
get: (key) => appStorage.get(key),
|
|
27
|
+
set: (key, value) => appStorage.set(key, value),
|
|
28
|
+
remove: (key) => appStorage.remove(key),
|
|
29
|
+
},
|
|
30
|
+
// Telemetry access (if available) - using EventBus for custom events
|
|
31
|
+
telemetry: runtime.telemetry
|
|
32
|
+
? {
|
|
33
|
+
emit: (eventName, props) => {
|
|
34
|
+
// Use EventBus to emit custom events since TelemetryClient doesn't have generic emit
|
|
35
|
+
runtime.events.publish(eventName, {
|
|
36
|
+
...props,
|
|
37
|
+
_appId: appId,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
getSessionId: () => { var _a, _b; return (_b = (_a = runtime.telemetry) === null || _a === void 0 ? void 0 : _a.getSessionId) === null || _b === void 0 ? void 0 : _b.call(_a); },
|
|
41
|
+
}
|
|
42
|
+
: undefined,
|
|
43
|
+
// Surfaces access
|
|
44
|
+
surfaces: {
|
|
45
|
+
mount: (slot, content, opts) => {
|
|
46
|
+
const handle = runtime.surfaces.mount(slot, content, {
|
|
47
|
+
...opts,
|
|
48
|
+
adaptiveId: appId,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
unmount: () => handle.unmount(),
|
|
52
|
+
update: (newContent) => handle.update(newContent),
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
canMount: (slot, priority) => runtime.surfaces.canMount(slot, priority),
|
|
56
|
+
},
|
|
57
|
+
// Events access
|
|
58
|
+
events: {
|
|
59
|
+
subscribe: (callback) => runtime.events.subscribe((event) => {
|
|
60
|
+
callback(event);
|
|
61
|
+
}),
|
|
62
|
+
publish: (name, props) => {
|
|
63
|
+
runtime.events.publish(name, {
|
|
64
|
+
...props,
|
|
65
|
+
_appId: appId,
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
// Action registration
|
|
70
|
+
registerAction: (definition) => {
|
|
71
|
+
runtime.executors.register(definition.kind, definition.executor, definition.schema, appId, isBuiltIn);
|
|
72
|
+
registeredActions.push(definition.kind);
|
|
73
|
+
},
|
|
74
|
+
// Widget registration
|
|
75
|
+
registerWidget: (definition) => {
|
|
76
|
+
runtime.widgets.register(definition.id, definition.component, appId, definition.metadata);
|
|
77
|
+
registeredWidgets.push(definition.id);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
return context;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clean up all resources registered by an app context.
|
|
84
|
+
*/
|
|
85
|
+
export function cleanupAppContext(appId, runtime) {
|
|
86
|
+
// Unregister all executors from this app
|
|
87
|
+
runtime.executors.unregisterBySource(appId);
|
|
88
|
+
// Unregister all widgets from this app
|
|
89
|
+
runtime.widgets.unregisterBySource(appId);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=AppContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppContext.js","sourceRoot":"","sources":["../../src/apps/AppContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles loading apps from CDN based on canvas config requirements.
|
|
5
|
+
*
|
|
6
|
+
* Loading Strategy:
|
|
7
|
+
* 1. Core apps (built-in actions) are bundled with runtime - no loading needed
|
|
8
|
+
* 2. External apps are loaded from CDN when config references them
|
|
9
|
+
*
|
|
10
|
+
* The loader determines which apps are needed by scanning the canvas config for:
|
|
11
|
+
* - Action kinds with namespaces (e.g., "gamification:awardBadge")
|
|
12
|
+
* - Widget IDs with namespaces (e.g., "gamification:leaderboard")
|
|
13
|
+
* - Explicit app references in config
|
|
14
|
+
*/
|
|
15
|
+
import type { AppRegistry } from './AppRegistry';
|
|
16
|
+
import type { AppManifest } from './types';
|
|
17
|
+
/**
|
|
18
|
+
* App loading options.
|
|
19
|
+
*/
|
|
20
|
+
export interface AppLoaderOptions {
|
|
21
|
+
/** Base URL for CDN app bundles */
|
|
22
|
+
cdnBase: string;
|
|
23
|
+
/** App registry to register loaded apps */
|
|
24
|
+
registry: AppRegistry;
|
|
25
|
+
/** Timeout for loading apps (ms) */
|
|
26
|
+
timeout?: number;
|
|
27
|
+
/** Callback when an app starts loading */
|
|
28
|
+
onLoadStart?: (appId: string) => void;
|
|
29
|
+
/** Callback when an app finishes loading */
|
|
30
|
+
onLoadEnd?: (appId: string, success: boolean, error?: string) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* App load result.
|
|
34
|
+
*/
|
|
35
|
+
export interface AppLoadResult {
|
|
36
|
+
appId: string;
|
|
37
|
+
success: boolean;
|
|
38
|
+
error?: string;
|
|
39
|
+
manifest?: AppManifest;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Canvas config for determining which apps to load.
|
|
43
|
+
*/
|
|
44
|
+
export interface CanvasConfigForLoader {
|
|
45
|
+
/** Actions in the config */
|
|
46
|
+
actions?: Array<{
|
|
47
|
+
kind: string;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}>;
|
|
50
|
+
/** Explicit app IDs to load */
|
|
51
|
+
apps?: string[];
|
|
52
|
+
/** Widgets referenced in actions */
|
|
53
|
+
widgets?: Array<{
|
|
54
|
+
widgetId?: string;
|
|
55
|
+
widget?: {
|
|
56
|
+
widgetId: string;
|
|
57
|
+
};
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if an action kind is a core action.
|
|
62
|
+
*/
|
|
63
|
+
export declare function isCoreActionKind(kind: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Extract app ID from a namespaced action kind.
|
|
66
|
+
* e.g., "gamification:awardBadge" → "gamification"
|
|
67
|
+
* e.g., "navigation:scrollTo" → "nav" (via namespace mapping)
|
|
68
|
+
*/
|
|
69
|
+
export declare function getAppIdFromActionKind(kind: string): string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Extract app ID from a namespaced widget ID.
|
|
72
|
+
* e.g., "gamification:leaderboard" → "gamification"
|
|
73
|
+
*/
|
|
74
|
+
export declare function getAppIdFromWidgetId(widgetId: string): string | null;
|
|
75
|
+
/**
|
|
76
|
+
* Create an app loader instance.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createAppLoader(options: AppLoaderOptions): {
|
|
79
|
+
loadApp: (appId: string) => Promise<AppLoadResult>;
|
|
80
|
+
loadAppsForConfig: (config: CanvasConfigForLoader) => Promise<AppLoadResult[]>;
|
|
81
|
+
preloadApps: (appIds: string[]) => Promise<AppLoadResult[]>;
|
|
82
|
+
getRequiredApps: (config: CanvasConfigForLoader) => string[];
|
|
83
|
+
getAppUrl: (appId: string) => string;
|
|
84
|
+
};
|
|
85
|
+
export type AppLoader = ReturnType<typeof createAppLoader>;
|