 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>
		
			
				
	
	
		
			248 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Preprocessor } from './preprocessor.js';
 | |
| import { type Token, type CharacterToken, type DoctypeToken, type TagToken, type EOFToken, type CommentToken, type Attribute, type Location } from '../common/token.js';
 | |
| import { EntityDecoder } from 'entities/decode';
 | |
| import { ERR, type ParserErrorHandler } from '../common/error-codes.js';
 | |
| declare const enum State {
 | |
|     DATA = 0,
 | |
|     RCDATA = 1,
 | |
|     RAWTEXT = 2,
 | |
|     SCRIPT_DATA = 3,
 | |
|     PLAINTEXT = 4,
 | |
|     TAG_OPEN = 5,
 | |
|     END_TAG_OPEN = 6,
 | |
|     TAG_NAME = 7,
 | |
|     RCDATA_LESS_THAN_SIGN = 8,
 | |
|     RCDATA_END_TAG_OPEN = 9,
 | |
|     RCDATA_END_TAG_NAME = 10,
 | |
|     RAWTEXT_LESS_THAN_SIGN = 11,
 | |
|     RAWTEXT_END_TAG_OPEN = 12,
 | |
|     RAWTEXT_END_TAG_NAME = 13,
 | |
|     SCRIPT_DATA_LESS_THAN_SIGN = 14,
 | |
|     SCRIPT_DATA_END_TAG_OPEN = 15,
 | |
|     SCRIPT_DATA_END_TAG_NAME = 16,
 | |
|     SCRIPT_DATA_ESCAPE_START = 17,
 | |
|     SCRIPT_DATA_ESCAPE_START_DASH = 18,
 | |
|     SCRIPT_DATA_ESCAPED = 19,
 | |
|     SCRIPT_DATA_ESCAPED_DASH = 20,
 | |
|     SCRIPT_DATA_ESCAPED_DASH_DASH = 21,
 | |
|     SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 22,
 | |
|     SCRIPT_DATA_ESCAPED_END_TAG_OPEN = 23,
 | |
|     SCRIPT_DATA_ESCAPED_END_TAG_NAME = 24,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPE_START = 25,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPED = 26,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 27,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 28,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 29,
 | |
|     SCRIPT_DATA_DOUBLE_ESCAPE_END = 30,
 | |
|     BEFORE_ATTRIBUTE_NAME = 31,
 | |
|     ATTRIBUTE_NAME = 32,
 | |
|     AFTER_ATTRIBUTE_NAME = 33,
 | |
|     BEFORE_ATTRIBUTE_VALUE = 34,
 | |
|     ATTRIBUTE_VALUE_DOUBLE_QUOTED = 35,
 | |
|     ATTRIBUTE_VALUE_SINGLE_QUOTED = 36,
 | |
|     ATTRIBUTE_VALUE_UNQUOTED = 37,
 | |
|     AFTER_ATTRIBUTE_VALUE_QUOTED = 38,
 | |
|     SELF_CLOSING_START_TAG = 39,
 | |
|     BOGUS_COMMENT = 40,
 | |
|     MARKUP_DECLARATION_OPEN = 41,
 | |
|     COMMENT_START = 42,
 | |
|     COMMENT_START_DASH = 43,
 | |
|     COMMENT = 44,
 | |
|     COMMENT_LESS_THAN_SIGN = 45,
 | |
|     COMMENT_LESS_THAN_SIGN_BANG = 46,
 | |
|     COMMENT_LESS_THAN_SIGN_BANG_DASH = 47,
 | |
|     COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH = 48,
 | |
|     COMMENT_END_DASH = 49,
 | |
|     COMMENT_END = 50,
 | |
|     COMMENT_END_BANG = 51,
 | |
|     DOCTYPE = 52,
 | |
|     BEFORE_DOCTYPE_NAME = 53,
 | |
|     DOCTYPE_NAME = 54,
 | |
|     AFTER_DOCTYPE_NAME = 55,
 | |
|     AFTER_DOCTYPE_PUBLIC_KEYWORD = 56,
 | |
|     BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 57,
 | |
|     DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 58,
 | |
|     DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 59,
 | |
|     AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 60,
 | |
|     BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 61,
 | |
|     AFTER_DOCTYPE_SYSTEM_KEYWORD = 62,
 | |
|     BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 63,
 | |
|     DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 64,
 | |
|     DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 65,
 | |
|     AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 66,
 | |
|     BOGUS_DOCTYPE = 67,
 | |
|     CDATA_SECTION = 68,
 | |
|     CDATA_SECTION_BRACKET = 69,
 | |
|     CDATA_SECTION_END = 70,
 | |
|     CHARACTER_REFERENCE = 71,
 | |
|     AMBIGUOUS_AMPERSAND = 72
 | |
| }
 | |
| export declare const TokenizerMode: {
 | |
|     readonly DATA: State.DATA;
 | |
|     readonly RCDATA: State.RCDATA;
 | |
|     readonly RAWTEXT: State.RAWTEXT;
 | |
|     readonly SCRIPT_DATA: State.SCRIPT_DATA;
 | |
|     readonly PLAINTEXT: State.PLAINTEXT;
 | |
|     readonly CDATA_SECTION: State.CDATA_SECTION;
 | |
| };
 | |
| export interface TokenizerOptions {
 | |
|     sourceCodeLocationInfo?: boolean;
 | |
| }
 | |
| export interface TokenHandler {
 | |
|     onComment(token: CommentToken): void;
 | |
|     onDoctype(token: DoctypeToken): void;
 | |
|     onStartTag(token: TagToken): void;
 | |
|     onEndTag(token: TagToken): void;
 | |
|     onEof(token: EOFToken): void;
 | |
|     onCharacter(token: CharacterToken): void;
 | |
|     onNullCharacter(token: CharacterToken): void;
 | |
|     onWhitespaceCharacter(token: CharacterToken): void;
 | |
|     onParseError?: ParserErrorHandler | null;
 | |
| }
 | |
| export declare class Tokenizer {
 | |
|     protected options: TokenizerOptions;
 | |
|     protected handler: TokenHandler;
 | |
|     preprocessor: Preprocessor;
 | |
|     protected paused: boolean;
 | |
|     /** Ensures that the parsing loop isn't run multiple times at once. */
 | |
|     protected inLoop: boolean;
 | |
|     /**
 | |
|      * Indicates that the current adjusted node exists, is not an element in the HTML namespace,
 | |
|      * and that it is not an integration point for either MathML or HTML.
 | |
|      *
 | |
|      * @see {@link https://html.spec.whatwg.org/multipage/parsing.html#tree-construction}
 | |
|      */
 | |
|     inForeignNode: boolean;
 | |
|     lastStartTagName: string;
 | |
|     active: boolean;
 | |
|     state: State;
 | |
|     protected returnState: State;
 | |
|     /**
 | |
|      * We use `entities`' `EntityDecoder` to parse character references.
 | |
|      *
 | |
|      * All of the following states are handled by the `EntityDecoder`:
 | |
|      *
 | |
|      * - Named character reference state
 | |
|      * - Numeric character reference state
 | |
|      * - Hexademical character reference start state
 | |
|      * - Hexademical character reference state
 | |
|      * - Decimal character reference state
 | |
|      * - Numeric character reference end state
 | |
|      */
 | |
|     protected entityDecoder: EntityDecoder;
 | |
|     protected entityStartPos: number;
 | |
|     protected consumedAfterSnapshot: number;
 | |
|     protected currentLocation: Location | null;
 | |
|     protected currentCharacterToken: CharacterToken | null;
 | |
|     protected currentToken: Token | null;
 | |
|     protected currentAttr: Attribute;
 | |
|     constructor(options: TokenizerOptions, handler: TokenHandler);
 | |
|     protected _err(code: ERR, cpOffset?: number): void;
 | |
|     protected getCurrentLocation(offset: number): Location | null;
 | |
|     protected _runParsingLoop(): void;
 | |
|     pause(): void;
 | |
|     resume(writeCallback?: () => void): void;
 | |
|     write(chunk: string, isLastChunk: boolean, writeCallback?: () => void): void;
 | |
|     insertHtmlAtCurrentPos(chunk: string): void;
 | |
|     protected _ensureHibernation(): boolean;
 | |
|     protected _consume(): number;
 | |
|     protected _advanceBy(count: number): void;
 | |
|     protected _consumeSequenceIfMatch(pattern: string, caseSensitive: boolean): boolean;
 | |
|     protected _createStartTagToken(): void;
 | |
|     protected _createEndTagToken(): void;
 | |
|     protected _createCommentToken(offset: number): void;
 | |
|     protected _createDoctypeToken(initialName: string | null): void;
 | |
|     protected _createCharacterToken(type: CharacterToken['type'], chars: string): void;
 | |
|     protected _createAttr(attrNameFirstCh: string): void;
 | |
|     protected _leaveAttrName(): void;
 | |
|     protected _leaveAttrValue(): void;
 | |
|     protected prepareToken(ct: Token): void;
 | |
|     protected emitCurrentTagToken(): void;
 | |
|     protected emitCurrentComment(ct: CommentToken): void;
 | |
|     protected emitCurrentDoctype(ct: DoctypeToken): void;
 | |
|     protected _emitCurrentCharacterToken(nextLocation: Location | null): void;
 | |
|     protected _emitEOFToken(): void;
 | |
|     protected _appendCharToCurrentCharacterToken(type: CharacterToken['type'], ch: string): void;
 | |
|     protected _emitCodePoint(cp: number): void;
 | |
|     protected _emitChars(ch: string): void;
 | |
|     protected _startCharacterReference(): void;
 | |
|     protected _isCharacterReferenceInAttribute(): boolean;
 | |
|     protected _flushCodePointConsumedAsCharacterReference(cp: number): void;
 | |
|     protected _callState(cp: number): void;
 | |
|     protected _stateData(cp: number): void;
 | |
|     protected _stateRcdata(cp: number): void;
 | |
|     protected _stateRawtext(cp: number): void;
 | |
|     protected _stateScriptData(cp: number): void;
 | |
|     protected _statePlaintext(cp: number): void;
 | |
|     protected _stateTagOpen(cp: number): void;
 | |
|     protected _stateEndTagOpen(cp: number): void;
 | |
|     protected _stateTagName(cp: number): void;
 | |
|     protected _stateRcdataLessThanSign(cp: number): void;
 | |
|     protected _stateRcdataEndTagOpen(cp: number): void;
 | |
|     protected handleSpecialEndTag(_cp: number): boolean;
 | |
|     protected _stateRcdataEndTagName(cp: number): void;
 | |
|     protected _stateRawtextLessThanSign(cp: number): void;
 | |
|     protected _stateRawtextEndTagOpen(cp: number): void;
 | |
|     protected _stateRawtextEndTagName(cp: number): void;
 | |
|     protected _stateScriptDataLessThanSign(cp: number): void;
 | |
|     protected _stateScriptDataEndTagOpen(cp: number): void;
 | |
|     protected _stateScriptDataEndTagName(cp: number): void;
 | |
|     protected _stateScriptDataEscapeStart(cp: number): void;
 | |
|     protected _stateScriptDataEscapeStartDash(cp: number): void;
 | |
|     protected _stateScriptDataEscaped(cp: number): void;
 | |
|     protected _stateScriptDataEscapedDash(cp: number): void;
 | |
|     protected _stateScriptDataEscapedDashDash(cp: number): void;
 | |
|     protected _stateScriptDataEscapedLessThanSign(cp: number): void;
 | |
|     protected _stateScriptDataEscapedEndTagOpen(cp: number): void;
 | |
|     protected _stateScriptDataEscapedEndTagName(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscapeStart(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscaped(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscapedDash(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscapedDashDash(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscapedLessThanSign(cp: number): void;
 | |
|     protected _stateScriptDataDoubleEscapeEnd(cp: number): void;
 | |
|     protected _stateBeforeAttributeName(cp: number): void;
 | |
|     protected _stateAttributeName(cp: number): void;
 | |
|     protected _stateAfterAttributeName(cp: number): void;
 | |
|     protected _stateBeforeAttributeValue(cp: number): void;
 | |
|     protected _stateAttributeValueDoubleQuoted(cp: number): void;
 | |
|     protected _stateAttributeValueSingleQuoted(cp: number): void;
 | |
|     protected _stateAttributeValueUnquoted(cp: number): void;
 | |
|     protected _stateAfterAttributeValueQuoted(cp: number): void;
 | |
|     protected _stateSelfClosingStartTag(cp: number): void;
 | |
|     protected _stateBogusComment(cp: number): void;
 | |
|     protected _stateMarkupDeclarationOpen(cp: number): void;
 | |
|     protected _stateCommentStart(cp: number): void;
 | |
|     protected _stateCommentStartDash(cp: number): void;
 | |
|     protected _stateComment(cp: number): void;
 | |
|     protected _stateCommentLessThanSign(cp: number): void;
 | |
|     protected _stateCommentLessThanSignBang(cp: number): void;
 | |
|     protected _stateCommentLessThanSignBangDash(cp: number): void;
 | |
|     protected _stateCommentLessThanSignBangDashDash(cp: number): void;
 | |
|     protected _stateCommentEndDash(cp: number): void;
 | |
|     protected _stateCommentEnd(cp: number): void;
 | |
|     protected _stateCommentEndBang(cp: number): void;
 | |
|     protected _stateDoctype(cp: number): void;
 | |
|     protected _stateBeforeDoctypeName(cp: number): void;
 | |
|     protected _stateDoctypeName(cp: number): void;
 | |
|     protected _stateAfterDoctypeName(cp: number): void;
 | |
|     protected _stateAfterDoctypePublicKeyword(cp: number): void;
 | |
|     protected _stateBeforeDoctypePublicIdentifier(cp: number): void;
 | |
|     protected _stateDoctypePublicIdentifierDoubleQuoted(cp: number): void;
 | |
|     protected _stateDoctypePublicIdentifierSingleQuoted(cp: number): void;
 | |
|     protected _stateAfterDoctypePublicIdentifier(cp: number): void;
 | |
|     protected _stateBetweenDoctypePublicAndSystemIdentifiers(cp: number): void;
 | |
|     protected _stateAfterDoctypeSystemKeyword(cp: number): void;
 | |
|     protected _stateBeforeDoctypeSystemIdentifier(cp: number): void;
 | |
|     protected _stateDoctypeSystemIdentifierDoubleQuoted(cp: number): void;
 | |
|     protected _stateDoctypeSystemIdentifierSingleQuoted(cp: number): void;
 | |
|     protected _stateAfterDoctypeSystemIdentifier(cp: number): void;
 | |
|     protected _stateBogusDoctype(cp: number): void;
 | |
|     protected _stateCdataSection(cp: number): void;
 | |
|     protected _stateCdataSectionBracket(cp: number): void;
 | |
|     protected _stateCdataSectionEnd(cp: number): void;
 | |
|     protected _stateCharacterReference(): void;
 | |
|     protected _stateAmbiguousAmpersand(cp: number): void;
 | |
| }
 | |
| export {};
 |