{"mappings":"AA6BA,SAAgB,iBAAiB;AACjC,cAAc,eAAe;AAE7B,OAAO,cAAM,UAAW,EACtB,OACA,MACA,QACA,OACA,QACA,OACA,QACA,MACA,OACA,UACA,QACA,UACA,MACA,UACC;CACD;CACA,MAAM;CACN,QAAQ;CACR;CACA;CACA;CACA;CACA;CACA;CACA,UAAU;CACV;CACA,WAAW;CACX;CACA;MACE;AAoCJ,OAAO,cAAM,UAAW,EACtB,OACA,MACA,QACA,OACA,UACA,MACA,UACC;CACD;CACA,MAAM;CACN,QAAQ;CACR;CACA,WAAW;CACX;CACA;MACE;AAeJ,OAAO,cAAM,cAAe,EAC1B,OACA,MACA,QACA,QACA,UACA,MACA,UACC;CACD;CACA,MAAM;CACN,QAAQ;CACR;CACA,WAAW;CACX;CACA;MACE;AAeJ,OAAO,cAAM,QACX,GAAG,WACH,EACE,OACA,MACA,QACA,MACA,OACA,UACA,QACA,QACA,iBACC;CACD;CACA,OAAO;CACP,SAAS;CACT,OAAO;CACP;CACA,WAAW;CACX;CACA;CACA,0BAA0B;MAE3B;AAqSH,OAAO,cAAM,UAAW,kBAAgB","names":[],"sources":["../../../../src/lib/stylis/parser.ts"],"sourcesContent":["import {\n  AMPERSAND,\n  ASTERISK,\n  AT,\n  CARRIAGE_RETURN,\n  COLON,\n  COMMA,\n  COMMENT,\n  DECLARATION,\n  DOUBLE_QUOTE,\n  FORM_FEED,\n  HORIZONTAL_TAB,\n  MINUS,\n  LEFT_CURLY_BRACKET,\n  LEFT_PARENTHESIS,\n  LEFT_SQUARE_BRACKET,\n  LINE_FEED,\n  NULL_CHARACTER,\n  REVERSE_SOLIDUS,\n  RIGHT_CURLY_BRACKET,\n  RULESET,\n  SEMICOLON,\n  SINGLE_QUOTE,\n  SOLIDUS,\n  SPACE,\n  START_OF_HEADING,\n  UNDERSCORE,\n} from \"./enum.ts\";\nimport { charCodeAt, charCodeFrom, charOr } from \"./utility.ts\";\nimport { token, Tokenizer } from \"./tokenizer.ts\";\nimport type { Element } from \"./types.ts\";\n\nexport const ruleset = ({\n  value,\n  root,\n  parent,\n  index,\n  offset,\n  rules,\n  points,\n  type,\n  props,\n  children,\n  length,\n  siblings,\n  line,\n  column,\n}: {\n  value: string;\n  root: Element;\n  parent: Element | null;\n  index: number;\n  offset: number;\n  rules: string[];\n  points: number[];\n  type: string;\n  props: string[];\n  children: Element[];\n  length: number;\n  siblings?: Element[];\n  line: number;\n  column: number;\n}): Element => {\n  let currentPosition = offset - 1;\n\n  const activeRules = offset === 0 ? rules : [\"\"];\n  const ruleCount = activeRules.length;\n\n  for (let itemIndex = 0, propIndex = 0; itemIndex < index; itemIndex++) {\n    const pointPosition = points[itemIndex];\n    const segmentEnd = Math.abs(pointPosition);\n\n    const substring = value.slice(currentPosition + 1, segmentEnd);\n    currentPosition = segmentEnd;\n\n    for (let ruleIndex = 0; ruleIndex < ruleCount; ruleIndex++) {\n      const processedValue =\n        pointPosition > 0\n          ? `${activeRules[ruleIndex]} ${substring}`\n          : substring.replaceAll(AMPERSAND + FORM_FEED, activeRules[ruleIndex]);\n      props[propIndex] = processedValue.trim();\n      propIndex++;\n    }\n  }\n  return {\n    value,\n    root,\n    parent,\n    type: offset === 0 ? RULESET : type,\n    props,\n    children,\n    length,\n    siblings,\n    line,\n    column,\n  } as Element;\n};\n\nexport const comment = ({\n  value,\n  root,\n  parent,\n  props,\n  siblings,\n  line,\n  column,\n}: {\n  value: string;\n  root: Element;\n  parent: Element | null;\n  props: string;\n  siblings?: Element[];\n  line: number;\n  column: number;\n}): Element => {\n  return {\n    value,\n    root,\n    parent,\n    type: COMMENT,\n    props,\n    children: value.slice(2, -2),\n    length: 0,\n    siblings,\n    line,\n    column,\n  } as Element;\n};\n\nexport const declaration = ({\n  value,\n  root,\n  parent,\n  length,\n  siblings,\n  line,\n  column,\n}: {\n  value: string;\n  root: Element;\n  parent: Element | null;\n  length: number;\n  siblings?: Element[];\n  line: number;\n  column: number;\n}): Element => {\n  return {\n    value,\n    root,\n    parent,\n    type: DECLARATION,\n    props: value.slice(0, length),\n    children: value.slice(length + 1, -1),\n    length,\n    siblings,\n    line,\n    column,\n  } as Element;\n};\n\nexport const parse = (\n  t: Tokenizer,\n  {\n    value = \"\",\n    root = null,\n    parent = null,\n    rule = null,\n    rules = [\"\"],\n    rulesets = [],\n    pseudo = 0,\n    points = [0],\n    declarations = rulesets,\n  }: {\n    value?: string;\n    root?: Element;\n    parent?: Element | null;\n    rule?: Element | string[];\n    rules?: string[];\n    rulesets?: Element[];\n    pseudo?: number;\n    points?: number[];\n    declarations?: string[] | Element[];\n  } = {},\n): Element[] => {\n  let index = 0;\n  let offset = 0;\n  let length = pseudo;\n  let atrule;\n  let property = 0;\n  let variable = 1;\n  let scanning = true;\n  let ampersand = 1;\n  let currentChar: string = NULL_CHARACTER;\n  let previousChar: string = NULL_CHARACTER;\n  let type = \"\";\n  let props = rules;\n  let children = rulesets;\n  let reference = rule;\n  let characters = \"\";\n\n  while (scanning) {\n    previousChar = currentChar;\n    currentChar = t.next();\n    switch (currentChar) {\n      // (\n      case LEFT_PARENTHESIS:\n        if (characters[length - 1] === COLON) {\n          const processedChar = t.delimit(currentChar).replace(AMPERSAND, AMPERSAND + FORM_FEED);\n          characters += processedChar;\n          const startPos = Math.abs(index ? points[index - 1] : 0);\n\n          if (characters.indexOf(AMPERSAND + FORM_FEED, startPos) !== -1) {\n            ampersand = -1;\n          }\n          break;\n        }\n      // \" ' [\n      case DOUBLE_QUOTE:\n      case SINGLE_QUOTE:\n      case LEFT_SQUARE_BRACKET:\n        characters += t.delimit(currentChar);\n        break;\n      // \\t \\n \\r\n      case HORIZONTAL_TAB:\n      case LINE_FEED:\n      case CARRIAGE_RETURN:\n      case SPACE:\n        characters += t.whitespace(previousChar);\n        break;\n      // \\\n      case REVERSE_SOLIDUS:\n        characters += t.escaping(t.position - 1, 7);\n        continue;\n      // /\n      case SOLIDUS:\n        switch (t.peek()) {\n          case ASTERISK:\n          case SOLIDUS: {\n            (declarations as unknown as Element[]).push(\n              comment({\n                value: t.commenter(t.next(), t.position),\n                root,\n                parent,\n                props: t.character,\n                siblings: declarations as unknown as Element[],\n                line: t.line,\n                column: t.column,\n              }),\n            );\n            if (\n              (token(charOr(previousChar, START_OF_HEADING)) === 5 ||\n                token(charOr(t.peek(), START_OF_HEADING)) === 5) &&\n              characters.length &&\n              characters.slice(-1) !== SPACE\n            ) {\n              characters += SPACE;\n            }\n            break;\n          }\n          default:\n            characters += SOLIDUS;\n        }\n        break;\n      // {\n      case charCodeFrom(123 * variable):\n        points[index] = characters.length * ampersand;\n        index++;\n      // } ; \\0\n      case charCodeFrom(125 * variable):\n      case SEMICOLON:\n      case NULL_CHARACTER:\n        switch (currentChar) {\n          // \\0 }\n          case NULL_CHARACTER:\n          case RIGHT_CURLY_BRACKET:\n            scanning = false;\n          // ;\n          case charCodeFrom(59 + offset):\n            if (ampersand === -1) {\n              characters = characters.replace(FORM_FEED, \"\");\n            }\n            if (\n              property > 0 &&\n              (characters.length - length || (variable === 0 && previousChar === SOLIDUS))\n            ) {\n              (declarations as unknown as Element[]).push(\n                property > 32\n                  ? declaration({\n                      value: characters + SEMICOLON,\n                      root: rule as Element,\n                      parent,\n                      length: length - 1,\n                      siblings: declarations as unknown as Element[],\n                      line: t.line,\n                      column: t.column,\n                    })\n                  : declaration({\n                      value: characters.replace(SPACE, \"\") + SEMICOLON,\n                      root: rule as Element,\n                      parent,\n                      length: length - 2,\n                      siblings: declarations as unknown as Element[],\n                      line: t.line,\n                      column: t.column,\n                    }),\n              );\n            }\n            break;\n          // @ ;\n          case SEMICOLON:\n            characters += SEMICOLON;\n          // { rule/at-rule\n          default:\n            props = [];\n            children = [];\n            rulesets.push(\n              (reference = ruleset({\n                value: characters,\n                root,\n                parent,\n                index,\n                offset,\n                rules,\n                points,\n                type,\n                props,\n                children,\n                length,\n                siblings: rulesets,\n                line: t.line,\n                column: t.column,\n              })),\n            );\n\n            if (currentChar === LEFT_CURLY_BRACKET) {\n              if (offset === 0) {\n                parse(t, {\n                  value: characters,\n                  root,\n                  parent: reference,\n                  rule: reference,\n                  rules: props,\n                  rulesets,\n                  pseudo: length,\n                  points,\n                  declarations: children,\n                });\n              } else {\n                switch (atrule) {\n                  // c(ontainer)\n                  case \"c\":\n                    if (characters.slice(2, 10) === \"ontainer\") {\n                      break;\n                    }\n                    offset = 0;\n                  // l(ayer)\n                  case \"l\":\n                    if (characters.slice(2, 6) === \"ayer\") {\n                      break;\n                    }\n                    offset = 0;\n                  // d(ocument) m(edia) s(upports)\n                  case \"d\":\n                  case \"m\":\n                  case \"s\":\n                    break;\n                  default:\n                    offset = 0;\n                }\n                if (offset) {\n                  if (rule) {\n                    props = [];\n                    children.push(\n                      ruleset({\n                        value,\n                        root: reference,\n                        parent: reference,\n                        index: 0,\n                        offset: 0,\n                        rules,\n                        points,\n                        type,\n                        props: rules,\n                        children: props as any,\n                        length,\n                        siblings: children,\n                        line: t.line,\n                        column: t.column,\n                      }),\n                    );\n                  }\n                  parse(t, {\n                    value,\n                    root: reference,\n                    parent: reference,\n                    rule: children as any,\n                    rules: rules,\n                    rulesets: children,\n                    pseudo: length,\n                    points,\n                    declarations: rule ? props : children,\n                  });\n                } else {\n                  parse(t, {\n                    value: characters,\n                    root: reference,\n                    parent: reference,\n                    rule: reference,\n                    rulesets: children,\n                    points,\n                    declarations: children,\n                  });\n                }\n              }\n            }\n        }\n        index = offset = property = 0;\n        variable = ampersand = 1;\n        type = characters = \"\";\n        length = pseudo;\n        break;\n      // :\n      case COLON:\n        length = 1 + characters.length;\n        property = charCodeAt(previousChar);\n      default:\n        if (variable < 1) {\n          if (currentChar === LEFT_CURLY_BRACKET) {\n            variable--;\n          } else if (currentChar === RIGHT_CURLY_BRACKET) {\n            variable++;\n            if (variable === 1 && t.prev() === RIGHT_CURLY_BRACKET) {\n              continue;\n            }\n          }\n        }\n        characters += currentChar;\n        switch (charCodeFrom(charCodeAt(currentChar) * variable)) {\n          // &\n          case AMPERSAND:\n            if (offset > 0) {\n              ampersand = 1;\n            } else {\n              characters += FORM_FEED;\n              ampersand = -1;\n            }\n            break;\n          // ,\n          case COMMA:\n            points[index] = (characters.length - 1) * ampersand;\n            index++;\n            ampersand = 1;\n            break;\n          // @\n          case AT:\n            // -\n            if (t.peek() === MINUS) {\n              characters += t.delimit(t.next());\n            }\n            atrule = t.peek();\n            type = characters += t.identifier(t.position);\n            offset = length = type.length;\n            currentChar = UNDERSCORE;\n            break;\n          // -\n          case MINUS:\n            if (previousChar === MINUS && characters.length === 2) {\n              variable = 0;\n            }\n        }\n    }\n  }\n\n  return rulesets;\n};\n\nexport const compile = (value: string): Element[] => parse(new Tokenizer(value));\n"],"version":3,"file":"parser.d.ts"}