Skip to content

Commit 4a8a52e

Browse files
authored
Improve handling of cross references between computed values of custom properties (#1357)
1 parent 514ee9b commit 4a8a52e

33 files changed

+438
-151
lines changed

plugin-packs/postcss-preset-env/test/basic.autoprefixer.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@
673673

674674
.schemed-colors {
675675
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
676-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
676+
color: magenta;
677677
color: var(--csstools-light-dark-toggle--1, magenta);
678678
color: light-dark(rgb(141, 0, 0), magenta);
679679
}

plugin-packs/postcss-preset-env/test/basic.autoprefixer.false.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@
678678

679679
.schemed-colors {
680680
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
681-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
681+
color: magenta;
682682
color: var(--csstools-light-dark-toggle--1, magenta);
683683
color: light-dark(rgb(141, 0, 0), magenta);
684684
}

plugin-packs/postcss-preset-env/test/basic.autoprefixer.remove.false.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@
697697

698698
.schemed-colors {
699699
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
700-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
700+
color: magenta;
701701
color: var(--csstools-light-dark-toggle--1, magenta);
702702
color: light-dark(rgb(141, 0, 0), magenta);
703703
}

plugin-packs/postcss-preset-env/test/basic.ch38.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@
585585

586586
.schemed-colors {
587587
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
588-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
588+
color: magenta;
589589
color: var(--csstools-light-dark-toggle--1, magenta);
590590
color: light-dark(rgb(141, 0, 0), magenta);
591591
}

plugin-packs/postcss-preset-env/test/basic.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@
692692

693693
.schemed-colors {
694694
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
695-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
695+
color: magenta;
696696
color: var(--csstools-light-dark-toggle--1, magenta);
697697
color: light-dark(rgb(141, 0, 0), magenta);
698698
}

plugin-packs/postcss-preset-env/test/basic.hebrew.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ h1.test-custom-selectors:not(.does-not-exist), h2.test-custom-selectors:not(.doe
688688

689689
.schemed-colors {
690690
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
691-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
691+
color: magenta;
692692
color: var(--csstools-light-dark-toggle--1, magenta);
693693
color: light-dark(rgb(141, 0, 0), magenta);
694694
}

plugin-packs/postcss-preset-env/test/basic.ie10.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@
709709

710710
.schemed-colors {
711711
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
712-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
712+
color: magenta;
713713
color: var(--csstools-light-dark-toggle--1, magenta);
714714
color: light-dark(rgb(141, 0, 0), magenta);
715715
}

plugin-packs/postcss-preset-env/test/basic.nesting.false.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ h1.test-custom-selectors:not(.does-not-exist), h2.test-custom-selectors:not(.doe
690690

691691
.schemed-colors {
692692
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
693-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
693+
color: magenta;
694694
color: var(--csstools-light-dark-toggle--1, magenta);
695695
color: light-dark(rgb(141, 0, 0), magenta);
696696
}

plugin-packs/postcss-preset-env/test/basic.op_mini.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ h1.test-custom-selectors:not(.does-not-exist), h2.test-custom-selectors:not(.doe
670670

671671
.schemed-colors {
672672
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
673-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
673+
color: magenta;
674674
color: var(--csstools-light-dark-toggle--1, magenta);
675675
color: light-dark(rgb(141, 0, 0), magenta);
676676
}

plugin-packs/postcss-preset-env/test/basic.preserve.true.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ h1.test-custom-selectors:not(.does-not-exist), h2.test-custom-selectors:not(.doe
11331133

11341134
.schemed-colors {
11351135
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
1136-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
1136+
color: magenta;
11371137
color: var(--csstools-light-dark-toggle--1, magenta);
11381138
color: light-dark(rgb(141, 0, 0), magenta);
11391139
}

plugin-packs/postcss-preset-env/test/basic.stage0.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ h1.test-custom-selectors:not(.does-not-exist), h2.test-custom-selectors:not(.doe
688688

689689
.schemed-colors {
690690
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
691-
color: var(--csstools-color-scheme--dark) rgb(141, 0, 0);
691+
color: magenta;
692692
color: var(--csstools-light-dark-toggle--1, magenta);
693693
color: light-dark(rgb(141, 0, 0), magenta);
694694
}

plugin-packs/postcss-preset-env/test/basic.vendors-1.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@
670670

671671
.schemed-colors {
672672
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) lch(from rgb(141, 0, 0) l c h);
673-
color: var(--csstools-color-scheme--dark) lch(from rgb(141, 0, 0) l c h);
673+
color: magenta;
674674
color: var(--csstools-light-dark-toggle--1, magenta);
675675
color: light-dark(lch(from rgb(141, 0, 0) l c h), magenta);
676676
color: light-dark(lch(from color(display-p3 0.50566 0.0781 0) l c h), magenta);

plugin-packs/postcss-preset-env/test/basic.vendors-2.expect.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@
670670

671671
.schemed-colors {
672672
--csstools-light-dark-toggle--1: var(--csstools-color-scheme--dark) lch(from rgb(141, 0, 0) l c h);
673-
color: var(--csstools-color-scheme--dark) lch(from rgb(141, 0, 0) l c h);
673+
color: magenta;
674674
color: var(--csstools-light-dark-toggle--1, magenta);
675675
color: light-dark(lch(from rgb(141, 0, 0) l c h), magenta);
676676
color: light-dark(lch(from color(display-p3 0.50566 0.0781 0) l c h), magenta);

plugins/postcss-custom-properties/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changes to PostCSS Custom Properties
22

3+
### Unreleased (patch)
4+
5+
- Improve handling of cross references between computed values of custom properties
6+
37
### 13.3.6
48

59
_March 13, 2024_
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"use strict";var e=require("postcss-value-parser"),t=require("@csstools/cascade-layer-name-parser"),r=require("@csstools/utilities");const n=t.parse("csstools-implicit-layer")[0];function collectCascadeLayerOrder(e){const r=new Map,s=new Map,o=[];e.walkAtRules((e=>{if("layer"!==e.name.toLowerCase())return;{let t=e.parent;for(;t;){if("atrule"!==t.type||"layer"!==t.name.toLowerCase()){if(t===e.root())break;return}t=t.parent}}let a;if(e.nodes)a=normalizeLayerName(e.params,1);else{if(!e.params.trim())return;a=e.params}let i=t.parse(a);if(i?.length){{let t=e.parent;for(;t&&"atrule"===t.type&&"layer"===t.name.toLowerCase();){const e=s.get(t);e?(i=i.map((t=>e.concat(t))),t=t.parent):t=t.parent}}if(t.addLayerToModel(o,i),e.nodes){const t=i[0].concat(n);r.set(e,t),s.set(e,i[0])}}}));for(const e of r.values())t.addLayerToModel(o,[e]);const a=new WeakMap;for(const[e,t]of r)a.set(e,o.findIndex((e=>t.equal(e))));return a}function normalizeLayerName(e,t){return e.trim()?e:"csstools-anon-layer--"+t++}const s=/(!\s*)?postcss-custom-properties:\s*off\b/i,o=new WeakMap;function isBlockIgnored(e){if(!e||!e.nodes)return!1;if(o.has(e))return o.get(e);const t=e.some((e=>isIgnoreComment(e,s)));return o.set(e,t),t}const a=/(!\s*)?postcss-custom-properties:\s*ignore\s+next\b/i;function isDeclarationIgnored(e){return!!e&&(!!isBlockIgnored(e.parent)||isIgnoreComment(e.prev(),a))}function isIgnoreComment(e,t){return!!e&&"comment"===e.type&&t.test(e.text)}const i=new Set(["layer"]);function isProcessableRule(e){let t=e.parent;for(;t;){if("atrule"===t.type&&!i.has(t.name.toLowerCase()))return!1;t=t.parent}return!0}const l=/^html$/i,c=/^:where\(html\)$/i,u=/^:root$/i,p=/^:where\(:root\)$/i,f=/(html|:root)/i,d=/^var$/i;function isVarFunction(e){return"function"===e.type&&d.test(e.value)&&Object(e.nodes).length>0}const w=/\bvar\(/i;function removeCyclicReferences(e,t){const r=new Set;for(;e.size>0;){const n=findCyclicNode(Array.from(e.keys()),t);if(!n)return r;e.delete(n),r.add(n),t=t.filter((e=>-1===e.indexOf(n)))}return r}function findCyclicNode(e,t){let r=e.length;const n=new Array(r),s={};let o=r;const a=makeOutgoingEdges(t),i=makeNodesHash(e);for(;o--;)if(!s[o]){const t=visit(e[o],o,new Set);if(!t)continue;return t}function visit(e,t,o){if(o.has(e))return e;if(!i.has(e))return;if(s[t])return;s[t]=!0;const l=Array.from(a.get(e)||new Set);if(t=l.length){o.add(e);do{const e=l[--t],r=visit(e,i.get(e),o);if(r)return r}while(t);o.delete(e)}n[--r]=e}}function makeOutgoingEdges(e){const t=new Map;for(let r=0,n=e.length;r<n;r++){const n=e[r];t.has(n[0])||t.set(n[0],new Set),t.has(n[1])||t.set(n[1],new Set),t.get(n[0]).add(n[1])}return t}function makeNodesHash(e){const t=new Map;for(let r=0,n=e.length;r<n;r++)t.set(e[r],r);return t}function parseOrCached(t,r){let n=r.get(t);return n||(n=e(t),r.set(t,n),n)}function getCustomPropertiesFromRoot(t,r){const n=new Map,s=new Map,o=collectCascadeLayerOrder(t);t.walkRules((e=>{f.test(e.selector)&&e.nodes?.length&&isProcessableRule(e)&&(isBlockIgnored(e)||e.selectors.forEach((t=>{let r=-1;if(c.test(t)||p.test(t))r=0;else if(l.test(t))r=1;else{if(!u.test(t))return;r=2}const a=(f=o,((i=e).parent&&"atrule"===i.parent.type&&"layer"===i.parent.name.toLowerCase()?f.has(i.parent)?f.get(i.parent)+1:0:1e7)+10+r);var i,f;e.each((e=>{if("decl"!==e.type)return;if(!e.variable||isDeclarationIgnored(e))return;if("initial"===e.value.toLowerCase().trim())return;const t=s.get(e.prop)??-1;a>=t&&(s.set(e.prop,a),n.set(e.prop,e.value))}))})))}));const a=[],i=new Map;for(const[t,s]of n.entries()){const n=parseOrCached(s,r);e.walk(n.nodes,(e=>{if(isVarFunction(e)){const[r]=e.nodes.filter((e=>"word"===e.type));a.push([r.value,t])}})),i.set(t,n)}return removeCyclicReferences(i,a),i}function transformValueAST(t,r,n){if(!t.nodes?.length)return"";const s=new Map;return t.nodes.forEach((e=>{s.set(e,t)})),e.walk(t.nodes,(e=>{"nodes"in e&&e.nodes.length&&e.nodes.forEach((t=>{s.set(t,e)}))})),e.walk(t.nodes,(t=>{if(!isVarFunction(t))return;const[o,...a]=t.nodes.filter((e=>"div"!==e.type)),{value:i}=o,l=s.get(t);if(!l)return;const c=l.nodes.indexOf(t);if(-1===c)return;let u=!1;a&&e.walk(a,(e=>{if(isVarFunction(e)){const[t]=e.nodes.filter((e=>"word"===e.type));if(r.has(t.value)||n.has(t.value))return;return u=!0,!1}}));let p=n.get(i)?.nodes??r.get(i)?.nodes;p||!a.length||u||(p=t.nodes.slice(t.nodes.indexOf(a[0]))),void 0!==p&&(p.length?(l.nodes.splice(c,1,...p),l.nodes.forEach((e=>s.set(e,l)))):(l.nodes.splice(c,1,{type:"comment",value:"",sourceIndex:t.sourceIndex,sourceEndIndex:t.sourceEndIndex}),l.nodes.forEach((e=>s.set(e,l)))))}),!0),e.stringify(t.nodes)}function transformProperties(t,r,n,s,o){if(isTransformableDecl(t)&&!isDeclarationIgnored(t)){const s=t.value;let a=transformValueAST(e(s),r,n);const i=new Set;for(;w.test(a)&&!i.has(a);){i.add(a);a=transformValueAST(e(a),r,n)}if(a!==s){if(parentHasExactFallback(t,a))return void(o.preserve||t.remove());if(o.preserve){const e=t.cloneBefore({value:a});hasTrailingComment(e)&&e.raws?.value&&(e.raws.value.value=e.value.replace(v,"$1"),e.raws.value.raw=e.raws.value.value+e.raws.value.raw.replace(v,"$2"))}else t.value=a,hasTrailingComment(t)&&t.raws?.value&&(t.raws.value.value=t.value.replace(v,"$1"),t.raws.value.raw=t.raws.value.value+t.raws.value.raw.replace(v,"$2"))}}}const isTransformableDecl=e=>!e.variable&&e.value.includes("--")&&e.value.toLowerCase().includes("var("),hasTrailingComment=e=>"value"in Object(Object(e.raws).value)&&"raw"in(e.raws?.value??{})&&v.test(e.raws.value?.raw??""),v=/^([\W\w]+)(\s*\/\*[\W\w]+?\*\/)$/;function parentHasExactFallback(e,t){if(!e||!e.parent)return!1;let r=!1;const n=e.parent.index(e);return e.parent.each(((s,o)=>s!==e&&(!(o>=n)&&void("decl"===s.type&&s.prop.toLowerCase()===e.prop.toLowerCase()&&s.value===t&&(r=!0))))),r}const m=/^initial$/i,g=/(?:\bvar\()|(?:\(top: var\(--f\))/i,creator=e=>{const t=!("preserve"in Object(e))||Boolean(e?.preserve);if("importFrom"in Object(e))throw new Error('[postcss-custom-properties] "importFrom" is no longer supported');if("exportTo"in Object(e))throw new Error('[postcss-custom-properties] "exportTo" is no longer supported');return{postcssPlugin:"postcss-custom-properties",prepare(){let e=new Map;const n=new Map;return{postcssPlugin:"postcss-custom-properties",Once(t){e=getCustomPropertiesFromRoot(t,n)},Declaration(s){if(!w.test(s.value))return;if(r.hasSupportsAtRuleAncestor(s,g))return;const o=new Map;t&&s.parent&&s.parent.each((e=>{"decl"===e.type&&e.variable&&s!==e&&(isDeclarationIgnored(e)||(m.test(e.value)?o.delete(e.prop):o.set(e.prop,parseOrCached(e.value,n))))})),transformProperties(s,e,o,0,{preserve:t})}}}}};creator.postcss=!0,module.exports=creator;
1+
"use strict";var e=require("@csstools/cascade-layer-name-parser"),t=require("postcss-value-parser"),r=require("@csstools/utilities");const n=e.parse("csstools-implicit-layer")[0];function collectCascadeLayerOrder(t){const r=new Map,o=new Map,s=[];t.walkAtRules((t=>{if("layer"!==t.name.toLowerCase())return;{let e=t.parent;for(;e;){if("atrule"!==e.type||"layer"!==e.name.toLowerCase()){if(e===t.root())break;return}e=e.parent}}let a;if(t.nodes)a=normalizeLayerName(t.params,1);else{if(!t.params.trim())return;a=t.params}let i=e.parse(a);if(i?.length){{let e=t.parent;for(;e&&"atrule"===e.type&&"layer"===e.name.toLowerCase();){const t=o.get(e);t?(i=i.map((e=>t.concat(e))),e=e.parent):e=e.parent}}if(e.addLayerToModel(s,i),t.nodes){const e=i[0].concat(n);r.set(t,e),o.set(t,i[0])}}}));for(const t of r.values())e.addLayerToModel(s,[t]);const a=new WeakMap;for(const[e,t]of r)a.set(e,s.findIndex((e=>t.equal(e))));return a}function normalizeLayerName(e,t){return e.trim()?e:"csstools-anon-layer--"+t++}const o=/(!\s*)?postcss-custom-properties:\s*off\b/i,s=new WeakMap;function isBlockIgnored(e){if(!e||!e.nodes)return!1;if(s.has(e))return s.get(e);const t=e.some((e=>isIgnoreComment(e,o)));return s.set(e,t),t}const a=/(!\s*)?postcss-custom-properties:\s*ignore\s+next\b/i;function isDeclarationIgnored(e){return!!e&&(!!isBlockIgnored(e.parent)||isIgnoreComment(e.prev(),a))}function isIgnoreComment(e,t){return!!e&&"comment"===e.type&&t.test(e.text)}const i=new Set(["layer"]);function isProcessableRule(e){let t=e.parent;for(;t;){if("atrule"===t.type&&!i.has(t.name.toLowerCase()))return!1;t=t.parent}return!0}const l=/^html$/i,c=/^:where\(html\)$/i,u=/^:root$/i,p=/^:where\(:root\)$/i,f=/(html|:root)/i,d=/^var$/i;function isVarFunction(e){return"function"===e.type&&d.test(e.value)&&Object(e.nodes).length>0}const m=/\bvar\(/i;function parseOrCached(e,r){let n=r.get(e);return n||(n=t(e),r.set(e,n),n)}function toposort(e,t){let r=e.length;const n=new Array(r),o={};let s=r;const a=makeOutgoingEdges(t),i=makeNodesHash(e);for(;s--;)o[s]||visit(e[s],s,new Set);return n;function visit(e,t,s){if(s.has(e)){let t;try{t=", node was:"+JSON.stringify(e)}catch(e){t=""}throw new Error("Cyclic dependency"+t)}if(!i.has(e))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(e));if(o[t])return;o[t]=!0;const l=Array.from(a.get(e)||new Set);if(t=l.length){s.add(e);do{const e=l[--t];visit(e,i.get(e),s)}while(t);s.delete(e)}n[--r]=e}}function removeCyclicReferences(e,t){const r=new Set;for(;e.size>0;){const n=findCyclicNode(Array.from(e.keys()),t);if(!n)return r;e.delete(n),r.add(n),t=t.filter((e=>-1===e.indexOf(n)))}return r}function findCyclicNode(e,t){let r=e.length;const n=new Array(r),o={};let s=r;const a=makeOutgoingEdges(t),i=makeNodesHash(e);for(;s--;)if(!o[s]){const t=visit(e[s],s,new Set);if(!t)continue;return t}function visit(e,t,s){if(s.has(e))return e;if(!i.has(e))return;if(o[t])return;o[t]=!0;const l=Array.from(a.get(e)||new Set);if(t=l.length){s.add(e);do{const e=l[--t],r=visit(e,i.get(e),s);if(r)return r}while(t);s.delete(e)}n[--r]=e}}function makeOutgoingEdges(e){const t=new Map;for(let r=0,n=e.length;r<n;r++){const n=e[r];t.has(n[0])||t.set(n[0],new Set),t.has(n[1])||t.set(n[1],new Set),t.get(n[0]).add(n[1])}return t}function makeNodesHash(e){const t=new Map;for(let r=0,n=e.length;r<n;r++)t.set(e[r],r);return t}function parseVarFunction(e){let t,r,n=!1;for(const o of e.nodes)if(t||"word"!==o.type)if(!t||n||"div"!==o.type||","!==o.value){if(n&&Array.isArray(r))r.push(o);else if("space"!==o.type&&("div"!==o.type||""!==o.value.trim()))return}else n=!0,r=[];else t=o;if(t)return{name:t,fallback:r}}function transformValueAST(e,r){return e.nodes?.length?(walk(e.nodes,((e,n,o)=>{if(!isVarFunction(e))return;const s=parseVarFunction(e);if(!s)return;let a=!1;s.fallback&&t.walk(s.fallback,(e=>{if(!isVarFunction(e))return;const t=parseVarFunction(e);return t?t.fallback||r.has(t.name.value)?void 0:(a=!0,!1):void 0}));let i=r.get(s.name.value)?.nodes;i||!s.fallback||a||(i=s.fallback),void 0!==i&&(i.length?o.splice(n,1,...i):o.splice(n,1,{type:"div",value:" ",before:"",after:"",sourceIndex:e.sourceIndex,sourceEndIndex:e.sourceEndIndex}))})),t.stringify(e.nodes)):""}function walk(e,t){let r,n,o;for(r=0,n=e.length;r<n;r+=1)o=e[r],"function"===o.type&&Array.isArray(o.nodes)&&walk(o.nodes,t),t(o,r,e),n=e.length}const v=/^initial$/i;function isInitial(e){const t=e.nodes.filter((e=>"comment"!==e.type&&"space"!==e.type));return 1===t.length&&("word"===t[0].type&&v.test(t[0].value))}function buildCustomPropertiesMap(e,r,n){if(!e.size)return r;const o=new Map(r);{const s=[];for(const[a,i]of e.entries()){const l=parseOrCached(i,n);let c=!1;t.walk(l.nodes,(t=>{if(!isVarFunction(t))return;const n=parseVarFunction(t);n&&(n.fallback||e.has(n.name.value)||r.has(n.name.value)?s.push([n.name.value,a]):c=!0)})),c||o.set(a,l)}removeCyclicReferences(o,s)}{const e=[];for(const[r,n]of o.entries())t.walk(n.nodes,(t=>{if(!isVarFunction(t))return;const n=parseVarFunction(t);n&&(n.fallback||o.has(n.name.value)?e.push([n.name.value,r]):o.delete(r))}));const r=toposort(Array.from(o.keys()),e);for(const e of r){const t=o.get(e);if(!t)continue;const r=parseOrCached(transformValueAST(t,o),n);o.set(e,r)}}for(const[e,t]of o.entries())isInitial(t)&&o.delete(e);return o}function getCustomPropertiesFromRoot(e,t){const r=new Map,n=new Map,o=collectCascadeLayerOrder(e);return e.walkRules((e=>{f.test(e.selector)&&e.nodes?.length&&isProcessableRule(e)&&(isBlockIgnored(e)||e.selectors.forEach((t=>{let s=-1;if(c.test(t)||p.test(t))s=0;else if(l.test(t))s=1;else{if(!u.test(t))return;s=2}const a=(f=o,((i=e).parent&&"atrule"===i.parent.type&&"layer"===i.parent.name.toLowerCase()?f.has(i.parent)?f.get(i.parent)+1:0:1e7)+10+s);var i,f;e.each((e=>{if("decl"!==e.type)return;if(!e.variable||isDeclarationIgnored(e))return;if("initial"===e.value.toLowerCase().trim())return;const t=n.get(e.prop)??-1;a>=t&&(n.set(e.prop,a),r.set(e.prop,e.value))}))})))})),buildCustomPropertiesMap(r,new Map,t)}function getCustomPropertiesFromSiblings(e,t,r){if(!e.parent)return t;const n=new Map;return e.parent.each((t=>{"decl"===t.type&&t.variable&&e!==t&&(isDeclarationIgnored(t)||n.set(t.prop,t.value))})),n.size?buildCustomPropertiesMap(n,t,r):t}function transformProperties(e,r,n){if(isTransformableDecl(e)&&!isDeclarationIgnored(e)){const o=e.value,s=transformValueAST(t(o),r);if(s===o)return;if(parentHasExactFallback(e,s))return void(n.preserve||e.remove());if(n.preserve){const t=e.cloneBefore({value:s});hasTrailingComment(t)&&t.raws?.value&&(t.raws.value.value=t.value.replace(w,"$1"),t.raws.value.raw=t.raws.value.value+t.raws.value.raw.replace(w,"$2"))}else e.value=s,hasTrailingComment(e)&&e.raws?.value&&(e.raws.value.value=e.value.replace(w,"$1"),e.raws.value.raw=e.raws.value.value+e.raws.value.raw.replace(w,"$2"))}}const isTransformableDecl=e=>!e.variable&&e.value.includes("--")&&e.value.toLowerCase().includes("var("),hasTrailingComment=e=>"value"in Object(Object(e.raws).value)&&"raw"in(e.raws?.value??{})&&w.test(e.raws.value?.raw??""),w=/^([\W\w]+)(\s*\/\*[\W\w]+?\*\/)$/;function parentHasExactFallback(e,t){if(!e||!e.parent)return!1;let r=!1;const n=e.parent.index(e);return e.parent.each(((o,s)=>o!==e&&(!(s>=n)&&void("decl"===o.type&&o.prop.toLowerCase()===e.prop.toLowerCase()&&o.value===t&&(r=!0))))),r}const g=/(?:\bvar\()|(?:\(top: var\(--f\))/i,creator=e=>{const t=!("preserve"in Object(e))||Boolean(e?.preserve);if("importFrom"in Object(e))throw new Error('[postcss-custom-properties] "importFrom" is no longer supported');if("exportTo"in Object(e))throw new Error('[postcss-custom-properties] "exportTo" is no longer supported');return{postcssPlugin:"postcss-custom-properties",prepare(){let e=new Map;const n=new WeakMap,o=new Map;return{postcssPlugin:"postcss-custom-properties",Once(t){e=getCustomPropertiesFromRoot(t,o)},Declaration(s){if(!m.test(s.value))return;if(r.hasSupportsAtRuleAncestor(s,g))return;let a=e;t&&s.parent&&(a=n.get(s.parent)??getCustomPropertiesFromSiblings(s,e,o),n.set(s.parent,a)),transformProperties(s,a,{preserve:t})}}}}};creator.postcss=!0,module.exports=creator;

0 commit comments

Comments
 (0)