{"version":3,"file":"parser.cjs","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"],"names":["ruleset","currentPosition","offset","activeRules","rules","ruleCount","itemIndex","propIndex","index","pointPosition","points","segmentEnd","substring","value","ruleIndex","processedValue","AMPERSAND","FORM_FEED","RULESET","type","comment","COMMENT","declaration","DECLARATION","length","parse","rulesets","pseudo","atrule","property","variable","scanning","ampersand","currentChar: string","NULL_CHARACTER","previousChar: string","props","children","reference","rule","characters","currentChar","t","LEFT_PARENTHESIS","COLON","processedChar","startPos","DOUBLE_QUOTE","SINGLE_QUOTE","LEFT_SQUARE_BRACKET","HORIZONTAL_TAB","LINE_FEED","CARRIAGE_RETURN","SPACE","previousChar","REVERSE_SOLIDUS","SOLIDUS","ASTERISK","declarations","token","charOr","START_OF_HEADING","charCodeFrom","SEMICOLON","RIGHT_CURLY_BRACKET","LEFT_CURLY_BRACKET","charCodeAt","COMMA","AT","MINUS","UNDERSCORE","compile","Tokenizer"],"mappings":"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"}