{"version":3,"file":"optimize-layer-DZdbIjXg.mjs","names":[],"sources":["../src/postcss/plugins/optimize-layer.ts"],"sourcesContent":["import postcss, { AtRule, Plugin, Root } from 'postcss';\n\ntype Filter = (layerName: string, rule: AtRule) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\n\nexport interface OptimizeLayerOptions {\n  include?: FilterSpec;\n  exclude?: FilterSpec;\n}\n\nfunction resolveFilter(\n  spec: FilterSpec | undefined,\n  defaults: boolean,\n): Filter {\n  if (!spec) return () => defaults;\n  if (typeof spec === 'function') return spec;\n  const conditions = Array.isArray(spec) ? spec : [spec];\n  return (layerName) =>\n    conditions.some((condition) =>\n      typeof condition === 'string'\n        ? layerName.includes(condition)\n        : condition.test(layerName),\n    );\n}\n\ninterface Layer {\n  name: string;\n  rule: AtRule;\n}\n\nexport function optimizeLayer(\n  css: string | { toString(): string } | Root,\n  opts: OptimizeLayerOptions = {},\n): Root {\n  const root = css instanceof Root ? css : postcss.parse(css);\n  const layers: Layer[] = [];\n  const include = resolveFilter(opts.include, true);\n  const exclude = resolveFilter(opts.exclude, false);\n\n  const getLayer = (\n    layerRule: AtRule,\n  ): {\n    layer: Layer;\n    atFirst: boolean;\n  } => {\n    const name = layerRule.params;\n    const layer = layers.find((_layer) => _layer.name === name);\n    if (layer)\n      return {\n        layer,\n        atFirst: false,\n      };\n\n    const created: Layer = { name, rule: layerRule };\n    layers.push(created);\n    return {\n      layer: created,\n      atFirst: true,\n    };\n  };\n\n  root.walkAtRules('layer', (layerRule) => {\n    if (layerRule.parent?.type !== 'root') return;\n    const { params, nodes } = layerRule;\n    if (!nodes || !include(params, layerRule) || exclude(params, layerRule))\n      return;\n\n    const { layer, atFirst } = getLayer(layerRule);\n\n    if (atFirst) return;\n\n    layerRule.nodes?.forEach((node) => {\n      layer.rule.append(node.clone());\n    });\n\n    layerRule.remove();\n  });\n\n  return root;\n}\n\nconst PLUGIN_NAME = 'optimize-layer';\n\nexport function OptimizeLayer(opts?: OptimizeLayerOptions): Plugin {\n  return {\n    postcssPlugin: PLUGIN_NAME,\n    Once(root) {\n      optimizeLayer(root, opts);\n    },\n  };\n}\n\nOptimizeLayer.postcss = true;\n\nexport default OptimizeLayer;\n"],"mappings":";;AAWA,SAAS,cACP,MACA,UACQ;CACR,IAAI,CAAC,MAAM,aAAa;CACxB,IAAI,OAAO,SAAS,YAAY,OAAO;CACvC,MAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CACrD,QAAQ,cACN,WAAW,MAAM,cACf,OAAO,cAAc,WACjB,UAAU,SAAS,SAAS,IAC5B,UAAU,KAAK,SAAS,CAC9B;AACJ;AAOA,SAAgB,cACd,KACA,OAA6B,CAAC,GACxB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;CAC1D,MAAM,SAAkB,CAAC;CACzB,MAAM,UAAU,cAAc,KAAK,SAAS,IAAI;CAChD,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CAEjD,MAAM,YACJ,cAIG;EACH,MAAM,OAAO,UAAU;EACvB,MAAM,QAAQ,OAAO,MAAM,WAAW,OAAO,SAAS,IAAI;EAC1D,IAAI,OACF,OAAO;GACL;GACA,SAAS;EACX;EAEF,MAAM,UAAiB;GAAE;GAAM,MAAM;EAAU;EAC/C,OAAO,KAAK,OAAO;EACnB,OAAO;GACL,OAAO;GACP,SAAS;EACX;CACF;CAEA,KAAK,YAAY,UAAU,cAAc;EACvC,IAAI,UAAU,QAAQ,SAAS,QAAQ;EACvC,MAAM,EAAE,QAAQ,UAAU;EAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,GACpE;EAEF,MAAM,EAAE,OAAO,YAAY,SAAS,SAAS;EAE7C,IAAI,SAAS;EAEb,UAAU,OAAO,SAAS,SAAS;GACjC,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC;EAChC,CAAC;EAED,UAAU,OAAO;CACnB,CAAC;CAED,OAAO;AACT;AAEA,MAAM,cAAc;AAEpB,SAAgB,cAAc,MAAqC;CACjE,OAAO;EACL,eAAe;EACf,KAAK,MAAM;GACT,cAAc,MAAM,IAAI;EAC1B;CACF;AACF;AAEA,cAAc,UAAU"}