{"version":3,"file":"optimize-media-CocGC9bo.mjs","names":[],"sources":["../src/postcss/plugins/optimize-media.ts"],"sourcesContent":["import postcss, {\n  AtRule,\n  Plugin,\n  Root,\n  Container,\n  ChildNode,\n  Comment,\n} from 'postcss';\n\ninterface Media {\n  query: string;\n  rule: AtRule;\n  container: Container;\n}\n\ntype Filter = (query: string, media: Media) => boolean;\n\ntype FilterSpec = string | RegExp | (string | RegExp)[] | Filter;\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\ntype SortMedia = (a: Media, b: Media) => number;\n\nexport interface OptimizeMediaOptions {\n  include?: FilterSpec;\n  exclude?: FilterSpec;\n  sort?: SortMedia;\n}\n\nfunction parseMedia(mediaRule: AtRule): Media {\n  const { params, parent } = mediaRule;\n  if (!parent) {\n    throw mediaRule.error('@media rules require a parent container.');\n  }\n  return {\n    query: params,\n    rule: mediaRule,\n    container: parent,\n  };\n}\n\nfunction isSourceMapAnnotation(node: ChildNode | undefined): node is Comment {\n  if (!node) return false;\n  if (node.type !== 'comment') return false;\n  return node.text.toLowerCase().startsWith('# sourcemappingurl=');\n}\n\nfunction getSourceMapAnnotation(container: Container): ChildNode | undefined {\n  const maybeAnnotation = container.last;\n  if (isSourceMapAnnotation(maybeAnnotation)) {\n    return maybeAnnotation;\n  }\n}\n\nexport function optimizeMedia(\n  css: string | { toString(): string } | Root,\n  opts: OptimizeMediaOptions = {},\n): Root {\n  const root = css instanceof Root ? css : postcss.parse(css);\n  const include = resolveFilter(opts.include, true);\n  const exclude = resolveFilter(opts.exclude, false);\n\n  const sourceMap = getSourceMapAnnotation(root);\n\n  const containerMap = new Map<Container, Media[]>();\n\n  root.walkAtRules('media', (mediaRule) => {\n    const media = parseMedia(mediaRule);\n    if (\n      !mediaRule.nodes ||\n      !include(media.query, media) ||\n      exclude(media.query, media)\n    )\n      return;\n\n    let bucket = containerMap.get(media.container);\n    if (!bucket) {\n      bucket = [];\n      containerMap.set(media.container, bucket);\n    }\n    bucket.push(media);\n  });\n\n  containerMap.forEach((bucket, container) => {\n    if (opts.sort) {\n      bucket.sort(opts.sort);\n    }\n\n    const combinedRules: {\n      query: string;\n      medias: Media[];\n    }[] = [];\n\n    bucket.forEach((media) => {\n      let rule = combinedRules.find((r) => r.query === media.query);\n      if (!rule) {\n        rule = { query: media.query, medias: [] };\n        combinedRules.push(rule);\n      }\n      rule.medias.push(media);\n    });\n\n    combinedRules.forEach((rule) => {\n      const nodes = rule.medias\n        .map((media) => (media.rule.nodes || []).map((node) => node.clone()))\n        .flat();\n      const newAtRule = new AtRule({\n        name: 'media',\n        params: rule.query,\n        nodes,\n      });\n      rule.medias.forEach((media) => media.rule.remove());\n      container.append(newAtRule);\n    });\n  });\n\n  containerMap.clear();\n\n  if (sourceMap) {\n    root.append(sourceMap);\n  }\n\n  return root;\n}\n\nconst PLUGIN_NAME = 'optimize-media';\n\nexport function OptimizeMedia(opts?: OptimizeMediaOptions): Plugin {\n  return {\n    postcssPlugin: PLUGIN_NAME,\n    Once(root) {\n      optimizeMedia(root, opts);\n    },\n  };\n}\n\nOptimizeMedia.postcss = true;\n\nexport default OptimizeMedia;\n"],"mappings":";;AAmBA,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;AAUA,SAAS,WAAW,WAA0B;CAC5C,MAAM,EAAE,QAAQ,WAAW;CAC3B,IAAI,CAAC,QACH,MAAM,UAAU,MAAM,0CAA0C;CAElE,OAAO;EACL,OAAO;EACP,MAAM;EACN,WAAW;CACb;AACF;AAEA,SAAS,sBAAsB,MAA8C;CAC3E,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,KAAK,SAAS,WAAW,OAAO;CACpC,OAAO,KAAK,KAAK,YAAY,CAAC,CAAC,WAAW,qBAAqB;AACjE;AAEA,SAAS,uBAAuB,WAA6C;CAC3E,MAAM,kBAAkB,UAAU;CAClC,IAAI,sBAAsB,eAAe,GACvC,OAAO;AAEX;AAEA,SAAgB,cACd,KACA,OAA6B,CAAC,GACxB;CACN,MAAM,OAAO,eAAe,OAAO,MAAM,QAAQ,MAAM,GAAG;CAC1D,MAAM,UAAU,cAAc,KAAK,SAAS,IAAI;CAChD,MAAM,UAAU,cAAc,KAAK,SAAS,KAAK;CAEjD,MAAM,YAAY,uBAAuB,IAAI;CAE7C,MAAM,+BAAe,IAAI,IAAwB;CAEjD,KAAK,YAAY,UAAU,cAAc;EACvC,MAAM,QAAQ,WAAW,SAAS;EAClC,IACE,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,OAAO,KAAK,KAC3B,QAAQ,MAAM,OAAO,KAAK,GAE1B;EAEF,IAAI,SAAS,aAAa,IAAI,MAAM,SAAS;EAC7C,IAAI,CAAC,QAAQ;GACX,SAAS,CAAC;GACV,aAAa,IAAI,MAAM,WAAW,MAAM;EAC1C;EACA,OAAO,KAAK,KAAK;CACnB,CAAC;CAED,aAAa,SAAS,QAAQ,cAAc;EAC1C,IAAI,KAAK,MACP,OAAO,KAAK,KAAK,IAAI;EAGvB,MAAM,gBAGA,CAAC;EAEP,OAAO,SAAS,UAAU;GACxB,IAAI,OAAO,cAAc,MAAM,MAAM,EAAE,UAAU,MAAM,KAAK;GAC5D,IAAI,CAAC,MAAM;IACT,OAAO;KAAE,OAAO,MAAM;KAAO,QAAQ,CAAC;IAAE;IACxC,cAAc,KAAK,IAAI;GACzB;GACA,KAAK,OAAO,KAAK,KAAK;EACxB,CAAC;EAED,cAAc,SAAS,SAAS;GAC9B,MAAM,QAAQ,KAAK,OAChB,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CACpE,KAAK;GACR,MAAM,YAAY,IAAI,OAAO;IAC3B,MAAM;IACN,QAAQ,KAAK;IACb;GACF,CAAC;GACD,KAAK,OAAO,SAAS,UAAU,MAAM,KAAK,OAAO,CAAC;GAClD,UAAU,OAAO,SAAS;EAC5B,CAAC;CACH,CAAC;CAED,aAAa,MAAM;CAEnB,IAAI,WACF,KAAK,OAAO,SAAS;CAGvB,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"}