-
-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathindex.mjs
1 lines (1 loc) · 8.61 KB
/
index.mjs
1
import{tokenizer as e,TokenType as r,NumberType as t,cloneTokens as n,stringify as o}from"@csstools/css-tokenizer";import{parseFromTokens as a,parse as s,isMediaFeatureBoolean as i,isMediaFeature as l,newMediaFeaturePlain as u,isMediaQueryInvalid as c,isMediaQueryWithType as p,isMediaAnd as f,isMediaOr as m,isMediaNot as d,isMediaConditionList as h,isGeneralEnclosed as g}from"@csstools/media-query-list-parser";function collectCascadeLayerOrder(e){const r=new Map,t=new Map,n=[];e.walkAtRules((e=>{if("layer"!==e.name.toLowerCase())return;{let r=e.parent;for(;r;){if("atrule"!==r.type||"layer"!==r.name.toLowerCase()){if(r===e.root())break;return}r=r.parent}}let o=[];if(e.nodes)o.push((a=e.params,s=1,a.trim()||"csstools-anon-layer--"+s++));else{if(!e.params.trim())return;o=e.params.split(",").map((e=>e.trim()))}var a,s;{let r=e.parent;for(;r&&"atrule"===r.type&&"layer"===r.name.toLowerCase();){const e=t.get(r);e?(o=o.map((r=>e+"."+r)),r=r.parent):r=r.parent}}if(addLayerToModel(n,o),e.nodes){const n=o[0]+".csstools-implicit-layer";r.set(e,n),t.set(e,o[0])}}));for(const e of r.values())addLayerToModel(n,[e]);const o=n.map((e=>e.join("."))),a=new WeakMap;for(const[e,t]of r)a.set(e,o.indexOf(t));return a}function addLayerToModel(e,r){return r.forEach((r=>{const t=r.split(".");e:for(let r=0;r<t.length;r++){const n=t.slice(0,r+1);let o=-1,a=0;for(let r=0;r<e.length;r++){const t=e[r];let s=0;r:for(let e=0;e<t.length;e++){const r=t[e],o=n[e];if(o===r&&e+1===n.length)continue e;if(o!==r){if(o!==r)break r}else s++}s>=a&&(o=r,a=s)}-1===o?e.push(n):e.splice(o+1,0,n)}})),e}const y=new Set(["scope","container","layer"]);function isProcessableCustomMediaRule(e){if("custom-media"!==e.name.toLowerCase())return!1;if(!e.params||!e.params.includes("--"))return!1;if(e.nodes&&e.nodes.length>0)return!1;let r=e.parent;for(;r;){if("atrule"===r.type&&!y.has(r.name.toLowerCase()))return!1;r=r.parent}return!0}function removeCyclicReferences(e,r){const t=new Set;let n=r;for(;e.size>0;)try{toposort(Array.from(e.keys()),n);break}catch(r){if(!r._graphNode)throw r;e.delete(r._graphNode),t.add(r._graphNode),n=n.filter((e=>-1===e.indexOf(r._graphNode)))}return t}function toposort(e,r){let t=e.length;const n=new Array(t),o={};let a=t;const s=makeOutgoingEdges(r),i=makeNodesHash(e);for(r.forEach((function(e){if(!i.has(e[0])||!i.has(e[1]))throw new Error("Unknown token. Make sure to provide all tokens used in aliases.")}));a--;)o[a]||visit(e[a],a,new Set);return n;function visit(e,r,a){if(a.has(e)){const r=new Error("Cyclic dependency"+JSON.stringify(e));throw r._graphNode=e,r}if(!i.has(e))throw new Error("Found unknown token. Make sure to provided all involved tokens. Unknown token: "+JSON.stringify(e));if(o[r])return;o[r]=!0;let l=s.get(e)||new Set;if(l=Array.from(l),r=l.length){a.add(e);do{const e=l[--r];visit(e,i.get(e),a)}while(r);a.delete(e)}n[--t]=e}}function makeOutgoingEdges(e){const r=new Map;for(let t=0,n=e.length;t<n;t++){const n=e[t];r.has(n[0])||r.set(n[0],new Set),r.has(n[1])||r.set(n[1],new Set),r.get(n[0]).add(n[1])}return r}function makeNodesHash(e){const r=new Map;for(let t=0,n=e.length;t<n;t++)r.set(e[t],t);return r}function atMediaParamsTokens(r){const t=e({css:r},{commentsAreTokens:!0,onParseError:()=>{throw new Error(`Unable to parse media query "${r}"`)}}),n=[];for(;!t.endOfFile();)n.push(t.nextToken());return n}const w=[[r.Ident,"max-color",0,0,{value:"max-color"}],[r.Colon,":",0,0,void 0],[r.Number,"2147477350",0,0,{value:2147477350,type:t.Integer}]],v=[[r.Ident,"color",0,0,{value:"color"}],[r.Colon,":",0,0,void 0],[r.Number,"2147477350",0,0,{value:2147477350,type:t.Integer}]];function replaceTrueAndFalseTokens(e){let t,n;for(let o=0;o<e.length;o++)if(e[o][0]!==r.Comment&&e[o][0]!==r.Whitespace){if(e[o][0]===r.Ident){const r=e[o];if("true"===r[4].value.toLowerCase()){t="true",n=e.slice(o+1);break}if("false"===r[4].value.toLowerCase()){t="false",n=e.slice(o+1);break}}return e}if(!t)return e;for(let t=0;t<n.length;t++)if(n[t][0]!==r.Comment&&n[t][0]!==r.Whitespace)return e;return"true"===t?[[r.Whitespace," ",0,0,void 0],[r.OpenParen,"(",0,0,void 0],...w,[r.CloseParen,")",0,0,void 0]]:[[r.Whitespace," ",0,0,void 0],[r.OpenParen,"(",0,0,void 0],...v,[r.CloseParen,")",0,0,void 0]]}function parseCustomMedia(e){const t=atMediaParamsTokens(e),s=new Set;let i="",l=t;for(let e=0;e<t.length;e++)if(t[e][0]!==r.Comment&&t[e][0]!==r.Whitespace){if(t[e][0]===r.Ident){const r=t[e];if(r[4].value.startsWith("--")){i=r[4].value,l=t.slice(e+1);break}}return!1}for(let e=0;e<l.length;e++)if(l[e][0]===r.Ident){const r=l[e];r[4].value.startsWith("--")&&s.add(r[4].value)}l=replaceTrueAndFalseTokens(l);const u=a(n(l),{preserveInvalidMediaQueries:!0,onParseError:()=>{throw new Error(`Unable to parse media query "${o(...l)}"`)}}),c=a(n(l),{preserveInvalidMediaQueries:!0,onParseError:()=>{throw new Error(`Unable to parse media query "${o(...l)}"`)}});for(let e=0;e<c.length;e++)c[e]=c[e].negateQuery();return{name:i,truthy:u,falsy:c,dependsOn:Array.from(s).map((e=>[e,i]))}}function getCustomMedia(e,r,t){const n=new Map,o=new Map,a=[],s=collectCascadeLayerOrder(e);e.walkAtRules((e=>{if(!isProcessableCustomMediaRule(e))return;const r=parseCustomMedia(e.params);if(!r)return;if(0===r.truthy.length)return;const i=(u=s,(l=e).parent&&"atrule"===l.parent.type&&"layer"===l.parent.name.toLowerCase()?u.has(l.parent)?u.get(l.parent):-1:1/0);var l,u;if(i>=(o.get(r.name)??-1)&&(o.set(r.name,i),n.set(r.name,{truthy:r.truthy,falsy:r.falsy}),a.push(...r.dependsOn)),!t.preserve){const r=e.parent;e.remove(),removeEmptyAncestorBlocks(r)}}));const i=removeCyclicReferences(n,a);for(const t of i.values())e.warn(r,`@custom-media rules have cyclic dependencies for "${t}"`);return n}function removeEmptyAncestorBlocks(e){let r=e;for(;r;){if(r.nodes&&r.nodes.length>0)return;const e=r.parent;r.remove(),r=e}}function transformAtMediaListTokens(e,r){const t=s(e,{preserveInvalidMediaQueries:!0,onParseError:()=>{throw new Error(`Unable to parse media query "${e}"`)}}),n=t.map((e=>e.toString()));for(let e=0;e<t.length;e++){const o=t[e],a=n[e];{const t=transformSimpleMediaQuery(o,r);if(t&&t.replaceWith!==a)return n.map(((r,n)=>n===e?t:{replaceWith:r}))}const s=transformComplexMediaQuery(o,r);if(s&&0!==s.length&&s[0].replaceWith!==a)return n.flatMap(((r,t)=>t===e?s:[{replaceWith:r}]))}return[]}function transformSimpleMediaQuery(e,r){if(!mediaQueryIsSimple(e))return null;let t=null;return e.walk((e=>{const n=e.node;if(!i(n))return;const o=n.getName();if(!o.startsWith("--"))return!1;const a=r.get(o);return a?(t={replaceWith:a.truthy.map((e=>e.toString().trim())).join(",")},!1):void 0})),t}function transformComplexMediaQuery(e,r){let t=[];return e.walk((n=>{const o=n.node;if(!i(o))return;const a=n.parent;if(!l(a))return;const s=o.getName();if(!s.startsWith("--"))return!1;const c=r.get(s);if(c){if(1===c.truthy.length&&mediaQueryIsSimple(c.truthy[0])){let r=null;if(c.truthy[0].walk((e=>{if(l(e.node))return r=e.node,!1})),r&&r.feature)return a.feature=r.feature,t=[{replaceWith:e.toString()}],!1}const r=u(w[0][4].value,w[2]);a.feature=r.feature;const n=e.toString(),o=u(v[0][4].value,v[2]);a.feature=o.feature;const s=e.toString();return t=[{replaceWith:n,encapsulateWith:c.truthy.map((e=>e.toString().trim())).join(",")},{replaceWith:s,encapsulateWith:c.falsy.map((e=>e.toString().trim())).join(",")}],!1}})),t}function mediaQueryIsSimple(e){if(c(e))return!1;if(p(e))return!1;let r=!0;return e.walk((e=>{if(f(e.node)||m(e.node)||d(e.node)||h(e.node)||g(e.node))return r=!1,!1})),r}const creator=e=>{const r=Boolean(Object(e).preserve);if("importFrom"in Object(e))throw new Error('[postcss-custom-media] "importFrom" is no longer supported');if("exportTo"in Object(e))throw new Error('[postcss-custom-media] "exportTo" is no longer supported');return{postcssPlugin:"postcss-custom-media",prepare(){let e=new Map;return{Once:(t,{result:n})=>{e=getCustomMedia(t,n,{preserve:r})},AtRule:(t,{result:n})=>{if("media"!==t.name.toLowerCase())return;if(!t.params)return;if(!t.params.includes("--"))return;let o=[];try{o=transformAtMediaListTokens(t.params,e)}catch(e){return void t.warn(n,`Failed to parse @custom-media params with error message: "${e.message}"`)}if(!o||0===o.length)return;if(1===o.length){if(t.params.trim()===o[0].replaceWith.trim())return;return t.cloneBefore({params:o[0].replaceWith.trim()}),r?void 0:void t.remove()}if(!!!o.find((e=>!!e.encapsulateWith)))return t.cloneBefore({params:o.map((e=>e.replaceWith)).join(",").trim()}),void(r||t.remove());o.forEach((e=>{if(!e.encapsulateWith)return void t.cloneBefore({params:e.replaceWith.trim()});const r=t.clone({params:e.replaceWith}),n=t.clone({params:e.encapsulateWith.trim(),nodes:[]});r.parent=null,n.parent=null,n.append(r),t.before(n)})),r||t.remove()}}}}};creator.postcss=!0;export{creator as default};