- 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
|