{"version":3,"file":"css.mjs","names":[],"sources":["../../../src/modules/processor/css.ts"],"sourcesContent":["type CssBlock = {\n    selector: string;\n    body: string;\n};\n\nconst parseCss = (css: string): CssBlock => {\n    const start: number = css.indexOf(\"{\");\n    const end: number = css.lastIndexOf(\"}\");\n\n    if (start === -1 || end === -1 || end <= start) {\n        return {\n            selector: css.trim(),\n            body: \"\",\n        };\n    }\n\n    return {\n        selector: css.slice(0, start).trim(),\n        body: css.slice(start + 1, end).trim(),\n    };\n};\n\nconst getPriority = (css: string): number => {\n    if (css.startsWith(\":root\")) return 0;\n    if (css.startsWith(\"@\")) return 1;\n    if (/^[a-zA-Z]/.test(css)) return 2;\n    if (css.startsWith(\".\")) return 3;\n    return 4;\n};\n\n/**\n * This function will sort CSS list by selector.\n *\n * For example, `:root { xxx }` and other `:root { xxx }` will be sorted together,\n * and `.xxx { xxx }` will be sorted after them.\n */\nconst sortCssList = (cssList: string[]): string[] => {\n    return [\n        ...cssList,\n    ].sort((a: string, b: string): number => {\n        const sa: CssBlock = parseCss(a);\n        const sb: CssBlock = parseCss(b);\n\n        const pa: number = getPriority(sa.selector);\n        const pb: number = getPriority(sb.selector);\n\n        if (pa !== pb) return pa - pb;\n\n        return sa.selector.localeCompare(sb.selector);\n    });\n};\n\n/**\n * This function will merge CSS list by selector.\n *\n * For example, `:root { display: block }` and `:root { color: blue }`\n * will be merged to `:root { display: block; color: blue }`.\n */\nconst mergeCssList = (cssList: string[]): string[] => {\n    const map: Map<string, Set<string>> = new Map();\n\n    for (let i: number = 0; i < cssList.length; i++) {\n        const css: string | undefined = cssList[i];\n\n        if (!css) continue;\n\n        const { selector, body }: CssBlock = parseCss(css);\n\n        if (!body) continue;\n\n        const declarations: string[] = body\n            .split(\";\")\n            .map((d: string): string => d.trim())\n            .filter(Boolean);\n\n        const existing: Set<string> = map.get(selector) ?? new Set<string>();\n\n        for (const decl of declarations) {\n            existing.add(decl);\n        }\n\n        map.set(selector, existing);\n    }\n\n    const result: string[] = [];\n\n    map.forEach((set: Set<string>, selector: string): void => {\n        const body: string = Array.from(set).join(\";\");\n        result.push(`${selector}{${body}}`);\n    });\n\n    return result;\n};\n\n/**\n * This function will transform CSS list.\n */\nconst transformCssList = (cssList: string[]): string[] => {\n    return sortCssList(mergeCssList(cssList));\n};\n\nexport { transformCssList };\n"],"mappings":"AAKA,MAAM,YAAY,QAA0B;CACxC,MAAM,QAAgB,IAAI,QAAQ,GAAG;CACrC,MAAM,MAAc,IAAI,YAAY,GAAG;CAEvC,IAAI,UAAU,MAAM,QAAQ,MAAM,OAAO,OACrC,OAAO;EACH,UAAU,IAAI,KAAK;EACnB,MAAM;CACV;CAGJ,OAAO;EACH,UAAU,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK;EACnC,MAAM,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,KAAK;CACzC;AACJ;AAEA,MAAM,eAAe,QAAwB;CACzC,IAAI,IAAI,WAAW,OAAO,GAAG,OAAO;CACpC,IAAI,IAAI,WAAW,GAAG,GAAG,OAAO;CAChC,IAAI,YAAY,KAAK,GAAG,GAAG,OAAO;CAClC,IAAI,IAAI,WAAW,GAAG,GAAG,OAAO;CAChC,OAAO;AACX;;;;;;;AAQA,MAAM,eAAe,YAAgC;CACjD,OAAO,CACH,GAAG,OACP,CAAC,CAAC,MAAM,GAAW,MAAsB;EACrC,MAAM,KAAe,SAAS,CAAC;EAC/B,MAAM,KAAe,SAAS,CAAC;EAE/B,MAAM,KAAa,YAAY,GAAG,QAAQ;EAC1C,MAAM,KAAa,YAAY,GAAG,QAAQ;EAE1C,IAAI,OAAO,IAAI,OAAO,KAAK;EAE3B,OAAO,GAAG,SAAS,cAAc,GAAG,QAAQ;CAChD,CAAC;AACL;;;;;;;AAQA,MAAM,gBAAgB,YAAgC;CAClD,MAAM,sBAAgC,IAAI,IAAI;CAE9C,KAAK,IAAI,IAAY,GAAG,IAAI,QAAQ,QAAQ,KAAK;EAC7C,MAAM,MAA0B,QAAQ;EAExC,IAAI,CAAC,KAAK;EAEV,MAAM,EAAE,UAAU,SAAmB,SAAS,GAAG;EAEjD,IAAI,CAAC,MAAM;EAEX,MAAM,eAAyB,KAC1B,MAAM,GAAG,CAAC,CACV,KAAK,MAAsB,EAAE,KAAK,CAAC,CAAC,CACpC,OAAO,OAAO;EAEnB,MAAM,WAAwB,IAAI,IAAI,QAAQ,qBAAK,IAAI,IAAY;EAEnE,KAAK,MAAM,QAAQ,cACf,SAAS,IAAI,IAAI;EAGrB,IAAI,IAAI,UAAU,QAAQ;CAC9B;CAEA,MAAM,SAAmB,CAAC;CAE1B,IAAI,SAAS,KAAkB,aAA2B;EACtD,MAAM,OAAe,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;EAC7C,OAAO,KAAK,GAAG,SAAS,GAAG,KAAK,EAAE;CACtC,CAAC;CAED,OAAO;AACX;;;;AAKA,MAAM,oBAAoB,YAAgC;CACtD,OAAO,YAAY,aAAa,OAAO,CAAC;AAC5C"}