 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>
		
			
				
	
	
		
			862 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			862 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| function $parcel$defineInteropFlag(a) {
 | |
|   Object.defineProperty(a, '__esModule', {value: true, configurable: true});
 | |
| }
 | |
| 
 | |
| function $parcel$export(e, n, v, s) {
 | |
|   Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
 | |
| }
 | |
| var $009ddb00d3ec72b8$exports = {};
 | |
| 
 | |
| $parcel$defineInteropFlag($009ddb00d3ec72b8$exports);
 | |
| 
 | |
| $parcel$export($009ddb00d3ec72b8$exports, "default", () => $009ddb00d3ec72b8$export$2e2bcd8739ae039);
 | |
| class $009ddb00d3ec72b8$export$2e2bcd8739ae039 extends Error {
 | |
|     constructor(filename, msg, lineno, column, css){
 | |
|         super(filename + ':' + lineno + ':' + column + ': ' + msg);
 | |
|         this.reason = msg;
 | |
|         this.filename = filename;
 | |
|         this.line = lineno;
 | |
|         this.column = column;
 | |
|         this.source = css;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| var $0865a9fb4cc365fe$exports = {};
 | |
| 
 | |
| $parcel$defineInteropFlag($0865a9fb4cc365fe$exports);
 | |
| 
 | |
| $parcel$export($0865a9fb4cc365fe$exports, "default", () => $0865a9fb4cc365fe$export$2e2bcd8739ae039);
 | |
| /**
 | |
|  * Store position information for a node
 | |
|  */ class $0865a9fb4cc365fe$export$2e2bcd8739ae039 {
 | |
|     constructor(start, end, source){
 | |
|         this.start = start;
 | |
|         this.end = end;
 | |
|         this.source = source;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| var $b2e137848b48cf4f$exports = {};
 | |
| 
 | |
| $parcel$export($b2e137848b48cf4f$exports, "CssTypes", () => $b2e137848b48cf4f$export$9be5dd6e61d5d73a);
 | |
| var $b2e137848b48cf4f$export$9be5dd6e61d5d73a = /*#__PURE__*/ function(CssTypes) {
 | |
|     CssTypes["stylesheet"] = "stylesheet";
 | |
|     CssTypes["rule"] = "rule";
 | |
|     CssTypes["declaration"] = "declaration";
 | |
|     CssTypes["comment"] = "comment";
 | |
|     CssTypes["container"] = "container";
 | |
|     CssTypes["charset"] = "charset";
 | |
|     CssTypes["document"] = "document";
 | |
|     CssTypes["customMedia"] = "custom-media";
 | |
|     CssTypes["fontFace"] = "font-face";
 | |
|     CssTypes["host"] = "host";
 | |
|     CssTypes["import"] = "import";
 | |
|     CssTypes["keyframes"] = "keyframes";
 | |
|     CssTypes["keyframe"] = "keyframe";
 | |
|     CssTypes["layer"] = "layer";
 | |
|     CssTypes["media"] = "media";
 | |
|     CssTypes["namespace"] = "namespace";
 | |
|     CssTypes["page"] = "page";
 | |
|     CssTypes["startingStyle"] = "starting-style";
 | |
|     CssTypes["supports"] = "supports";
 | |
|     return CssTypes;
 | |
| }({});
 | |
| 
 | |
| 
 | |
| const $6d129ebf064c486f$export$82eb5486fce3d340 = 10000;
 | |
| const $6d129ebf064c486f$export$c8b95ffeec50f24a = (string, search, position)=>{
 | |
|     let currentPosition = position;
 | |
|     let maxLoop = $6d129ebf064c486f$export$82eb5486fce3d340;
 | |
|     do {
 | |
|         const all = search.map((v)=>string.indexOf(v, currentPosition));
 | |
|         all.push(string.indexOf('\\', currentPosition));
 | |
|         const foundAll = all.filter((v)=>v !== -1);
 | |
|         if (foundAll.length === 0) return -1;
 | |
|         const found = Math.min(...foundAll);
 | |
|         if (string[found] === '\\') {
 | |
|             currentPosition = found + 2;
 | |
|             maxLoop--;
 | |
|         } else return found;
 | |
|     }while (maxLoop > 0);
 | |
|     throw new Error('Too many escaping');
 | |
| };
 | |
| const $6d129ebf064c486f$export$b8d42a8583d2e477 = (string, search, position)=>{
 | |
|     let currentSearchPosition = position;
 | |
|     let maxLoop = $6d129ebf064c486f$export$82eb5486fce3d340;
 | |
|     do {
 | |
|         const all = search.map((v)=>string.indexOf(v, currentSearchPosition));
 | |
|         all.push(string.indexOf('(', currentSearchPosition));
 | |
|         all.push(string.indexOf('"', currentSearchPosition));
 | |
|         all.push(string.indexOf("'", currentSearchPosition));
 | |
|         all.push(string.indexOf('\\', currentSearchPosition));
 | |
|         const foundAll = all.filter((v)=>v !== -1);
 | |
|         if (foundAll.length === 0) return -1;
 | |
|         const firstMatchPos = Math.min(...foundAll);
 | |
|         const char = string[firstMatchPos];
 | |
|         switch(char){
 | |
|             case '\\':
 | |
|                 currentSearchPosition = firstMatchPos + 2;
 | |
|                 break;
 | |
|             case '(':
 | |
|                 {
 | |
|                     const endPosition = $6d129ebf064c486f$export$b8d42a8583d2e477(string, [
 | |
|                         ')'
 | |
|                     ], firstMatchPos + 1);
 | |
|                     if (endPosition === -1) return -1;
 | |
|                     currentSearchPosition = endPosition + 1;
 | |
|                 }
 | |
|                 break;
 | |
|             case '"':
 | |
|                 {
 | |
|                     const endQuotePosition = $6d129ebf064c486f$export$c8b95ffeec50f24a(string, [
 | |
|                         '"'
 | |
|                     ], firstMatchPos + 1);
 | |
|                     if (endQuotePosition === -1) return -1;
 | |
|                     currentSearchPosition = endQuotePosition + 1;
 | |
|                 }
 | |
|                 break;
 | |
|             case "'":
 | |
|                 {
 | |
|                     const endQuotePosition = $6d129ebf064c486f$export$c8b95ffeec50f24a(string, [
 | |
|                         "'"
 | |
|                     ], firstMatchPos + 1);
 | |
|                     if (endQuotePosition === -1) return -1;
 | |
|                     currentSearchPosition = endQuotePosition + 1;
 | |
|                 }
 | |
|                 break;
 | |
|             default:
 | |
|                 return firstMatchPos;
 | |
|         }
 | |
|         maxLoop--;
 | |
|     }while (maxLoop > 0);
 | |
|     throw new Error('Too many escaping');
 | |
| };
 | |
| const $6d129ebf064c486f$export$801dd37ac183521b = (string, search)=>{
 | |
|     const result = [];
 | |
|     let currentPosition = 0;
 | |
|     while(currentPosition < string.length){
 | |
|         const index = $6d129ebf064c486f$export$b8d42a8583d2e477(string, search, currentPosition);
 | |
|         if (index === -1) {
 | |
|             result.push(string.substring(currentPosition));
 | |
|             return result;
 | |
|         }
 | |
|         result.push(string.substring(currentPosition, index));
 | |
|         currentPosition = index + 1;
 | |
|     }
 | |
|     return result;
 | |
| };
 | |
| 
 | |
| 
 | |
| // http://www.w3.org/TR/CSS21/grammar.html
 | |
| // https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027
 | |
| // New rule => https://www.w3.org/TR/CSS22/syndata.html#comments
 | |
| // [^] is equivalent to [.\n\r]
 | |
| const $d708735ed1303b43$var$commentre = /\/\*[^]*?(?:\*\/|$)/g;
 | |
| const $d708735ed1303b43$export$98e6a39c04603d36 = (css, options)=>{
 | |
|     options = options || {};
 | |
|     /**
 | |
|    * Positional.
 | |
|    */ let lineno = 1;
 | |
|     let column = 1;
 | |
|     /**
 | |
|    * Update lineno and column based on `str`.
 | |
|    */ function updatePosition(str) {
 | |
|         const lines = str.match(/\n/g);
 | |
|         if (lines) lineno += lines.length;
 | |
|         const i = str.lastIndexOf('\n');
 | |
|         column = ~i ? str.length - i : column + str.length;
 | |
|     }
 | |
|     /**
 | |
|    * Mark position and patch `node.position`.
 | |
|    */ function position() {
 | |
|         const start = {
 | |
|             line: lineno,
 | |
|             column: column
 | |
|         };
 | |
|         return function(node) {
 | |
|             node.position = new (0, $0865a9fb4cc365fe$export$2e2bcd8739ae039)(start, {
 | |
|                 line: lineno,
 | |
|                 column: column
 | |
|             }, options?.source || '');
 | |
|             whitespace();
 | |
|             return node;
 | |
|         };
 | |
|     }
 | |
|     /**
 | |
|    * Error `msg`.
 | |
|    */ const errorsList = [];
 | |
|     function error(msg) {
 | |
|         const err = new (0, $009ddb00d3ec72b8$export$2e2bcd8739ae039)(options?.source || '', msg, lineno, column, css);
 | |
|         if (options?.silent) errorsList.push(err);
 | |
|         else throw err;
 | |
|     }
 | |
|     /**
 | |
|    * Parse stylesheet.
 | |
|    */ function stylesheet() {
 | |
|         const rulesList = rules();
 | |
|         const result = {
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).stylesheet,
 | |
|             stylesheet: {
 | |
|                 source: options?.source,
 | |
|                 rules: rulesList,
 | |
|                 parsingErrors: errorsList
 | |
|             }
 | |
|         };
 | |
|         return result;
 | |
|     }
 | |
|     /**
 | |
|    * Opening brace.
 | |
|    */ function open() {
 | |
|         const openMatch = /^{\s*/.exec(css);
 | |
|         if (openMatch) {
 | |
|             processMatch(openMatch);
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     /**
 | |
|    * Closing brace.
 | |
|    */ function close() {
 | |
|         const closeMatch = /^}/.exec(css);
 | |
|         if (closeMatch) {
 | |
|             processMatch(closeMatch);
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     /**
 | |
|    * Parse ruleset.
 | |
|    */ function rules() {
 | |
|         let node;
 | |
|         const rules = [];
 | |
|         whitespace();
 | |
|         comments(rules);
 | |
|         while(css.length && css.charAt(0) !== '}' && (node = atrule() || rule()))if (node) {
 | |
|             rules.push(node);
 | |
|             comments(rules);
 | |
|         }
 | |
|         return rules;
 | |
|     }
 | |
|     /**
 | |
|    * Update position and css string. Return the matches
 | |
|    */ function processMatch(m) {
 | |
|         const str = m[0];
 | |
|         updatePosition(str);
 | |
|         css = css.slice(str.length);
 | |
|         return m;
 | |
|     }
 | |
|     /**
 | |
|    * Parse whitespace.
 | |
|    */ function whitespace() {
 | |
|         const m = /^\s*/.exec(css);
 | |
|         if (m) processMatch(m);
 | |
|     }
 | |
|     /**
 | |
|    * Parse comments;
 | |
|    */ function comments(rules) {
 | |
|         let c;
 | |
|         rules = rules || [];
 | |
|         while(c = comment())if (c) rules.push(c);
 | |
|         return rules;
 | |
|     }
 | |
|     /**
 | |
|    * Parse comment.
 | |
|    */ function comment() {
 | |
|         const pos = position();
 | |
|         if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) return;
 | |
|         const m = /^\/\*[^]*?\*\//.exec(css);
 | |
|         if (!m) return error('End of comment missing');
 | |
|         processMatch(m);
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).comment,
 | |
|             comment: m[0].slice(2, -2)
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse selector.
 | |
|    */ function selector() {
 | |
|         const m = /^([^{]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         processMatch(m);
 | |
|         // remove comment in selector;
 | |
|         const res = $d708735ed1303b43$var$trim(m[0]).replace($d708735ed1303b43$var$commentre, '');
 | |
|         return (0, $6d129ebf064c486f$export$801dd37ac183521b)(res, [
 | |
|             ','
 | |
|         ]).map((v)=>$d708735ed1303b43$var$trim(v));
 | |
|     }
 | |
|     /**
 | |
|    * Parse declaration.
 | |
|    */ function declaration() {
 | |
|         const pos = position();
 | |
|         // prop
 | |
|         const propMatch = /^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/.exec(css);
 | |
|         if (!propMatch) return;
 | |
|         processMatch(propMatch);
 | |
|         const propValue = $d708735ed1303b43$var$trim(propMatch[0]);
 | |
|         // :
 | |
|         const sepratotorMatch = /^:\s*/.exec(css);
 | |
|         if (!sepratotorMatch) return error("property missing ':'");
 | |
|         processMatch(sepratotorMatch);
 | |
|         // val
 | |
|         let value = '';
 | |
|         const endValuePosition = (0, $6d129ebf064c486f$export$b8d42a8583d2e477)(css, [
 | |
|             ';',
 | |
|             '}'
 | |
|         ]);
 | |
|         if (endValuePosition !== -1) {
 | |
|             value = css.substring(0, endValuePosition);
 | |
|             const fakeMatch = [
 | |
|                 value
 | |
|             ];
 | |
|             processMatch(fakeMatch);
 | |
|             value = $d708735ed1303b43$var$trim(value).replace($d708735ed1303b43$var$commentre, '');
 | |
|         }
 | |
|         const ret = pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).declaration,
 | |
|             property: propValue.replace($d708735ed1303b43$var$commentre, ''),
 | |
|             value: value
 | |
|         });
 | |
|         // ;
 | |
|         const endMatch = /^[;\s]*/.exec(css);
 | |
|         if (endMatch) processMatch(endMatch);
 | |
|         return ret;
 | |
|     }
 | |
|     /**
 | |
|    * Parse declarations.
 | |
|    */ function declarations() {
 | |
|         const decls = [];
 | |
|         if (!open()) return error("missing '{'");
 | |
|         comments(decls);
 | |
|         // declarations
 | |
|         let decl;
 | |
|         while(decl = declaration())if (decl) {
 | |
|             decls.push(decl);
 | |
|             comments(decls);
 | |
|         }
 | |
|         if (!close()) return error("missing '}'");
 | |
|         return decls;
 | |
|     }
 | |
|     /**
 | |
|    * Parse keyframe.
 | |
|    */ function keyframe() {
 | |
|         let m;
 | |
|         const vals = [];
 | |
|         const pos = position();
 | |
|         while(m = /^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/.exec(css)){
 | |
|             const res = processMatch(m);
 | |
|             vals.push(res[1]);
 | |
|             const spacesMatch = /^,\s*/.exec(css);
 | |
|             if (spacesMatch) processMatch(spacesMatch);
 | |
|         }
 | |
|         if (!vals.length) return;
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).keyframe,
 | |
|             values: vals,
 | |
|             declarations: declarations() || []
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse keyframes.
 | |
|    */ function atkeyframes() {
 | |
|         const pos = position();
 | |
|         const m1 = /^@([-\w]+)?keyframes\s*/.exec(css);
 | |
|         if (!m1) return;
 | |
|         const vendor = processMatch(m1)[1];
 | |
|         // identifier
 | |
|         const m2 = /^([-\w]+)\s*/.exec(css);
 | |
|         if (!m2) return error('@keyframes missing name');
 | |
|         const name = processMatch(m2)[1];
 | |
|         if (!open()) return error("@keyframes missing '{'");
 | |
|         let frame;
 | |
|         let frames = comments();
 | |
|         while(frame = keyframe()){
 | |
|             frames.push(frame);
 | |
|             frames = frames.concat(comments());
 | |
|         }
 | |
|         if (!close()) return error("@keyframes missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).keyframes,
 | |
|             name: name,
 | |
|             vendor: vendor,
 | |
|             keyframes: frames
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse supports.
 | |
|    */ function atsupports() {
 | |
|         const pos = position();
 | |
|         const m = /^@supports *([^{]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         const supports = $d708735ed1303b43$var$trim(processMatch(m)[1]);
 | |
|         if (!open()) return error("@supports missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@supports missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).supports,
 | |
|             supports: supports,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse host.
 | |
|    */ function athost() {
 | |
|         const pos = position();
 | |
|         const m = /^@host\s*/.exec(css);
 | |
|         if (!m) return;
 | |
|         processMatch(m);
 | |
|         if (!open()) return error("@host missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@host missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).host,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse container.
 | |
|    */ function atcontainer() {
 | |
|         const pos = position();
 | |
|         const m = /^@container *([^{]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         const container = $d708735ed1303b43$var$trim(processMatch(m)[1]);
 | |
|         if (!open()) return error("@container missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@container missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).container,
 | |
|             container: container,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse container.
 | |
|    */ function atlayer() {
 | |
|         const pos = position();
 | |
|         const m = /^@layer *([^{;@]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         const layer = $d708735ed1303b43$var$trim(processMatch(m)[1]);
 | |
|         if (!open()) {
 | |
|             const m2 = /^[;\s]*/.exec(css);
 | |
|             if (m2) processMatch(m2);
 | |
|             return pos({
 | |
|                 type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).layer,
 | |
|                 layer: layer
 | |
|             });
 | |
|         }
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@layer missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).layer,
 | |
|             layer: layer,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse media.
 | |
|    */ function atmedia() {
 | |
|         const pos = position();
 | |
|         const m = /^@media *([^{]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         const media = $d708735ed1303b43$var$trim(processMatch(m)[1]);
 | |
|         if (!open()) return error("@media missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@media missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).media,
 | |
|             media: media,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse custom-media.
 | |
|    */ function atcustommedia() {
 | |
|         const pos = position();
 | |
|         const m = /^@custom-media\s+(--\S+)\s+([^{;\s][^{;]*);/.exec(css);
 | |
|         if (!m) return;
 | |
|         const res = processMatch(m);
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).customMedia,
 | |
|             name: $d708735ed1303b43$var$trim(res[1]),
 | |
|             media: $d708735ed1303b43$var$trim(res[2])
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse paged media.
 | |
|    */ function atpage() {
 | |
|         const pos = position();
 | |
|         const m = /^@page */.exec(css);
 | |
|         if (!m) return;
 | |
|         processMatch(m);
 | |
|         const sel = selector() || [];
 | |
|         if (!open()) return error("@page missing '{'");
 | |
|         let decls = comments();
 | |
|         // declarations
 | |
|         let decl;
 | |
|         while(decl = declaration()){
 | |
|             decls.push(decl);
 | |
|             decls = decls.concat(comments());
 | |
|         }
 | |
|         if (!close()) return error("@page missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).page,
 | |
|             selectors: sel,
 | |
|             declarations: decls
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse document.
 | |
|    */ function atdocument() {
 | |
|         const pos = position();
 | |
|         const m = /^@([-\w]+)?document *([^{]+)/.exec(css);
 | |
|         if (!m) return;
 | |
|         const res = processMatch(m);
 | |
|         const vendor = $d708735ed1303b43$var$trim(res[1]);
 | |
|         const doc = $d708735ed1303b43$var$trim(res[2]);
 | |
|         if (!open()) return error("@document missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@document missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).document,
 | |
|             document: doc,
 | |
|             vendor: vendor,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse font-face.
 | |
|    */ function atfontface() {
 | |
|         const pos = position();
 | |
|         const m = /^@font-face\s*/.exec(css);
 | |
|         if (!m) return;
 | |
|         processMatch(m);
 | |
|         if (!open()) return error("@font-face missing '{'");
 | |
|         let decls = comments();
 | |
|         // declarations
 | |
|         let decl;
 | |
|         while(decl = declaration()){
 | |
|             decls.push(decl);
 | |
|             decls = decls.concat(comments());
 | |
|         }
 | |
|         if (!close()) return error("@font-face missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).fontFace,
 | |
|             declarations: decls
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse starting style.
 | |
|    */ function atstartingstyle() {
 | |
|         const pos = position();
 | |
|         const m = /^@starting-style\s*/.exec(css);
 | |
|         if (!m) return;
 | |
|         processMatch(m);
 | |
|         if (!open()) return error("@starting-style missing '{'");
 | |
|         const style = comments().concat(rules());
 | |
|         if (!close()) return error("@starting-style missing '}'");
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).startingStyle,
 | |
|             rules: style
 | |
|         });
 | |
|     }
 | |
|     /**
 | |
|    * Parse import
 | |
|    */ const atimport = _compileAtrule('import');
 | |
|     /**
 | |
|    * Parse charset
 | |
|    */ const atcharset = _compileAtrule('charset');
 | |
|     /**
 | |
|    * Parse namespace
 | |
|    */ const atnamespace = _compileAtrule('namespace');
 | |
|     /**
 | |
|    * Parse non-block at-rules
 | |
|    */ function _compileAtrule(name) {
 | |
|         const re = new RegExp('^@' + name + '\\s*((?::?[^;\'"]|"(?:\\\\"|[^"])*?"|\'(?:\\\\\'|[^\'])*?\')+)(?:;|$)');
 | |
|         // ^@import\s*([^;"']|("|')(?:\\\2|.)*?\2)+(;|$)
 | |
|         return function() {
 | |
|             const pos = position();
 | |
|             const m = re.exec(css);
 | |
|             if (!m) return;
 | |
|             const res = processMatch(m);
 | |
|             const ret = {
 | |
|                 type: name
 | |
|             };
 | |
|             ret[name] = res[1].trim();
 | |
|             return pos(ret);
 | |
|         };
 | |
|     }
 | |
|     /**
 | |
|    * Parse at rule.
 | |
|    */ function atrule() {
 | |
|         if (css[0] !== '@') return;
 | |
|         return atkeyframes() || atmedia() || atcustommedia() || atsupports() || atimport() || atcharset() || atnamespace() || atdocument() || atpage() || athost() || atfontface() || atcontainer() || atstartingstyle() || atlayer();
 | |
|     }
 | |
|     /**
 | |
|    * Parse rule.
 | |
|    */ function rule() {
 | |
|         const pos = position();
 | |
|         const sel = selector();
 | |
|         if (!sel) return error('selector missing');
 | |
|         comments();
 | |
|         return pos({
 | |
|             type: (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).rule,
 | |
|             selectors: sel,
 | |
|             declarations: declarations() || []
 | |
|         });
 | |
|     }
 | |
|     return $d708735ed1303b43$var$addParent(stylesheet());
 | |
| };
 | |
| /**
 | |
|  * Trim `str`.
 | |
|  */ function $d708735ed1303b43$var$trim(str) {
 | |
|     return str ? str.trim() : '';
 | |
| }
 | |
| /**
 | |
|  * Adds non-enumerable parent node reference to each node.
 | |
|  */ function $d708735ed1303b43$var$addParent(obj, parent) {
 | |
|     const isNode = obj && typeof obj.type === 'string';
 | |
|     const childParent = isNode ? obj : parent;
 | |
|     for(const k in obj){
 | |
|         const value = obj[k];
 | |
|         if (Array.isArray(value)) value.forEach((v)=>{
 | |
|             $d708735ed1303b43$var$addParent(v, childParent);
 | |
|         });
 | |
|         else if (value && typeof value === 'object') $d708735ed1303b43$var$addParent(value, childParent);
 | |
|     }
 | |
|     if (isNode) Object.defineProperty(obj, 'parent', {
 | |
|         configurable: true,
 | |
|         writable: true,
 | |
|         enumerable: false,
 | |
|         value: parent || null
 | |
|     });
 | |
|     return obj;
 | |
| }
 | |
| var $d708735ed1303b43$export$2e2bcd8739ae039 = $d708735ed1303b43$export$98e6a39c04603d36;
 | |
| 
 | |
| 
 | |
| 
 | |
| class $de9540138ed1fd01$var$Compiler {
 | |
|     constructor(options){
 | |
|         this.level = 0;
 | |
|         this.indentation = '  ';
 | |
|         this.compress = false;
 | |
|         if (typeof options?.indent === 'string') this.indentation = options?.indent;
 | |
|         if (options?.compress) this.compress = true;
 | |
|     }
 | |
|     // We disable no-unused-vars for _position. We keep position for potential reintroduction of source-map
 | |
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | |
|     emit(str, _position) {
 | |
|         return str;
 | |
|     }
 | |
|     /**
 | |
|    * Increase, decrease or return current indentation.
 | |
|    */ indent(level) {
 | |
|         this.level = this.level || 1;
 | |
|         if (level) {
 | |
|             this.level += level;
 | |
|             return '';
 | |
|         }
 | |
|         return Array(this.level).join(this.indentation);
 | |
|     }
 | |
|     visit(node) {
 | |
|         switch(node.type){
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).stylesheet:
 | |
|                 return this.stylesheet(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).rule:
 | |
|                 return this.rule(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).declaration:
 | |
|                 return this.declaration(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).comment:
 | |
|                 return this.comment(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).container:
 | |
|                 return this.container(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).charset:
 | |
|                 return this.charset(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).document:
 | |
|                 return this.document(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).customMedia:
 | |
|                 return this.customMedia(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).fontFace:
 | |
|                 return this.fontFace(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).host:
 | |
|                 return this.host(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).import:
 | |
|                 return this.import(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).keyframes:
 | |
|                 return this.keyframes(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).keyframe:
 | |
|                 return this.keyframe(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).layer:
 | |
|                 return this.layer(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).media:
 | |
|                 return this.media(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).namespace:
 | |
|                 return this.namespace(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).page:
 | |
|                 return this.page(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).startingStyle:
 | |
|                 return this.startingStyle(node);
 | |
|             case (0, $b2e137848b48cf4f$export$9be5dd6e61d5d73a).supports:
 | |
|                 return this.supports(node);
 | |
|         }
 | |
|     }
 | |
|     mapVisit(nodes, delim) {
 | |
|         let buf = '';
 | |
|         delim = delim || '';
 | |
|         for(let i = 0, length = nodes.length; i < length; i++){
 | |
|             buf += this.visit(nodes[i]);
 | |
|             if (delim && i < length - 1) buf += this.emit(delim);
 | |
|         }
 | |
|         return buf;
 | |
|     }
 | |
|     compile(node) {
 | |
|         if (this.compress) return node.stylesheet.rules.map(this.visit, this).join('');
 | |
|         return this.stylesheet(node);
 | |
|     }
 | |
|     /**
 | |
|    * Visit stylesheet node.
 | |
|    */ stylesheet(node) {
 | |
|         return this.mapVisit(node.stylesheet.rules, '\n\n');
 | |
|     }
 | |
|     /**
 | |
|    * Visit comment node.
 | |
|    */ comment(node) {
 | |
|         if (this.compress) return this.emit('', node.position);
 | |
|         return this.emit(this.indent() + '/*' + node.comment + '*/', node.position);
 | |
|     }
 | |
|     /**
 | |
|    * Visit container node.
 | |
|    */ container(node) {
 | |
|         if (this.compress) return this.emit('@container ' + node.container, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit(this.indent() + '@container ' + node.container, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit('\n' + this.indent(-1) + this.indent() + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit container node.
 | |
|    */ layer(node) {
 | |
|         if (this.compress) return this.emit('@layer ' + node.layer, node.position) + (node.rules ? this.emit('{') + this.mapVisit(node.rules) + this.emit('}') : ';');
 | |
|         return this.emit(this.indent() + '@layer ' + node.layer, node.position) + (node.rules ? this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit('\n' + this.indent(-1) + this.indent() + '}') : ';');
 | |
|     }
 | |
|     /**
 | |
|    * Visit import node.
 | |
|    */ import(node) {
 | |
|         return this.emit('@import ' + node.import + ';', node.position);
 | |
|     }
 | |
|     /**
 | |
|    * Visit media node.
 | |
|    */ media(node) {
 | |
|         if (this.compress) return this.emit('@media ' + node.media, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit(this.indent() + '@media ' + node.media, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit('\n' + this.indent(-1) + this.indent() + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit document node.
 | |
|    */ document(node) {
 | |
|         const doc = '@' + (node.vendor || '') + 'document ' + node.document;
 | |
|         if (this.compress) return this.emit(doc, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit(doc, node.position) + this.emit("  {\n" + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit charset node.
 | |
|    */ charset(node) {
 | |
|         return this.emit('@charset ' + node.charset + ';', node.position);
 | |
|     }
 | |
|     /**
 | |
|    * Visit namespace node.
 | |
|    */ namespace(node) {
 | |
|         return this.emit('@namespace ' + node.namespace + ';', node.position);
 | |
|     }
 | |
|     /**
 | |
|    * Visit container node.
 | |
|    */ startingStyle(node) {
 | |
|         if (this.compress) return this.emit('@starting-style', node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit(this.indent() + '@starting-style', node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit('\n' + this.indent(-1) + this.indent() + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit supports node.
 | |
|    */ supports(node) {
 | |
|         if (this.compress) return this.emit('@supports ' + node.supports, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit(this.indent() + '@supports ' + node.supports, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit('\n' + this.indent(-1) + this.indent() + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit keyframes node.
 | |
|    */ keyframes(node) {
 | |
|         if (this.compress) return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit('{') + this.mapVisit(node.keyframes) + this.emit('}');
 | |
|         return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.keyframes, '\n') + this.emit(this.indent(-1) + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit keyframe node.
 | |
|    */ keyframe(node) {
 | |
|         const decls = node.declarations;
 | |
|         if (this.compress) return this.emit(node.values.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}');
 | |
|         return this.emit(this.indent()) + this.emit(node.values.join(', '), node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1) + '\n' + this.indent() + '}\n');
 | |
|     }
 | |
|     /**
 | |
|    * Visit page node.
 | |
|    */ page(node) {
 | |
|         if (this.compress) {
 | |
|             const sel = node.selectors.length ? node.selectors.join(', ') : '';
 | |
|             return this.emit('@page ' + sel, node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}');
 | |
|         }
 | |
|         const sel = node.selectors.length ? node.selectors.join(', ') + ' ' : '';
 | |
|         return this.emit('@page ' + sel, node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit font-face node.
 | |
|    */ fontFace(node) {
 | |
|         if (this.compress) return this.emit('@font-face', node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}');
 | |
|         return this.emit('@font-face ', node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit host node.
 | |
|    */ host(node) {
 | |
|         if (this.compress) return this.emit('@host', node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}');
 | |
|         return this.emit('@host', node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit custom-media node.
 | |
|    */ customMedia(node) {
 | |
|         return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position);
 | |
|     }
 | |
|     /**
 | |
|    * Visit rule node.
 | |
|    */ rule(node) {
 | |
|         const decls = node.declarations;
 | |
|         if (!decls.length) return '';
 | |
|         if (this.compress) return this.emit(node.selectors.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}');
 | |
|         const indent = this.indent();
 | |
|         return this.emit(node.selectors.map((s)=>{
 | |
|             return indent + s;
 | |
|         }).join(',\n'), node.position) + this.emit(' {\n') + this.emit(this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1)) + this.emit('\n' + this.indent() + '}');
 | |
|     }
 | |
|     /**
 | |
|    * Visit declaration node.
 | |
|    */ declaration(node) {
 | |
|         if (this.compress) return this.emit(node.property + ':' + node.value, node.position) + this.emit(';');
 | |
|         if (node.property === 'grid-template-areas') return this.emit(this.indent()) + this.emit(node.property + ': ' + node.value.split('\n').join('\n'.padEnd(22) + this.indent()), node.position) + this.emit(';');
 | |
|         return this.emit(this.indent()) + this.emit(node.property + ': ' + node.value, node.position) + this.emit(';');
 | |
|     }
 | |
| }
 | |
| var $de9540138ed1fd01$export$2e2bcd8739ae039 = $de9540138ed1fd01$var$Compiler;
 | |
| 
 | |
| 
 | |
| var $fdf773ab87e20450$export$2e2bcd8739ae039 = (node, options)=>{
 | |
|     const compiler = new (0, $de9540138ed1fd01$export$2e2bcd8739ae039)(options || {});
 | |
|     return compiler.compile(node);
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| const $149c1bd638913645$export$98e6a39c04603d36 = (0, $d708735ed1303b43$export$2e2bcd8739ae039);
 | |
| const $149c1bd638913645$export$fac44ee5b035f737 = (0, $fdf773ab87e20450$export$2e2bcd8739ae039);
 | |
| var $149c1bd638913645$export$2e2bcd8739ae039 = {
 | |
|     parse: $149c1bd638913645$export$98e6a39c04603d36,
 | |
|     stringify: $149c1bd638913645$export$fac44ee5b035f737
 | |
| };
 | |
| 
 | |
| 
 | |
| export {$149c1bd638913645$export$98e6a39c04603d36 as parse, $149c1bd638913645$export$fac44ee5b035f737 as stringify, $149c1bd638913645$export$2e2bcd8739ae039 as default, $b2e137848b48cf4f$export$9be5dd6e61d5d73a as CssTypes};
 | |
| //# sourceMappingURL=index.mjs.map
 |