You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1 lines
8.5 KiB

"use strict";var e=require("postcss-selector-parser"),r=require("@csstools/selector-specificity");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(e);const s=["media","supports"],n=["keyframes"];class l{constructor(){this.anonymousLayerCount=0,this.layerCount=0,this.anonymousLayerCount=0,this.layerCount=0,this.layerOrder=new Map,this.layerParamsParsed=new Map,this.layerNameParts=new Map}createAnonymousLayerName(){const e=`anonymous-${this.anonymousLayerCount}-6efdb677-bb05-44e5-840f-29d2175862fd`;return this.addLayerNameParts(e),this.layerParamsParsed.set(e,[e]),this.anonymousLayerCount++,e}createImplicitLayerName(e){const r=this.layerNameParts.get(e),a=`implicit-${r[r.length-1]}-b147acf6-11a6-4338-a4d0-80aef4cd1a2f`;return this.addLayerNameParts([...r,a]),this.layerParamsParsed.set(a,[a]),a}addLayerParams(e,r){r?"string"!=typeof r?this.layerParamsParsed.set(e,r):this.layerParamsParsed.set(e,[r]):this.layerParamsParsed.set(e,[e])}addLayerNameParts(e){"string"!=typeof e?this.layerNameParts.set(e.join("."),e):this.layerNameParts.set(e,[e])}getLayerParams(e){const r=[...this.layerParamsParsed.get(e.params)];let a=e.parent;for(;a;)"atrule"===a.type?("layer"===a.name&&r.push(...this.layerParamsParsed.get(a.params)),a=a.parent):a=a.parent;return r.reverse(),r.flatMap((e=>this.layerNameParts.get(e)))}getLayerNameList(e){const r=this.layerNameParts.get(e),a=[];for(let e=0;e<r.length;e++){const t=r.slice(0,e+1).join(".");this.layerParamsParsed.has(t)||this.layerParamsParsed.set(t,[t]),this.layerNameParts.has(t)||this.layerNameParts.set(t,r.slice(0,e+1)),a.push(r.slice(0,e+1).join("."))}return a}sortLayerNames(){for(const[e,r]of this.layerOrder){const a=this.layerNameParts.get(e);for(let e=1;e<a.length;e++){const t=a.slice(0,e).join(".");this.layerOrder.has(t)||this.layerOrder.set(t,r)}}let e=Array.from(this.layerOrder.entries());e=e.sort(((e,r)=>{const a=this.layerNameParts.get(e[0]),t=this.layerNameParts.get(r[0]);if(a[0]!==t[0])return this.layerOrder.get(a[0])-this.layerOrder.get(t[0]);const s=Math.max(a.length,t.length);for(let e=0;e<s;e++){const r=a[e],s=t[e];if(r!==s)return r?s?this.layerOrder.get(a.slice(0,e).join("."))-this.layerOrder.get(t.slice(0,e).join(".")):-1:1}})),this.layerOrder.clear(),e.forEach(((e,r)=>{this.layerOrder.set(e[0],r)}))}}function o(e,r){const a=t.default().astSync(e),s=t.default().astSync(function(e){if(0===e)return"";let r="";for(let a=0;a<e;a++)r+=":not(#\\#)";return r}(r));let n=!1;for(let e=0;e<a.nodes[0].nodes.length;e++)if("combinator"===a.nodes[0].nodes[e].type||t.default.isPseudoElement(a.nodes[0].nodes[e])){a.nodes[0].insertBefore(a.nodes[0].nodes[e],s),n=!0;break}return n||a.nodes[0].insertAfter(a.nodes[0].nodes[a.nodes[0].nodes.length-1],s),a.toString()}function i(e,r){let a=!1;return e.walk((e=>{if(r(e))return a=!0,!1})),a}function u(e,r){let a=!1;return e.walkAtRules((e=>{if(r(e))return a=!0,!1})),a}function y(e){let r=e.parent;for(;r;)if("atrule"===r.type){if("layer"===r.name)return r;r=r.parent}else r=r.parent;return null}function m(e){e.walk((e=>{("rule"===e.type||"atrule"===e.type&&["layer",...s].includes(e.name))&&(e.nodes&&e.nodes.length||e.remove())})),e.nodes&&e.nodes.length||e.remove()}function c(e){let r=e;for(;r;){if(r.nodes&&r.nodes.length>0)return;const e=r.parent;r.remove(),r=e}}function d(e,r,{result:a,options:t}){e.walkAtRules("layer",(e=>{const n=r.getLayerParams(e),l=n.join(".");r.layerOrder.has(l)||(t.onConditionalRulesChangingLayerOrder&&function(e){let r=e.parent;for(;r;)if("atrule"===r.type){if(s.includes(r.name))return r;r=r.parent}else r=r.parent;return null}(e)&&!e.params.endsWith("b147acf6-11a6-4338-a4d0-80aef4cd1a2f")&&!e.params.endsWith("6efdb677-bb05-44e5-840f-29d2175862fd")&&e.warn(a,"handling different layer orders in conditional rules is unsupported by this plugin and will cause style differences between browser versions."),r.layerParamsParsed.has(l)||r.layerParamsParsed.set(l,[l]),r.layerNameParts.has(l)||r.layerNameParts.set(l,[...n]),r.getLayerNameList(l).forEach((e=>{r.layerOrder.has(e)||(r.layerOrder.set(e,r.layerCount),r.layerCount+=1)}))),e.nodes&&0!==e.nodes.length||e.remove()}))}const p=e=>{const a=Object.assign({onRevertLayerKeyword:"warn",onConditionalRulesChangingLayerOrder:"warn",onImportLayerRule:"warn"},e);return{postcssPlugin:"postcss-cascade-layers",OnceExit(e,{result:p}){a.onRevertLayerKeyword&&e.walkDecls((e=>{"revert-layer"===e.value&&e.warn(p,'handling "revert-layer" is unsupported by this plugin and will cause style differences between browser versions.')})),a.onImportLayerRule&&e.walkAtRules("import",(e=>{e.params.includes("layer")&&e.warn(p,"To use @import with layers, the postcss-import plugin is also required. This plugin alone will not support using the @import at-rule.")})),function(e){e.walkDecls((e=>{if(!e.important)return;const r=e.parent;if(r.parent&&"atrule"===r.parent.type&&n.includes(r.parent.name))return;const a=r.clone();a.each((e=>{"decl"===e.type&&e.important||e.remove()})),r.each((e=>{"decl"===e.type&&e.important&&e.remove()})),r.before(a),m(r)}))}(e);const f=new l;if(function(e,r){e.walkAtRules("layer",(e=>{if(e.params){const a=[];let s=!1;if(t.default().astSync(e.params).each((e=>{const t=[];e.walk((e=>{switch(e.type){case"class":case"tag":t.push(e.value);break;default:s=!0}})),s||(a.push(t.join(".")),r.addLayerNameParts(t))})),r.addLayerParams(e.params,a),e.nodes&&a.length>1&&(s=!0),s)return void(e.name="csstools-invalid-layer");if(!e.nodes||0===e.nodes.length){if(a.length<=1)return;return a.slice(0,-1).forEach((a=>{r.addLayerParams(a,a),e.cloneBefore({params:a})})),r.addLayerParams(a[a.length-1],a[a.length-1]),void(e.params=a[a.length-1])}}e.params||(e.raws.afterName=" ",e.params=r.createAnonymousLayerName());const a=u(e,(e=>"layer"===e.name)),s=i(e,(r=>{if("rule"===r.type)return y(r)===e}));if(a&&s){const a=r.createImplicitLayerName(e.params),t=e.clone({params:a});t.walkAtRules("layer",(e=>{e.remove()})),e.walk((r=>{"rule"===r.type&&y(r)===e&&r.remove()})),e.append(t),m(e),c(e)}}))}(e,f),d(e,f,{result:p,options:a}),!f.layerCount)return void e.walkAtRules("csstools-invalid-layer",(e=>{e.name="layer"}));let h=0;for(e.walkRules((e=>{e.selectors.forEach((e=>{const a=r.selectorSpecificity(t.default().astSync(e));h=Math.max(h,a.a+1)}))})),e.walkRules((e=>{e.parent&&"atrule"===e.parent.type&&n.includes(e.parent.name)||y(e)||e.some((e=>"decl"===e.type&&e.important))||(e.selectors=e.selectors.map((e=>o(e,f.layerCount*h))))})),f.sortLayerNames(),function(e,r){for(;u(e,(e=>e.nodes&&u(e,(e=>"layer"===e.name))));){let a=!1;if(e.walkAtRules("layer",(t=>{if(t.parent!==e){if("atrule"===t.parent.type&&"layer"===t.parent.name){const e=t.parent;return r.layerNameParts.set(`${e.params}.${t.params}`,[...r.layerNameParts.get(e.params),...r.layerNameParts.get(t.params)]),r.layerParamsParsed.set(`${e.params}.${t.params}`,[`${e.params}.${t.params}`]),t.params=`${e.params}.${t.params}`,e.before(t),m(e),void c(e)}if("atrule"===t.parent.type){const e=t.parent,r=e.clone(),a=t.clone();return r.removeAll(),a.removeAll(),r.append(t.nodes),a.append(r),e.before(a),t.remove(),m(e),void c(e)}a=!0}})),a)break}}(e,f),function(e,r){e.walkAtRules("layer",(e=>{const r=e.clone(),a=e.clone();r.walkAtRules((e=>{if(n.includes(e.name)){const r=e.parent;return e.remove(),m(r),void c(r)}if(i(e,(e=>"rule"===e.type)))return;const r=e.parent;e.remove(),m(r),c(r)})),a.walkRules((e=>{if(e.parent&&"atrule"===e.parent.type&&n.includes(e.parent.name))return;const r=e.parent;e.remove(),m(r),c(r)})),a.walkAtRules((e=>{if(s.includes(e.name))return m(e),void c(e)})),r.name="csstools-layer-with-selector-rules",e.replaceWith(r,a),0===r.nodes.length&&r.remove(),0===a.nodes.length&&a.remove()})),e.nodes.sort(((e,a)=>{const t="atrule"===e.type&&"charset"===e.name,s="atrule"===a.type&&"charset"===a.name;if(t&&s)return 0;if(t!==s)return t?-1:1;const n="atrule"===e.type&&"import"===e.name,l="atrule"===a.type&&"import"===a.name;if(n&&l)return 0;if(n!==l)return n?-1:1;const o="atrule"===e.type&&"layer"===e.name,i="atrule"===a.type&&"layer"===a.name;return o&&i?r.layerOrder.get(e.params)-r.layerOrder.get(a.params):o!==i?o?-1:1:0})),e.walkAtRules("csstools-layer-with-selector-rules",(e=>{e.name="layer"}))}(e,f),e.walkRules((e=>{if(e.parent&&"atrule"===e.parent.type&&n.includes(e.parent.name))return;const r=y(e);if(!r)return;const a=f.getLayerParams(r).join(".");let t=f.layerOrder.get(a)*h;e.some((e=>"decl"===e.type&&e.important))&&(t=f.layerCount-t),e.selectors=e.selectors.map((e=>o(e,t)))}));u(e,(e=>"layer"===e.name));)e.walkAtRules("layer",(e=>{e.replaceWith(e.nodes)}));e.walkAtRules("csstools-invalid-layer",(e=>{e.name="layer"}))}}};p.postcss=!0,module.exports=p;