 aacb45156b
			
		
	
	aacb45156b
	
	
	
		
			
			- Install Jest for unit testing with React Testing Library - Install Playwright for end-to-end testing - Configure Jest with proper TypeScript support and module mapping - Create test setup files and utilities for both unit and e2e tests Components: * Jest configuration with coverage thresholds * Playwright configuration with browser automation * Unit tests for LoginForm, AuthContext, and useSocketIO hook * E2E tests for authentication, dashboard, and agents workflows * GitHub Actions workflow for automated testing * Mock data and API utilities for consistent testing * Test documentation with best practices Testing features: - Unit tests with 70% coverage threshold - E2E tests with API mocking and user journey testing - CI/CD integration for automated test runs - Cross-browser testing support with Playwright - Authentication system testing end-to-end 🚀 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			711 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			711 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.eventMap = exports.eventAliasMap = void 0;
 | |
| const eventMap = exports.eventMap = {
 | |
|   // Clipboard Events
 | |
|   copy: {
 | |
|     EventType: 'ClipboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   cut: {
 | |
|     EventType: 'ClipboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   paste: {
 | |
|     EventType: 'ClipboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Composition Events
 | |
|   compositionEnd: {
 | |
|     EventType: 'CompositionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   compositionStart: {
 | |
|     EventType: 'CompositionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   compositionUpdate: {
 | |
|     EventType: 'CompositionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Keyboard Events
 | |
|   keyDown: {
 | |
|     EventType: 'KeyboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       charCode: 0,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   keyPress: {
 | |
|     EventType: 'KeyboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       charCode: 0,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   keyUp: {
 | |
|     EventType: 'KeyboardEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       charCode: 0,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Focus Events
 | |
|   focus: {
 | |
|     EventType: 'FocusEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   blur: {
 | |
|     EventType: 'FocusEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   focusIn: {
 | |
|     EventType: 'FocusEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   focusOut: {
 | |
|     EventType: 'FocusEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Form Events
 | |
|   change: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   input: {
 | |
|     EventType: 'InputEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   invalid: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: true
 | |
|     }
 | |
|   },
 | |
|   submit: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true
 | |
|     }
 | |
|   },
 | |
|   reset: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true
 | |
|     }
 | |
|   },
 | |
|   // Mouse Events
 | |
|   click: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       button: 0,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   contextMenu: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dblClick: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   drag: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragEnd: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragEnter: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragExit: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragLeave: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragOver: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   dragStart: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   drop: {
 | |
|     EventType: 'DragEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseDown: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseEnter: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseLeave: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseMove: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseOut: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseOver: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   mouseUp: {
 | |
|     EventType: 'MouseEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Selection Events
 | |
|   select: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // Touch Events
 | |
|   touchCancel: {
 | |
|     EventType: 'TouchEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   touchEnd: {
 | |
|     EventType: 'TouchEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   touchMove: {
 | |
|     EventType: 'TouchEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   touchStart: {
 | |
|     EventType: 'TouchEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // UI Events
 | |
|   resize: {
 | |
|     EventType: 'UIEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   scroll: {
 | |
|     EventType: 'UIEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // Wheel Events
 | |
|   wheel: {
 | |
|     EventType: 'WheelEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // Media Events
 | |
|   abort: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   canPlay: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   canPlayThrough: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   durationChange: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   emptied: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   encrypted: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   ended: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   loadedData: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   loadedMetadata: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   loadStart: {
 | |
|     EventType: 'ProgressEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   pause: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   play: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   playing: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   progress: {
 | |
|     EventType: 'ProgressEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   rateChange: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   seeked: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   seeking: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   stalled: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   suspend: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   timeUpdate: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   volumeChange: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   waiting: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // Events
 | |
|   load: {
 | |
|     // TODO: load events can be UIEvent or Event depending on what generated them
 | |
|     // This is where this abstraction breaks down.
 | |
|     // But the common targets are <img />, <script /> and window.
 | |
|     // Neither of these targets receive a UIEvent
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   error: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // Animation Events
 | |
|   animationStart: {
 | |
|     EventType: 'AnimationEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   animationEnd: {
 | |
|     EventType: 'AnimationEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   animationIteration: {
 | |
|     EventType: 'AnimationEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // Transition Events
 | |
|   transitionCancel: {
 | |
|     EventType: 'TransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   transitionEnd: {
 | |
|     EventType: 'TransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true
 | |
|     }
 | |
|   },
 | |
|   transitionRun: {
 | |
|     EventType: 'TransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   transitionStart: {
 | |
|     EventType: 'TransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // pointer events
 | |
|   pointerOver: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerEnter: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   pointerDown: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerMove: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerUp: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerCancel: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerOut: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   pointerLeave: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   gotPointerCapture: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   lostPointerCapture: {
 | |
|     EventType: 'PointerEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false,
 | |
|       composed: true
 | |
|     }
 | |
|   },
 | |
|   // history events
 | |
|   popState: {
 | |
|     EventType: 'PopStateEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   // window events
 | |
|   offline: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   online: {
 | |
|     EventType: 'Event',
 | |
|     defaultInit: {
 | |
|       bubbles: false,
 | |
|       cancelable: false
 | |
|     }
 | |
|   },
 | |
|   pageHide: {
 | |
|     EventType: 'PageTransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true
 | |
|     }
 | |
|   },
 | |
|   pageShow: {
 | |
|     EventType: 'PageTransitionEvent',
 | |
|     defaultInit: {
 | |
|       bubbles: true,
 | |
|       cancelable: true
 | |
|     }
 | |
|   }
 | |
| };
 | |
| const eventAliasMap = exports.eventAliasMap = {
 | |
|   doubleClick: 'dblClick'
 | |
| }; |