@holoscript/core 2.0.1 → 2.1.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 (137) hide show
  1. package/dist/chunk-2XXE34KS.js +344 -0
  2. package/dist/chunk-2XXE34KS.js.map +1 -0
  3. package/dist/chunk-3X2EGU7Z.cjs +52 -0
  4. package/dist/chunk-3X2EGU7Z.cjs.map +1 -0
  5. package/dist/chunk-AFFVFO4D.js +1689 -0
  6. package/dist/chunk-AFFVFO4D.js.map +1 -0
  7. package/dist/chunk-DGUM43GV.js +10 -0
  8. package/dist/chunk-DGUM43GV.js.map +1 -0
  9. package/{src/HoloScriptDebugger.ts → dist/chunk-DOY73HDH.js} +118 -257
  10. package/dist/chunk-DOY73HDH.js.map +1 -0
  11. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  12. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  13. package/dist/chunk-L6VLNVKP.cjs +1691 -0
  14. package/dist/chunk-L6VLNVKP.cjs.map +1 -0
  15. package/dist/chunk-MFNO57XL.cjs +347 -0
  16. package/dist/chunk-MFNO57XL.cjs.map +1 -0
  17. package/dist/chunk-R75MREOS.cjs +424 -0
  18. package/dist/chunk-R75MREOS.cjs.map +1 -0
  19. package/dist/chunk-SATNCODL.js +45 -0
  20. package/dist/chunk-SATNCODL.js.map +1 -0
  21. package/dist/chunk-T57ZL7KR.cjs +1281 -0
  22. package/dist/chunk-T57ZL7KR.cjs.map +1 -0
  23. package/dist/chunk-U72GEJZT.js +1279 -0
  24. package/dist/chunk-U72GEJZT.js.map +1 -0
  25. package/dist/debugger.cjs +20 -0
  26. package/dist/debugger.cjs.map +1 -0
  27. package/dist/debugger.d.cts +171 -0
  28. package/dist/debugger.d.ts +171 -0
  29. package/dist/debugger.js +7 -0
  30. package/dist/debugger.js.map +1 -0
  31. package/dist/index.cjs +6803 -0
  32. package/dist/index.cjs.map +1 -0
  33. package/dist/index.d.cts +4093 -0
  34. package/dist/index.d.ts +4093 -0
  35. package/dist/index.js +6715 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/parser.cjs +14 -0
  38. package/dist/parser.cjs.map +1 -0
  39. package/dist/parser.d.cts +172 -0
  40. package/dist/parser.d.ts +172 -0
  41. package/dist/parser.js +5 -0
  42. package/dist/parser.js.map +1 -0
  43. package/dist/runtime.cjs +14 -0
  44. package/dist/runtime.cjs.map +1 -0
  45. package/dist/runtime.d.cts +200 -0
  46. package/dist/runtime.d.ts +200 -0
  47. package/dist/runtime.js +5 -0
  48. package/dist/runtime.js.map +1 -0
  49. package/dist/type-checker.cjs +17 -0
  50. package/dist/type-checker.cjs.map +1 -0
  51. package/dist/type-checker.d.cts +105 -0
  52. package/dist/type-checker.d.ts +105 -0
  53. package/dist/type-checker.js +4 -0
  54. package/dist/type-checker.js.map +1 -0
  55. package/dist/types-4h8cbtF_.d.cts +329 -0
  56. package/dist/types-4h8cbtF_.d.ts +329 -0
  57. package/package.json +17 -13
  58. package/src/HoloScript2DParser.js +0 -227
  59. package/src/HoloScript2DParser.ts +0 -261
  60. package/src/HoloScriptCodeParser.js +0 -1102
  61. package/src/HoloScriptCodeParser.ts +0 -1188
  62. package/src/HoloScriptDebugger.js +0 -458
  63. package/src/HoloScriptParser.js +0 -338
  64. package/src/HoloScriptParser.ts +0 -397
  65. package/src/HoloScriptPlusParser.js +0 -371
  66. package/src/HoloScriptPlusParser.ts +0 -543
  67. package/src/HoloScriptRuntime.js +0 -1399
  68. package/src/HoloScriptRuntime.test.js +0 -351
  69. package/src/HoloScriptRuntime.test.ts +0 -436
  70. package/src/HoloScriptRuntime.ts +0 -1653
  71. package/src/HoloScriptTypeChecker.js +0 -356
  72. package/src/HoloScriptTypeChecker.ts +0 -475
  73. package/src/__tests__/GraphicsServices.test.js +0 -357
  74. package/src/__tests__/GraphicsServices.test.ts +0 -427
  75. package/src/__tests__/HoloScriptPlusParser.test.js +0 -317
  76. package/src/__tests__/HoloScriptPlusParser.test.ts +0 -392
  77. package/src/__tests__/integration.test.js +0 -336
  78. package/src/__tests__/integration.test.ts +0 -416
  79. package/src/__tests__/performance.bench.js +0 -218
  80. package/src/__tests__/performance.bench.ts +0 -262
  81. package/src/__tests__/type-checker.test.js +0 -60
  82. package/src/__tests__/type-checker.test.ts +0 -73
  83. package/src/index.js +0 -217
  84. package/src/index.ts +0 -426
  85. package/src/interop/Interoperability.js +0 -413
  86. package/src/interop/Interoperability.ts +0 -494
  87. package/src/logger.js +0 -42
  88. package/src/logger.ts +0 -57
  89. package/src/parser/EnhancedParser.js +0 -205
  90. package/src/parser/EnhancedParser.ts +0 -251
  91. package/src/parser/HoloScriptPlusParser.js +0 -928
  92. package/src/parser/HoloScriptPlusParser.ts +0 -1089
  93. package/src/runtime/HoloScriptPlusRuntime.js +0 -674
  94. package/src/runtime/HoloScriptPlusRuntime.ts +0 -861
  95. package/src/runtime/PerformanceTelemetry.js +0 -323
  96. package/src/runtime/PerformanceTelemetry.ts +0 -467
  97. package/src/runtime/RuntimeOptimization.js +0 -361
  98. package/src/runtime/RuntimeOptimization.ts +0 -416
  99. package/src/services/HololandGraphicsPipelineService.js +0 -506
  100. package/src/services/HololandGraphicsPipelineService.ts +0 -662
  101. package/src/services/PlatformPerformanceOptimizer.js +0 -356
  102. package/src/services/PlatformPerformanceOptimizer.ts +0 -503
  103. package/src/state/ReactiveState.js +0 -427
  104. package/src/state/ReactiveState.ts +0 -572
  105. package/src/tools/DeveloperExperience.js +0 -376
  106. package/src/tools/DeveloperExperience.ts +0 -438
  107. package/src/traits/AIDriverTrait.js +0 -322
  108. package/src/traits/AIDriverTrait.test.js +0 -329
  109. package/src/traits/AIDriverTrait.test.ts +0 -357
  110. package/src/traits/AIDriverTrait.ts +0 -474
  111. package/src/traits/LightingTrait.js +0 -313
  112. package/src/traits/LightingTrait.test.js +0 -410
  113. package/src/traits/LightingTrait.test.ts +0 -462
  114. package/src/traits/LightingTrait.ts +0 -505
  115. package/src/traits/MaterialTrait.js +0 -194
  116. package/src/traits/MaterialTrait.test.js +0 -286
  117. package/src/traits/MaterialTrait.test.ts +0 -329
  118. package/src/traits/MaterialTrait.ts +0 -324
  119. package/src/traits/RenderingTrait.js +0 -356
  120. package/src/traits/RenderingTrait.test.js +0 -363
  121. package/src/traits/RenderingTrait.test.ts +0 -427
  122. package/src/traits/RenderingTrait.ts +0 -555
  123. package/src/traits/VRTraitSystem.js +0 -740
  124. package/src/traits/VRTraitSystem.ts +0 -1040
  125. package/src/traits/VoiceInputTrait.js +0 -284
  126. package/src/traits/VoiceInputTrait.test.js +0 -226
  127. package/src/traits/VoiceInputTrait.test.ts +0 -252
  128. package/src/traits/VoiceInputTrait.ts +0 -401
  129. package/src/types/AdvancedTypeSystem.js +0 -226
  130. package/src/types/AdvancedTypeSystem.ts +0 -494
  131. package/src/types/HoloScriptPlus.d.ts +0 -853
  132. package/src/types.js +0 -6
  133. package/src/types.ts +0 -369
  134. package/tsconfig.json +0 -23
  135. package/tsup.config.d.ts +0 -2
  136. package/tsup.config.js +0 -18
  137. package/tsup.config.ts +0 -19
@@ -1,853 +0,0 @@
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
- }