- 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>
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {
 | |
|   FLAG,
 | |
|   getEmptyResult,
 | |
|   IOptions,
 | |
|   IResult,
 | |
|   parseImpl,
 | |
|   resetResult,
 | |
| } from 'tldts-core';
 | |
| 
 | |
| import suffixLookup from './src/suffix-trie';
 | |
| 
 | |
| // For all methods but 'parse', it does not make sense to allocate an object
 | |
| // every single time to only return the value of a specific attribute. To avoid
 | |
| // this un-necessary allocation, we use a global object which is re-used.
 | |
| const RESULT: IResult = getEmptyResult();
 | |
| 
 | |
| export function parse(url: string, options: Partial<IOptions> = {}): IResult {
 | |
|   return parseImpl(url, FLAG.ALL, suffixLookup, options, getEmptyResult());
 | |
| }
 | |
| 
 | |
| export function getHostname(
 | |
|   url: string,
 | |
|   options: Partial<IOptions> = {},
 | |
| ): string | null {
 | |
|   /*@__INLINE__*/ resetResult(RESULT);
 | |
|   return parseImpl(url, FLAG.HOSTNAME, suffixLookup, options, RESULT).hostname;
 | |
| }
 | |
| 
 | |
| export function getPublicSuffix(
 | |
|   url: string,
 | |
|   options: Partial<IOptions> = {},
 | |
| ): string | null {
 | |
|   /*@__INLINE__*/ resetResult(RESULT);
 | |
|   return parseImpl(url, FLAG.PUBLIC_SUFFIX, suffixLookup, options, RESULT)
 | |
|     .publicSuffix;
 | |
| }
 | |
| 
 | |
| export function getDomain(
 | |
|   url: string,
 | |
|   options: Partial<IOptions> = {},
 | |
| ): string | null {
 | |
|   /*@__INLINE__*/ resetResult(RESULT);
 | |
|   return parseImpl(url, FLAG.DOMAIN, suffixLookup, options, RESULT).domain;
 | |
| }
 | |
| 
 | |
| export function getSubdomain(
 | |
|   url: string,
 | |
|   options: Partial<IOptions> = {},
 | |
| ): string | null {
 | |
|   /*@__INLINE__*/ resetResult(RESULT);
 | |
|   return parseImpl(url, FLAG.SUB_DOMAIN, suffixLookup, options, RESULT)
 | |
|     .subdomain;
 | |
| }
 | |
| 
 | |
| export function getDomainWithoutSuffix(
 | |
|   url: string,
 | |
|   options: Partial<IOptions> = {},
 | |
| ): string | null {
 | |
|   /*@__INLINE__*/ resetResult(RESULT);
 | |
|   return parseImpl(url, FLAG.ALL, suffixLookup, options, RESULT)
 | |
|     .domainWithoutSuffix;
 | |
| }
 |