@syntrologie/runtime-sdk 1.0.1-canary.3 → 2.0.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CAPABILITIES.md +630 -463
- package/README.md +285 -62
- package/dist/RuntimeProvider.d.ts +51 -0
- package/dist/RuntimeProvider.js +114 -0
- package/dist/RuntimeProvider.js.map +1 -0
- package/dist/SmartCanvasApp.d.ts +9 -3
- package/dist/SmartCanvasApp.js +36 -38
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/actions/ActionEngine.d.ts +11 -0
- package/dist/actions/ActionEngine.js +274 -0
- package/dist/actions/ActionEngine.js.map +1 -0
- package/dist/actions/executors/index.d.ts +118 -0
- package/dist/actions/executors/index.js +242 -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 +603 -0
- package/dist/actions/validation.js.map +1 -0
- package/dist/api.d.ts +32 -18
- package/dist/api.js +56 -39
- package/dist/api.js.map +1 -1
- package/dist/apps/AppContext.d.ts +31 -0
- package/dist/apps/AppContext.js +93 -0
- package/dist/apps/AppContext.js.map +1 -0
- package/dist/apps/AppLoader.d.ts +84 -0
- package/dist/apps/AppLoader.js +250 -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 +18 -0
- package/dist/apps/index.js +26 -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/bootstrap.d.ts +24 -0
- package/dist/bootstrap.js +133 -33
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.js +36 -9
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.js +37 -18
- package/dist/components/TileCard.js.map +1 -1
- package/dist/context/schema.d.ts +16 -16
- package/dist/decisions/schema.d.ts +96 -96
- 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 +2 -0
- package/dist/editorLoader.js +46 -7
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/normalizers/posthog.d.ts +24 -0
- package/dist/events/normalizers/posthog.js.map +1 -1
- package/dist/events/schema.d.ts +8 -8
- package/dist/events/types.d.ts +6 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -1
- package/dist/hooks/useCanvasOverlays.d.ts +4 -1
- package/dist/hooks/useCanvasOverlays.js +53 -6
- package/dist/hooks/useCanvasOverlays.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +3 -7
- package/dist/hooks/useShadowCanvasConfig.js +2 -3
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/overlays/schema.d.ts +153 -153
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.js +75 -1
- package/dist/runtime.js.map +1 -1
- package/dist/smart-canvas.esm.js +162 -55
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +21133 -17957
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +162 -55
- package/dist/smart-canvas.min.js.map +4 -4
- 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 +90 -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 +231 -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/posthog.d.ts +6 -0
- package/dist/telemetry/adapters/posthog.js +9 -0
- package/dist/telemetry/adapters/posthog.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 +26 -14
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +139 -0
- package/dist/widgets/WidgetRegistry.js +182 -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 +13 -3
- package/schema/canvas-config.schema.json +444 -254
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Executor Registry
|
|
3
|
+
*
|
|
4
|
+
* Extensible registry that maps action kinds to their executor functions.
|
|
5
|
+
* Apps can register custom executors at runtime.
|
|
6
|
+
*
|
|
7
|
+
* Core app executors are imported from their respective app packages.
|
|
8
|
+
*/
|
|
9
|
+
// Import executors from core app packages
|
|
10
|
+
import { executors as contentExecutors } from "@syntrologie/app-content/runtime";
|
|
11
|
+
import { executors as overlayExecutors } from "@syntrologie/app-overlays/runtime";
|
|
12
|
+
import { executors as navigationExecutors } from "@syntrologie/app-navigation/runtime";
|
|
13
|
+
import { executors as gamificationExecutors } from "@syntrologie/app-gamification/runtime";
|
|
14
|
+
import { executeTour } from "./tour";
|
|
15
|
+
/**
|
|
16
|
+
* Extensible registry for action executors.
|
|
17
|
+
*
|
|
18
|
+
* Core executors (setText, highlight, etc.) are registered synchronously
|
|
19
|
+
* at construction time for immediate availability - no async loading.
|
|
20
|
+
*
|
|
21
|
+
* External app executors are registered when apps activate.
|
|
22
|
+
*/
|
|
23
|
+
export class ExecutorRegistry {
|
|
24
|
+
/**
|
|
25
|
+
* Constructor - registers core executors synchronously.
|
|
26
|
+
* These are available IMMEDIATELY when the module loads,
|
|
27
|
+
* enabling instant action execution without waiting for app activation.
|
|
28
|
+
*/
|
|
29
|
+
constructor() {
|
|
30
|
+
this.executors = new Map();
|
|
31
|
+
// Register all executors from core app packages
|
|
32
|
+
for (const { kind, executor } of contentExecutors) {
|
|
33
|
+
this.registerCore(kind, executor);
|
|
34
|
+
}
|
|
35
|
+
for (const { kind, executor } of overlayExecutors) {
|
|
36
|
+
this.registerCore(kind, executor);
|
|
37
|
+
}
|
|
38
|
+
for (const { kind, executor } of navigationExecutors) {
|
|
39
|
+
this.registerCore(kind, executor);
|
|
40
|
+
}
|
|
41
|
+
for (const { kind, executor } of gamificationExecutors) {
|
|
42
|
+
this.registerCore(kind, executor);
|
|
43
|
+
}
|
|
44
|
+
// core:mountWidget is handled specially in ActionEngine since it delegates to Surfaces
|
|
45
|
+
this.registerCore("core:mountWidget", async () => {
|
|
46
|
+
throw new Error("core:mountWidget must be handled by ActionEngine");
|
|
47
|
+
});
|
|
48
|
+
// Register core:tour executor
|
|
49
|
+
this.registerCore("core:tour", executeTour);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Register a core executor (synchronous, built-in, cannot be overridden).
|
|
53
|
+
*/
|
|
54
|
+
registerCore(kind, executor, schema) {
|
|
55
|
+
this.executors.set(kind, {
|
|
56
|
+
kind,
|
|
57
|
+
executor,
|
|
58
|
+
schema,
|
|
59
|
+
source: "core",
|
|
60
|
+
isBuiltIn: true,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Register an executor for an action kind.
|
|
65
|
+
*
|
|
66
|
+
* @param kind - The action kind (e.g., "gamification:awardBadge")
|
|
67
|
+
* @param executor - The executor function
|
|
68
|
+
* @param schema - Optional Zod schema for validation
|
|
69
|
+
* @param source - The source app ID (for tracking)
|
|
70
|
+
* @param isBuiltIn - Whether this is from a built-in app (prevents override)
|
|
71
|
+
*/
|
|
72
|
+
register(kind, executor, schema, source = "custom", isBuiltIn = false) {
|
|
73
|
+
if (this.executors.has(kind)) {
|
|
74
|
+
const existing = this.executors.get(kind);
|
|
75
|
+
if (existing.isBuiltIn) {
|
|
76
|
+
throw new Error(`Cannot override built-in executor: ${kind}`);
|
|
77
|
+
}
|
|
78
|
+
console.warn(`[ExecutorRegistry] Overriding executor for kind: ${kind}`);
|
|
79
|
+
}
|
|
80
|
+
this.executors.set(kind, {
|
|
81
|
+
kind,
|
|
82
|
+
executor,
|
|
83
|
+
schema,
|
|
84
|
+
source,
|
|
85
|
+
isBuiltIn,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Unregister an executor.
|
|
90
|
+
*
|
|
91
|
+
* @param kind - The action kind to unregister
|
|
92
|
+
* @returns true if the executor was unregistered, false if not found or built-in
|
|
93
|
+
*/
|
|
94
|
+
unregister(kind) {
|
|
95
|
+
const existing = this.executors.get(kind);
|
|
96
|
+
if (!existing) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (existing.isBuiltIn) {
|
|
100
|
+
console.warn(`[ExecutorRegistry] Cannot unregister built-in executor: ${kind}`);
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
this.executors.delete(kind);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Unregister all executors from a specific source.
|
|
108
|
+
*
|
|
109
|
+
* @param source - The source app ID
|
|
110
|
+
*/
|
|
111
|
+
unregisterBySource(source) {
|
|
112
|
+
for (const [kind, registration] of this.executors.entries()) {
|
|
113
|
+
if (registration.source === source) {
|
|
114
|
+
this.executors.delete(kind);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the executor for an action kind.
|
|
120
|
+
*/
|
|
121
|
+
get(kind) {
|
|
122
|
+
var _a;
|
|
123
|
+
return (_a = this.executors.get(kind)) === null || _a === void 0 ? void 0 : _a.executor;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the full registration for an action kind.
|
|
127
|
+
*/
|
|
128
|
+
getRegistration(kind) {
|
|
129
|
+
return this.executors.get(kind);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if an executor exists for a given action kind.
|
|
133
|
+
*/
|
|
134
|
+
has(kind) {
|
|
135
|
+
return this.executors.has(kind);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validate an action using its registered schema.
|
|
139
|
+
*
|
|
140
|
+
* @param action - The action to validate
|
|
141
|
+
* @returns Validation result
|
|
142
|
+
*/
|
|
143
|
+
validate(action) {
|
|
144
|
+
const errors = [];
|
|
145
|
+
if (!action || typeof action !== "object") {
|
|
146
|
+
errors.push({
|
|
147
|
+
code: "INVALID_ACTION",
|
|
148
|
+
message: "Action must be an object",
|
|
149
|
+
});
|
|
150
|
+
return { valid: false, errors, warnings: [] };
|
|
151
|
+
}
|
|
152
|
+
const kind = action.kind;
|
|
153
|
+
if (!kind || typeof kind !== "string") {
|
|
154
|
+
errors.push({
|
|
155
|
+
code: "MISSING_KIND",
|
|
156
|
+
message: "Action must have a 'kind' property",
|
|
157
|
+
});
|
|
158
|
+
return { valid: false, errors, warnings: [] };
|
|
159
|
+
}
|
|
160
|
+
const registration = this.executors.get(kind);
|
|
161
|
+
if (!registration) {
|
|
162
|
+
errors.push({
|
|
163
|
+
code: "UNKNOWN_KIND",
|
|
164
|
+
message: `Unknown action kind: ${kind}`,
|
|
165
|
+
field: "kind",
|
|
166
|
+
});
|
|
167
|
+
return { valid: false, errors, warnings: [] };
|
|
168
|
+
}
|
|
169
|
+
// If schema is provided, validate against it
|
|
170
|
+
if (registration.schema) {
|
|
171
|
+
const result = registration.schema.safeParse(action);
|
|
172
|
+
if (!result.success) {
|
|
173
|
+
for (const issue of result.error.issues) {
|
|
174
|
+
errors.push({
|
|
175
|
+
code: "SCHEMA_VALIDATION_ERROR",
|
|
176
|
+
message: issue.message,
|
|
177
|
+
field: issue.path.join("."),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return { valid: false, errors, warnings: [] };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return { valid: true, errors: [], warnings: [] };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* List all registered action kinds.
|
|
187
|
+
*/
|
|
188
|
+
list() {
|
|
189
|
+
return Array.from(this.executors.keys());
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* List all registrations.
|
|
193
|
+
*/
|
|
194
|
+
listRegistrations() {
|
|
195
|
+
return Array.from(this.executors.values());
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get all built-in action kinds.
|
|
199
|
+
*/
|
|
200
|
+
getBuiltInKinds() {
|
|
201
|
+
return Array.from(this.executors.entries())
|
|
202
|
+
.filter(([, reg]) => reg.isBuiltIn)
|
|
203
|
+
.map(([kind]) => kind);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get all custom action kinds.
|
|
207
|
+
*/
|
|
208
|
+
getCustomKinds() {
|
|
209
|
+
return Array.from(this.executors.entries())
|
|
210
|
+
.filter(([, reg]) => !reg.isBuiltIn)
|
|
211
|
+
.map(([kind]) => kind);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ============================================================================
|
|
215
|
+
// Singleton and backwards-compatible exports
|
|
216
|
+
// ============================================================================
|
|
217
|
+
/**
|
|
218
|
+
* Default singleton instance of ExecutorRegistry.
|
|
219
|
+
*/
|
|
220
|
+
export const executorRegistry = new ExecutorRegistry();
|
|
221
|
+
/**
|
|
222
|
+
* Get the executor for an action kind.
|
|
223
|
+
* @deprecated Use executorRegistry.get() instead
|
|
224
|
+
*/
|
|
225
|
+
export function getExecutor(kind) {
|
|
226
|
+
return executorRegistry.get(kind);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if an executor exists for a given action kind.
|
|
230
|
+
* @deprecated Use executorRegistry.has() instead
|
|
231
|
+
*/
|
|
232
|
+
export function hasExecutor(kind) {
|
|
233
|
+
return executorRegistry.has(kind);
|
|
234
|
+
}
|
|
235
|
+
// Re-export individual executors from app packages for backwards compatibility
|
|
236
|
+
export { executeInsertHtml, executeSetText, executeSetAttr, executeAddClass, executeRemoveClass, executeSetStyle, } from "@syntrologie/app-content/runtime";
|
|
237
|
+
export { executeHighlight, executePulse, executeBadge, executeTooltip, executeModal, } from "@syntrologie/app-overlays/runtime";
|
|
238
|
+
export { executeScrollTo, executeNavigate, } from "@syntrologie/app-navigation/runtime";
|
|
239
|
+
export { executeAwardBadge, executeAddPoints, } from "@syntrologie/app-gamification/runtime";
|
|
240
|
+
// Core executors
|
|
241
|
+
export { executeTour } from "./tour";
|
|
242
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/executors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tour Executor
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates sequential tour steps with cross-page state persistence.
|
|
5
|
+
* Tours can span multiple pages and resume after navigation.
|
|
6
|
+
*
|
|
7
|
+
* Each step contains an inner action (modal, tooltip) that gets executed.
|
|
8
|
+
* The tour listens for CTA click events to advance to the next step.
|
|
9
|
+
*/
|
|
10
|
+
import type { TourAction, ActionExecutor } from "../types";
|
|
11
|
+
/**
|
|
12
|
+
* Execute a tour action
|
|
13
|
+
*
|
|
14
|
+
* Tours orchestrate a sequence of steps, persisting state to localStorage
|
|
15
|
+
* to support cross-page navigation. Each step contains an action to execute
|
|
16
|
+
* and optionally defines transitions based on action events.
|
|
17
|
+
*/
|
|
18
|
+
export declare const executeTour: ActionExecutor<TourAction>;
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tour Executor
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates sequential tour steps with cross-page state persistence.
|
|
5
|
+
* Tours can span multiple pages and resume after navigation.
|
|
6
|
+
*
|
|
7
|
+
* Each step contains an inner action (modal, tooltip) that gets executed.
|
|
8
|
+
* The tour listens for CTA click events to advance to the next step.
|
|
9
|
+
*/
|
|
10
|
+
/** Storage key for active tour state */
|
|
11
|
+
const ACTIVE_TOUR_KEY = "syntro_active_tour";
|
|
12
|
+
/** Track active tour executors to prevent duplicates */
|
|
13
|
+
const activeTours = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Get active tour state from localStorage
|
|
16
|
+
*/
|
|
17
|
+
function getTourState(tourId) {
|
|
18
|
+
try {
|
|
19
|
+
const data = localStorage.getItem(ACTIVE_TOUR_KEY);
|
|
20
|
+
if (!data)
|
|
21
|
+
return null;
|
|
22
|
+
const state = JSON.parse(data);
|
|
23
|
+
// Only return if it matches the requested tour
|
|
24
|
+
if (state.tourId !== tourId)
|
|
25
|
+
return null;
|
|
26
|
+
return state;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Save tour state to localStorage
|
|
34
|
+
*/
|
|
35
|
+
function saveTourState(state) {
|
|
36
|
+
try {
|
|
37
|
+
localStorage.setItem(ACTIVE_TOUR_KEY, JSON.stringify(state));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Storage may be full or unavailable
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Clear tour state from localStorage
|
|
45
|
+
*/
|
|
46
|
+
function clearTourState() {
|
|
47
|
+
try {
|
|
48
|
+
localStorage.removeItem(ACTIVE_TOUR_KEY);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get current route/path
|
|
56
|
+
*/
|
|
57
|
+
function getCurrentRoute() {
|
|
58
|
+
return window.location.pathname;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a step matches the current route
|
|
62
|
+
*/
|
|
63
|
+
function stepMatchesRoute(step) {
|
|
64
|
+
if (!step.route)
|
|
65
|
+
return true;
|
|
66
|
+
const currentRoute = getCurrentRoute();
|
|
67
|
+
// Simple pattern matching - step.route can be exact path or glob pattern
|
|
68
|
+
if (step.route.includes("*")) {
|
|
69
|
+
const pattern = new RegExp("^" + step.route.replace(/\*/g, ".*") + "$");
|
|
70
|
+
return pattern.test(currentRoute);
|
|
71
|
+
}
|
|
72
|
+
return currentRoute === step.route;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute a tour action
|
|
76
|
+
*
|
|
77
|
+
* Tours orchestrate a sequence of steps, persisting state to localStorage
|
|
78
|
+
* to support cross-page navigation. Each step contains an action to execute
|
|
79
|
+
* and optionally defines transitions based on action events.
|
|
80
|
+
*/
|
|
81
|
+
export const executeTour = async (action, context) => {
|
|
82
|
+
const { tourId, steps, startStep, autoStart = true } = action;
|
|
83
|
+
if (steps.length === 0) {
|
|
84
|
+
throw new Error(`Tour "${tourId}" has no steps`);
|
|
85
|
+
}
|
|
86
|
+
// Self-guard: if this tour is already running, return no-op
|
|
87
|
+
// This prevents duplicate modals when applyBatch is called multiple times
|
|
88
|
+
if (activeTours.has(tourId)) {
|
|
89
|
+
return {
|
|
90
|
+
cleanup: async () => {
|
|
91
|
+
// Delegate to the original tour's cleanup
|
|
92
|
+
const existing = activeTours.get(tourId);
|
|
93
|
+
if (existing) {
|
|
94
|
+
await existing.cleanup();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Check if we can execute inner actions
|
|
100
|
+
if (!context.applyAction) {
|
|
101
|
+
throw new Error("Tour executor requires applyAction in context");
|
|
102
|
+
}
|
|
103
|
+
// Get or initialize tour state
|
|
104
|
+
let state = getTourState(tourId);
|
|
105
|
+
const isResumingTour = !!state;
|
|
106
|
+
// If not resuming and autoStart is false, don't start the tour
|
|
107
|
+
if (!isResumingTour && !autoStart) {
|
|
108
|
+
return {
|
|
109
|
+
cleanup: () => { },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (!state) {
|
|
113
|
+
state = {
|
|
114
|
+
tourId,
|
|
115
|
+
currentStepId: startStep || steps[0].id,
|
|
116
|
+
startedAt: Date.now(),
|
|
117
|
+
};
|
|
118
|
+
saveTourState(state);
|
|
119
|
+
}
|
|
120
|
+
// Find the current step
|
|
121
|
+
let currentStepIndex = steps.findIndex((s) => s.id === state.currentStepId);
|
|
122
|
+
if (currentStepIndex === -1) {
|
|
123
|
+
// Step not found, use startStep or first step
|
|
124
|
+
const initialStepId = startStep || steps[0].id;
|
|
125
|
+
currentStepIndex = steps.findIndex((s) => s.id === initialStepId);
|
|
126
|
+
if (currentStepIndex === -1)
|
|
127
|
+
currentStepIndex = 0;
|
|
128
|
+
state.currentStepId = steps[currentStepIndex].id;
|
|
129
|
+
saveTourState(state);
|
|
130
|
+
}
|
|
131
|
+
const currentStep = steps[currentStepIndex];
|
|
132
|
+
// Check if current step matches the route
|
|
133
|
+
if (!stepMatchesRoute(currentStep)) {
|
|
134
|
+
// Current page doesn't match this step's route
|
|
135
|
+
// Tour is "waiting" for navigation to the correct page
|
|
136
|
+
context.publishEvent("tour.waiting_for_route", {
|
|
137
|
+
tourId,
|
|
138
|
+
stepId: currentStep.id,
|
|
139
|
+
expectedRoute: currentStep.route,
|
|
140
|
+
currentRoute: getCurrentRoute(),
|
|
141
|
+
});
|
|
142
|
+
// Return a no-op that cleans up when tour ends
|
|
143
|
+
return {
|
|
144
|
+
cleanup: () => { },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Track state
|
|
148
|
+
let isDestroyed = false;
|
|
149
|
+
let currentActionHandle = null;
|
|
150
|
+
let eventUnsubscribe = null;
|
|
151
|
+
let routeWatcher = null;
|
|
152
|
+
/**
|
|
153
|
+
* Clean up current step
|
|
154
|
+
*/
|
|
155
|
+
const cleanupCurrentStep = async () => {
|
|
156
|
+
if (eventUnsubscribe) {
|
|
157
|
+
eventUnsubscribe();
|
|
158
|
+
eventUnsubscribe = null;
|
|
159
|
+
}
|
|
160
|
+
if (currentActionHandle && currentActionHandle.isApplied()) {
|
|
161
|
+
await currentActionHandle.revert();
|
|
162
|
+
currentActionHandle = null;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Advance to the next step
|
|
167
|
+
*/
|
|
168
|
+
const advanceToStep = async (nextStepId) => {
|
|
169
|
+
if (isDestroyed)
|
|
170
|
+
return;
|
|
171
|
+
// Clean up current step
|
|
172
|
+
await cleanupCurrentStep();
|
|
173
|
+
if (nextStepId === "end") {
|
|
174
|
+
// Tour complete
|
|
175
|
+
clearTourState();
|
|
176
|
+
context.publishEvent("tour.completed", {
|
|
177
|
+
tourId,
|
|
178
|
+
totalSteps: steps.length,
|
|
179
|
+
});
|
|
180
|
+
isDestroyed = true;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Find next step
|
|
184
|
+
const nextStep = steps.find((s) => s.id === nextStepId);
|
|
185
|
+
if (!nextStep) {
|
|
186
|
+
console.error(`[Tour] Step "${nextStepId}" not found`);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Update state
|
|
190
|
+
state.currentStepId = nextStepId;
|
|
191
|
+
saveTourState(state);
|
|
192
|
+
context.publishEvent("tour.step_changed", {
|
|
193
|
+
tourId,
|
|
194
|
+
previousStepId: currentStep.id,
|
|
195
|
+
nextStepId,
|
|
196
|
+
});
|
|
197
|
+
// If the next step has a different route, let navigation happen
|
|
198
|
+
if (nextStep.route && nextStep.route !== getCurrentRoute()) {
|
|
199
|
+
context.publishEvent("tour.awaiting_navigation", {
|
|
200
|
+
tourId,
|
|
201
|
+
stepId: nextStepId,
|
|
202
|
+
targetRoute: nextStep.route,
|
|
203
|
+
});
|
|
204
|
+
// Tour will resume when page reloads and this executor runs again
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Execute the next step's action
|
|
208
|
+
await executeStep(nextStep);
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* Execute a step's inner action and set up event listeners
|
|
212
|
+
*/
|
|
213
|
+
const executeStep = async (step) => {
|
|
214
|
+
if (isDestroyed)
|
|
215
|
+
return;
|
|
216
|
+
context.publishEvent("tour.step_started", {
|
|
217
|
+
tourId,
|
|
218
|
+
stepId: step.id,
|
|
219
|
+
stepIndex: steps.findIndex((s) => s.id === step.id),
|
|
220
|
+
totalSteps: steps.length,
|
|
221
|
+
});
|
|
222
|
+
// Execute the inner action
|
|
223
|
+
try {
|
|
224
|
+
currentActionHandle = await context.applyAction(step.action);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
console.error(`[Tour] Failed to execute step "${step.id}":`, error);
|
|
228
|
+
context.publishEvent("tour.step_failed", {
|
|
229
|
+
tourId,
|
|
230
|
+
stepId: step.id,
|
|
231
|
+
error: String(error),
|
|
232
|
+
});
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Subscribe to CTA click events if there are transitions defined
|
|
236
|
+
if (step.onAction && context.subscribeEvent) {
|
|
237
|
+
eventUnsubscribe = context.subscribeEvent("action.modal_cta_clicked", (props) => {
|
|
238
|
+
const actionId = props === null || props === void 0 ? void 0 : props.actionId;
|
|
239
|
+
if (actionId && step.onAction) {
|
|
240
|
+
const nextStepId = step.onAction[actionId];
|
|
241
|
+
if (nextStepId) {
|
|
242
|
+
advanceToStep(nextStepId);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
// Also listen for tooltip CTA clicks
|
|
247
|
+
const tooltipUnsubscribe = context.subscribeEvent("action.tooltip_cta_clicked", (props) => {
|
|
248
|
+
const actionId = props === null || props === void 0 ? void 0 : props.actionId;
|
|
249
|
+
if (actionId && step.onAction) {
|
|
250
|
+
const nextStepId = step.onAction[actionId];
|
|
251
|
+
if (nextStepId) {
|
|
252
|
+
advanceToStep(nextStepId);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// Combine unsubscribes
|
|
257
|
+
const originalUnsubscribe = eventUnsubscribe;
|
|
258
|
+
eventUnsubscribe = () => {
|
|
259
|
+
originalUnsubscribe();
|
|
260
|
+
tooltipUnsubscribe();
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
// Set up route change watcher for SPAs
|
|
265
|
+
const setupRouteWatcher = () => {
|
|
266
|
+
let lastPath = getCurrentRoute();
|
|
267
|
+
const checkRoute = () => {
|
|
268
|
+
const currentPath = getCurrentRoute();
|
|
269
|
+
if (currentPath !== lastPath) {
|
|
270
|
+
lastPath = currentPath;
|
|
271
|
+
context.publishEvent("tour.route_changed", {
|
|
272
|
+
tourId,
|
|
273
|
+
newRoute: currentPath,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
// Watch for popstate (back/forward navigation)
|
|
278
|
+
window.addEventListener("popstate", checkRoute);
|
|
279
|
+
// Watch for pushState/replaceState
|
|
280
|
+
const origPushState = history.pushState.bind(history);
|
|
281
|
+
const origReplaceState = history.replaceState.bind(history);
|
|
282
|
+
history.pushState = (...args) => {
|
|
283
|
+
origPushState(...args);
|
|
284
|
+
checkRoute();
|
|
285
|
+
};
|
|
286
|
+
history.replaceState = (...args) => {
|
|
287
|
+
origReplaceState(...args);
|
|
288
|
+
checkRoute();
|
|
289
|
+
};
|
|
290
|
+
return () => {
|
|
291
|
+
window.removeEventListener("popstate", checkRoute);
|
|
292
|
+
history.pushState = origPushState;
|
|
293
|
+
history.replaceState = origReplaceState;
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
routeWatcher = setupRouteWatcher();
|
|
297
|
+
// Publish tour started/resumed event
|
|
298
|
+
if (!isResumingTour) {
|
|
299
|
+
context.publishEvent("tour.started", {
|
|
300
|
+
tourId,
|
|
301
|
+
totalSteps: steps.length,
|
|
302
|
+
startStepId: state.currentStepId,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
context.publishEvent("tour.resumed", {
|
|
307
|
+
tourId,
|
|
308
|
+
stepId: state.currentStepId,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
// Execute the current step
|
|
312
|
+
await executeStep(currentStep);
|
|
313
|
+
// Create cleanup function
|
|
314
|
+
const cleanup = async () => {
|
|
315
|
+
isDestroyed = true;
|
|
316
|
+
// Remove from active tours
|
|
317
|
+
activeTours.delete(tourId);
|
|
318
|
+
await cleanupCurrentStep();
|
|
319
|
+
if (routeWatcher) {
|
|
320
|
+
routeWatcher();
|
|
321
|
+
}
|
|
322
|
+
// Don't clear tour state on cleanup - allow resume
|
|
323
|
+
context.publishEvent("tour.paused", {
|
|
324
|
+
tourId,
|
|
325
|
+
stepId: state.currentStepId,
|
|
326
|
+
});
|
|
327
|
+
};
|
|
328
|
+
// Register this tour as active
|
|
329
|
+
activeTours.set(tourId, { cleanup });
|
|
330
|
+
return { cleanup };
|
|
331
|
+
};
|
|
332
|
+
//# sourceMappingURL=tour.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tour.js","sourceRoot":"","sources":["../../../src/actions/executors/tour.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actions Module
|
|
3
|
+
*
|
|
4
|
+
* Unified execution layer for interventions (highlight, tooltip, badge, DOM modifications).
|
|
5
|
+
*/
|
|
6
|
+
export { createActionEngine } from "./ActionEngine";
|
|
7
|
+
export type { ActionEngine, ActionEngineOptions, ActionEngineExecutorRegistry, ActionHandle, BatchActionHandle, ActiveAction, ActionStep, ActionKind, HighlightAction, PulseAction, BadgeAction, TooltipAction, InsertHtmlAction, SetTextAction, SetAttrAction, AddClassAction, RemoveClassAction, SetStyleAction, MountWidgetAction, ScrollToAction, NavigateAction, HighlightStyle, BadgePosition, TooltipContent, TooltipTrigger, InsertPosition, WidgetConfig, ActionState, ValidationResult, ValidationError, ValidationWarning, ExecutorResult, ExecutorContext, ExecutorCleanup, ExecutorUpdate, ActionExecutor, } from "./types";
|
|
8
|
+
export { validateAction, validateActions } from "./validation";
|
|
9
|
+
export { ExecutorRegistry, executorRegistry, getExecutor, hasExecutor, } from "./executors";
|
|
10
|
+
export type { ExecutorRegistration } from "./executors";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actions Module
|
|
3
|
+
*
|
|
4
|
+
* Unified execution layer for interventions (highlight, tooltip, badge, DOM modifications).
|
|
5
|
+
*/
|
|
6
|
+
// Main factory
|
|
7
|
+
export { createActionEngine } from "./ActionEngine";
|
|
8
|
+
// Validation
|
|
9
|
+
export { validateAction, validateActions } from "./validation";
|
|
10
|
+
// Executors (for advanced usage)
|
|
11
|
+
export { ExecutorRegistry, executorRegistry, getExecutor, hasExecutor, } from "./executors";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAqDpD,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D,iCAAiC;AACjC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC"}
|