@holoscript/core 1.0.0-alpha.2 → 2.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.
Files changed (74) hide show
  1. package/package.json +2 -2
  2. package/src/HoloScript2DParser.js +227 -0
  3. package/src/HoloScript2DParser.ts +5 -0
  4. package/src/HoloScriptCodeParser.js +1102 -0
  5. package/src/HoloScriptCodeParser.ts +145 -20
  6. package/src/HoloScriptDebugger.js +458 -0
  7. package/src/HoloScriptParser.js +338 -0
  8. package/src/HoloScriptPlusParser.js +371 -0
  9. package/src/HoloScriptPlusParser.ts +543 -0
  10. package/src/HoloScriptRuntime.js +1399 -0
  11. package/src/HoloScriptRuntime.test.js +351 -0
  12. package/src/HoloScriptRuntime.ts +17 -3
  13. package/src/HoloScriptTypeChecker.js +356 -0
  14. package/src/__tests__/GraphicsServices.test.js +357 -0
  15. package/src/__tests__/GraphicsServices.test.ts +427 -0
  16. package/src/__tests__/HoloScriptPlusParser.test.js +317 -0
  17. package/src/__tests__/HoloScriptPlusParser.test.ts +392 -0
  18. package/src/__tests__/integration.test.js +336 -0
  19. package/src/__tests__/performance.bench.js +218 -0
  20. package/src/__tests__/type-checker.test.js +60 -0
  21. package/src/__tests__/type-checker.test.ts +73 -0
  22. package/src/index.js +217 -0
  23. package/src/index.ts +158 -18
  24. package/src/interop/Interoperability.js +413 -0
  25. package/src/interop/Interoperability.ts +494 -0
  26. package/src/logger.js +42 -0
  27. package/src/parser/EnhancedParser.js +205 -0
  28. package/src/parser/EnhancedParser.ts +251 -0
  29. package/src/parser/HoloScriptPlusParser.js +928 -0
  30. package/src/parser/HoloScriptPlusParser.ts +1089 -0
  31. package/src/runtime/HoloScriptPlusRuntime.js +674 -0
  32. package/src/runtime/HoloScriptPlusRuntime.ts +861 -0
  33. package/src/runtime/PerformanceTelemetry.js +323 -0
  34. package/src/runtime/PerformanceTelemetry.ts +467 -0
  35. package/src/runtime/RuntimeOptimization.js +361 -0
  36. package/src/runtime/RuntimeOptimization.ts +416 -0
  37. package/src/services/HololandGraphicsPipelineService.js +506 -0
  38. package/src/services/HololandGraphicsPipelineService.ts +662 -0
  39. package/src/services/PlatformPerformanceOptimizer.js +356 -0
  40. package/src/services/PlatformPerformanceOptimizer.ts +503 -0
  41. package/src/state/ReactiveState.js +427 -0
  42. package/src/state/ReactiveState.ts +572 -0
  43. package/src/tools/DeveloperExperience.js +376 -0
  44. package/src/tools/DeveloperExperience.ts +438 -0
  45. package/src/traits/AIDriverTrait.js +322 -0
  46. package/src/traits/AIDriverTrait.test.js +329 -0
  47. package/src/traits/AIDriverTrait.test.ts +357 -0
  48. package/src/traits/AIDriverTrait.ts +474 -0
  49. package/src/traits/LightingTrait.js +313 -0
  50. package/src/traits/LightingTrait.test.js +410 -0
  51. package/src/traits/LightingTrait.test.ts +462 -0
  52. package/src/traits/LightingTrait.ts +505 -0
  53. package/src/traits/MaterialTrait.js +194 -0
  54. package/src/traits/MaterialTrait.test.js +286 -0
  55. package/src/traits/MaterialTrait.test.ts +329 -0
  56. package/src/traits/MaterialTrait.ts +324 -0
  57. package/src/traits/RenderingTrait.js +356 -0
  58. package/src/traits/RenderingTrait.test.js +363 -0
  59. package/src/traits/RenderingTrait.test.ts +427 -0
  60. package/src/traits/RenderingTrait.ts +555 -0
  61. package/src/traits/VRTraitSystem.js +740 -0
  62. package/src/traits/VRTraitSystem.ts +1040 -0
  63. package/src/traits/VoiceInputTrait.js +284 -0
  64. package/src/traits/VoiceInputTrait.test.js +226 -0
  65. package/src/traits/VoiceInputTrait.test.ts +252 -0
  66. package/src/traits/VoiceInputTrait.ts +401 -0
  67. package/src/types/AdvancedTypeSystem.js +226 -0
  68. package/src/types/AdvancedTypeSystem.ts +494 -0
  69. package/src/types/HoloScriptPlus.d.ts +853 -0
  70. package/src/types.js +6 -0
  71. package/src/types.ts +96 -1
  72. package/tsconfig.json +1 -1
  73. package/tsup.config.d.ts +2 -0
  74. package/tsup.config.js +18 -0
@@ -0,0 +1,853 @@
1
+ /**
2
+ * HoloScript+ Type Definitions
3
+ *
4
+ * Enhanced HoloScript with VR interactions, state management, and TypeScript interop.
5
+ * Backward compatible with original HoloScript - new features are opt-in via @ directives.
6
+ *
7
+ * uaa2-service maintains its own evolved implementation for service-level enhancements.
8
+ * Core baseline: @holoscript/core
9
+ *
10
+ * @version 1.0.0
11
+ * @license MIT
12
+ */
13
+
14
+ // =============================================================================
15
+ // CORE TYPES
16
+ // =============================================================================
17
+
18
+ export type Vector3 = [number, number, number];
19
+ export type Vector2 = [number, number];
20
+ export type Color = string; // Hex color like "#ff0000" or named colors
21
+ export type Duration = `${number}${'ms' | 's' | 'm'}`;
22
+
23
+ export interface Transform {
24
+ position: Vector3;
25
+ rotation?: Vector3;
26
+ scale?: Vector3 | number;
27
+ }
28
+
29
+ // =============================================================================
30
+ // VR INTERACTION TYPES
31
+ // =============================================================================
32
+
33
+ /**
34
+ * Hand reference for VR interactions
35
+ */
36
+ export interface VRHand {
37
+ id: 'left' | 'right';
38
+ position: Vector3;
39
+ rotation: Vector3;
40
+ velocity: Vector3;
41
+ grip: number; // 0-1 grip strength
42
+ trigger: number; // 0-1 trigger pressure
43
+ }
44
+
45
+ /**
46
+ * Velocity data for throw calculations
47
+ */
48
+ export interface ThrowVelocity {
49
+ direction: Vector3;
50
+ magnitude: number;
51
+ angularVelocity: Vector3;
52
+ }
53
+
54
+ /**
55
+ * Collision event data
56
+ */
57
+ export interface CollisionEvent {
58
+ target: HSPlusNode;
59
+ point: Vector3;
60
+ normal: Vector3;
61
+ impulse: number;
62
+ relativeVelocity: Vector3;
63
+ }
64
+
65
+ // =============================================================================
66
+ // VR TRAIT CONFIGURATIONS
67
+ // =============================================================================
68
+
69
+ /**
70
+ * @grabbable trait configuration
71
+ */
72
+ export interface GrabbableTrait {
73
+ snap_to_hand?: boolean;
74
+ two_handed?: boolean;
75
+ haptic_on_grab?: number; // 0-1 intensity
76
+ grab_points?: Vector3[]; // Specific grab positions
77
+ preserve_rotation?: boolean;
78
+ distance_grab?: boolean; // Allow grabbing from distance
79
+ max_grab_distance?: number;
80
+ }
81
+
82
+ /**
83
+ * @throwable trait configuration
84
+ */
85
+ export interface ThrowableTrait {
86
+ velocity_multiplier?: number;
87
+ gravity?: boolean;
88
+ max_velocity?: number;
89
+ spin?: boolean;
90
+ bounce?: boolean;
91
+ bounce_factor?: number; // 0-1
92
+ }
93
+
94
+ /**
95
+ * @pointable trait configuration
96
+ */
97
+ export interface PointableTrait {
98
+ highlight_on_point?: boolean;
99
+ highlight_color?: Color;
100
+ cursor_style?: 'default' | 'pointer' | 'grab' | 'crosshair';
101
+ }
102
+
103
+ /**
104
+ * @hoverable trait configuration
105
+ */
106
+ export interface HoverableTrait {
107
+ highlight_color?: Color;
108
+ scale_on_hover?: number;
109
+ show_tooltip?: string | boolean;
110
+ tooltip_offset?: Vector3;
111
+ glow?: boolean;
112
+ glow_intensity?: number;
113
+ }
114
+
115
+ /**
116
+ * @scalable trait configuration
117
+ */
118
+ export interface ScalableTrait {
119
+ min_scale?: number;
120
+ max_scale?: number;
121
+ uniform?: boolean; // Force uniform scaling
122
+ pivot?: Vector3;
123
+ }
124
+
125
+ /**
126
+ * @rotatable trait configuration
127
+ */
128
+ export interface RotatableTrait {
129
+ axis?: 'x' | 'y' | 'z' | 'all';
130
+ snap_angles?: number[]; // Snap to specific angles
131
+ speed?: number;
132
+ }
133
+
134
+ /**
135
+ * @stackable trait configuration
136
+ */
137
+ export interface StackableTrait {
138
+ stack_axis?: 'x' | 'y' | 'z';
139
+ stack_offset?: number;
140
+ max_stack?: number;
141
+ snap_distance?: number;
142
+ }
143
+
144
+ /**
145
+ * @snappable trait configuration
146
+ */
147
+ export interface SnappableTrait {
148
+ snap_points?: Vector3[];
149
+ snap_distance?: number;
150
+ snap_rotation?: boolean;
151
+ magnetic?: boolean;
152
+ }
153
+
154
+ /**
155
+ * @breakable trait configuration
156
+ */
157
+ export interface BreakableTrait {
158
+ break_velocity?: number;
159
+ fragments?: number;
160
+ fragment_mesh?: string;
161
+ sound_on_break?: string;
162
+ respawn?: boolean;
163
+ respawn_delay?: Duration;
164
+ }
165
+
166
+ // =============================================================================
167
+ // STATE MANAGEMENT
168
+ // =============================================================================
169
+
170
+ /**
171
+ * Reactive state declaration
172
+ */
173
+ export interface StateDeclaration {
174
+ [key: string]: unknown;
175
+ }
176
+
177
+ /**
178
+ * State proxy for reactive updates
179
+ */
180
+ export interface ReactiveState<T extends StateDeclaration> {
181
+ get<K extends keyof T>(key: K): T[K];
182
+ set<K extends keyof T>(key: K, value: T[K]): void;
183
+ subscribe(callback: (state: T) => void): () => void;
184
+ }
185
+
186
+ // =============================================================================
187
+ // LIFECYCLE HOOKS
188
+ // =============================================================================
189
+
190
+ export type LifecycleHook =
191
+ | 'on_mount'
192
+ | 'on_unmount'
193
+ | 'on_update'
194
+ | 'on_data_update';
195
+
196
+ export type VRLifecycleHook =
197
+ | 'on_grab'
198
+ | 'on_release'
199
+ | 'on_hover_enter'
200
+ | 'on_hover_exit'
201
+ | 'on_point_enter'
202
+ | 'on_point_exit'
203
+ | 'on_collision'
204
+ | 'on_trigger_enter'
205
+ | 'on_trigger_exit'
206
+ | 'on_click'
207
+ | 'on_double_click';
208
+
209
+ export type ControllerHook =
210
+ | 'on_controller_button'
211
+ | 'on_trigger_hold'
212
+ | 'on_trigger_release'
213
+ | 'on_grip_hold'
214
+ | 'on_grip_release';
215
+
216
+ // =============================================================================
217
+ // CONTROL FLOW
218
+ // =============================================================================
219
+
220
+ /**
221
+ * For loop iteration context
222
+ */
223
+ export interface ForLoopContext<T> {
224
+ item: T;
225
+ index: number;
226
+ first: boolean;
227
+ last: boolean;
228
+ even: boolean;
229
+ odd: boolean;
230
+ }
231
+
232
+ /**
233
+ * Range helper for numeric loops
234
+ */
235
+ export function range(start: number, end: number, step?: number): number[];
236
+
237
+ // =============================================================================
238
+ // AST NODE TYPES
239
+ // =============================================================================
240
+
241
+ export type HSPlusDirective =
242
+ | { type: 'state'; body: StateDeclaration }
243
+ | { type: 'for'; variable: string; iterable: string; body: HSPlusNode[] }
244
+ | { type: 'if'; condition: string; body: HSPlusNode[]; else?: HSPlusNode[] }
245
+ | { type: 'import'; path: string; alias: string }
246
+ | { type: 'lifecycle'; hook: LifecycleHook | VRLifecycleHook | ControllerHook; params?: string[]; body: string }
247
+ | { type: 'trait'; name: VRTraitName; config: Record<string, unknown> };
248
+
249
+ export type VRTraitName =
250
+ | 'grabbable'
251
+ | 'throwable'
252
+ | 'pointable'
253
+ | 'hoverable'
254
+ | 'scalable'
255
+ | 'rotatable'
256
+ | 'stackable'
257
+ | 'snappable'
258
+ | 'breakable';
259
+
260
+ export interface HSPlusNode {
261
+ type: string;
262
+ id?: string;
263
+ properties: Record<string, unknown>;
264
+ directives: HSPlusDirective[];
265
+ children: HSPlusNode[];
266
+ traits: Map<VRTraitName, unknown>;
267
+ // Source location for debugging
268
+ loc?: {
269
+ start: { line: number; column: number };
270
+ end: { line: number; column: number };
271
+ };
272
+ }
273
+
274
+ export interface HSPlusAST {
275
+ version: '1.0';
276
+ root: HSPlusNode;
277
+ imports: Array<{ path: string; alias: string }>;
278
+ hasState: boolean;
279
+ hasVRTraits: boolean;
280
+ hasControlFlow: boolean;
281
+ }
282
+
283
+ // =============================================================================
284
+ // RUNTIME CONTEXT
285
+ // =============================================================================
286
+
287
+ export interface HSPlusRuntimeContext {
288
+ // Data from data_source
289
+ data: unknown;
290
+
291
+ // Reactive state
292
+ state: ReactiveState<StateDeclaration>;
293
+
294
+ // VR context
295
+ vr: {
296
+ hands: { left: VRHand | null; right: VRHand | null };
297
+ headset: { position: Vector3; rotation: Vector3 };
298
+ controllers: { left: unknown; right: unknown };
299
+ };
300
+
301
+ // TypeScript companion functions
302
+ scripts: Record<string, (...args: unknown[]) => unknown>;
303
+
304
+ // Built-in functions
305
+ builtins: HSPlusBuiltins;
306
+ }
307
+
308
+ export interface HSPlusBuiltins {
309
+ // Math
310
+ Math: typeof Math;
311
+
312
+ // Array methods
313
+ range: (start: number, end: number, step?: number) => number[];
314
+
315
+ // Color utilities
316
+ interpolate_color: (t: number, from: Color, to: Color) => Color;
317
+
318
+ // Distance/proximity
319
+ distance_to: (point: Vector3) => number;
320
+ distance_to_viewer: () => number;
321
+
322
+ // VR helpers
323
+ hand_position: (handId: string) => Vector3;
324
+ hand_velocity: (handId: string) => Vector3;
325
+ dominant_hand: () => VRHand;
326
+
327
+ // Audio
328
+ play_sound: (source: string, options?: { volume?: number; spatial?: boolean }) => void;
329
+
330
+ // Haptics
331
+ haptic_feedback: (hand: VRHand | string, intensity: number) => void;
332
+ haptic_pulse: (intensity: number) => void;
333
+
334
+ // Physics
335
+ apply_velocity: (node: HSPlusNode, velocity: Vector3) => void;
336
+
337
+ // Spawning
338
+ spawn: (template: string, position: Vector3) => HSPlusNode;
339
+ destroy: (node: HSPlusNode) => void;
340
+
341
+ // API calls
342
+ api_call: (url: string, method: string, body?: unknown) => Promise<unknown>;
343
+
344
+ // Modals
345
+ open_modal: (modalId: string) => void;
346
+ close_modal: (modalId: string) => void;
347
+
348
+ // Timing
349
+ setTimeout: (callback: () => void, delay: number) => number;
350
+ clearTimeout: (id: number) => void;
351
+ }
352
+
353
+ // =============================================================================
354
+ // PARSER OPTIONS
355
+ // =============================================================================
356
+
357
+ export interface HSPlusParserOptions {
358
+ // Enable VR trait parsing
359
+ enableVRTraits?: boolean;
360
+
361
+ // Enable TypeScript companion imports
362
+ enableTypeScriptImports?: boolean;
363
+
364
+ // Strict mode - error on unknown directives
365
+ strict?: boolean;
366
+
367
+ // Source file path for error messages
368
+ sourcePath?: string;
369
+ }
370
+
371
+ // =============================================================================
372
+ // COMPILER OUTPUT
373
+ // =============================================================================
374
+
375
+ export interface HSPlusCompileResult {
376
+ ast: HSPlusAST;
377
+
378
+ // Compiled JavaScript for expressions
379
+ compiledExpressions: Map<string, string>;
380
+
381
+ // Required TypeScript companions
382
+ requiredCompanions: string[];
383
+
384
+ // Feature flags
385
+ features: {
386
+ state: boolean;
387
+ vrTraits: boolean;
388
+ loops: boolean;
389
+ conditionals: boolean;
390
+ lifecycleHooks: boolean;
391
+ };
392
+
393
+ // Warnings
394
+ warnings: Array<{ message: string; line: number; column: number }>;
395
+
396
+ // Errors
397
+ errors: Array<{ message: string; line: number; column: number }>;
398
+ }
399
+
400
+ // =============================================================================
401
+ // EXPORTS
402
+ // =============================================================================
403
+
404
+ export interface HoloScriptPlusModule {
405
+ parse: (source: string, options?: HSPlusParserOptions) => HSPlusCompileResult;
406
+
407
+ createRuntime: (ast: HSPlusAST, context?: Partial<HSPlusRuntimeContext>) => HSPlusRuntime;
408
+
409
+ // Version info
410
+ version: string;
411
+
412
+ // Feature detection
413
+ features: {
414
+ vrTraits: readonly VRTraitName[];
415
+ lifecycleHooks: readonly (LifecycleHook | VRLifecycleHook | ControllerHook)[];
416
+ };
417
+ }
418
+
419
+ export interface HSPlusRuntime {
420
+ // Mount the scene
421
+ mount: (container: unknown) => void;
422
+
423
+ // Unmount and cleanup
424
+ unmount: () => void;
425
+
426
+ // Update with new data
427
+ updateData: (data: unknown) => void;
428
+
429
+ // Get current state
430
+ getState: () => StateDeclaration;
431
+
432
+ // Set state
433
+ setState: (updates: Partial<StateDeclaration>) => void;
434
+
435
+ // Emit event
436
+ emit: (event: string, payload?: unknown) => void;
437
+
438
+ // Subscribe to events
439
+ on: (event: string, handler: (payload: unknown) => void) => () => void;
440
+ }
441
+
442
+ // =============================================================================
443
+ // VR INTERACTION TYPES
444
+ // =============================================================================
445
+
446
+ /**
447
+ * Hand reference for VR interactions
448
+ */
449
+ export interface VRHand {
450
+ id: 'left' | 'right';
451
+ position: Vector3;
452
+ rotation: Vector3;
453
+ velocity: Vector3;
454
+ grip: number; // 0-1 grip strength
455
+ trigger: number; // 0-1 trigger pressure
456
+ }
457
+
458
+ /**
459
+ * Velocity data for throw calculations
460
+ */
461
+ export interface ThrowVelocity {
462
+ direction: Vector3;
463
+ magnitude: number;
464
+ angularVelocity: Vector3;
465
+ }
466
+
467
+ /**
468
+ * Collision event data
469
+ */
470
+ export interface CollisionEvent {
471
+ target: HSPlusNode;
472
+ point: Vector3;
473
+ normal: Vector3;
474
+ impulse: number;
475
+ relativeVelocity: Vector3;
476
+ }
477
+
478
+ // =============================================================================
479
+ // VR TRAIT CONFIGURATIONS
480
+ // =============================================================================
481
+
482
+ /**
483
+ * @grabbable trait configuration
484
+ */
485
+ export interface GrabbableTrait {
486
+ snap_to_hand?: boolean;
487
+ two_handed?: boolean;
488
+ haptic_on_grab?: number; // 0-1 intensity
489
+ grab_points?: Vector3[]; // Specific grab positions
490
+ preserve_rotation?: boolean;
491
+ distance_grab?: boolean; // Allow grabbing from distance
492
+ max_grab_distance?: number;
493
+ }
494
+
495
+ /**
496
+ * @throwable trait configuration
497
+ */
498
+ export interface ThrowableTrait {
499
+ velocity_multiplier?: number;
500
+ gravity?: boolean;
501
+ max_velocity?: number;
502
+ spin?: boolean;
503
+ bounce?: boolean;
504
+ bounce_factor?: number; // 0-1
505
+ }
506
+
507
+ /**
508
+ * @pointable trait configuration
509
+ */
510
+ export interface PointableTrait {
511
+ highlight_on_point?: boolean;
512
+ highlight_color?: Color;
513
+ cursor_style?: 'default' | 'pointer' | 'grab' | 'crosshair';
514
+ }
515
+
516
+ /**
517
+ * @hoverable trait configuration
518
+ */
519
+ export interface HoverableTrait {
520
+ highlight_color?: Color;
521
+ scale_on_hover?: number;
522
+ show_tooltip?: string | boolean;
523
+ tooltip_offset?: Vector3;
524
+ glow?: boolean;
525
+ glow_intensity?: number;
526
+ }
527
+
528
+ /**
529
+ * @scalable trait configuration
530
+ */
531
+ export interface ScalableTrait {
532
+ min_scale?: number;
533
+ max_scale?: number;
534
+ uniform?: boolean; // Force uniform scaling
535
+ pivot?: Vector3;
536
+ }
537
+
538
+ /**
539
+ * @rotatable trait configuration
540
+ */
541
+ export interface RotatableTrait {
542
+ axis?: 'x' | 'y' | 'z' | 'all';
543
+ snap_angles?: number[]; // Snap to specific angles
544
+ speed?: number;
545
+ }
546
+
547
+ /**
548
+ * @stackable trait configuration
549
+ */
550
+ export interface StackableTrait {
551
+ stack_axis?: 'x' | 'y' | 'z';
552
+ stack_offset?: number;
553
+ max_stack?: number;
554
+ snap_distance?: number;
555
+ }
556
+
557
+ /**
558
+ * @snappable trait configuration
559
+ */
560
+ export interface SnappableTrait {
561
+ snap_points?: Vector3[];
562
+ snap_distance?: number;
563
+ snap_rotation?: boolean;
564
+ magnetic?: boolean;
565
+ }
566
+
567
+ /**
568
+ * @breakable trait configuration
569
+ */
570
+ export interface BreakableTrait {
571
+ break_velocity?: number;
572
+ fragments?: number;
573
+ fragment_mesh?: string;
574
+ sound_on_break?: string;
575
+ respawn?: boolean;
576
+ respawn_delay?: Duration;
577
+ }
578
+
579
+ // =============================================================================
580
+ // STATE MANAGEMENT
581
+ // =============================================================================
582
+
583
+ /**
584
+ * Reactive state declaration
585
+ */
586
+ export interface StateDeclaration {
587
+ [key: string]: unknown;
588
+ }
589
+
590
+ /**
591
+ * State proxy for reactive updates
592
+ */
593
+ export interface ReactiveState<T extends StateDeclaration> {
594
+ get<K extends keyof T>(key: K): T[K];
595
+ set<K extends keyof T>(key: K, value: T[K]): void;
596
+ subscribe(callback: (state: T) => void): () => void;
597
+ }
598
+
599
+ // =============================================================================
600
+ // LIFECYCLE HOOKS
601
+ // =============================================================================
602
+
603
+ export type LifecycleHook =
604
+ | 'on_mount'
605
+ | 'on_unmount'
606
+ | 'on_update'
607
+ | 'on_data_update';
608
+
609
+ export type VRLifecycleHook =
610
+ | 'on_grab'
611
+ | 'on_release'
612
+ | 'on_hover_enter'
613
+ | 'on_hover_exit'
614
+ | 'on_point_enter'
615
+ | 'on_point_exit'
616
+ | 'on_collision'
617
+ | 'on_trigger_enter'
618
+ | 'on_trigger_exit'
619
+ | 'on_click'
620
+ | 'on_double_click';
621
+
622
+ export type ControllerHook =
623
+ | 'on_controller_button'
624
+ | 'on_trigger_hold'
625
+ | 'on_trigger_release'
626
+ | 'on_grip_hold'
627
+ | 'on_grip_release';
628
+
629
+ // =============================================================================
630
+ // CONTROL FLOW
631
+ // =============================================================================
632
+
633
+ /**
634
+ * For loop iteration context
635
+ */
636
+ export interface ForLoopContext<T> {
637
+ item: T;
638
+ index: number;
639
+ first: boolean;
640
+ last: boolean;
641
+ even: boolean;
642
+ odd: boolean;
643
+ }
644
+
645
+ /**
646
+ * Range helper for numeric loops
647
+ */
648
+ export function range(start: number, end: number, step?: number): number[];
649
+
650
+ // =============================================================================
651
+ // AST NODE TYPES
652
+ // =============================================================================
653
+
654
+ export type HSPlusDirective =
655
+ | { type: 'state'; body: StateDeclaration }
656
+ | { type: 'for'; variable: string; iterable: string; body: HSPlusNode[] }
657
+ | { type: 'if'; condition: string; body: HSPlusNode[]; else?: HSPlusNode[] }
658
+ | { type: 'import'; path: string; alias: string }
659
+ | { type: 'lifecycle'; hook: LifecycleHook | VRLifecycleHook | ControllerHook; params?: string[]; body: string }
660
+ | { type: 'trait'; name: VRTraitName; config: Record<string, unknown> };
661
+
662
+ export type VRTraitName =
663
+ | 'grabbable'
664
+ | 'throwable'
665
+ | 'pointable'
666
+ | 'hoverable'
667
+ | 'scalable'
668
+ | 'rotatable'
669
+ | 'stackable'
670
+ | 'snappable'
671
+ | 'breakable';
672
+
673
+ export interface HSPlusNode {
674
+ type: string;
675
+ id?: string;
676
+ properties: Record<string, unknown>;
677
+ directives: HSPlusDirective[];
678
+ children: HSPlusNode[];
679
+ traits: Map<VRTraitName, unknown>;
680
+ // Source location for debugging
681
+ loc?: {
682
+ start: { line: number; column: number };
683
+ end: { line: number; column: number };
684
+ };
685
+ }
686
+
687
+ export interface HSPlusAST {
688
+ version: '1.0';
689
+ root: HSPlusNode;
690
+ imports: Array<{ path: string; alias: string }>;
691
+ hasState: boolean;
692
+ hasVRTraits: boolean;
693
+ hasControlFlow: boolean;
694
+ }
695
+
696
+ // =============================================================================
697
+ // RUNTIME CONTEXT
698
+ // =============================================================================
699
+
700
+ export interface HSPlusRuntimeContext {
701
+ // Data from data_source
702
+ data: unknown;
703
+
704
+ // Reactive state
705
+ state: ReactiveState<StateDeclaration>;
706
+
707
+ // VR context
708
+ vr: {
709
+ hands: { left: VRHand | null; right: VRHand | null };
710
+ headset: { position: Vector3; rotation: Vector3 };
711
+ controllers: { left: unknown; right: unknown };
712
+ };
713
+
714
+ // TypeScript companion functions
715
+ scripts: Record<string, (...args: unknown[]) => unknown>;
716
+
717
+ // Built-in functions
718
+ builtins: HSPlusBuiltins;
719
+ }
720
+
721
+ export interface HSPlusBuiltins {
722
+ // Math
723
+ Math: typeof Math;
724
+
725
+ // Array methods
726
+ range: (start: number, end: number, step?: number) => number[];
727
+
728
+ // Color utilities
729
+ interpolate_color: (t: number, from: Color, to: Color) => Color;
730
+
731
+ // Distance/proximity
732
+ distance_to: (point: Vector3) => number;
733
+ distance_to_viewer: () => number;
734
+
735
+ // VR helpers
736
+ hand_position: (handId: string) => Vector3;
737
+ hand_velocity: (handId: string) => Vector3;
738
+ dominant_hand: () => VRHand;
739
+
740
+ // Audio
741
+ play_sound: (source: string, options?: { volume?: number; spatial?: boolean }) => void;
742
+
743
+ // Haptics
744
+ haptic_feedback: (hand: VRHand | string, intensity: number) => void;
745
+ haptic_pulse: (intensity: number) => void;
746
+
747
+ // Physics
748
+ apply_velocity: (node: HSPlusNode, velocity: Vector3) => void;
749
+
750
+ // Spawning
751
+ spawn: (template: string, position: Vector3) => HSPlusNode;
752
+ destroy: (node: HSPlusNode) => void;
753
+
754
+ // API calls
755
+ api_call: (url: string, method: string, body?: unknown) => Promise<unknown>;
756
+
757
+ // Modals
758
+ open_modal: (modalId: string) => void;
759
+ close_modal: (modalId: string) => void;
760
+
761
+ // Timing
762
+ setTimeout: (callback: () => void, delay: number) => number;
763
+ clearTimeout: (id: number) => void;
764
+ }
765
+
766
+ // =============================================================================
767
+ // PARSER OPTIONS
768
+ // =============================================================================
769
+
770
+ export interface HSPlusParserOptions {
771
+ // Enable VR trait parsing
772
+ enableVRTraits?: boolean;
773
+
774
+ // Enable TypeScript companion imports
775
+ enableTypeScriptImports?: boolean;
776
+
777
+ // Strict mode - error on unknown directives
778
+ strict?: boolean;
779
+
780
+ // Source file path for error messages
781
+ sourcePath?: string;
782
+ }
783
+
784
+ // =============================================================================
785
+ // COMPILER OUTPUT
786
+ // =============================================================================
787
+
788
+ export interface HSPlusCompileResult {
789
+ ast: HSPlusAST;
790
+
791
+ // Compiled JavaScript for expressions
792
+ compiledExpressions: Map<string, string>;
793
+
794
+ // Required TypeScript companions
795
+ requiredCompanions: string[];
796
+
797
+ // Feature flags
798
+ features: {
799
+ state: boolean;
800
+ vrTraits: boolean;
801
+ loops: boolean;
802
+ conditionals: boolean;
803
+ lifecycleHooks: boolean;
804
+ };
805
+
806
+ // Warnings
807
+ warnings: Array<{ message: string; line: number; column: number }>;
808
+
809
+ // Errors
810
+ errors: Array<{ message: string; line: number; column: number }>;
811
+ }
812
+
813
+ // =============================================================================
814
+ // EXPORTS
815
+ // =============================================================================
816
+
817
+ export interface HoloScriptPlusModule {
818
+ parse: (source: string, options?: HSPlusParserOptions) => HSPlusCompileResult;
819
+
820
+ createRuntime: (ast: HSPlusAST, context?: Partial<HSPlusRuntimeContext>) => HSPlusRuntime;
821
+
822
+ // Version info
823
+ version: string;
824
+
825
+ // Feature detection
826
+ features: {
827
+ vrTraits: readonly VRTraitName[];
828
+ lifecycleHooks: readonly (LifecycleHook | VRLifecycleHook | ControllerHook)[];
829
+ };
830
+ }
831
+
832
+ export interface HSPlusRuntime {
833
+ // Mount the scene
834
+ mount: (container: unknown) => void;
835
+
836
+ // Unmount and cleanup
837
+ unmount: () => void;
838
+
839
+ // Update with new data
840
+ updateData: (data: unknown) => void;
841
+
842
+ // Get current state
843
+ getState: () => StateDeclaration;
844
+
845
+ // Set state
846
+ setState: (updates: Partial<StateDeclaration>) => void;
847
+
848
+ // Emit event
849
+ emit: (event: string, payload?: unknown) => void;
850
+
851
+ // Subscribe to events
852
+ on: (event: string, handler: (payload: unknown) => void) => () => void;
853
+ }