@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.
Files changed (122) hide show
  1. package/CAPABILITIES.md +630 -463
  2. package/README.md +285 -62
  3. package/dist/RuntimeProvider.d.ts +51 -0
  4. package/dist/RuntimeProvider.js +114 -0
  5. package/dist/RuntimeProvider.js.map +1 -0
  6. package/dist/SmartCanvasApp.d.ts +9 -3
  7. package/dist/SmartCanvasApp.js +36 -38
  8. package/dist/SmartCanvasApp.js.map +1 -1
  9. package/dist/actions/ActionEngine.d.ts +11 -0
  10. package/dist/actions/ActionEngine.js +274 -0
  11. package/dist/actions/ActionEngine.js.map +1 -0
  12. package/dist/actions/executors/index.d.ts +118 -0
  13. package/dist/actions/executors/index.js +242 -0
  14. package/dist/actions/executors/index.js.map +1 -0
  15. package/dist/actions/executors/tour.d.ts +18 -0
  16. package/dist/actions/executors/tour.js +332 -0
  17. package/dist/actions/executors/tour.js.map +1 -0
  18. package/dist/actions/index.d.ts +10 -0
  19. package/dist/actions/index.js +12 -0
  20. package/dist/actions/index.js.map +1 -0
  21. package/dist/actions/types.d.ts +399 -0
  22. package/dist/actions/types.js +8 -0
  23. package/dist/actions/types.js.map +1 -0
  24. package/dist/actions/validation.d.ts +14 -0
  25. package/dist/actions/validation.js +603 -0
  26. package/dist/actions/validation.js.map +1 -0
  27. package/dist/api.d.ts +32 -18
  28. package/dist/api.js +56 -39
  29. package/dist/api.js.map +1 -1
  30. package/dist/apps/AppContext.d.ts +31 -0
  31. package/dist/apps/AppContext.js +93 -0
  32. package/dist/apps/AppContext.js.map +1 -0
  33. package/dist/apps/AppLoader.d.ts +84 -0
  34. package/dist/apps/AppLoader.js +250 -0
  35. package/dist/apps/AppLoader.js.map +1 -0
  36. package/dist/apps/AppRegistry.d.ts +102 -0
  37. package/dist/apps/AppRegistry.js +317 -0
  38. package/dist/apps/AppRegistry.js.map +1 -0
  39. package/dist/apps/examples/gamification-app.example.d.ts +305 -0
  40. package/dist/apps/examples/gamification-app.example.js +329 -0
  41. package/dist/apps/examples/gamification-app.example.js.map +1 -0
  42. package/dist/apps/index.d.ts +18 -0
  43. package/dist/apps/index.js +26 -0
  44. package/dist/apps/index.js.map +1 -0
  45. package/dist/apps/types.d.ts +231 -0
  46. package/dist/apps/types.js +8 -0
  47. package/dist/apps/types.js.map +1 -0
  48. package/dist/bootstrap.d.ts +24 -0
  49. package/dist/bootstrap.js +133 -33
  50. package/dist/bootstrap.js.map +1 -1
  51. package/dist/components/ShadowCanvasOverlay.js +36 -9
  52. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  53. package/dist/components/TileCard.js +37 -18
  54. package/dist/components/TileCard.js.map +1 -1
  55. package/dist/context/schema.d.ts +16 -16
  56. package/dist/decisions/schema.d.ts +96 -96
  57. package/dist/earlyPatcher.d.ts +8 -20
  58. package/dist/earlyPatcher.js +13 -62
  59. package/dist/earlyPatcher.js.map +1 -1
  60. package/dist/editorLoader.d.ts +2 -0
  61. package/dist/editorLoader.js +46 -7
  62. package/dist/editorLoader.js.map +1 -1
  63. package/dist/events/normalizers/posthog.d.ts +24 -0
  64. package/dist/events/normalizers/posthog.js.map +1 -1
  65. package/dist/events/schema.d.ts +8 -8
  66. package/dist/events/types.d.ts +6 -0
  67. package/dist/events/types.js +8 -0
  68. package/dist/events/types.js.map +1 -1
  69. package/dist/hooks/useCanvasOverlays.d.ts +4 -1
  70. package/dist/hooks/useCanvasOverlays.js +53 -6
  71. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  72. package/dist/hooks/useShadowCanvasConfig.d.ts +3 -7
  73. package/dist/hooks/useShadowCanvasConfig.js +2 -3
  74. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  75. package/dist/index.d.ts +5 -0
  76. package/dist/index.js +10 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/overlays/schema.d.ts +153 -153
  79. package/dist/runtime.d.ts +24 -0
  80. package/dist/runtime.js +75 -1
  81. package/dist/runtime.js.map +1 -1
  82. package/dist/smart-canvas.esm.js +162 -55
  83. package/dist/smart-canvas.esm.js.map +4 -4
  84. package/dist/smart-canvas.js +21133 -17957
  85. package/dist/smart-canvas.js.map +4 -4
  86. package/dist/smart-canvas.min.js +162 -55
  87. package/dist/smart-canvas.min.js.map +4 -4
  88. package/dist/store/example.d.ts +1 -0
  89. package/dist/store/example.js +43 -0
  90. package/dist/store/example.js.map +1 -0
  91. package/dist/store/mini-effector.d.ts +46 -0
  92. package/dist/store/mini-effector.js +90 -0
  93. package/dist/store/mini-effector.js.map +1 -0
  94. package/dist/surfaces/Surfaces.d.ts +11 -0
  95. package/dist/surfaces/Surfaces.js +361 -0
  96. package/dist/surfaces/Surfaces.js.map +1 -0
  97. package/dist/surfaces/index.d.ts +9 -0
  98. package/dist/surfaces/index.js +12 -0
  99. package/dist/surfaces/index.js.map +1 -0
  100. package/dist/surfaces/positioning.d.ts +50 -0
  101. package/dist/surfaces/positioning.js +231 -0
  102. package/dist/surfaces/positioning.js.map +1 -0
  103. package/dist/surfaces/types.d.ts +167 -0
  104. package/dist/surfaces/types.js +23 -0
  105. package/dist/surfaces/types.js.map +1 -0
  106. package/dist/telemetry/adapters/posthog.d.ts +6 -0
  107. package/dist/telemetry/adapters/posthog.js +9 -0
  108. package/dist/telemetry/adapters/posthog.js.map +1 -1
  109. package/dist/types-only.d.ts +32 -0
  110. package/dist/types-only.js +11 -0
  111. package/dist/types-only.js.map +1 -0
  112. package/dist/types.d.ts +26 -14
  113. package/dist/types.js +1 -1
  114. package/dist/types.js.map +1 -1
  115. package/dist/widgets/WidgetRegistry.d.ts +139 -0
  116. package/dist/widgets/WidgetRegistry.js +182 -0
  117. package/dist/widgets/WidgetRegistry.js.map +1 -0
  118. package/dist/widgets/index.d.ts +7 -0
  119. package/dist/widgets/index.js +7 -0
  120. package/dist/widgets/index.js.map +1 -0
  121. package/package.json +13 -3
  122. package/schema/canvas-config.schema.json +444 -254
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Action Validation
3
+ *
4
+ * Validates action steps before execution.
5
+ */
6
+ import { hasExecutor } from "./executors";
7
+ /** Known action kinds */
8
+ const VALID_KINDS = [
9
+ "overlays:highlight",
10
+ "overlays:pulse",
11
+ "overlays:badge",
12
+ "overlays:tooltip",
13
+ "overlays:modal",
14
+ "content:insertHtml",
15
+ "content:setText",
16
+ "content:setAttr",
17
+ "content:addClass",
18
+ "content:removeClass",
19
+ "content:setStyle",
20
+ "core:mountWidget",
21
+ "core:wait",
22
+ "core:sequence",
23
+ "core:parallel",
24
+ "core:tour",
25
+ "navigation:scrollTo",
26
+ "navigation:navigate",
27
+ ];
28
+ /** Dangerous attribute names that should not be set */
29
+ const DANGEROUS_ATTRS = new Set([
30
+ "onclick",
31
+ "onerror",
32
+ "onload",
33
+ "onmouseover",
34
+ "onfocus",
35
+ "onblur",
36
+ "onchange",
37
+ "onsubmit",
38
+ "onkeydown",
39
+ "onkeyup",
40
+ "onkeypress",
41
+ ]);
42
+ /** Maximum HTML content length */
43
+ const MAX_HTML_LENGTH = 50000;
44
+ /** Maximum style count */
45
+ const MAX_STYLE_COUNT = 50;
46
+ /**
47
+ * Validate an action step.
48
+ */
49
+ export function validateAction(action) {
50
+ const errors = [];
51
+ const warnings = [];
52
+ // Check action has a kind
53
+ if (!action || typeof action !== "object") {
54
+ errors.push({
55
+ code: "INVALID_ACTION",
56
+ message: "Action must be an object",
57
+ });
58
+ return { valid: false, errors, warnings };
59
+ }
60
+ const kind = action.kind;
61
+ // Check kind is valid
62
+ if (!kind || typeof kind !== "string") {
63
+ errors.push({
64
+ code: "MISSING_KIND",
65
+ message: "Action must have a 'kind' property",
66
+ });
67
+ return { valid: false, errors, warnings };
68
+ }
69
+ if (!VALID_KINDS.includes(kind)) {
70
+ errors.push({
71
+ code: "UNKNOWN_KIND",
72
+ message: `Unknown action kind: ${kind}`,
73
+ field: "kind",
74
+ });
75
+ return { valid: false, errors, warnings };
76
+ }
77
+ // Check executor exists
78
+ if (!hasExecutor(kind) && kind !== "core:mountWidget") {
79
+ errors.push({
80
+ code: "NO_EXECUTOR",
81
+ message: `No executor registered for action kind: ${kind}`,
82
+ field: "kind",
83
+ });
84
+ }
85
+ // Kind-specific validation
86
+ switch (kind) {
87
+ case "overlays:highlight":
88
+ case "overlays:pulse":
89
+ case "navigation:scrollTo":
90
+ validateAnchorAction(action, errors, warnings);
91
+ break;
92
+ case "overlays:badge":
93
+ validateAnchorAction(action, errors, warnings);
94
+ validateBadgeAction(action, errors, warnings);
95
+ break;
96
+ case "overlays:tooltip":
97
+ validateAnchorAction(action, errors, warnings);
98
+ validateTooltipAction(action, errors, warnings);
99
+ break;
100
+ case "overlays:modal":
101
+ validateModalAction(action, errors, warnings);
102
+ break;
103
+ case "content:insertHtml":
104
+ validateAnchorAction(action, errors, warnings);
105
+ validateInsertHtmlAction(action, errors, warnings);
106
+ break;
107
+ case "content:setText":
108
+ validateAnchorAction(action, errors, warnings);
109
+ validateSetTextAction(action, errors, warnings);
110
+ break;
111
+ case "content:setAttr":
112
+ validateAnchorAction(action, errors, warnings);
113
+ validateSetAttrAction(action, errors, warnings);
114
+ break;
115
+ case "content:addClass":
116
+ case "content:removeClass":
117
+ validateAnchorAction(action, errors, warnings);
118
+ validateClassAction(action, errors, warnings);
119
+ break;
120
+ case "content:setStyle":
121
+ validateAnchorAction(action, errors, warnings);
122
+ validateSetStyleAction(action, errors, warnings);
123
+ break;
124
+ case "core:mountWidget":
125
+ validateMountWidgetAction(action, errors, warnings);
126
+ break;
127
+ case "core:wait":
128
+ validateWaitAction(action, errors, warnings);
129
+ break;
130
+ case "core:sequence":
131
+ validateSequenceAction(action, errors, warnings);
132
+ break;
133
+ case "core:parallel":
134
+ validateParallelAction(action, errors, warnings);
135
+ break;
136
+ case "core:tour":
137
+ validateTourAction(action, errors, warnings);
138
+ break;
139
+ case "navigation:navigate":
140
+ validateNavigateAction(action, errors, warnings);
141
+ break;
142
+ }
143
+ return {
144
+ valid: errors.length === 0,
145
+ errors,
146
+ warnings,
147
+ };
148
+ }
149
+ function validateAnchorAction(action, errors, warnings) {
150
+ if (!action.anchorId || typeof action.anchorId !== "string") {
151
+ errors.push({
152
+ code: "MISSING_ANCHOR_ID",
153
+ message: "Action requires an 'anchorId' property",
154
+ field: "anchorId",
155
+ });
156
+ }
157
+ else if (action.anchorId.length > 200) {
158
+ warnings.push({
159
+ code: "LONG_ANCHOR_ID",
160
+ message: "Anchor ID is unusually long",
161
+ suggestion: "Consider using a shorter, more descriptive ID",
162
+ });
163
+ }
164
+ }
165
+ function validateBadgeAction(action, errors, warnings) {
166
+ if (!action.content || typeof action.content !== "string") {
167
+ errors.push({
168
+ code: "MISSING_CONTENT",
169
+ message: "Badge action requires 'content' property",
170
+ field: "content",
171
+ });
172
+ }
173
+ else if (action.content.length > 100) {
174
+ warnings.push({
175
+ code: "LONG_BADGE_CONTENT",
176
+ message: "Badge content is quite long",
177
+ suggestion: "Keep badge content short (under 100 characters)",
178
+ });
179
+ }
180
+ }
181
+ function validateTooltipAction(action, errors, warnings) {
182
+ if (!action.content || typeof action.content !== "object") {
183
+ errors.push({
184
+ code: "MISSING_CONTENT",
185
+ message: "Tooltip action requires 'content' object",
186
+ field: "content",
187
+ });
188
+ return;
189
+ }
190
+ if (!action.content.body || typeof action.content.body !== "string") {
191
+ errors.push({
192
+ code: "MISSING_BODY",
193
+ message: "Tooltip content requires 'body' property",
194
+ field: "content.body",
195
+ });
196
+ }
197
+ }
198
+ function validateInsertHtmlAction(action, errors, warnings) {
199
+ if (!action.html || typeof action.html !== "string") {
200
+ errors.push({
201
+ code: "MISSING_HTML",
202
+ message: "insertHtml action requires 'html' property",
203
+ field: "html",
204
+ });
205
+ }
206
+ else if (action.html.length > MAX_HTML_LENGTH) {
207
+ errors.push({
208
+ code: "HTML_TOO_LONG",
209
+ message: `HTML content exceeds maximum length of ${MAX_HTML_LENGTH}`,
210
+ field: "html",
211
+ });
212
+ }
213
+ const validPositions = ["before", "after", "prepend", "append", "replace"];
214
+ if (!action.position || !validPositions.includes(action.position)) {
215
+ errors.push({
216
+ code: "INVALID_POSITION",
217
+ message: `Position must be one of: ${validPositions.join(", ")}`,
218
+ field: "position",
219
+ });
220
+ }
221
+ }
222
+ function validateSetTextAction(action, errors, warnings) {
223
+ if (action.text === undefined || action.text === null) {
224
+ errors.push({
225
+ code: "MISSING_TEXT",
226
+ message: "setText action requires 'text' property",
227
+ field: "text",
228
+ });
229
+ }
230
+ }
231
+ function validateSetAttrAction(action, errors, warnings) {
232
+ if (!action.attr || typeof action.attr !== "string") {
233
+ errors.push({
234
+ code: "MISSING_ATTR",
235
+ message: "setAttr action requires 'attr' property",
236
+ field: "attr",
237
+ });
238
+ }
239
+ else if (DANGEROUS_ATTRS.has(action.attr.toLowerCase()) || action.attr.toLowerCase().startsWith("on")) {
240
+ errors.push({
241
+ code: "DANGEROUS_ATTR",
242
+ message: `Event handler attributes are not allowed: ${action.attr}`,
243
+ field: "attr",
244
+ });
245
+ }
246
+ if (action.value === undefined || action.value === null) {
247
+ errors.push({
248
+ code: "MISSING_VALUE",
249
+ message: "setAttr action requires 'value' property",
250
+ field: "value",
251
+ });
252
+ }
253
+ }
254
+ function validateClassAction(action, errors, warnings) {
255
+ if (!action.className || typeof action.className !== "string") {
256
+ errors.push({
257
+ code: "MISSING_CLASS_NAME",
258
+ message: "Class action requires 'className' property",
259
+ field: "className",
260
+ });
261
+ }
262
+ else if (!/^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(action.className)) {
263
+ warnings.push({
264
+ code: "INVALID_CLASS_NAME",
265
+ message: "Class name contains unusual characters",
266
+ suggestion: "Use alphanumeric characters, hyphens, and underscores",
267
+ });
268
+ }
269
+ }
270
+ function validateSetStyleAction(action, errors, warnings) {
271
+ if (!action.styles || typeof action.styles !== "object") {
272
+ errors.push({
273
+ code: "MISSING_STYLES",
274
+ message: "setStyle action requires 'styles' object",
275
+ field: "styles",
276
+ });
277
+ }
278
+ else {
279
+ const styleCount = Object.keys(action.styles).length;
280
+ if (styleCount > MAX_STYLE_COUNT) {
281
+ errors.push({
282
+ code: "TOO_MANY_STYLES",
283
+ message: `Too many styles (${styleCount}). Maximum is ${MAX_STYLE_COUNT}`,
284
+ field: "styles",
285
+ });
286
+ }
287
+ // Check for potentially dangerous style values
288
+ for (const [prop, value] of Object.entries(action.styles)) {
289
+ if (typeof value === "string" && value.includes("expression(")) {
290
+ errors.push({
291
+ code: "DANGEROUS_STYLE",
292
+ message: `Style expressions are not allowed: ${prop}`,
293
+ field: `styles.${prop}`,
294
+ });
295
+ }
296
+ }
297
+ }
298
+ }
299
+ function validateMountWidgetAction(action, errors, warnings) {
300
+ if (!action.slot || typeof action.slot !== "string") {
301
+ errors.push({
302
+ code: "MISSING_SLOT",
303
+ message: "mountWidget action requires 'slot' property",
304
+ field: "slot",
305
+ });
306
+ }
307
+ if (!action.widget || typeof action.widget !== "object") {
308
+ errors.push({
309
+ code: "MISSING_WIDGET",
310
+ message: "mountWidget action requires 'widget' object",
311
+ field: "widget",
312
+ });
313
+ }
314
+ else if (!action.widget.widgetId || typeof action.widget.widgetId !== "string") {
315
+ errors.push({
316
+ code: "MISSING_WIDGET_ID",
317
+ message: "Widget must have a 'widgetId' property",
318
+ field: "widget.widgetId",
319
+ });
320
+ }
321
+ }
322
+ function validateWaitAction(action, errors, warnings) {
323
+ if (action.durationMs === undefined && !action.event) {
324
+ errors.push({
325
+ code: "MISSING_WAIT_CONFIG",
326
+ message: "wait action requires either 'durationMs' or 'event' property",
327
+ });
328
+ }
329
+ if (action.durationMs !== undefined && action.durationMs < 0) {
330
+ errors.push({
331
+ code: "INVALID_DURATION",
332
+ message: "durationMs must be a positive number",
333
+ field: "durationMs",
334
+ });
335
+ }
336
+ if (action.event !== undefined && typeof action.event !== "string") {
337
+ errors.push({
338
+ code: "INVALID_EVENT",
339
+ message: "event must be a string",
340
+ field: "event",
341
+ });
342
+ }
343
+ }
344
+ function validateSequenceAction(action, errors, warnings) {
345
+ if (!action.actions || !Array.isArray(action.actions)) {
346
+ errors.push({
347
+ code: "MISSING_ACTIONS",
348
+ message: "sequence action requires 'actions' array",
349
+ field: "actions",
350
+ });
351
+ return;
352
+ }
353
+ if (action.actions.length === 0) {
354
+ warnings.push({
355
+ code: "EMPTY_SEQUENCE",
356
+ message: "sequence has no actions",
357
+ suggestion: "Add at least one action to the sequence",
358
+ });
359
+ }
360
+ // Recursively validate nested actions
361
+ for (let i = 0; i < action.actions.length; i++) {
362
+ const result = validateAction(action.actions[i]);
363
+ for (const error of result.errors) {
364
+ errors.push({
365
+ ...error,
366
+ field: `actions[${i}]${error.field ? `.${error.field}` : ""}`,
367
+ });
368
+ }
369
+ for (const warning of result.warnings) {
370
+ warnings.push(warning);
371
+ }
372
+ }
373
+ }
374
+ function validateParallelAction(action, errors, warnings) {
375
+ if (!action.actions || !Array.isArray(action.actions)) {
376
+ errors.push({
377
+ code: "MISSING_ACTIONS",
378
+ message: "parallel action requires 'actions' array",
379
+ field: "actions",
380
+ });
381
+ return;
382
+ }
383
+ if (action.actions.length === 0) {
384
+ warnings.push({
385
+ code: "EMPTY_PARALLEL",
386
+ message: "parallel has no actions",
387
+ suggestion: "Add at least one action to the parallel group",
388
+ });
389
+ }
390
+ if (action.waitFor && !["all", "any"].includes(action.waitFor)) {
391
+ errors.push({
392
+ code: "INVALID_WAIT_FOR",
393
+ message: "waitFor must be 'all' or 'any'",
394
+ field: "waitFor",
395
+ });
396
+ }
397
+ // Recursively validate nested actions
398
+ for (let i = 0; i < action.actions.length; i++) {
399
+ const result = validateAction(action.actions[i]);
400
+ for (const error of result.errors) {
401
+ errors.push({
402
+ ...error,
403
+ field: `actions[${i}]${error.field ? `.${error.field}` : ""}`,
404
+ });
405
+ }
406
+ for (const warning of result.warnings) {
407
+ warnings.push(warning);
408
+ }
409
+ }
410
+ }
411
+ function validateNavigateAction(action, errors, warnings) {
412
+ if (!action.url || typeof action.url !== "string") {
413
+ errors.push({
414
+ code: "MISSING_URL",
415
+ message: "navigate action requires 'url' property",
416
+ field: "url",
417
+ });
418
+ }
419
+ else {
420
+ const url = action.url.trim().toLowerCase();
421
+ if (url.startsWith("javascript:")) {
422
+ errors.push({
423
+ code: "DANGEROUS_URL",
424
+ message: "javascript: URLs are not allowed",
425
+ field: "url",
426
+ });
427
+ }
428
+ // Warn about data: URLs
429
+ if (url.startsWith("data:")) {
430
+ warnings.push({
431
+ code: "DATA_URL",
432
+ message: "data: URLs may have limited support",
433
+ suggestion: "Consider using a regular URL instead",
434
+ });
435
+ }
436
+ }
437
+ }
438
+ function validateModalAction(action, errors, warnings) {
439
+ if (!action.content || typeof action.content !== "object") {
440
+ errors.push({
441
+ code: "MISSING_CONTENT",
442
+ message: "Modal action requires 'content' object",
443
+ field: "content",
444
+ });
445
+ return;
446
+ }
447
+ if (!action.content.body || typeof action.content.body !== "string") {
448
+ errors.push({
449
+ code: "MISSING_BODY",
450
+ message: "Modal content requires 'body' property",
451
+ field: "content.body",
452
+ });
453
+ }
454
+ if (action.size && !["sm", "md", "lg"].includes(action.size)) {
455
+ errors.push({
456
+ code: "INVALID_SIZE",
457
+ message: "Modal size must be 'sm', 'md', or 'lg'",
458
+ field: "size",
459
+ });
460
+ }
461
+ if (action.ctaButtons) {
462
+ if (!Array.isArray(action.ctaButtons)) {
463
+ errors.push({
464
+ code: "INVALID_CTA_BUTTONS",
465
+ message: "ctaButtons must be an array",
466
+ field: "ctaButtons",
467
+ });
468
+ }
469
+ else {
470
+ for (let i = 0; i < action.ctaButtons.length; i++) {
471
+ const btn = action.ctaButtons[i];
472
+ if (!btn.label || typeof btn.label !== "string") {
473
+ errors.push({
474
+ code: "MISSING_BUTTON_LABEL",
475
+ message: `CTA button at index ${i} requires 'label' property`,
476
+ field: `ctaButtons[${i}].label`,
477
+ });
478
+ }
479
+ if (!btn.actionId || typeof btn.actionId !== "string") {
480
+ errors.push({
481
+ code: "MISSING_BUTTON_ACTION_ID",
482
+ message: `CTA button at index ${i} requires 'actionId' property`,
483
+ field: `ctaButtons[${i}].actionId`,
484
+ });
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ function validateTourAction(action, errors, warnings) {
491
+ if (!action.tourId || typeof action.tourId !== "string") {
492
+ errors.push({
493
+ code: "MISSING_TOUR_ID",
494
+ message: "Tour action requires 'tourId' property",
495
+ field: "tourId",
496
+ });
497
+ }
498
+ if (!action.steps || !Array.isArray(action.steps)) {
499
+ errors.push({
500
+ code: "MISSING_STEPS",
501
+ message: "Tour action requires 'steps' array",
502
+ field: "steps",
503
+ });
504
+ return;
505
+ }
506
+ if (action.steps.length === 0) {
507
+ errors.push({
508
+ code: "EMPTY_STEPS",
509
+ message: "Tour must have at least one step",
510
+ field: "steps",
511
+ });
512
+ }
513
+ const stepIds = new Set();
514
+ for (let i = 0; i < action.steps.length; i++) {
515
+ const step = action.steps[i];
516
+ if (!step.id || typeof step.id !== "string") {
517
+ errors.push({
518
+ code: "MISSING_STEP_ID",
519
+ message: `Step at index ${i} requires 'id' property`,
520
+ field: `steps[${i}].id`,
521
+ });
522
+ }
523
+ else {
524
+ if (stepIds.has(step.id)) {
525
+ errors.push({
526
+ code: "DUPLICATE_STEP_ID",
527
+ message: `Duplicate step ID: ${step.id}`,
528
+ field: `steps[${i}].id`,
529
+ });
530
+ }
531
+ stepIds.add(step.id);
532
+ }
533
+ if (!step.action) {
534
+ errors.push({
535
+ code: "MISSING_STEP_ACTION",
536
+ message: `Step at index ${i} requires 'action' property`,
537
+ field: `steps[${i}].action`,
538
+ });
539
+ }
540
+ else {
541
+ // Recursively validate nested action
542
+ const result = validateAction(step.action);
543
+ for (const error of result.errors) {
544
+ errors.push({
545
+ ...error,
546
+ field: `steps[${i}].action${error.field ? `.${error.field}` : ""}`,
547
+ });
548
+ }
549
+ for (const warning of result.warnings) {
550
+ warnings.push(warning);
551
+ }
552
+ }
553
+ // Validate onAction references
554
+ if (step.onAction) {
555
+ for (const [actionId, targetStepId] of Object.entries(step.onAction)) {
556
+ if (targetStepId !== "end" && !action.steps.some((s) => s.id === targetStepId)) {
557
+ warnings.push({
558
+ code: "UNKNOWN_TARGET_STEP",
559
+ message: `Step "${step.id}" references unknown target step: ${targetStepId}`,
560
+ suggestion: `Make sure step "${targetStepId}" exists in the tour`,
561
+ });
562
+ }
563
+ }
564
+ }
565
+ }
566
+ }
567
+ /**
568
+ * Validate a batch of actions.
569
+ */
570
+ export function validateActions(actions) {
571
+ const errors = [];
572
+ const warnings = [];
573
+ if (!Array.isArray(actions)) {
574
+ errors.push({
575
+ code: "INVALID_ACTIONS",
576
+ message: "Actions must be an array",
577
+ });
578
+ return { valid: false, errors, warnings };
579
+ }
580
+ for (let i = 0; i < actions.length; i++) {
581
+ const result = validateAction(actions[i]);
582
+ for (const error of result.errors) {
583
+ errors.push({
584
+ ...error,
585
+ field: error.field ? `[${i}].${error.field}` : `[${i}]`,
586
+ });
587
+ }
588
+ for (const warning of result.warnings) {
589
+ warnings.push({
590
+ ...warning,
591
+ suggestion: warning.suggestion
592
+ ? `Action ${i}: ${warning.suggestion}`
593
+ : undefined,
594
+ });
595
+ }
596
+ }
597
+ return {
598
+ valid: errors.length === 0,
599
+ errors,
600
+ warnings,
601
+ };
602
+ }
603
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/actions/validation.ts"],"names":[],"mappings":"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"}