import { String as StringToken, Ident, Url, Function as FunctionToken, LeftParenthesis, RightParenthesis } from '../../tokenizer/index.js'; function parseWithFallback(parse, fallback) { return this.parseWithFallback( () => { try { return parse.call(this); } finally { this.skipSC(); if (this.lookupNonWSType(0) !== RightParenthesis) { this.error(); } } }, fallback || (() => this.Raw(null, true)) ); } const parseFunctions = { layer() { this.skipSC(); const children = this.createList(); const node = parseWithFallback.call(this, this.Layer); if (node.type !== 'Raw' || node.value !== '') { children.push(node); } return children; }, supports() { this.skipSC(); const children = this.createList(); const node = parseWithFallback.call( this, this.Declaration, () => parseWithFallback.call(this, () => this.Condition('supports')) ); if (node.type !== 'Raw' || node.value !== '') { children.push(node); } return children; } }; export default { parse: { prelude() { const children = this.createList(); switch (this.tokenType) { case StringToken: children.push(this.String()); break; case Url: case FunctionToken: children.push(this.Url()); break; default: this.error('String or url() is expected'); } this.skipSC(); if (this.tokenType === Ident && this.cmpStr(this.tokenStart, this.tokenEnd, 'layer')) { children.push(this.Identifier()); } else if ( this.tokenType === FunctionToken && this.cmpStr(this.tokenStart, this.tokenEnd, 'layer(') ) { children.push(this.Function(null, parseFunctions)); } this.skipSC(); if (this.tokenType === FunctionToken && this.cmpStr(this.tokenStart, this.tokenEnd, 'supports(')) { children.push(this.Function(null, parseFunctions)); } if (this.lookupNonWSType(0) === Ident || this.lookupNonWSType(0) === LeftParenthesis) { children.push(this.MediaQueryList()); } return children; }, block: null } };