{"version":3,"file":"util.extract-declaration-scopes.mjs","sources":["../../../../../src/rules/css/grouped-declarations/util.extract-declaration-scopes.ts"],"sourcesContent":["import type { AtRule, Comment, Declaration, Root, Rule } from \"postcss\";\n\nexport type DeclarationScope = {\n  comments: Comment[];\n  container?: Rule | AtRule;\n  groups: DeclarationGroup[];\n  scopes: DeclarationScope[];\n};\n\nexport type DeclarationGroup = {\n  comments: Comment[];\n  declarations: Declaration[];\n};\n\nexport function extractDeclarationScope(\n  root: Root | AtRule | Rule,\n  comments?: Comment[],\n): DeclarationScope {\n  root.nodes ??= [];\n\n  let commentsForNextScope: Comment[] = [];\n  const scopedDeclaration: DeclarationScope = {\n    comments: comments ?? [],\n    container:\n      root.type === \"atrule\" || root.type === \"rule\" ? root : undefined,\n    groups: [],\n    scopes: [],\n  };\n  let currentDeclarationGroup: DeclarationGroup = {\n    declarations: [],\n    comments: [],\n  };\n\n  for (let i = 0; i < root.nodes.length; i++) {\n    const currentNode = root.nodes[i];\n\n    switch (currentNode?.type) {\n      case \"decl\": {\n        const prevDeclaration = currentDeclarationGroup.declarations.at(-1);\n\n        if (\n          prevDeclaration?.source?.end &&\n          currentNode.source?.start &&\n          prevDeclaration.source.end.line < currentNode.source.start.line - 1\n        ) {\n          scopedDeclaration.groups.push(currentDeclarationGroup);\n          currentDeclarationGroup = {\n            declarations: [],\n            comments: [],\n          };\n        }\n\n        currentDeclarationGroup.declarations.push(currentNode);\n        break;\n      }\n\n      case \"comment\": {\n        if (isNextLogicalNodeAScope(root, i)) {\n          commentsForNextScope.push(currentNode);\n        } else if (\n          currentDeclarationGroup.declarations.length > 0 &&\n          currentNode.raws.before?.includes(\"\\n\")\n        ) {\n          scopedDeclaration.groups.push(currentDeclarationGroup);\n          currentDeclarationGroup = {\n            comments: [currentNode],\n            declarations: [],\n          };\n        } else {\n          currentDeclarationGroup.comments.push(currentNode);\n        }\n        break;\n      }\n\n      case \"rule\": {\n        if (currentDeclarationGroup.declarations.length > 0) {\n          scopedDeclaration.groups.push(currentDeclarationGroup);\n\n          currentDeclarationGroup = {\n            declarations: [],\n            comments: [],\n          };\n        }\n\n        const ruleDeclarationGroups = extractDeclarationScope(\n          currentNode,\n          commentsForNextScope,\n        );\n        commentsForNextScope = [];\n        scopedDeclaration.scopes.push(ruleDeclarationGroups);\n\n        break;\n      }\n\n      case \"atrule\": {\n        if (currentDeclarationGroup.declarations.length > 0) {\n          scopedDeclaration.groups.push(currentDeclarationGroup);\n\n          currentDeclarationGroup = {\n            declarations: [],\n            comments: [],\n          };\n        }\n\n        const ruleDeclarationGroups = extractDeclarationScope(\n          currentNode,\n          commentsForNextScope,\n        );\n        commentsForNextScope = [];\n        scopedDeclaration.scopes.push(ruleDeclarationGroups);\n      }\n    }\n  }\n\n  if (commentsForNextScope.length > 0) {\n    scopedDeclaration.comments.push(...commentsForNextScope);\n  }\n\n  if (\n    currentDeclarationGroup.declarations.length > 0 ||\n    currentDeclarationGroup.comments.length > 0\n  ) {\n    scopedDeclaration.groups.push(currentDeclarationGroup);\n  }\n\n  return scopedDeclaration;\n}\n\nfunction isNextLogicalNodeAScope(\n  root: Root | AtRule | Rule,\n  startIndex: number,\n): boolean {\n  root.nodes ??= [];\n\n  for (let i = startIndex + 1; i < root.nodes.length; i++) {\n    const nextNode = root.nodes[i];\n\n    if (!nextNode || nextNode.type === \"atrule\" || nextNode.type === \"rule\") {\n      return true;\n    }\n\n    if (nextNode.type === \"decl\") {\n      return false;\n    }\n  }\n\n  return false;\n}\n"],"names":[],"mappings":"AAcO,SAAS,uBAAA,CACd,MACA,QAAA,EACkB;AAClB,EAAA,IAAA,CAAK,UAAU,EAAC;AAEhB,EAAA,IAAI,uBAAkC,EAAC;AACvC,EAAA,MAAM,iBAAA,GAAsC;AAAA,IAC1C,QAAA,EAAU,YAAY,EAAC;AAAA,IACvB,WACE,IAAA,CAAK,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,KAAS,SAAS,IAAA,GAAO,MAAA;AAAA,IAC1D,QAAQ,EAAC;AAAA,IACT,QAAQ;AAAC,GACX;AACA,EAAA,IAAI,uBAAA,GAA4C;AAAA,IAC9C,cAAc,EAAC;AAAA,IACf,UAAU;AAAC,GACb;AAEA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEhC,IAAA,QAAQ,aAAa,IAAA;AAAM,MACzB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,YAAA,CAAa,EAAA,CAAG,EAAE,CAAA;AAElE,QAAA,IACE,eAAA,EAAiB,MAAA,EAAQ,GAAA,IACzB,WAAA,CAAY,QAAQ,KAAA,IACpB,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAClE;AACA,UAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,uBAAuB,CAAA;AACrD,UAAA,uBAAA,GAA0B;AAAA,YACxB,cAAc,EAAC;AAAA,YACf,UAAU;AAAC,WACb;AAAA,QACF;AAEA,QAAA,uBAAA,CAAwB,YAAA,CAAa,KAAK,WAAW,CAAA;AACrD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,IAAI,uBAAA,CAAwB,IAAA,EAAM,CAAC,CAAA,EAAG;AACpC,UAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA;AAAA,QACvC,CAAA,MAAA,IACE,uBAAA,CAAwB,YAAA,CAAa,MAAA,GAAS,CAAA,IAC9C,YAAY,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,IAAI,CAAA,EACtC;AACA,UAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,uBAAuB,CAAA;AACrD,UAAA,uBAAA,GAA0B;AAAA,YACxB,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,YACtB,cAAc;AAAC,WACjB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,uBAAA,CAAwB,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,QACnD;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,uBAAA,CAAwB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACnD,UAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAErD,UAAA,uBAAA,GAA0B;AAAA,YACxB,cAAc,EAAC;AAAA,YACf,UAAU;AAAC,WACb;AAAA,QACF;AAEA,QAAA,MAAM,qBAAA,GAAwB,uBAAA;AAAA,UAC5B,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,oBAAA,GAAuB,EAAC;AACxB,QAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,qBAAqB,CAAA;AAEnD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,uBAAA,CAAwB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACnD,UAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAErD,UAAA,uBAAA,GAA0B;AAAA,YACxB,cAAc,EAAC;AAAA,YACf,UAAU;AAAC,WACb;AAAA,QACF;AAEA,QAAA,MAAM,qBAAA,GAAwB,uBAAA;AAAA,UAC5B,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,oBAAA,GAAuB,EAAC;AACxB,QAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,qBAAqB,CAAA;AAAA,MACrD;AAAA;AACF,EACF;AAEA,EAAA,IAAI,oBAAA,CAAqB,SAAS,CAAA,EAAG;AACnC,IAAA,iBAAA,CAAkB,QAAA,CAAS,IAAA,CAAK,GAAG,oBAAoB,CAAA;AAAA,EACzD;AAEA,EAAA,IACE,wBAAwB,YAAA,CAAa,MAAA,GAAS,KAC9C,uBAAA,CAAwB,QAAA,CAAS,SAAS,CAAA,EAC1C;AACA,IAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,iBAAA;AACT;AAEA,SAAS,uBAAA,CACP,MACA,UAAA,EACS;AACT,EAAA,IAAA,CAAK,UAAU,EAAC;AAEhB,EAAA,KAAA,IAAS,IAAI,UAAA,GAAa,CAAA,EAAG,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACvD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAE7B,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,SAAS,QAAA,IAAY,QAAA,CAAS,SAAS,MAAA,EAAQ;AACvE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;;"}