diff --git a/plugins/postcss-pseudo-class-any-link/CHANGELOG.md b/plugins/postcss-pseudo-class-any-link/CHANGELOG.md index 8c3f65650..5923137f0 100644 --- a/plugins/postcss-pseudo-class-any-link/CHANGELOG.md +++ b/plugins/postcss-pseudo-class-any-link/CHANGELOG.md @@ -1,5 +1,9 @@ # Changes to PostCSS Pseudo Class Any Link +### Unreleased (patch) + +- Ignore `:any-link` in `:not()` pseudo class functions + ### 9.0.1 _December 15, 2023_ diff --git a/plugins/postcss-pseudo-class-any-link/dist/index.cjs b/plugins/postcss-pseudo-class-any-link/dist/index.cjs index 4d6985cb6..1f8f74148 100644 --- a/plugins/postcss-pseudo-class-any-link/dist/index.cjs +++ b/plugins/postcss-pseudo-class-any-link/dist/index.cjs @@ -1 +1 @@ -"use strict";var e=require("postcss-selector-parser");const t=e().astSync(":link").nodes[0],s=e().astSync(":visited").nodes[0],n=e().astSync("area[href]").nodes[0],o=e().astSync("[href]").nodes[0];function replaceAnyLink(e,t,s,n){const o=[],r=[];try{for(let t=0;t{const r=[];if(e.walkPseudos((e=>{if(":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length)return;if(!l)return void r.push([t.clone(),s.clone()]);const c=getTagElementsNextToPseudo(e);c.includes("area")?r.push([t.clone(),s.clone(),o.clone()]):c.length?r.push([t.clone(),s.clone()]):r.push([t.clone(),s.clone(),n.clone()])})),!r.length)return;cartesianProduct(...r).forEach((t=>{const s=e.clone();s.walkPseudos((e=>{":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length||(insertNode(e.parent,e,t.shift()),e.remove())})),c.push(s.toString())}))})).processSync(r),c}function cartesianProduct(...e){const t=[],s=e.length-1;return function helper(n,o){for(let r=0,l=e[o].length;r=0&&("combinator"!==t.nodes[s].type&&!e.isPseudoElement(t.nodes[s].type));s--)r=s;if("tag"!==o){for(let s=c;s{const t={preserve:!0,...e},s={areaHrefNeedsFixing:!1,...Object(t.subFeatures)};return{postcssPlugin:"postcss-pseudo-class-any-link",prepare(){const e=new WeakSet;return{postcssPlugin:"postcss-pseudo-class-any-link",Rule(n,{result:o}){if(!n.selector.toLowerCase().includes(":any-link"))return;if(e.has(n))return;if((n.raws.selector&&n.raws.selector.raw||n.selector).endsWith(":"))return;replaceAnyLink(n,o,t.preserve,s.areaHrefNeedsFixing)&&e.add(n)}}}}};creator.postcss=!0,module.exports=creator; +"use strict";var e=require("postcss-selector-parser");const t=e().astSync(":link").nodes[0],s=e().astSync(":visited").nodes[0],n=e().astSync("area[href]").nodes[0],o=e().astSync("[href]").nodes[0];function replaceAnyLink(e,t,s,n){const o=[],r=[];try{for(let t=0;t{const r=[];if(e.walkPseudos((e=>{if(":not"===e.value.toLowerCase())return!1;if(":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length)return;if(!l)return void r.push([t.clone(),s.clone()]);const c=getTagElementsNextToPseudo(e);c.includes("area")?r.push([t.clone(),s.clone(),o.clone()]):c.length?r.push([t.clone(),s.clone()]):r.push([t.clone(),s.clone(),n.clone()])})),!r.length)return;cartesianProduct(...r).forEach((t=>{const s=e.clone();s.walkPseudos((e=>{":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length||(insertNode(e.parent,e,t.shift()),e.remove())})),c.push(s.toString())}))})).processSync(r),c}function cartesianProduct(...e){const t=[],s=e.length-1;return function helper(n,o){for(let r=0,l=e[o].length;r=0&&("combinator"!==t.nodes[s].type&&!e.isPseudoElement(t.nodes[s].type));s--)r=s;if("tag"!==o){for(let s=c;s{const t={preserve:!0,...e},s={areaHrefNeedsFixing:!1,...Object(t.subFeatures)};return{postcssPlugin:"postcss-pseudo-class-any-link",prepare(){const e=new WeakSet;return{postcssPlugin:"postcss-pseudo-class-any-link",Rule(n,{result:o}){if(!n.selector.toLowerCase().includes(":any-link"))return;if(e.has(n))return;if((n.raws.selector&&n.raws.selector.raw||n.selector).endsWith(":"))return;replaceAnyLink(n,o,t.preserve,s.areaHrefNeedsFixing)&&e.add(n)}}}}};creator.postcss=!0,module.exports=creator; diff --git a/plugins/postcss-pseudo-class-any-link/dist/index.mjs b/plugins/postcss-pseudo-class-any-link/dist/index.mjs index b20087cc7..192a428dc 100644 --- a/plugins/postcss-pseudo-class-any-link/dist/index.mjs +++ b/plugins/postcss-pseudo-class-any-link/dist/index.mjs @@ -1 +1 @@ -import e from"postcss-selector-parser";const t=e().astSync(":link").nodes[0],s=e().astSync(":visited").nodes[0],n=e().astSync("area[href]").nodes[0],o=e().astSync("[href]").nodes[0];function replaceAnyLink(e,t,s,n){const o=[],r=[];try{for(let t=0;t{const r=[];if(e.walkPseudos((e=>{if(":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length)return;if(!l)return void r.push([t.clone(),s.clone()]);const c=getTagElementsNextToPseudo(e);c.includes("area")?r.push([t.clone(),s.clone(),o.clone()]):c.length?r.push([t.clone(),s.clone()]):r.push([t.clone(),s.clone(),n.clone()])})),!r.length)return;cartesianProduct(...r).forEach((t=>{const s=e.clone();s.walkPseudos((e=>{":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length||(insertNode(e.parent,e,t.shift()),e.remove())})),c.push(s.toString())}))})).processSync(r),c}function cartesianProduct(...e){const t=[],s=e.length-1;return function helper(n,o){for(let r=0,l=e[o].length;r=0&&("combinator"!==t.nodes[s].type&&!e.isPseudoElement(t.nodes[s].type));s--)r=s;if("tag"!==o){for(let s=c;s{const t={preserve:!0,...e},s={areaHrefNeedsFixing:!1,...Object(t.subFeatures)};return{postcssPlugin:"postcss-pseudo-class-any-link",prepare(){const e=new WeakSet;return{postcssPlugin:"postcss-pseudo-class-any-link",Rule(n,{result:o}){if(!n.selector.toLowerCase().includes(":any-link"))return;if(e.has(n))return;if((n.raws.selector&&n.raws.selector.raw||n.selector).endsWith(":"))return;replaceAnyLink(n,o,t.preserve,s.areaHrefNeedsFixing)&&e.add(n)}}}}};creator.postcss=!0;export{creator as default}; +import e from"postcss-selector-parser";const t=e().astSync(":link").nodes[0],s=e().astSync(":visited").nodes[0],n=e().astSync("area[href]").nodes[0],o=e().astSync("[href]").nodes[0];function replaceAnyLink(e,t,s,n){const o=[],r=[];try{for(let t=0;t{const r=[];if(e.walkPseudos((e=>{if(":not"===e.value.toLowerCase())return!1;if(":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length)return;if(!l)return void r.push([t.clone(),s.clone()]);const c=getTagElementsNextToPseudo(e);c.includes("area")?r.push([t.clone(),s.clone(),o.clone()]):c.length?r.push([t.clone(),s.clone()]):r.push([t.clone(),s.clone(),n.clone()])})),!r.length)return;cartesianProduct(...r).forEach((t=>{const s=e.clone();s.walkPseudos((e=>{":any-link"!==e.value.toLowerCase()||e.nodes&&e.nodes.length||(insertNode(e.parent,e,t.shift()),e.remove())})),c.push(s.toString())}))})).processSync(r),c}function cartesianProduct(...e){const t=[],s=e.length-1;return function helper(n,o){for(let r=0,l=e[o].length;r=0&&("combinator"!==t.nodes[s].type&&!e.isPseudoElement(t.nodes[s].type));s--)r=s;if("tag"!==o){for(let s=c;s{const t={preserve:!0,...e},s={areaHrefNeedsFixing:!1,...Object(t.subFeatures)};return{postcssPlugin:"postcss-pseudo-class-any-link",prepare(){const e=new WeakSet;return{postcssPlugin:"postcss-pseudo-class-any-link",Rule(n,{result:o}){if(!n.selector.toLowerCase().includes(":any-link"))return;if(e.has(n))return;if((n.raws.selector&&n.raws.selector.raw||n.selector).endsWith(":"))return;replaceAnyLink(n,o,t.preserve,s.areaHrefNeedsFixing)&&e.add(n)}}}}};creator.postcss=!0;export{creator as default}; diff --git a/plugins/postcss-pseudo-class-any-link/src/replace-any-link.ts b/plugins/postcss-pseudo-class-any-link/src/replace-any-link.ts index 51395794e..edc984f0c 100644 --- a/plugins/postcss-pseudo-class-any-link/src/replace-any-link.ts +++ b/plugins/postcss-pseudo-class-any-link/src/replace-any-link.ts @@ -54,6 +54,10 @@ function modifiedSelector(selector: string, areaHrefNeedsFixing: boolean): Array parser((selectorsAST) => { const replacements: Array> = []; selectorsAST.walkPseudos((pseudo) => { + if (pseudo.value.toLowerCase() === ':not') { + return false; + } + if (pseudo.value.toLowerCase() !== ':any-link' || (pseudo.nodes && pseudo.nodes.length)) { return; } diff --git a/plugins/postcss-pseudo-class-any-link/test/basic.css b/plugins/postcss-pseudo-class-any-link/test/basic.css index 7f07855db..97b283d67 100644 --- a/plugins/postcss-pseudo-class-any-link/test/basic.css +++ b/plugins/postcss-pseudo-class-any-link/test/basic.css @@ -117,3 +117,7 @@ b { :any-link { to-clone: 1; } + +:not(:any-link) { + order: 110; +} diff --git a/plugins/postcss-pseudo-class-any-link/test/basic.expect.css b/plugins/postcss-pseudo-class-any-link/test/basic.expect.css index a6386c930..45adc877c 100644 --- a/plugins/postcss-pseudo-class-any-link/test/basic.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/basic.expect.css @@ -243,3 +243,7 @@ b { :any-link { to-clone: 1; } + +:not(:any-link) { + order: 110; +} diff --git a/plugins/postcss-pseudo-class-any-link/test/basic.preserve-false.expect.css b/plugins/postcss-pseudo-class-any-link/test/basic.preserve-false.expect.css index d762cf419..89d8f31c6 100644 --- a/plugins/postcss-pseudo-class-any-link/test/basic.preserve-false.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/basic.preserve-false.expect.css @@ -127,3 +127,7 @@ b { :link, :visited { to-clone: 1; } + +:not(:any-link) { + order: 110; +} diff --git a/plugins/postcss-pseudo-class-any-link/test/basic.sub-features-area-href.expect.css b/plugins/postcss-pseudo-class-any-link/test/basic.sub-features-area-href.expect.css index 273f0870f..0821063be 100644 --- a/plugins/postcss-pseudo-class-any-link/test/basic.sub-features-area-href.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/basic.sub-features-area-href.expect.css @@ -248,3 +248,7 @@ b { :any-link { to-clone: 1; } + +:not(:any-link) { + order: 110; +} diff --git a/plugins/postcss-pseudo-class-any-link/test/basic.with-cloned-declarations.expect.css b/plugins/postcss-pseudo-class-any-link/test/basic.with-cloned-declarations.expect.css index 008b2aab7..0f2990b47 100644 --- a/plugins/postcss-pseudo-class-any-link/test/basic.with-cloned-declarations.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/basic.with-cloned-declarations.expect.css @@ -250,3 +250,7 @@ b { cloned: 1; to-clone: 1; } + +:not(:any-link) { + order: 110; +} diff --git a/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.expect.css b/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.expect.css index 5557948dc..9d07ce883 100644 --- a/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.expect.css @@ -966,7 +966,7 @@ foo[baz=":any-link"] { order: 221; } -:not(:link), :not(:visited) { +:not(:any-link) { order: 222; } diff --git a/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.sub-features-area-href.expect.css b/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.sub-features-area-href.expect.css index bbe8e65cc..12ba946d9 100644 --- a/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.sub-features-area-href.expect.css +++ b/plugins/postcss-pseudo-class-any-link/test/generated-selector-cases.sub-features-area-href.expect.css @@ -966,7 +966,7 @@ foo[baz=":any-link"] { order: 221; } -:not(:link), :not(:visited), :not(area[href]) { +:not(:any-link) { order: 222; }