Set up comprehensive frontend testing infrastructure
- 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>
This commit is contained in:
		
							
								
								
									
										285
									
								
								frontend/node_modules/lz-string/libs/base64-string.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								frontend/node_modules/lz-string/libs/base64-string.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,285 @@ | ||||
| // Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net> | ||||
| // This work is free. You can redistribute it and/or modify it | ||||
| // under the terms of the WTFPL, Version 2 | ||||
| // For more information see LICENSE.txt or http://www.wtfpl.net/ | ||||
| // | ||||
| // This lib is part of the lz-string project. | ||||
| // For more information, the home page: | ||||
| // http://pieroxy.net/blog/pages/lz-string/index.html | ||||
| // | ||||
| // Base64 compression / decompression for already compressed content (gif, png, jpg, mp3, ...)  | ||||
| // version 1.4.1 | ||||
| var Base64String = { | ||||
|    | ||||
|   compressToUTF16 : function (input) { | ||||
|     var output = [], | ||||
|         i,c, | ||||
|         current, | ||||
|         status = 0; | ||||
|      | ||||
|     input = this.compress(input); | ||||
|      | ||||
|     for (i=0 ; i<input.length ; i++) { | ||||
|       c = input.charCodeAt(i); | ||||
|       switch (status++) { | ||||
|         case 0: | ||||
|           output.push(String.fromCharCode((c >> 1)+32)); | ||||
|           current = (c & 1) << 14; | ||||
|           break; | ||||
|         case 1: | ||||
|           output.push(String.fromCharCode((current + (c >> 2))+32)); | ||||
|           current = (c & 3) << 13; | ||||
|           break; | ||||
|         case 2: | ||||
|           output.push(String.fromCharCode((current + (c >> 3))+32)); | ||||
|           current = (c & 7) << 12; | ||||
|           break; | ||||
|         case 3: | ||||
|           output.push(String.fromCharCode((current + (c >> 4))+32)); | ||||
|           current = (c & 15) << 11; | ||||
|           break; | ||||
|         case 4: | ||||
|           output.push(String.fromCharCode((current + (c >> 5))+32)); | ||||
|           current = (c & 31) << 10; | ||||
|           break; | ||||
|         case 5: | ||||
|           output.push(String.fromCharCode((current + (c >> 6))+32)); | ||||
|           current = (c & 63) << 9; | ||||
|           break; | ||||
|         case 6: | ||||
|           output.push(String.fromCharCode((current + (c >> 7))+32)); | ||||
|           current = (c & 127) << 8; | ||||
|           break; | ||||
|         case 7: | ||||
|           output.push(String.fromCharCode((current + (c >> 8))+32)); | ||||
|           current = (c & 255) << 7; | ||||
|           break; | ||||
|         case 8: | ||||
|           output.push(String.fromCharCode((current + (c >> 9))+32)); | ||||
|           current = (c & 511) << 6; | ||||
|           break; | ||||
|         case 9: | ||||
|           output.push(String.fromCharCode((current + (c >> 10))+32)); | ||||
|           current = (c & 1023) << 5; | ||||
|           break; | ||||
|         case 10: | ||||
|           output.push(String.fromCharCode((current + (c >> 11))+32)); | ||||
|           current = (c & 2047) << 4; | ||||
|           break; | ||||
|         case 11: | ||||
|           output.push(String.fromCharCode((current + (c >> 12))+32)); | ||||
|           current = (c & 4095) << 3; | ||||
|           break; | ||||
|         case 12: | ||||
|           output.push(String.fromCharCode((current + (c >> 13))+32)); | ||||
|           current = (c & 8191) << 2; | ||||
|           break; | ||||
|         case 13: | ||||
|           output.push(String.fromCharCode((current + (c >> 14))+32)); | ||||
|           current = (c & 16383) << 1; | ||||
|           break; | ||||
|         case 14: | ||||
|           output.push(String.fromCharCode((current + (c >> 15))+32, (c & 32767)+32)); | ||||
|           status = 0; | ||||
|           break; | ||||
|       } | ||||
|     } | ||||
|     output.push(String.fromCharCode(current + 32)); | ||||
|     return output.join(''); | ||||
|   }, | ||||
|    | ||||
|  | ||||
|   decompressFromUTF16 : function (input) { | ||||
|     var output = [], | ||||
|         current,c, | ||||
|         status=0, | ||||
|         i = 0; | ||||
|      | ||||
|     while (i < input.length) { | ||||
|       c = input.charCodeAt(i) - 32; | ||||
|        | ||||
|       switch (status++) { | ||||
|         case 0: | ||||
|           current = c << 1; | ||||
|           break; | ||||
|         case 1: | ||||
|           output.push(String.fromCharCode(current | (c >> 14))); | ||||
|           current = (c&16383) << 2; | ||||
|           break; | ||||
|         case 2: | ||||
|           output.push(String.fromCharCode(current | (c >> 13))); | ||||
|           current = (c&8191) << 3; | ||||
|           break; | ||||
|         case 3: | ||||
|           output.push(String.fromCharCode(current | (c >> 12))); | ||||
|           current = (c&4095) << 4; | ||||
|           break; | ||||
|         case 4: | ||||
|           output.push(String.fromCharCode(current | (c >> 11))); | ||||
|           current = (c&2047) << 5; | ||||
|           break; | ||||
|         case 5: | ||||
|           output.push(String.fromCharCode(current | (c >> 10))); | ||||
|           current = (c&1023) << 6; | ||||
|           break; | ||||
|         case 6: | ||||
|           output.push(String.fromCharCode(current | (c >> 9))); | ||||
|           current = (c&511) << 7; | ||||
|           break; | ||||
|         case 7: | ||||
|           output.push(String.fromCharCode(current | (c >> 8))); | ||||
|           current = (c&255) << 8; | ||||
|           break; | ||||
|         case 8: | ||||
|           output.push(String.fromCharCode(current | (c >> 7))); | ||||
|           current = (c&127) << 9; | ||||
|           break; | ||||
|         case 9: | ||||
|           output.push(String.fromCharCode(current | (c >> 6))); | ||||
|           current = (c&63) << 10; | ||||
|           break; | ||||
|         case 10: | ||||
|           output.push(String.fromCharCode(current | (c >> 5))); | ||||
|           current = (c&31) << 11; | ||||
|           break; | ||||
|         case 11: | ||||
|           output.push(String.fromCharCode(current | (c >> 4))); | ||||
|           current = (c&15) << 12; | ||||
|           break; | ||||
|         case 12: | ||||
|           output.push(String.fromCharCode(current | (c >> 3))); | ||||
|           current = (c&7) << 13; | ||||
|           break; | ||||
|         case 13: | ||||
|           output.push(String.fromCharCode(current | (c >> 2))); | ||||
|           current = (c&3) << 14; | ||||
|           break; | ||||
|         case 14: | ||||
|           output.push(String.fromCharCode(current | (c >> 1))); | ||||
|           current = (c&1) << 15; | ||||
|           break; | ||||
|         case 15: | ||||
|           output.push(String.fromCharCode(current | c)); | ||||
|           status=0; | ||||
|           break; | ||||
|       } | ||||
|        | ||||
|        | ||||
|       i++; | ||||
|     } | ||||
|      | ||||
|     return this.decompress(output.join('')); | ||||
|     //return output; | ||||
|      | ||||
|   }, | ||||
|  | ||||
|  | ||||
|   // private property | ||||
|   _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", | ||||
|    | ||||
|   decompress : function (input) { | ||||
|     var output = []; | ||||
|     var chr1, chr2, chr3, enc1, enc2, enc3, enc4; | ||||
|     var i = 1; | ||||
|     var odd = input.charCodeAt(0) >> 8; | ||||
|      | ||||
|     while (i < input.length*2 && (i < input.length*2-1 || odd==0)) { | ||||
|        | ||||
|       if (i%2==0) { | ||||
|         chr1 = input.charCodeAt(i/2) >> 8; | ||||
|         chr2 = input.charCodeAt(i/2) & 255; | ||||
|         if (i/2+1 < input.length)  | ||||
|           chr3 = input.charCodeAt(i/2+1) >> 8; | ||||
|         else  | ||||
|           chr3 = NaN; | ||||
|       } else { | ||||
|         chr1 = input.charCodeAt((i-1)/2) & 255; | ||||
|         if ((i+1)/2 < input.length) { | ||||
|           chr2 = input.charCodeAt((i+1)/2) >> 8; | ||||
|           chr3 = input.charCodeAt((i+1)/2) & 255; | ||||
|         } else  | ||||
|           chr2=chr3=NaN; | ||||
|       } | ||||
|       i+=3; | ||||
|        | ||||
|       enc1 = chr1 >> 2; | ||||
|       enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | ||||
|       enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | ||||
|       enc4 = chr3 & 63; | ||||
|        | ||||
|       if (isNaN(chr2) || (i==input.length*2+1 && odd)) { | ||||
|         enc3 = enc4 = 64; | ||||
|       } else if (isNaN(chr3) || (i==input.length*2 && odd)) { | ||||
|         enc4 = 64; | ||||
|       } | ||||
|        | ||||
|       output.push(this._keyStr.charAt(enc1)); | ||||
|       output.push(this._keyStr.charAt(enc2)); | ||||
|       output.push(this._keyStr.charAt(enc3)); | ||||
|       output.push(this._keyStr.charAt(enc4)); | ||||
|     } | ||||
|      | ||||
|     return output.join(''); | ||||
|   }, | ||||
|    | ||||
|   compress : function (input) { | ||||
|     var output = [], | ||||
|         ol = 1,  | ||||
|         output_, | ||||
|         chr1, chr2, chr3, | ||||
|         enc1, enc2, enc3, enc4, | ||||
|         i = 0, flush=false; | ||||
|      | ||||
|     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); | ||||
|      | ||||
|     while (i < input.length) { | ||||
|        | ||||
|       enc1 = this._keyStr.indexOf(input.charAt(i++)); | ||||
|       enc2 = this._keyStr.indexOf(input.charAt(i++)); | ||||
|       enc3 = this._keyStr.indexOf(input.charAt(i++)); | ||||
|       enc4 = this._keyStr.indexOf(input.charAt(i++)); | ||||
|        | ||||
|       chr1 = (enc1 << 2) | (enc2 >> 4); | ||||
|       chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | ||||
|       chr3 = ((enc3 & 3) << 6) | enc4; | ||||
|        | ||||
|       if (ol%2==0) { | ||||
|         output_ = chr1 << 8; | ||||
|         flush = true; | ||||
|          | ||||
|         if (enc3 != 64) { | ||||
|           output.push(String.fromCharCode(output_ | chr2)); | ||||
|           flush = false; | ||||
|         } | ||||
|         if (enc4 != 64) { | ||||
|           output_ = chr3 << 8; | ||||
|           flush = true; | ||||
|         } | ||||
|       } else { | ||||
|         output.push(String.fromCharCode(output_ | chr1)); | ||||
|         flush = false; | ||||
|          | ||||
|         if (enc3 != 64) { | ||||
|           output_ = chr2 << 8; | ||||
|           flush = true; | ||||
|         } | ||||
|         if (enc4 != 64) { | ||||
|           output.push(String.fromCharCode(output_ | chr3)); | ||||
|           flush = false; | ||||
|         } | ||||
|       } | ||||
|       ol+=3; | ||||
|     } | ||||
|      | ||||
|     if (flush) { | ||||
|       output.push(String.fromCharCode(output_)); | ||||
|       output = output.join(''); | ||||
|       output = String.fromCharCode(output.charCodeAt(0)|256) + output.substring(1); | ||||
|     } else { | ||||
|       output = output.join(''); | ||||
|     } | ||||
|      | ||||
|     return output; | ||||
|      | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 anthonyrawlins
					anthonyrawlins