 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>
		
			
				
	
	
		
			238 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = void 0;
 | |
| exports.causesExit = causesExit;
 | |
| exports.adjustTokenMathMLAttrs = adjustTokenMathMLAttrs;
 | |
| exports.adjustTokenSVGAttrs = adjustTokenSVGAttrs;
 | |
| exports.adjustTokenXMLAttrs = adjustTokenXMLAttrs;
 | |
| exports.adjustTokenSVGTagName = adjustTokenSVGTagName;
 | |
| exports.isIntegrationPoint = isIntegrationPoint;
 | |
| const html_js_1 = require("./html.js");
 | |
| //MIME types
 | |
| const MIME_TYPES = {
 | |
|     TEXT_HTML: 'text/html',
 | |
|     APPLICATION_XML: 'application/xhtml+xml',
 | |
| };
 | |
| //Attributes
 | |
| const DEFINITION_URL_ATTR = 'definitionurl';
 | |
| const ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL';
 | |
| const SVG_ATTRS_ADJUSTMENT_MAP = new Map([
 | |
|     'attributeName',
 | |
|     'attributeType',
 | |
|     'baseFrequency',
 | |
|     'baseProfile',
 | |
|     'calcMode',
 | |
|     'clipPathUnits',
 | |
|     'diffuseConstant',
 | |
|     'edgeMode',
 | |
|     'filterUnits',
 | |
|     'glyphRef',
 | |
|     'gradientTransform',
 | |
|     'gradientUnits',
 | |
|     'kernelMatrix',
 | |
|     'kernelUnitLength',
 | |
|     'keyPoints',
 | |
|     'keySplines',
 | |
|     'keyTimes',
 | |
|     'lengthAdjust',
 | |
|     'limitingConeAngle',
 | |
|     'markerHeight',
 | |
|     'markerUnits',
 | |
|     'markerWidth',
 | |
|     'maskContentUnits',
 | |
|     'maskUnits',
 | |
|     'numOctaves',
 | |
|     'pathLength',
 | |
|     'patternContentUnits',
 | |
|     'patternTransform',
 | |
|     'patternUnits',
 | |
|     'pointsAtX',
 | |
|     'pointsAtY',
 | |
|     'pointsAtZ',
 | |
|     'preserveAlpha',
 | |
|     'preserveAspectRatio',
 | |
|     'primitiveUnits',
 | |
|     'refX',
 | |
|     'refY',
 | |
|     'repeatCount',
 | |
|     'repeatDur',
 | |
|     'requiredExtensions',
 | |
|     'requiredFeatures',
 | |
|     'specularConstant',
 | |
|     'specularExponent',
 | |
|     'spreadMethod',
 | |
|     'startOffset',
 | |
|     'stdDeviation',
 | |
|     'stitchTiles',
 | |
|     'surfaceScale',
 | |
|     'systemLanguage',
 | |
|     'tableValues',
 | |
|     'targetX',
 | |
|     'targetY',
 | |
|     'textLength',
 | |
|     'viewBox',
 | |
|     'viewTarget',
 | |
|     'xChannelSelector',
 | |
|     'yChannelSelector',
 | |
|     'zoomAndPan',
 | |
| ].map((attr) => [attr.toLowerCase(), attr]));
 | |
| const XML_ATTRS_ADJUSTMENT_MAP = new Map([
 | |
|     ['xlink:actuate', { prefix: 'xlink', name: 'actuate', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:arcrole', { prefix: 'xlink', name: 'arcrole', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:href', { prefix: 'xlink', name: 'href', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:role', { prefix: 'xlink', name: 'role', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:show', { prefix: 'xlink', name: 'show', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:title', { prefix: 'xlink', name: 'title', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xlink:type', { prefix: 'xlink', name: 'type', namespace: html_js_1.NS.XLINK }],
 | |
|     ['xml:lang', { prefix: 'xml', name: 'lang', namespace: html_js_1.NS.XML }],
 | |
|     ['xml:space', { prefix: 'xml', name: 'space', namespace: html_js_1.NS.XML }],
 | |
|     ['xmlns', { prefix: '', name: 'xmlns', namespace: html_js_1.NS.XMLNS }],
 | |
|     ['xmlns:xlink', { prefix: 'xmlns', name: 'xlink', namespace: html_js_1.NS.XMLNS }],
 | |
| ]);
 | |
| //SVG tag names adjustment map
 | |
| exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map([
 | |
|     'altGlyph',
 | |
|     'altGlyphDef',
 | |
|     'altGlyphItem',
 | |
|     'animateColor',
 | |
|     'animateMotion',
 | |
|     'animateTransform',
 | |
|     'clipPath',
 | |
|     'feBlend',
 | |
|     'feColorMatrix',
 | |
|     'feComponentTransfer',
 | |
|     'feComposite',
 | |
|     'feConvolveMatrix',
 | |
|     'feDiffuseLighting',
 | |
|     'feDisplacementMap',
 | |
|     'feDistantLight',
 | |
|     'feFlood',
 | |
|     'feFuncA',
 | |
|     'feFuncB',
 | |
|     'feFuncG',
 | |
|     'feFuncR',
 | |
|     'feGaussianBlur',
 | |
|     'feImage',
 | |
|     'feMerge',
 | |
|     'feMergeNode',
 | |
|     'feMorphology',
 | |
|     'feOffset',
 | |
|     'fePointLight',
 | |
|     'feSpecularLighting',
 | |
|     'feSpotLight',
 | |
|     'feTile',
 | |
|     'feTurbulence',
 | |
|     'foreignObject',
 | |
|     'glyphRef',
 | |
|     'linearGradient',
 | |
|     'radialGradient',
 | |
|     'textPath',
 | |
| ].map((tn) => [tn.toLowerCase(), tn]));
 | |
| //Tags that causes exit from foreign content
 | |
| const EXITS_FOREIGN_CONTENT = new Set([
 | |
|     html_js_1.TAG_ID.B,
 | |
|     html_js_1.TAG_ID.BIG,
 | |
|     html_js_1.TAG_ID.BLOCKQUOTE,
 | |
|     html_js_1.TAG_ID.BODY,
 | |
|     html_js_1.TAG_ID.BR,
 | |
|     html_js_1.TAG_ID.CENTER,
 | |
|     html_js_1.TAG_ID.CODE,
 | |
|     html_js_1.TAG_ID.DD,
 | |
|     html_js_1.TAG_ID.DIV,
 | |
|     html_js_1.TAG_ID.DL,
 | |
|     html_js_1.TAG_ID.DT,
 | |
|     html_js_1.TAG_ID.EM,
 | |
|     html_js_1.TAG_ID.EMBED,
 | |
|     html_js_1.TAG_ID.H1,
 | |
|     html_js_1.TAG_ID.H2,
 | |
|     html_js_1.TAG_ID.H3,
 | |
|     html_js_1.TAG_ID.H4,
 | |
|     html_js_1.TAG_ID.H5,
 | |
|     html_js_1.TAG_ID.H6,
 | |
|     html_js_1.TAG_ID.HEAD,
 | |
|     html_js_1.TAG_ID.HR,
 | |
|     html_js_1.TAG_ID.I,
 | |
|     html_js_1.TAG_ID.IMG,
 | |
|     html_js_1.TAG_ID.LI,
 | |
|     html_js_1.TAG_ID.LISTING,
 | |
|     html_js_1.TAG_ID.MENU,
 | |
|     html_js_1.TAG_ID.META,
 | |
|     html_js_1.TAG_ID.NOBR,
 | |
|     html_js_1.TAG_ID.OL,
 | |
|     html_js_1.TAG_ID.P,
 | |
|     html_js_1.TAG_ID.PRE,
 | |
|     html_js_1.TAG_ID.RUBY,
 | |
|     html_js_1.TAG_ID.S,
 | |
|     html_js_1.TAG_ID.SMALL,
 | |
|     html_js_1.TAG_ID.SPAN,
 | |
|     html_js_1.TAG_ID.STRONG,
 | |
|     html_js_1.TAG_ID.STRIKE,
 | |
|     html_js_1.TAG_ID.SUB,
 | |
|     html_js_1.TAG_ID.SUP,
 | |
|     html_js_1.TAG_ID.TABLE,
 | |
|     html_js_1.TAG_ID.TT,
 | |
|     html_js_1.TAG_ID.U,
 | |
|     html_js_1.TAG_ID.UL,
 | |
|     html_js_1.TAG_ID.VAR,
 | |
| ]);
 | |
| //Check exit from foreign content
 | |
| function causesExit(startTagToken) {
 | |
|     const tn = startTagToken.tagID;
 | |
|     const isFontWithAttrs = tn === html_js_1.TAG_ID.FONT &&
 | |
|         startTagToken.attrs.some(({ name }) => name === html_js_1.ATTRS.COLOR || name === html_js_1.ATTRS.SIZE || name === html_js_1.ATTRS.FACE);
 | |
|     return isFontWithAttrs || EXITS_FOREIGN_CONTENT.has(tn);
 | |
| }
 | |
| //Token adjustments
 | |
| function adjustTokenMathMLAttrs(token) {
 | |
|     for (let i = 0; i < token.attrs.length; i++) {
 | |
|         if (token.attrs[i].name === DEFINITION_URL_ATTR) {
 | |
|             token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR;
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| function adjustTokenSVGAttrs(token) {
 | |
|     for (let i = 0; i < token.attrs.length; i++) {
 | |
|         const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);
 | |
|         if (adjustedAttrName != null) {
 | |
|             token.attrs[i].name = adjustedAttrName;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| function adjustTokenXMLAttrs(token) {
 | |
|     for (let i = 0; i < token.attrs.length; i++) {
 | |
|         const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name);
 | |
|         if (adjustedAttrEntry) {
 | |
|             token.attrs[i].prefix = adjustedAttrEntry.prefix;
 | |
|             token.attrs[i].name = adjustedAttrEntry.name;
 | |
|             token.attrs[i].namespace = adjustedAttrEntry.namespace;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| function adjustTokenSVGTagName(token) {
 | |
|     const adjustedTagName = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName);
 | |
|     if (adjustedTagName != null) {
 | |
|         token.tagName = adjustedTagName;
 | |
|         token.tagID = (0, html_js_1.getTagID)(token.tagName);
 | |
|     }
 | |
| }
 | |
| //Integration points
 | |
| function isMathMLTextIntegrationPoint(tn, ns) {
 | |
|     return ns === html_js_1.NS.MATHML && (tn === html_js_1.TAG_ID.MI || tn === html_js_1.TAG_ID.MO || tn === html_js_1.TAG_ID.MN || tn === html_js_1.TAG_ID.MS || tn === html_js_1.TAG_ID.MTEXT);
 | |
| }
 | |
| function isHtmlIntegrationPoint(tn, ns, attrs) {
 | |
|     if (ns === html_js_1.NS.MATHML && tn === html_js_1.TAG_ID.ANNOTATION_XML) {
 | |
|         for (let i = 0; i < attrs.length; i++) {
 | |
|             if (attrs[i].name === html_js_1.ATTRS.ENCODING) {
 | |
|                 const value = attrs[i].value.toLowerCase();
 | |
|                 return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     return ns === html_js_1.NS.SVG && (tn === html_js_1.TAG_ID.FOREIGN_OBJECT || tn === html_js_1.TAG_ID.DESC || tn === html_js_1.TAG_ID.TITLE);
 | |
| }
 | |
| function isIntegrationPoint(tn, ns, attrs, foreignNS) {
 | |
|     return (((!foreignNS || foreignNS === html_js_1.NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) ||
 | |
|         ((!foreignNS || foreignNS === html_js_1.NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns)));
 | |
| }
 |