@projectwallace/css-analyzer 5.2.1 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/analyzer.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("css-tree/parser"),t=require("css-tree/walker");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=/*#__PURE__*/n(e),i=/*#__PURE__*/n(t);function a(){return a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a.apply(this,arguments)}function s(e,t){return t>=65&&t<=90&&(t|=32),e===t}function o(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(!1===s(e.charCodeAt(n),t.charCodeAt(n)))return!1;return!0}function u(e,t){var n=t.length-e.length;if(n<0)return!1;for(var r=t.length-1;r>=n;r--)if(!1===s(e.charCodeAt(r-n),t.charCodeAt(r)))return!1;return!0}function l(e,t){if(t.length<e.length)return!1;for(var n=0;n<e.length;n++)if(!1===s(e.charCodeAt(n),t.charCodeAt(n)))return!1;return!0}function c(e,t){return e[0]===t[0]?e[1]===t[1]?t[2]-e[2]:t[1]-e[1]:t[0]-e[0]}var h=function(e){var t=0,n=0,r=0,a=0,s=!1;return i.default(e,function(e){switch(e.type){case"IdSelector":t++,a++;break;case"ClassSelector":n++,a++;break;case"AttributeSelector":n++,a++,Boolean(e.value)&&a++,s="role"===e.name.name||l("aria-",e.name.name);break;case"PseudoElementSelector":case"TypeSelector":if(a++,42===e.name.charCodeAt(0)&&1===e.name.length)break;r++;break;case"PseudoClassSelector":switch(e.name){case"before":case"after":case"first-letter":case"first-line":return r++,a++,this.skip;case"where":case"is":case"has":case"matches":case"-webkit-any":case"-moz-any":case"not":case"nth-child":case"nth-last-child":"nth-child"!==e.name&&"nth-last-child"!==e.name||n++;var o=(m=[],i.default(e,{visit:"Selector",enter:function(e){m.push(h(e))}}),m.sort(function(e,t){return c(e.specificity,t.specificity)}));if(0===o.length)return;if("where"!==e.name){var u=o[0].specificity;t+=u[0],n+=u[1],r+=u[2]}for(var d=0;d<o.length;d++){var f=o[d];f.isA11y&&(s=!0),a+=f.complexity}return a++,this.skip;default:return a++,n++,this.skip}case"Combinator":a++}var m}),{specificity:[t,n,r],complexity:a,isId:t>0,isA11y:s}},d={aliceblue:1,antiquewhite:1,aqua:1,aquamarine:1,azure:1,beige:1,bisque:1,black:1,blanchedalmond:1,blue:1,blueviolet:1,brown:1,burlywood:1,cadetblue:1,chartreuse:1,chocolate:1,coral:1,cornflowerblue:1,cornsilk:1,crimson:1,cyan:1,darkblue:1,darkcyan:1,darkgoldenrod:1,darkgray:1,darkgreen:1,darkgrey:1,darkkhaki:1,darkmagenta:1,darkolivegreen:1,darkorange:1,darkorchid:1,darkred:1,darksalmon:1,darkseagreen:1,darkslateblue:1,darkslategray:1,darkslategrey:1,darkturquoise:1,darkviolet:1,deeppink:1,deepskyblue:1,dimgray:1,dimgrey:1,dodgerblue:1,firebrick:1,floralwhite:1,forestgreen:1,fuchsia:1,gainsboro:1,ghostwhite:1,gold:1,goldenrod:1,gray:1,green:1,greenyellow:1,grey:1,honeydew:1,hotpink:1,indianred:1,indigo:1,ivory:1,khaki:1,lavender:1,lavenderblush:1,lawngreen:1,lemonchiffon:1,lightblue:1,lightcoral:1,lightcyan:1,lightgoldenrodyellow:1,lightgray:1,lightgreen:1,lightgrey:1,lightpink:1,lightsalmon:1,lightseagreen:1,lightskyblue:1,lightslategray:1,lightslategrey:1,lightsteelblue:1,lightyellow:1,lime:1,limegreen:1,linen:1,magenta:1,maroon:1,mediumaquamarine:1,mediumblue:1,mediumorchid:1,mediumpurple:1,mediumseagreen:1,mediumslateblue:1,mediumspringgreen:1,mediumturquoise:1,mediumvioletred:1,midnightblue:1,mintcream:1,mistyrose:1,moccasin:1,navajowhite:1,navy:1,oldlace:1,olive:1,olivedrab:1,orange:1,orangered:1,orchid:1,palegoldenrod:1,palegreen:1,paleturquoise:1,palevioletred:1,papayawhip:1,peachpuff:1,peru:1,pink:1,plum:1,powderblue:1,purple:1,rebeccapurple:1,red:1,rosybrown:1,royalblue:1,saddlebrown:1,salmon:1,sandybrown:1,seagreen:1,seashell:1,sienna:1,silver:1,skyblue:1,slateblue:1,slategray:1,slategrey:1,snow:1,springgreen:1,steelblue:1,tan:1,teal:1,thistle:1,tomato:1,turquoise:1,violet:1,wheat:1,white:1,whitesmoke:1,yellow:1,yellowgreen:1,canvas:1,canvastext:1,linktext:1,visitedtext:1,activetext:1,buttonface:1,buttontext:1,buttonborder:1,field:1,fieldtext:1,highlight:1,highlighttext:1,selecteditem:1,selecteditemtext:1,mark:1,marktext:1,graytext:1},f={rgb:1,rgba:1,hsl:1,hsla:1,hwb:1,lab:1,lch:1,oklab:1,oklch:1,color:1},m=/*#__PURE__*/function(){function e(e){if(this.items={},this.total=0,this.totalUnique=0,e)for(var t=0;t<e.length;t++)this.push(e[t])}var t=e.prototype;return t.push=function(e){this.total++,this.items[e]?this.items[e]++:(this.items[e]=1,this.totalUnique++)},t.size=function(){return this.total},t.count=function(){return{total:this.total,totalUnique:this.totalUnique,unique:this.items,uniquenessRatio:0===this.total?0:this.totalUnique/this.total}},e}(),p={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},g={normal:1,"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1,bold:1,bolder:1,lighter:1,"ultra-condensed":1,"extra-condensed":1,condensed:1,"semi-condensed":1,"semi-expanded":1,expanded:1,"extra-expanded":1,"ultra-expanded":1,italic:1,oblique:1},y=function(e){for(var t=e.fontValues,n=e.stringifyNode,r=new m(e.fontFamilyValues),a=function(e){var a=t[e],s=a.children.first;if("Identifier"===s.type&&p[s.name])return"continue";var o="";i.default(a,{reverse:!0,enter:function(e){if("String"===e.type){var t=e.loc.start,r=n({loc:{start:{line:t.line,column:t.column},end:{line:t.line,column:t.column+1}}});return o=r+e.value+r+o}return"Operator"===e.type&&44===e.value.charCodeAt(0)?o=e.value+o:"Identifier"===e.type?g[e.name]?this.skip:o=e.name+o:void 0}}),r.push(o)},s=0;s<t.length;s++)a(s);return r.count()},v={"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1},b={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},k=function(e){for(var t=e.stringifyNode,n=e.fontValues,r=new m(e.fontSizeValues),a=function(e){var a=n[e],s=a.children.first;if("Identifier"===s.type&&b[s.name])return"continue";var o=!1,u=void 0;i.default(a,function(e){switch(e.type){case"Number":if(48===e.value.charCodeAt(0))return u="0",this.break;case"Operator":47===e.value.charCodeAt(0)&&(o=!0);break;case"Dimension":if(!o)return u=t(e),this.break;case"Identifier":if(v[e.name])return u=e.name,this.break}}),u&&r.push(u)},s=0;s<n.length;s++)a(s);return r.count()},w={auto:1,inherit:1,initial:1,unset:1,revert:1,none:1},x=function(e){for(var t=e.values,n=e.stringifyNode,r=new m,i=0;i<t.length;i++){var a=t[i],s=a.children.first;s&&("Identifier"===s.type&&w[s.name]||r.push(n(a)))}return r.count()},z={linear:1,ease:1,"ease-in":1,"ease-out":1,"ease-in-out":1,"step-start":1,"step-end":1},q=function(e){for(var t=e.animations,n=e.timingFunctions,r=e.stringifyNode,i=new m(e.durations),a=new m(n),s=function(e){var n=!1;t[e].forEach(function(e){return"Operator"===e.type?n=!1:"Dimension"===e.type&&!1===n?(n=!0,i.push(r(e))):"Identifier"===e.type&&z[e.name]?a.push(r(e)):"Function"!==e.type||"cubic-bezier"!==e.name&&"steps"!==e.name?void 0:a.push(r(e))})},o=0;o<t.length;o++)s(o);return{durations:i.count(),timingFunctions:a.count()}};function C(e){return 45===e.charCodeAt(0)&&45!==e.charCodeAt(1)&&-1!==e.indexOf("-",2)}function A(e){e=e.toArray();for(var t=0;t<e.length;t++){var n=e[t];if("Identifier"===n.type&&n.name.length>=3&&C(n.name))return!0;if("Function"===n.type){if(C(n.name))return!0;if(n.children&&A(n.children))return!0}}return!1}var O=function(e){for(var t=e.values,n=e.stringifyNode,r=new m,i=0;i<t.length;i++){var a=t[i];a.children&&A(a.children)&&r.push(n(a))}return r.count()},S=function(e){for(var t=e.atrules,n=e.stringifyNode,r=[],i=new m,s=new m,o=new m,l=new m,c=new m,h=new m,d=new m,f=new m,p={"font-face":function(e){var t={};e.block.children.forEach(function(e){return t[e.property]=n(e.value)}),r.push(t)},media:function(e){return o.push(e.prelude)},supports:function(e){return c.push(e.prelude)},keyframes:function(e){return h.push("@"+e.name+" "+e.prelude)},import:function(e){return s.push(e.prelude)},charset:function(e){return l.push(e.prelude)},container:function(e){return f.push(e.prelude)},layer:function(e){e.prelude.trim().split(",").map(function(e){return e.trim()}).forEach(function(e){return i.push(e)})}},g=0;g<t.length;g++){var y=t[g],v=y.name,b=p[v];if(b)b(y);else if(u("keyframes",v)){var k="@"+v+" "+y.prelude;h.push(k),C(v)&&d.push(k)}}return{fontface:{total:r.length,totalUnique:r.length,unique:r,uniquenessRatio:0===r.length?0:1},import:s.count(),media:o.count(),charset:l.count(),supports:c.count(),keyframes:a({},h.count(),{prefixed:a({},d.count(),{ratio:0===h.size()?0:d.size()/h.size()})}),container:f.count(),layer:i.count()}},N=/*#__PURE__*/function(){function e(){this.list=new m,this.contexts={}}var t=e.prototype;return t.push=function(e,t){this.list.push(e),this.contexts[t]||(this.contexts[t]=new m),this.contexts[t].push(e)},t.count=function(){var e={};for(var t in this.contexts)e[t]=this.contexts[t].count();return Object.assign(this.list.count(),{itemsPerContext:e})},e}(),j=/*#__PURE__*/function(){function e(){this.items=[]}var t=e.prototype;return t.add=function(e){this.items.push(e)},t.aggregate=function(){if(0===this.items.length)return{min:0,max:0,mean:0,mode:0,median:0,range:0,sum:0};var e,t,n,r=this.items.slice().sort(function(e,t){return e-t}),i=r[0],a=r[r.length-1],s=this.items.reduce(function(e,t){return e+t}),o=function(e){for(var t=Object.create(null),n=-1,r=0,i=0,a=0;a<e.length;a++){var s=e[a],o=(t[s]||0)+1;t[s]=o,o>n&&(n=o,r=0,i=0),o>=n&&(r++,i+=s)}return i/r}(this.items),u=(t=(e=r).length/2)!==(n=Math.floor(t))?e[n]:(e[n]+e[n-1])/2;return{min:i,max:a,mean:s/this.items.length,mode:o,median:u,range:a-i,sum:s}},t.toArray=function(){return this.items},e}();function I(e){return!(e.length<3)&&45===e.charCodeAt(0)&&45===e.charCodeAt(1)}function D(e,t){return!I(t)&&u(e,t)}exports.analyze=function(e){var t=new Date,n=e.split(/\r?\n/);function s(e){var t=e.loc.start,r=e.loc.end;if(0==r.line-t.line)return n[t.line-1].substring(t.column-1,r.column-1);for(var i="",a=t.line;a<=r.line;a++){var s=n[a-1];i+=a!==t.line?a!==r.line?s+"\n":s.substring(0,r.column-1):s.substring(t.column-1)+"\n"}return i}var p,g,v=new Date,b=0,w=0,z=r.default(e,{parseAtrulePrelude:!1,parseCustomProperty:!0,positions:!0,onComment:function(e){b++,w+=e.length}}),A=new Date,F=new m,U=[],V=0,P=0,E=new j,R=new j,_=new m,L=Object.create(null),T=0,B=0,H=0,K=new m,M=new m,G=new m,J=new m,Q=[],W=[],X=[],Y=[],Z=[],$=[],ee=[],te=[],ne=[],re=[],ie=new N,ae=new N,se=Object.create(null),oe=new j,ue=new j,le=new j,ce=new j,he=[],de=[],fe=new m,me=new m;i.default(z,function(e){switch(e.type){case"Atrule":U.push({name:e.name,prelude:e.prelude&&e.prelude.value,block:o("font-face",e.name)&&e.block});break;case"Rule":var t=function(e){var t=0,n=0;return i.default(e,function(e){return"Selector"===e.type?(t++,this.skip):"Declaration"===e.type?(n++,this.skip):void 0}),[t,n]}(e),n=t[1];V++,0===n&&P++,E.add(t[0]),R.add(n);break;case"Selector":var r=s(e);if(this.atrule&&u("keyframes",this.atrule.name))return _.push(r),this.skip;var a=h(e),m=a.specificity,y=a.complexity,v=a.isA11y;return a.isId&&fe.push(r),v&&me.push(r),se[r]?se[r]++:se[r]=1,ce.add(y),void 0===p&&(p=m),void 0===g&&(g=m),oe.add(m[0]),ue.add(m[1]),le.add(m[2]),void 0!==g&&c(g,m)<0&&(g=m),void 0!==p&&c(p,m)>0&&(p=m),he.push(m),de.push(y),this.skip;case"Dimension":if(!this.declaration)break;return ae.push(e.unit,this.declaration.property),this.skip;case"Url":l("data:",e.value)&&F.push(e.value);break;case"Declaration":T++;var b=s(e);L[b]?L[b]++:L[b]=1,e.important&&(B++,this.atrule&&u("keyframes",this.atrule.name)&&H++);var k=e.value,w=e.property;if(K.push(w),Q.push(k),C(w)?G.push(w):function(e){if(I(e)||C(e))return!1;var t=e.charCodeAt(0);return 47===t||95===t||43===t||42===t||38===t||36===t||35===t}(w)?M.push(w):I(w)&&J.push(w),D("z-index",w))return W.push(k),this.skip;if(D("font",w)){Z.push(k);break}if(D("font-size",w)){ee.push(s(k));break}if(D("font-family",w)){$.push(s(k));break}if(D("transition",w)||D("animation",w)){te.push(k.children);break}if(D("animation-duration",w)||D("transition-duration",w)){re.push(s(k));break}if(D("transition-timing-function",w)||D("animation-timing-function",w)){ne.push(s(k));break}D("text-shadow",w)?X.push(k):D("box-shadow",w)&&Y.push(k),i.default(k,function(e){switch(e.type){case"Hash":return ie.push("#"+e.value,w),this.skip;case"Identifier":var t=e.name;return t.length>20||t.length<3||d[t.toLowerCase()]&&ie.push(s(e),w),this.skip;case"Function":f[e.name.toLowerCase()]&&ie.push(s(e),w)}})}});var pe=F.count(),ge=Object.keys(pe.unique).join("").length,ye=Object.keys(L).length,ve=de.length,be=oe.aggregate(),ke=ue.aggregate(),we=le.aggregate(),xe=new m(de).count(),ze=Object.values(se).length;return{stylesheet:{sourceLinesOfCode:U.length+ve+T+_.size(),linesOfCode:n.length,size:e.length,comments:{total:b,size:w},embeddedContent:Object.assign(pe,{size:{total:ge,ratio:0===e.length?0:ge/e.length}})},atrules:S({atrules:U,stringifyNode:s}),rules:{total:V,empty:{total:P,ratio:0===V?0:P/V},selectors:a({},E.aggregate(),{items:E.toArray()}),declarations:a({},R.aggregate(),{items:R.toArray()})},selectors:{total:ve,totalUnique:ze,uniquenessRatio:0===ve?0:ze/ve,specificity:{min:void 0===g?[0,0,0]:g,max:void 0===p?[0,0,0]:p,sum:[be.sum,ke.sum,we.sum],mean:[be.mean,ke.mean,we.mean],mode:[be.mode,ke.mode,we.mode],median:[be.median,ke.median,we.median],items:he},complexity:a({},ce.aggregate(),xe,{items:de}),id:a({},fe.count(),{ratio:0===ve?0:fe.size()/ve}),accessibility:a({},me.count(),{ratio:0===ve?0:me.size()/ve}),keyframes:_.count()},declarations:{total:T,unique:{total:ye,ratio:0===T?0:ye/T},importants:{total:B,ratio:0===T?0:B/T,inKeyframes:{total:H,ratio:0===B?0:H/B}}},properties:a({},K.count(),{prefixed:a({},G.count(),{ratio:0===K.size()?0:G.size()/K.size()}),custom:a({},J.count(),{ratio:0===K.size()?0:J.size()/K.size()}),browserhacks:a({},M.count(),{ratio:0===K.size()?0:M.size()/K.size()})}),values:{colors:ie.count(),fontFamilies:y({stringifyNode:s,fontValues:Z,fontFamilyValues:$}),fontSizes:k({stringifyNode:s,fontValues:Z,fontSizeValues:ee}),zindexes:x({values:W,stringifyNode:s}),textShadows:x({values:X,stringifyNode:s}),boxShadows:x({values:Y,stringifyNode:s}),animations:q({animations:te,timingFunctions:ne,durations:re,stringifyNode:s}),prefixes:O({values:Q,stringifyNode:s}),units:ae.count()},__meta__:{parseTime:A-v,analyzeTime:new Date-A,total:new Date-t}}},exports.compareSpecificity=c;
1
+ var e=require("css-tree/parser"),t=require("css-tree/walker");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=/*#__PURE__*/r(e),i=/*#__PURE__*/r(t);function a(e,t){return t>=65&&t<=90&&(t|=32),e===t}function o(e,t){if(e.length!==t.length)return!1;for(var r=0;r<e.length;r++)if(!1===a(e.charCodeAt(r),t.charCodeAt(r)))return!1;return!0}function s(e,t){var r=t.length-e.length;if(r<0)return!1;for(var n=t.length-1;n>=r;n--)if(!1===a(e.charCodeAt(n-r),t.charCodeAt(n)))return!1;return!0}function u(e,t){if(t.length<e.length)return!1;for(var r=0;r<e.length;r++)if(!1===a(e.charCodeAt(r),t.charCodeAt(r)))return!1;return!0}function l(e,t){return e[0]===t[0]?e[1]===t[1]?t[2]-e[2]:t[1]-e[1]:t[0]-e[0]}var c=function(e){var t=0,r=0,n=0,a=0,o=!1;return i.default(e,function(e){switch(e.type){case"IdSelector":t++,a++;break;case"ClassSelector":r++,a++;break;case"AttributeSelector":r++,a++,Boolean(e.value)&&a++,o="role"===e.name.name||u("aria-",e.name.name);break;case"PseudoElementSelector":case"TypeSelector":if(a++,42===e.name.charCodeAt(0)&&1===e.name.length)break;n++;break;case"PseudoClassSelector":switch(e.name){case"before":case"after":case"first-letter":case"first-line":return n++,a++,this.skip;case"where":case"is":case"has":case"matches":case"-webkit-any":case"-moz-any":case"not":case"nth-child":case"nth-last-child":"nth-child"!==e.name&&"nth-last-child"!==e.name||r++;var s=(m=[],i.default(e,{visit:"Selector",enter:function(e){m.push(c(e))}}),m.sort(function(e,t){return l(e.specificity,t.specificity)}));if(0===s.length)return;if("where"!==e.name){var f=s[0].specificity;t+=f[0],r+=f[1],n+=f[2]}for(var d=0;d<s.length;d++){var h=s[d];h.isA11y&&(o=!0),a+=h.complexity}return a++,this.skip;default:return a++,r++,this.skip}case"Combinator":a++}var m}),{specificity:[t,r,n],complexity:a,isId:t>0,isA11y:o}},f={aliceblue:1,antiquewhite:1,aqua:1,aquamarine:1,azure:1,beige:1,bisque:1,black:1,blanchedalmond:1,blue:1,blueviolet:1,brown:1,burlywood:1,cadetblue:1,chartreuse:1,chocolate:1,coral:1,cornflowerblue:1,cornsilk:1,crimson:1,cyan:1,darkblue:1,darkcyan:1,darkgoldenrod:1,darkgray:1,darkgreen:1,darkgrey:1,darkkhaki:1,darkmagenta:1,darkolivegreen:1,darkorange:1,darkorchid:1,darkred:1,darksalmon:1,darkseagreen:1,darkslateblue:1,darkslategray:1,darkslategrey:1,darkturquoise:1,darkviolet:1,deeppink:1,deepskyblue:1,dimgray:1,dimgrey:1,dodgerblue:1,firebrick:1,floralwhite:1,forestgreen:1,fuchsia:1,gainsboro:1,ghostwhite:1,gold:1,goldenrod:1,gray:1,green:1,greenyellow:1,grey:1,honeydew:1,hotpink:1,indianred:1,indigo:1,ivory:1,khaki:1,lavender:1,lavenderblush:1,lawngreen:1,lemonchiffon:1,lightblue:1,lightcoral:1,lightcyan:1,lightgoldenrodyellow:1,lightgray:1,lightgreen:1,lightgrey:1,lightpink:1,lightsalmon:1,lightseagreen:1,lightskyblue:1,lightslategray:1,lightslategrey:1,lightsteelblue:1,lightyellow:1,lime:1,limegreen:1,linen:1,magenta:1,maroon:1,mediumaquamarine:1,mediumblue:1,mediumorchid:1,mediumpurple:1,mediumseagreen:1,mediumslateblue:1,mediumspringgreen:1,mediumturquoise:1,mediumvioletred:1,midnightblue:1,mintcream:1,mistyrose:1,moccasin:1,navajowhite:1,navy:1,oldlace:1,olive:1,olivedrab:1,orange:1,orangered:1,orchid:1,palegoldenrod:1,palegreen:1,paleturquoise:1,palevioletred:1,papayawhip:1,peachpuff:1,peru:1,pink:1,plum:1,powderblue:1,purple:1,rebeccapurple:1,red:1,rosybrown:1,royalblue:1,saddlebrown:1,salmon:1,sandybrown:1,seagreen:1,seashell:1,sienna:1,silver:1,skyblue:1,slateblue:1,slategray:1,slategrey:1,snow:1,springgreen:1,steelblue:1,tan:1,teal:1,thistle:1,tomato:1,turquoise:1,violet:1,wheat:1,white:1,whitesmoke:1,yellow:1,yellowgreen:1,canvas:1,canvastext:1,linktext:1,visitedtext:1,activetext:1,buttonface:1,buttontext:1,buttonborder:1,field:1,fieldtext:1,highlight:1,highlighttext:1,selecteditem:1,selecteditemtext:1,mark:1,marktext:1,graytext:1},d={rgb:1,rgba:1,hsl:1,hsla:1,hwb:1,lab:1,lch:1,oklab:1,oklch:1,color:1},h=/*#__PURE__*/function(){function e(e){if(this.t={},this.i=0,this.o=0,e)for(var t=0;t<e.length;t++)this.push(e[t])}var t=e.prototype;return t.push=function(e){this.i++,this.t[e]?this.t[e]++:(this.t[e]=1,this.o++)},t.size=function(){return this.i},t.count=function(){return{total:this.i,totalUnique:this.o,unique:this.t,uniquenessRatio:0===this.i?0:this.o/this.i}},e}(),m={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},b={normal:1,"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1,bold:1,bolder:1,lighter:1,"ultra-condensed":1,"extra-condensed":1,condensed:1,"semi-condensed":1,"semi-expanded":1,expanded:1,"extra-expanded":1,"ultra-expanded":1,italic:1,oblique:1},v=function(e){for(var t=e.fontValues,r=e.stringifyNode,n=new h(e.fontFamilyValues),a=function(e){var a=t[e],o=a.children.first;if("Identifier"===o.type&&m[o.name])return"continue";var s="";i.default(a,{reverse:!0,enter:function(e){if("String"===e.type){var t=e.loc.start,n=r({loc:{start:{line:t.line,column:t.column},end:{line:t.line,column:t.column+1}}});return s=n+e.value+n+s}return"Operator"===e.type&&44===e.value.charCodeAt(0)?s=e.value+s:"Identifier"===e.type?b[e.name]?this.skip:s=e.name+s:void 0}}),n.push(s)},o=0;o<t.length;o++)a(o);return n.count()},g={"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1},w={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},p=function(e){for(var t=e.stringifyNode,r=e.fontValues,n=new h(e.fontSizeValues),a=function(e){var a=r[e],o=a.children.first;if("Identifier"===o.type&&w[o.name])return"continue";var s=!1,u=void 0;i.default(a,function(e){switch(e.type){case"Number":if(48===e.value.charCodeAt(0))return u="0",this.break;case"Operator":47===e.value.charCodeAt(0)&&(s=!0);break;case"Dimension":if(!s)return u=t(e),this.break;case"Identifier":if(g[e.name])return u=e.name,this.break}}),u&&n.push(u)},o=0;o<r.length;o++)a(o);return n.count()},y={auto:1,inherit:1,initial:1,unset:1,revert:1,none:1},k=function(e){for(var t=e.values,r=e.stringifyNode,n=new h,i=0;i<t.length;i++){var a=t[i],o=a.children.first;o&&("Identifier"===o.type&&y[o.name]||n.push(r(a)))}return n.count()},x={linear:1,ease:1,"ease-in":1,"ease-out":1,"ease-in-out":1,"step-start":1,"step-end":1},O=function(e){for(var t=e.animations,r=e.timingFunctions,n=e.stringifyNode,i=new h(e.durations),a=new h(r),o=function(e){var r=!1;t[e].forEach(function(e){return"Operator"===e.type?r=!1:"Dimension"===e.type&&!1===r?(r=!0,i.push(n(e))):"Identifier"===e.type&&x[e.name]?a.push(n(e)):"Function"!==e.type||"cubic-bezier"!==e.name&&"steps"!==e.name?void 0:a.push(n(e))})},s=0;s<t.length;s++)o(s);return{durations:i.count(),timingFunctions:a.count()}};function q(e){return 45===e.charCodeAt(0)&&45!==e.charCodeAt(1)&&-1!==e.indexOf("-",2)}function j(e){e=e.toArray();for(var t=0;t<e.length;t++){var r=e[t];if("Identifier"===r.type&&r.name.length>=3&&q(r.name))return!0;if("Function"===r.type){if(q(r.name))return!0;if(r.children&&j(r.children))return!0}}return!1}var S=function(e){for(var t=e.values,r=e.stringifyNode,n=new h,i=0;i<t.length;i++){var a=t[i];a.children&&j(a.children)&&n.push(r(a))}return n.count()},z=function(e){for(var t=e.atrules,r=e.stringifyNode,n=[],i=new h,a=new h,o=new h,u=new h,l=new h,c=new h,f=new h,d=new h,m={"font-face":function(e){var t={};e.block.children.forEach(function(e){return t[e.property]=r(e.value)}),n.push(t)},media:function(e){return o.push(e.prelude)},supports:function(e){return l.push(e.prelude)},keyframes:function(e){return c.push("@"+e.name+" "+e.prelude)},import:function(e){return a.push(e.prelude)},charset:function(e){return u.push(e.prelude)},container:function(e){return d.push(e.prelude)},layer:function(e){e.prelude.trim().split(",").map(function(e){return e.trim()}).forEach(function(e){return i.push(e)})}},b=0;b<t.length;b++){var v=t[b],g=v.name,w=m[g];if(w)w(v);else if(s("keyframes",g)){var p="@"+g+" "+v.prelude;c.push(p),q(g)&&f.push(p)}}return{fontface:{total:n.length,totalUnique:n.length,unique:n,uniquenessRatio:0===n.length?0:1},import:a.count(),media:o.count(),charset:u.count(),supports:l.count(),keyframes:Object.assign(c.count(),{prefixed:Object.assign(f.count(),{ratio:0===c.size()?0:f.size()/c.size()})}),container:d.count(),layer:i.count()}},D=/*#__PURE__*/function(){function e(){this.u=new h,this.l={}}var t=e.prototype;return t.push=function(e,t){this.u.push(e),this.l[t]||(this.l[t]=new h),this.l[t].push(e)},t.count=function(){var e={};for(var t in this.l)e[t]=this.l[t].count();return Object.assign(this.u.count(),{itemsPerContext:e})},e}(),I=/*#__PURE__*/function(){function e(){this.t=[]}var t=e.prototype;return t.add=function(e){this.t.push(e)},t.aggregate=function(){if(0===this.t.length)return{min:0,max:0,mean:0,mode:0,median:0,range:0,sum:0};var e,t,r,n=this.t.slice().sort(function(e,t){return e-t}),i=n[0],a=n[n.length-1],o=this.t.reduce(function(e,t){return e+t}),s=function(e){for(var t=Object.create(null),r=-1,n=0,i=0,a=0;a<e.length;a++){var o=e[a],s=(t[o]||0)+1;t[o]=s,s>r&&(r=s,n=0,i=0),s>=r&&(n++,i+=o)}return i/n}(this.t),u=(t=(e=n).length/2)!==(r=Math.floor(t))?e[r]:(e[r]+e[r-1])/2;return{min:i,max:a,mean:o/this.t.length,mode:s,median:u,range:a-i,sum:o}},t.toArray=function(){return this.t},e}();function C(e){return!(e.length<3)&&45===e.charCodeAt(0)&&45===e.charCodeAt(1)}function N(e,t){return!C(t)&&s(e,t)}var F=/*#__PURE__*/function(){function e(){this.t=Object.create(null)}var t=e.prototype;return t.push=function(e){return this.t[e]?this.t[e]++:this.t[e]=1},t.count=function(){return Object.keys(this.t).length},e}();exports.analyze=function(e){var t=new Date,r=e.split(/\r?\n/);function a(e){var t=e.loc.start,n=e.loc.end;if(0==n.line-t.line)return r[t.line-1].substring(t.column-1,n.column-1);for(var i="",a=t.line;a<=n.line;a++){var o=r[a-1];i+=a!==t.line?a!==n.line?o+"\n":o.substring(0,n.column-1):o.substring(t.column-1)+"\n"}return i}var m,b,g=new Date,w=0,y=0,x=n.default(e,{parseAtrulePrelude:!1,parseCustomProperty:!0,positions:!0,onComment:function(e){w++,y+=e.length}}),j=new Date,P=new h,V=[],A=0,R=0,U=new I,_=new I,T=new h,B=new F,E=0,H=0,K=0,L=new h,M=new h,G=new h,J=new h,Q=[],W=[],X=[],Y=[],Z=[],$=[],ee=[],te=[],re=[],ne=[],ie=new D,ae=new D,oe=new F,se=new I,ue=new I,le=new I,ce=new I,fe=[],de=[],he=new h,me=new h;i.default(x,function(e){switch(e.type){case"Atrule":V.push({name:e.name,prelude:e.prelude&&e.prelude.value,block:o("font-face",e.name)&&e.block});break;case"Rule":var t=function(e){var t=0,r=0;return i.default(e,function(e){return"Selector"===e.type?(t++,this.skip):"Declaration"===e.type?(r++,this.skip):void 0}),[t,r]}(e),r=t[1];A++,0===r&&R++,U.add(t[0]),_.add(r);break;case"Selector":var n=a(e);if(this.atrule&&s("keyframes",this.atrule.name))return T.push(n),this.skip;var h=c(e),v=h.specificity,g=h.complexity,w=h.isA11y;return h.isId&&he.push(n),w&&me.push(n),oe.push(n),ce.add(g),void 0===m&&(m=v),void 0===b&&(b=v),se.add(v[0]),ue.add(v[1]),le.add(v[2]),void 0!==b&&l(b,v)<0&&(b=v),void 0!==m&&l(m,v)>0&&(m=v),fe.push(v),de.push(g),this.skip;case"Dimension":if(!this.declaration)break;return ae.push(e.unit,this.declaration.property),this.skip;case"Url":u("data:",e.value)&&P.push(e.value);break;case"Value":Q.push(e);var p=this.declaration.property;if(N("z-index",p))return W.push(e),this.skip;if(N("font",p)){Z.push(e);break}if(N("font-size",p)){ee.push(a(e));break}if(N("font-family",p)){$.push(a(e));break}if(N("transition",p)||N("animation",p)){te.push(e.children);break}if(N("animation-duration",p)||N("transition-duration",p)){ne.push(a(e));break}if(N("transition-timing-function",p)||N("animation-timing-function",p)){re.push(a(e));break}N("text-shadow",p)?X.push(e):N("box-shadow",p)&&Y.push(e),i.default(e,function(e){switch(e.type){case"Hash":return ie.push("#"+e.value,p),this.skip;case"Identifier":var t=e.name;return t.length>20||t.length<3||f[t.toLowerCase()]&&ie.push(a(e),p),this.skip;case"Function":if(o("var",e.name))return this.skip;d[e.name.toLowerCase()]&&ie.push(a(e),p)}});break;case"Declaration":E++;var y=a(e);B.push(y),e.important&&(H++,this.atrule&&s("keyframes",this.atrule.name)&&K++);var k=e.property;L.push(k),q(k)?G.push(k):function(e){if(C(e)||q(e))return!1;var t=e.charCodeAt(0);return 47===t||95===t||43===t||42===t||38===t||36===t||35===t}(k)?M.push(k):C(k)&&J.push(k)}});var be=P.count(),ve=Object.keys(be.unique).join("").length,ge=B.count(),we=de.length,pe=se.aggregate(),ye=ue.aggregate(),ke=le.aggregate(),xe=new h(de).count(),Oe=oe.count();return{stylesheet:{sourceLinesOfCode:V.length+we+E+T.size(),linesOfCode:r.length,size:e.length,comments:{total:w,size:y},embeddedContent:Object.assign(be,{size:{total:ve,ratio:0===e.length?0:ve/e.length}})},atrules:z({atrules:V,stringifyNode:a}),rules:{total:A,empty:{total:R,ratio:0===A?0:R/A},selectors:Object.assign(U.aggregate(),{items:U.toArray()}),declarations:Object.assign(_.aggregate(),{items:_.toArray()})},selectors:{total:we,totalUnique:Oe,uniquenessRatio:0===we?0:Oe/we,specificity:{min:void 0===b?[0,0,0]:b,max:void 0===m?[0,0,0]:m,sum:[pe.sum,ye.sum,ke.sum],mean:[pe.mean,ye.mean,ke.mean],mode:[pe.mode,ye.mode,ke.mode],median:[pe.median,ye.median,ke.median],items:fe},complexity:Object.assign(ce.aggregate(),xe,{items:de}),id:Object.assign(he.count(),{ratio:0===we?0:he.size()/we}),accessibility:Object.assign(me.count(),{ratio:0===we?0:me.size()/we}),keyframes:T.count()},declarations:{total:E,unique:{total:ge,ratio:0===E?0:ge/E},importants:{total:H,ratio:0===E?0:H/E,inKeyframes:{total:K,ratio:0===H?0:K/H}}},properties:Object.assign(L.count(),{prefixed:Object.assign(G.count(),{ratio:0===L.size()?0:G.size()/L.size()}),custom:Object.assign(J.count(),{ratio:0===L.size()?0:J.size()/L.size()}),browserhacks:Object.assign(M.count(),{ratio:0===L.size()?0:M.size()/L.size()})}),values:{colors:ie.count(),fontFamilies:v({stringifyNode:a,fontValues:Z,fontFamilyValues:$}),fontSizes:p({stringifyNode:a,fontValues:Z,fontSizeValues:ee}),zindexes:k({values:W,stringifyNode:a}),textShadows:k({values:X,stringifyNode:a}),boxShadows:k({values:Y,stringifyNode:a}),animations:O({animations:te,timingFunctions:re,durations:ne,stringifyNode:a}),prefixes:S({values:Q,stringifyNode:a}),units:ae.count()},h:{parseTime:j-g,analyzeTime:new Date-j,total:new Date-t}}},exports.compareSpecificity=l;
2
2
  //# sourceMappingURL=analyzer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.cjs","sources":["../src/string-utils.js","../src/selectors/specificity.js","../src/values/colors.js","../src/countable-collection.js","../src/values/font-families.js","../src/values/font-sizes.js","../src/values/values.js","../src/values/animations.js","../src/vendor-prefix.js","../src/values/vendor-prefix.js","../src/atrules/atrules.js","../src/context-collection.js","../src/aggregate-collection.js","../src/properties/property-utils.js","../src/index.js","../src/rules/rules.js"],"sourcesContent":["/**\n * Case-insensitive compare two character codes\n * @param {string} charA\n * @param {string} charB\n * @see https://github.com/csstree/csstree/blob/41f276e8862d8223eeaa01a3d113ab70bb13d2d9/lib/tokenizer/utils.js#L22\n */\nfunction compareChar(referenceCode, testCode) {\n // if uppercase\n if (testCode >= 0x0041 && testCode <= 0x005A) {\n // shifting the 6th bit makes a letter lowercase\n testCode = testCode | 32\n }\n return referenceCode === testCode\n}\n\n/**\n * Case-insensitive string-comparison\n * @param {string} base\n * @param {string} test\n * @returns {boolean} true if the two strings are the same, false otherwise\n */\nexport function strEquals(base, test) {\n if (base.length !== test.length) return false\n\n for (let i = 0; i < base.length; i++) {\n if (compareChar(base.charCodeAt(i), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Case-insensitive testing whether a string ends with a given substring\n * @param {string} base e.g. '-webkit-transform'\n * @param {string} cmp e.g. 'transform'\n * @returns {boolean} true if `test` ends with `base`, false otherwise\n */\nexport function endsWith(base, test) {\n const offset = test.length - base.length\n\n if (offset < 0) {\n return false\n }\n\n for (let i = test.length - 1; i >= offset; i--) {\n if (compareChar(base.charCodeAt(i - offset), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Case-insensitive testing whether a string starts with a given substring\n * @param {string} base\n * @param {test} test\n * @returns {boolean} true if `test` starts with `base`, false otherwise\n */\nexport function startsWith(base, test) {\n if (test.length < base.length) return false\n\n for (let i = 0; i < base.length; i++) {\n if (compareChar(base.charCodeAt(i), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n","import walk from 'css-tree/walker'\nimport { startsWith } from '../string-utils.js'\n\n/**\n * Compare specificity A to Specificity B\n * @param {[number,number,number]} a - Specificity A\n * @param {[number,number,number]} b - Specificity B\n * @returns {number} sortIndex - 0 when a==b, 1 when a<b, -1 when a>b\n */\nfunction compareSpecificity(a, b) {\n if (a[0] === b[0]) {\n if (a[1] === b[1]) {\n return b[2] - a[2]\n }\n\n return b[1] - a[1]\n }\n\n return b[0] - a[0]\n}\n\n/**\n *\n * @param {import('css-tree').SelectorList} selectorListAst\n * @returns {Selector} topSpecificitySelector\n */\nfunction selectorListSpecificities(selectorListAst) {\n const childSelectors = []\n walk(selectorListAst, {\n visit: 'Selector',\n enter(node) {\n childSelectors.push(analyzeSpecificity(node))\n }\n })\n\n return childSelectors.sort((a, b) => compareSpecificity(a.specificity, b.specificity))\n}\n\n/**\n * Get the Specificity for the AST of a Selector Node\n * @param {import('css-tree').Selector} ast - AST Node for a Selector\n * @return {Object}\n * @property {[number,number,number]} specificity\n * @property {number} complexity\n * @property {Boolean} isId\n * @property {Boolean} isA11y\n */\nconst analyzeSpecificity = (node) => {\n let A = 0\n let B = 0\n let C = 0\n let complexity = 0\n let isA11y = false\n\n walk(node, function (selector) {\n switch (selector.type) {\n case 'IdSelector': {\n A++\n complexity++\n break\n }\n case 'ClassSelector': {\n B++\n complexity++\n break\n }\n case 'AttributeSelector': {\n B++\n complexity++\n\n // Add 1 for [attr=value] (or any variation using *= $= ^= |= )\n if (Boolean(selector.value)) {\n complexity++\n }\n\n isA11y = selector.name.name === 'role' || startsWith('aria-', selector.name.name)\n break\n }\n case 'PseudoElementSelector':\n case 'TypeSelector': {\n complexity++\n\n // 42 === '*'.charCodeAt(0)\n if (selector.name.charCodeAt(0) === 42 && selector.name.length === 1) {\n break\n }\n\n C++\n break\n }\n case 'PseudoClassSelector': {\n switch (selector.name) {\n case 'before':\n case 'after':\n case 'first-letter':\n case 'first-line': {\n C++\n complexity++\n return this.skip\n }\n\n // The specificity of an :is(), :not(), or :has() pseudo-class is\n // replaced by the specificity of the most specific complex\n // selector in its selector list argument.\n case 'where':\n case 'is':\n case 'has':\n case 'matches':\n case '-webkit-any':\n case '-moz-any':\n case 'not':\n case 'nth-child':\n case 'nth-last-child': {\n // The specificity of an :nth-child() or :nth-last-child() selector\n // is the specificity of the pseudo class itself (counting as one\n // pseudo-class selector) plus the specificity of the most\n // specific complex selector in its selector list argument (if any).\n if (selector.name === 'nth-child' || selector.name === 'nth-last-child') {\n // +1 for the pseudo class itself\n B++\n }\n\n const selectorList = selectorListSpecificities(selector)\n\n // Bail out for empty/non-existent :nth-child() params\n if (selectorList.length === 0) return\n\n // The specificity of a :where() pseudo-class is replaced by zero,\n // but it does count towards complexity.\n if (selector.name !== 'where') {\n const [topA, topB, topC] = selectorList[0].specificity\n A += topA\n B += topB\n C += topC\n }\n\n for (let i = 0; i < selectorList.length; i++) {\n const listItem = selectorList[i]\n if (listItem.isA11y) {\n isA11y = true\n }\n complexity += listItem.complexity\n }\n\n complexity++\n return this.skip\n }\n\n default: {\n // Regular pseudo classes have specificity [0,1,0]\n complexity++\n B++\n return this.skip\n }\n }\n }\n case 'Combinator': {\n complexity++\n break\n }\n }\n })\n\n return {\n /** @type {[number,number,number]} */\n specificity: [A, B, C],\n complexity,\n isId: A > 0,\n isA11y\n }\n}\n\nexport {\n analyzeSpecificity,\n compareSpecificity,\n}","export const colorNames = {\n // CSS Named Colors\n // Spec: https://drafts.csswg.org/css-color/#named-colors\n aliceblue: 1,\n antiquewhite: 1,\n aqua: 1,\n aquamarine: 1,\n azure: 1,\n beige: 1,\n bisque: 1,\n black: 1,\n blanchedalmond: 1,\n blue: 1,\n blueviolet: 1,\n brown: 1,\n burlywood: 1,\n cadetblue: 1,\n chartreuse: 1,\n chocolate: 1,\n coral: 1,\n cornflowerblue: 1,\n cornsilk: 1,\n crimson: 1,\n cyan: 1,\n darkblue: 1,\n darkcyan: 1,\n darkgoldenrod: 1,\n darkgray: 1,\n darkgreen: 1,\n darkgrey: 1,\n darkkhaki: 1,\n darkmagenta: 1,\n darkolivegreen: 1,\n darkorange: 1,\n darkorchid: 1,\n darkred: 1,\n darksalmon: 1,\n darkseagreen: 1,\n darkslateblue: 1,\n darkslategray: 1,\n darkslategrey: 1,\n darkturquoise: 1,\n darkviolet: 1,\n deeppink: 1,\n deepskyblue: 1,\n dimgray: 1,\n dimgrey: 1,\n dodgerblue: 1,\n firebrick: 1,\n floralwhite: 1,\n forestgreen: 1,\n fuchsia: 1,\n gainsboro: 1,\n ghostwhite: 1,\n gold: 1,\n goldenrod: 1,\n gray: 1,\n green: 1,\n greenyellow: 1,\n grey: 1,\n honeydew: 1,\n hotpink: 1,\n indianred: 1,\n indigo: 1,\n ivory: 1,\n khaki: 1,\n lavender: 1,\n lavenderblush: 1,\n lawngreen: 1,\n lemonchiffon: 1,\n lightblue: 1,\n lightcoral: 1,\n lightcyan: 1,\n lightgoldenrodyellow: 1,\n lightgray: 1,\n lightgreen: 1,\n lightgrey: 1,\n lightpink: 1,\n lightsalmon: 1,\n lightseagreen: 1,\n lightskyblue: 1,\n lightslategray: 1,\n lightslategrey: 1,\n lightsteelblue: 1,\n lightyellow: 1,\n lime: 1,\n limegreen: 1,\n linen: 1,\n magenta: 1,\n maroon: 1,\n mediumaquamarine: 1,\n mediumblue: 1,\n mediumorchid: 1,\n mediumpurple: 1,\n mediumseagreen: 1,\n mediumslateblue: 1,\n mediumspringgreen: 1,\n mediumturquoise: 1,\n mediumvioletred: 1,\n midnightblue: 1,\n mintcream: 1,\n mistyrose: 1,\n moccasin: 1,\n navajowhite: 1,\n navy: 1,\n oldlace: 1,\n olive: 1,\n olivedrab: 1,\n orange: 1,\n orangered: 1,\n orchid: 1,\n palegoldenrod: 1,\n palegreen: 1,\n paleturquoise: 1,\n palevioletred: 1,\n papayawhip: 1,\n peachpuff: 1,\n peru: 1,\n pink: 1,\n plum: 1,\n powderblue: 1,\n purple: 1,\n rebeccapurple: 1,\n red: 1,\n rosybrown: 1,\n royalblue: 1,\n saddlebrown: 1,\n salmon: 1,\n sandybrown: 1,\n seagreen: 1,\n seashell: 1,\n sienna: 1,\n silver: 1,\n skyblue: 1,\n slateblue: 1,\n slategray: 1,\n slategrey: 1,\n snow: 1,\n springgreen: 1,\n steelblue: 1,\n tan: 1,\n teal: 1,\n thistle: 1,\n tomato: 1,\n turquoise: 1,\n violet: 1,\n wheat: 1,\n white: 1,\n whitesmoke: 1,\n yellow: 1,\n yellowgreen: 1,\n\n // CSS System Colors\n // Spec: https://drafts.csswg.org/css-color/#css-system-colors\n canvas: 1,\n canvastext: 1,\n linktext: 1,\n visitedtext: 1,\n activetext: 1,\n buttonface: 1,\n buttontext: 1,\n buttonborder: 1,\n field: 1,\n fieldtext: 1,\n highlight: 1,\n highlighttext: 1,\n selecteditem: 1,\n selecteditemtext: 1,\n mark: 1,\n marktext: 1,\n graytext: 1,\n\n // TODO: Deprecated CSS System colors\n // Spec: https://drafts.csswg.org/css-color/#deprecated-system-colors\n}\n\nexport const colorFunctions = {\n rgb: 1,\n rgba: 1,\n hsl: 1,\n hsla: 1,\n hwb: 1,\n lab: 1,\n lch: 1,\n oklab: 1,\n oklch: 1,\n color: 1,\n}\n","class CountableCollection {\n /**\n * @param {string[]} initial\n */\n constructor(initial) {\n /** @type [index: string]: string */\n this.items = {}\n /** @type number */\n this.total = 0\n /** @type number */\n this.totalUnique = 0\n\n if (initial) {\n for (let index = 0; index < initial.length; index++) {\n this.push(initial[index])\n }\n }\n }\n\n /**\n * Push an item to the end of this collection\n * @param {string} item\n * @returns {void}\n */\n push(item) {\n this.total++\n\n if (this.items[item]) {\n this.items[item]++\n return\n }\n\n this.items[item] = 1\n this.totalUnique++\n }\n\n /**\n * Get the size of this collection\n * @returns {number} the size of this collection\n */\n size() {\n return this.total\n }\n\n /**\n * Get the counts of this collection, like total, uniques, etc.\n */\n count() {\n return {\n total: this.total,\n totalUnique: this.totalUnique,\n unique: this.items,\n uniquenessRatio: this.total === 0 ? 0 : this.totalUnique / this.total,\n }\n }\n}\n\nexport {\n CountableCollection\n}","import walk from 'css-tree/walker'\nimport { CountableCollection } from '../countable-collection.js'\n\nconst systemKeywords = {\n // Global CSS keywords\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n\n // System font keywords\n 'caption': 1,\n 'icon': 1,\n 'menu': 1,\n 'message-box': 1,\n 'small-caption': 1,\n 'status-bar': 1,\n}\n\nconst keywordDisallowList = {\n // font-weight, font-stretch, font-style\n 'normal': 1,\n\n // font-size keywords\n 'xx-small': 1,\n 'x-small': 1,\n 'small': 1,\n 'medium': 1,\n 'large': 1,\n 'x-large': 1,\n 'xx-large': 1,\n 'larger': 1,\n 'smaller': 1,\n\n // font-weight keywords\n 'bold': 1,\n 'bolder': 1,\n 'lighter': 1,\n\n // font-stretch keywords\n 'ultra-condensed': 1,\n 'extra-condensed': 1,\n 'condensed': 1,\n 'semi-condensed': 1,\n 'semi-expanded': 1,\n 'expanded': 1,\n 'extra-expanded': 1,\n 'ultra-expanded': 1,\n\n // font-style keywords\n 'italic': 1,\n 'oblique': 1,\n}\n\nconst COMMA = 44 // ','.charCodeAt(0) === 44\n\nconst analyzeFontFamilies = ({ fontValues, fontFamilyValues, stringifyNode }) => {\n const all = new CountableCollection(fontFamilyValues)\n\n for (let index = 0; index < fontValues.length; index++) {\n const value = fontValues[index]\n\n // Avoid tree traversal as soon as possible\n const firstChild = value.children.first\n\n if (firstChild.type === 'Identifier' && systemKeywords[firstChild.name]) {\n continue\n }\n\n let parts = ''\n\n walk(value, {\n reverse: true,\n enter: function (fontNode) {\n if (fontNode.type === 'String') {\n const loc = fontNode.loc.start\n // Stringify the first character to get the correct quote character\n const quote = stringifyNode({\n loc: {\n start: {\n line: loc.line,\n column: loc.column\n },\n end: {\n line: loc.line,\n column: loc.column + 1\n }\n }\n })\n return parts = quote + fontNode.value + quote + parts\n }\n if (fontNode.type === 'Operator' && fontNode.value.charCodeAt(0) === COMMA) {\n return parts = fontNode.value + parts\n }\n if (fontNode.type === 'Identifier') {\n if (keywordDisallowList[fontNode.name]) {\n return this.skip\n }\n return parts = fontNode.name + parts\n }\n }\n })\n\n all.push(parts)\n }\n\n return all.count()\n}\n\nexport {\n analyzeFontFamilies\n}","import walk from 'css-tree/walker'\nimport { CountableCollection } from '../countable-collection.js'\n\nconst sizeKeywords = {\n 'xx-small': 1,\n 'x-small': 1,\n 'small': 1,\n 'medium': 1,\n 'large': 1,\n 'x-large': 1,\n 'xx-large': 1,\n 'larger': 1,\n 'smaller': 1,\n}\n\nconst keywords = {\n // Global CSS keywords\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n\n // System font keywords\n 'caption': 1,\n 'icon': 1,\n 'menu': 1,\n 'message-box': 1,\n 'small-caption': 1,\n 'status-bar': 1,\n}\n\nconst ZERO = 48 // '0'.charCodeAt(0) === 48\nconst SLASH = 47 // '/'.charCodeAt(0) === 47\n\nconst analyzeFontSizes = ({ stringifyNode, fontSizeValues, fontValues }) => {\n const all = new CountableCollection(fontSizeValues)\n\n for (let index = 0; index < fontValues.length; index++) {\n const fontNode = fontValues[index];\n // Try to eliminate a keyword before we continue\n const firstChild = fontNode.children.first\n\n if (firstChild.type === 'Identifier' && keywords[firstChild.name]) {\n continue\n }\n\n let operator = false\n let size\n\n walk(fontNode, function (fontNode) {\n switch (fontNode.type) {\n case 'Number': {\n // Special case for `font: 0/0 a`\n if (fontNode.value.charCodeAt(0) === ZERO) {\n size = '0'\n return this.break\n }\n }\n case 'Operator': {\n if (fontNode.value.charCodeAt(0) === SLASH) {\n operator = true\n }\n break\n }\n case 'Dimension': {\n if (!operator) {\n size = stringifyNode(fontNode)\n return this.break\n }\n }\n case 'Identifier': {\n if (sizeKeywords[fontNode.name]) {\n size = fontNode.name\n return this.break\n }\n }\n }\n })\n\n if (size) {\n all.push(size)\n }\n }\n\n return all.count()\n}\n\nexport {\n analyzeFontSizes\n}","import { CountableCollection } from '../countable-collection.js'\n\nconst keywords = {\n 'auto': 1,\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n 'none': 1, // for `text-shadow` and `box-shadow`\n}\n\nconst analyzeValues = ({ values, stringifyNode }) => {\n const all = new CountableCollection()\n\n for (let i = 0; i < values.length; i++) {\n const node = values[i]\n const firstChild = node.children.first\n\n if (!firstChild) continue\n if (firstChild.type === 'Identifier' && keywords[firstChild.name]) continue\n\n all.push(stringifyNode(node))\n }\n\n return all.count()\n}\n\nexport {\n analyzeValues\n}","import { CountableCollection } from '../countable-collection.js'\n\nconst timingKeywords = {\n 'linear': 1,\n 'ease': 1,\n 'ease-in': 1,\n 'ease-out': 1,\n 'ease-in-out': 1,\n 'step-start': 1,\n 'step-end': 1,\n}\n\nconst analyzeAnimations = ({ animations, durations, timingFunctions, stringifyNode }) => {\n const allDurations = new CountableCollection(durations)\n const allTimingFunctions = new CountableCollection(timingFunctions)\n\n for (let index = 0; index < animations.length; index++) {\n // Flag to know if we've grabbed the first Duration\n // yet (the first Dimension in a shorthand)\n let durationFound = false\n\n animations[index].forEach(child => {\n // Right after a ',' we start over again\n if (child.type === 'Operator') {\n return durationFound = false\n }\n if (child.type === 'Dimension' && durationFound === false) {\n durationFound = true\n return allDurations.push(stringifyNode(child))\n }\n if (child.type === 'Identifier' && timingKeywords[child.name]) {\n return allTimingFunctions.push(stringifyNode(child))\n }\n if (child.type === 'Function'\n && (\n child.name === 'cubic-bezier' || child.name === 'steps'\n )\n ) {\n return allTimingFunctions.push(stringifyNode(child))\n }\n })\n }\n\n return {\n durations: allDurations.count(),\n timingFunctions: allTimingFunctions.count(),\n }\n}\n\nexport {\n analyzeAnimations\n}","const HYPHENMINUS = 45; // '-'.charCodeAt()\n\n/**\n * @param {string} keyword\n * @returns {boolean}\n */\nfunction hasVendorPrefix(keyword) {\n if (keyword.charCodeAt(0) === HYPHENMINUS && keyword.charCodeAt(1) !== HYPHENMINUS) {\n // String must have a 2nd occurrence of '-', at least at position 3 (offset=2)\n if (keyword.indexOf('-', 2) !== -1) {\n return true\n }\n }\n\n return false\n}\n\nexport {\n hasVendorPrefix\n}","import { CountableCollection } from '../countable-collection.js'\nimport { hasVendorPrefix } from '../vendor-prefix.js'\n\nfunction isAstVendorPrefixed(children) {\n children = children.toArray()\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index];\n\n if (child.type === 'Identifier' && child.name.length >= 3) {\n if (hasVendorPrefix(child.name)) {\n return true\n }\n }\n\n if (child.type === 'Function') {\n if (hasVendorPrefix(child.name)) {\n return true\n }\n\n if (child.children && isAstVendorPrefixed(child.children)) {\n return true\n }\n }\n }\n return false\n}\n\nconst analyzeVendorPrefixes = ({ values, stringifyNode }) => {\n const all = new CountableCollection()\n\n for (let i = 0; i < values.length; i++) {\n /** @type {import('css-tree').Value} */\n const value = values[i]\n\n if (value.children && isAstVendorPrefixed(value.children)) {\n all.push(stringifyNode(value))\n }\n }\n\n return all.count()\n}\n\nexport {\n analyzeVendorPrefixes\n}","import { CountableCollection } from '../countable-collection.js'\nimport { hasVendorPrefix } from '../vendor-prefix.js'\nimport { endsWith } from '../string-utils.js'\n\nconst analyzeAtRules = ({ atrules, stringifyNode }) => {\n /** @type {{[index: string]: string}[]} */\n const fontfaces = []\n const layers = new CountableCollection()\n const imports = new CountableCollection()\n const medias = new CountableCollection()\n const charsets = new CountableCollection()\n const supports = new CountableCollection()\n const keyframes = new CountableCollection()\n const prefixedKeyframes = new CountableCollection()\n const containers = new CountableCollection()\n\n const machine = {\n 'font-face': (node) => {\n /** @type {[index: string]: string} */\n const descriptors = {}\n\n node.block.children.forEach(\n /** @param {import('css-tree').Declaration} descriptor */\n descriptor => (descriptors[descriptor.property] = stringifyNode(descriptor.value))\n )\n\n fontfaces.push(descriptors)\n },\n 'media': node => medias.push(node.prelude),\n 'supports': node => supports.push(node.prelude),\n 'keyframes': node => keyframes.push(`@${node.name} ${node.prelude}`),\n 'import': node => imports.push(node.prelude),\n 'charset': node => charsets.push(node.prelude),\n 'container': node => containers.push(node.prelude),\n 'layer': node => {\n node.prelude.trim()\n .split(',')\n .map(name => name.trim())\n .forEach(name => layers.push(name))\n },\n }\n\n for (let i = 0; i < atrules.length; i++) {\n /** @type {import('css-tree').Atrule} */\n const node = atrules[i]\n const atRuleName = node.name\n const action = machine[atRuleName]\n if (action) {\n action(node)\n continue\n }\n\n if (endsWith('keyframes', atRuleName)) {\n const name = `@${atRuleName} ${node.prelude}`\n keyframes.push(name)\n\n if (hasVendorPrefix(atRuleName)) {\n prefixedKeyframes.push(name)\n }\n continue\n }\n }\n\n return {\n fontface: {\n total: fontfaces.length,\n totalUnique: fontfaces.length,\n unique: fontfaces,\n uniquenessRatio: fontfaces.length === 0 ? 0 : 1\n },\n import: imports.count(),\n media: medias.count(),\n charset: charsets.count(),\n supports: supports.count(),\n keyframes: {\n ...keyframes.count(),\n prefixed: {\n ...prefixedKeyframes.count(),\n ratio: keyframes.size() === 0 ? 0 : prefixedKeyframes.size() / keyframes.size()\n }\n },\n container: containers.count(),\n layer: layers.count(),\n }\n}\n\nexport {\n analyzeAtRules\n}","import { CountableCollection } from './countable-collection.js'\n\nclass ContextCollection {\n constructor() {\n this.list = new CountableCollection()\n /** @type {[index; string]: CountableCollection} */\n this.contexts = {}\n }\n\n /**\n * Add an item to this list's context\n * @param {string} item Item to push\n * @param {string} context Context to push Item to\n */\n push(item, context) {\n this.list.push(item)\n\n if (!this.contexts[context]) {\n this.contexts[context] = new CountableCollection()\n }\n\n this.contexts[context].push(item)\n }\n\n count() {\n /** @type {[index: string]: string} */\n const itemsPerContext = {}\n\n for (let context in this.contexts) {\n itemsPerContext[context] = this.contexts[context].count()\n }\n\n return Object.assign(this.list.count(), {\n itemsPerContext\n })\n }\n}\n\nexport {\n ContextCollection\n}","/**\n * Find the mode (most occurring value) in an array of Numbers\n * Takes the mean/average of multiple values if multiple values occur the same amount of times.\n *\n * @see https://github.com/angus-c/just/blob/684af9ca0c7808bc78543ec89379b1fdfce502b1/packages/array-mode/index.js\n * @param {Array} arr - Array to find the mode value for\n * @returns {Number} mode - The `mode` value of `arr`\n */\nfunction Mode(arr) {\n const frequencies = Object.create(null)\n let maxOccurrences = -1\n let maxOccurenceCount = 0\n let sum = 0\n\n for (let i = 0; i < arr.length; i++) {\n const element = arr[i]\n const updatedCount = (frequencies[element] || 0) + 1\n frequencies[element] = updatedCount\n\n if (updatedCount > maxOccurrences) {\n maxOccurrences = updatedCount\n maxOccurenceCount = 0\n sum = 0\n }\n\n if (updatedCount >= maxOccurrences) {\n maxOccurenceCount++\n sum += element\n }\n }\n\n return sum / maxOccurenceCount\n}\n\n/**\n * Find the middle number in an Array of Numbers\n * Returns the average of 2 numbers if the Array length is an even number\n * @see https://github.com/angus-c/just/blob/684af9ca0c7808bc78543ec89379b1fdfce502b1/packages/array-median/index.js\n * @param {Array} arr - A sorted Array\n * @returns {Number} - The array's Median\n */\nfunction Median(arr) {\n const middle = arr.length / 2\n const lowerMiddleRank = Math.floor(middle)\n\n if (middle !== lowerMiddleRank) {\n return arr[lowerMiddleRank]\n }\n return (arr[lowerMiddleRank] + arr[lowerMiddleRank - 1]) / 2\n}\n\nclass AggregateCollection {\n constructor() {\n /** @type number[] */\n this.items = []\n }\n\n /**\n * Add a new Integer at the end of this AggregateCollection\n * @param {number} item - The item to add\n */\n add(item) {\n this.items.push(item)\n }\n\n aggregate() {\n if (this.items.length === 0) {\n return {\n min: 0,\n max: 0,\n mean: 0,\n mode: 0,\n median: 0,\n range: 0,\n sum: 0,\n }\n }\n\n /** @type Number[] */\n const sorted = this.items.slice().sort((a, b) => a - b)\n const min = sorted[0]\n const max = sorted[sorted.length - 1]\n\n const sum = this.items.reduce((total, num) => (total += num))\n const mode = Mode(this.items)\n const median = Median(sorted)\n\n return {\n min,\n max,\n mean: sum / this.items.length,\n mode,\n median,\n range: max - min,\n sum,\n }\n }\n\n /**\n * @returns {number[]} All items in this collection\n */\n toArray() {\n return this.items\n }\n}\n\nexport {\n AggregateCollection\n}","import { hasVendorPrefix } from '../vendor-prefix.js'\nimport { endsWith } from '../string-utils.js'\n\n/**\n * @param {string} property\n * @see https://github.com/csstree/csstree/blob/master/lib/utils/names.js#L69\n */\nexport function isHack(property) {\n if (isCustom(property) || hasVendorPrefix(property)) return false\n\n let code = property.charCodeAt(0)\n\n return code === 47 // /\n || code === 95 // _\n || code === 43 // +\n || code === 42 // *\n || code === 38 // &\n || code === 36 // $\n || code === 35 // #\n}\n\nexport function isCustom(property) {\n if (property.length < 3) return false\n // 45 === '-'.charCodeAt(0)\n return property.charCodeAt(0) === 45 && property.charCodeAt(1) === 45\n}\n\nexport function isProperty(basename, property) {\n if (isCustom(property)) return false\n return endsWith(basename, property)\n}","import parse from 'css-tree/parser'\nimport walk from 'css-tree/walker'\nimport { analyzeRule } from './rules/rules.js'\nimport { analyzeSpecificity, compareSpecificity } from './selectors/specificity.js'\nimport { colorFunctions, colorNames } from './values/colors.js'\nimport { analyzeFontFamilies } from './values/font-families.js'\nimport { analyzeFontSizes } from './values/font-sizes.js'\nimport { analyzeValues } from './values/values.js'\nimport { analyzeAnimations } from './values/animations.js'\nimport { analyzeVendorPrefixes } from './values/vendor-prefix.js'\nimport { analyzeAtRules } from './atrules/atrules.js'\nimport { ContextCollection } from './context-collection.js'\nimport { CountableCollection } from './countable-collection.js'\nimport { AggregateCollection } from './aggregate-collection.js'\nimport { strEquals, startsWith, endsWith } from './string-utils.js'\nimport { hasVendorPrefix } from './vendor-prefix.js'\nimport { isCustom, isHack, isProperty } from './properties/property-utils.js'\n\n/**\n * Analyze CSS\n * @param {string} css\n */\nconst analyze = (css) => {\n const start = new Date()\n\n // We need all lines later on when we need to stringify the AST again\n // e.g. for Selectors\n const lines = css.split(/\\r?\\n/)\n\n /**\n * Recreate the authored CSS from a CSSTree node\n * @param {import('css-tree').CssNode} node - Node from CSSTree AST to stringify\n * @returns {string} str - The stringified node\n */\n function stringifyNode(node) {\n const start = node.loc.start\n const end = node.loc.end\n const lineCount = end.line - start.line\n\n // Single-line nodes\n if (lineCount === 0) {\n return lines[start.line - 1].substring(start.column - 1, end.column - 1)\n }\n\n // Multi-line nodes\n let value = ''\n\n for (let i = start.line; i <= end.line; i++) {\n const line = lines[i - 1]\n // First line\n if (i === start.line) {\n value += line.substring(start.column - 1) + '\\n'\n continue\n }\n // Last line\n if (i === end.line) {\n value += line.substring(0, end.column - 1)\n continue\n }\n // All lines in between first and last\n value += line + '\\n'\n }\n\n return value\n }\n\n const startParse = new Date()\n let totalComments = 0\n let commentsSize = 0\n\n const ast = parse(css, {\n parseAtrulePrelude: false,\n parseCustomProperty: true, // To find font-families, colors, etc.\n positions: true, // So we can use stringifyNode()\n onComment: function (comment) {\n totalComments++\n commentsSize += comment.length\n },\n })\n\n const startAnalysis = new Date()\n const embeds = new CountableCollection()\n const atrules = []\n\n let totalRules = 0\n let emptyRules = 0\n const selectorsPerRule = new AggregateCollection()\n const declarationsPerRule = new AggregateCollection()\n\n const keyframeSelectors = new CountableCollection()\n const declarationsCache = Object.create(null)\n let totalDeclarations = 0\n let importantDeclarations = 0\n let importantsInKeyframes = 0\n\n const properties = new CountableCollection()\n const propertyHacks = new CountableCollection()\n const propertyVendorPrefixes = new CountableCollection()\n const customProperties = new CountableCollection()\n\n const values = []\n const zindex = []\n const textShadows = []\n const boxShadows = []\n const fontValues = []\n const fontFamilyValues = []\n const fontSizeValues = []\n const animations = []\n const timingFunctions = []\n const durations = []\n const colors = new ContextCollection()\n const units = new ContextCollection()\n\n // SELECTORS\n /** @type number */\n const selectorCounts = Object.create(null)\n /** @type [number,number,number] */\n let maxSpecificity\n /** @type [number,number,number] */\n let minSpecificity\n let specificityA = new AggregateCollection()\n let specificityB = new AggregateCollection()\n let specificityC = new AggregateCollection()\n const complexityAggregator = new AggregateCollection()\n /** @type [number,number,number][] */\n const specificities = []\n /** @type number[] */\n const complexities = []\n const ids = new CountableCollection()\n const a11y = new CountableCollection()\n\n walk(ast, function (node) {\n switch (node.type) {\n case 'Atrule': {\n atrules.push({\n name: node.name,\n prelude: node.prelude && node.prelude.value,\n block: strEquals('font-face', node.name) && node.block,\n })\n break\n }\n case 'Rule': {\n const [numSelectors, numDeclarations] = analyzeRule(node)\n\n totalRules++\n\n if (numDeclarations === 0) {\n emptyRules++\n }\n\n selectorsPerRule.add(numSelectors)\n declarationsPerRule.add(numDeclarations)\n break\n }\n case 'Selector': {\n const selector = stringifyNode(node)\n\n if (this.atrule && endsWith('keyframes', this.atrule.name)) {\n keyframeSelectors.push(selector)\n return this.skip\n }\n\n const { specificity, complexity, isId, isA11y } = analyzeSpecificity(node)\n\n if (isId) {\n ids.push(selector)\n }\n\n if (isA11y) {\n a11y.push(selector)\n }\n\n if (selectorCounts[selector]) {\n selectorCounts[selector]++\n } else {\n selectorCounts[selector] = 1\n }\n\n complexityAggregator.add(complexity)\n\n if (maxSpecificity === undefined) {\n maxSpecificity = specificity\n }\n\n if (minSpecificity === undefined) {\n minSpecificity = specificity\n }\n\n specificityA.add(specificity[0])\n specificityB.add(specificity[1])\n specificityC.add(specificity[2])\n\n if (minSpecificity !== undefined && compareSpecificity(minSpecificity, specificity) < 0) {\n minSpecificity = specificity\n }\n\n if (maxSpecificity !== undefined && compareSpecificity(maxSpecificity, specificity) > 0) {\n maxSpecificity = specificity\n }\n\n specificities.push(specificity)\n complexities.push(complexity)\n\n // Avoid deeper walking of selectors to not mess with\n // our specificity calculations in case of a selector\n // with :where() or :is() that contain SelectorLists\n // as children\n return this.skip\n }\n case 'Dimension': {\n if (!this.declaration) {\n break\n }\n\n units.push(node.unit, this.declaration.property)\n\n return this.skip\n }\n case 'Url': {\n if (startsWith('data:', node.value)) {\n embeds.push(node.value)\n }\n break\n }\n case 'Declaration': {\n totalDeclarations++\n\n const declaration = stringifyNode(node)\n if (declarationsCache[declaration]) {\n declarationsCache[declaration]++\n } else {\n declarationsCache[declaration] = 1\n }\n\n if (node.important) {\n importantDeclarations++\n\n if (this.atrule && endsWith('keyframes', this.atrule.name)) {\n importantsInKeyframes++\n }\n }\n\n const { value, property } = node\n\n properties.push(property)\n values.push(value)\n\n if (hasVendorPrefix(property)) {\n propertyVendorPrefixes.push(property)\n } else if (isHack(property)) {\n propertyHacks.push(property)\n } else if (isCustom(property)) {\n customProperties.push(property)\n }\n\n // Process properties first that don't have colors,\n // so we can avoid further walking them;\n if (isProperty('z-index', property)) {\n zindex.push(value)\n return this.skip\n } else if (isProperty('font', property)) {\n fontValues.push(value)\n break\n } else if (isProperty('font-size', property)) {\n fontSizeValues.push(stringifyNode(value))\n break\n } else if (isProperty('font-family', property)) {\n fontFamilyValues.push(stringifyNode(value))\n break\n } else if (isProperty('transition', property) || isProperty('animation', property)) {\n animations.push(value.children)\n break\n } else if (isProperty('animation-duration', property) || isProperty('transition-duration', property)) {\n durations.push(stringifyNode(value))\n break\n } else if (isProperty('transition-timing-function', property) || isProperty('animation-timing-function', property)) {\n timingFunctions.push(stringifyNode(value))\n break\n } else if (isProperty('text-shadow', property)) {\n textShadows.push(value)\n // no break here: potentially contains colors\n } else if (isProperty('box-shadow', property)) {\n boxShadows.push(value)\n // no break here: potentially contains colors\n }\n\n walk(value, function (valueNode) {\n switch (valueNode.type) {\n case 'Hash': {\n colors.push('#' + valueNode.value, property)\n\n return this.skip\n }\n case 'Identifier': {\n const { name } = valueNode\n // Bail out if it can't be a color name\n // 20 === 'lightgoldenrodyellow'.length\n // 3 === 'red'.length\n if (name.length > 20 || name.length < 3) {\n return this.skip\n }\n if (colorNames[name.toLowerCase()]) {\n colors.push(stringifyNode(valueNode), property)\n }\n return this.skip\n }\n case 'Function': {\n if (colorFunctions[valueNode.name.toLowerCase()]) {\n colors.push(stringifyNode(valueNode), property)\n }\n // No this.skip here intentionally,\n // otherwise we'll miss colors in linear-gradient() etc.\n }\n }\n })\n }\n }\n })\n\n const embeddedContent = embeds.count()\n const embedSize = Object.keys(embeddedContent.unique).join('').length\n\n const totalUniqueDeclarations = Object.keys(declarationsCache).length\n\n const totalSelectors = complexities.length\n const aggregatesA = specificityA.aggregate()\n const aggregatesB = specificityB.aggregate()\n const aggregatesC = specificityC.aggregate()\n const complexityCount = new CountableCollection(complexities).count()\n const totalUniqueSelectors = Object.values(selectorCounts).length\n\n return {\n stylesheet: {\n sourceLinesOfCode: atrules.length + totalSelectors + totalDeclarations + keyframeSelectors.size(),\n linesOfCode: lines.length,\n size: css.length,\n comments: {\n total: totalComments,\n size: commentsSize,\n },\n embeddedContent: Object.assign(embeddedContent, {\n size: {\n total: embedSize,\n ratio: css.length === 0 ? 0 : embedSize / css.length,\n },\n }),\n },\n atrules: analyzeAtRules({ atrules, stringifyNode }),\n rules: {\n total: totalRules,\n empty: {\n total: emptyRules,\n ratio: totalRules === 0 ? 0 : emptyRules / totalRules\n },\n selectors: {\n ...selectorsPerRule.aggregate(),\n items: selectorsPerRule.toArray(),\n },\n declarations: {\n ...declarationsPerRule.aggregate(),\n items: declarationsPerRule.toArray()\n },\n },\n selectors: {\n total: totalSelectors,\n totalUnique: totalUniqueSelectors,\n uniquenessRatio: totalSelectors === 0 ? 0 : totalUniqueSelectors / totalSelectors,\n specificity: {\n min: minSpecificity === undefined ? [0, 0, 0] : minSpecificity,\n max: maxSpecificity === undefined ? [0, 0, 0] : maxSpecificity,\n sum: [aggregatesA.sum, aggregatesB.sum, aggregatesC.sum],\n mean: [aggregatesA.mean, aggregatesB.mean, aggregatesC.mean],\n mode: [aggregatesA.mode, aggregatesB.mode, aggregatesC.mode],\n median: [aggregatesA.median, aggregatesB.median, aggregatesC.median],\n items: specificities\n },\n complexity: {\n ...complexityAggregator.aggregate(),\n ...complexityCount,\n items: complexities,\n },\n id: {\n ...ids.count(),\n ratio: totalSelectors === 0 ? 0 : ids.size() / totalSelectors,\n },\n accessibility: {\n ...a11y.count(),\n ratio: totalSelectors === 0 ? 0 : a11y.size() / totalSelectors,\n },\n keyframes: keyframeSelectors.count(),\n },\n declarations: {\n total: totalDeclarations,\n unique: {\n total: totalUniqueDeclarations,\n ratio: totalDeclarations === 0 ? 0 : totalUniqueDeclarations / totalDeclarations,\n },\n importants: {\n total: importantDeclarations,\n ratio: totalDeclarations === 0 ? 0 : importantDeclarations / totalDeclarations,\n inKeyframes: {\n total: importantsInKeyframes,\n ratio: importantDeclarations === 0 ? 0 : importantsInKeyframes / importantDeclarations,\n },\n },\n },\n properties: {\n ...properties.count(),\n prefixed: {\n ...propertyVendorPrefixes.count(),\n ratio: properties.size() === 0 ? 0 : propertyVendorPrefixes.size() / properties.size(),\n },\n custom: {\n ...customProperties.count(),\n ratio: properties.size() === 0 ? 0 : customProperties.size() / properties.size(),\n },\n browserhacks: {\n ...propertyHacks.count(),\n ratio: properties.size() === 0 ? 0 : propertyHacks.size() / properties.size(),\n }\n },\n values: {\n colors: colors.count(),\n fontFamilies: analyzeFontFamilies({ stringifyNode, fontValues, fontFamilyValues }),\n fontSizes: analyzeFontSizes({ stringifyNode, fontValues, fontSizeValues }),\n zindexes: analyzeValues({ values: zindex, stringifyNode }),\n textShadows: analyzeValues({ values: textShadows, stringifyNode }),\n boxShadows: analyzeValues({ values: boxShadows, stringifyNode }),\n animations: analyzeAnimations({ animations, timingFunctions, durations, stringifyNode }),\n prefixes: analyzeVendorPrefixes({ values, stringifyNode }),\n units: units.count(),\n },\n __meta__: {\n parseTime: startAnalysis - startParse,\n analyzeTime: new Date() - startAnalysis,\n total: new Date() - start\n }\n }\n}\n\nexport {\n analyze,\n compareSpecificity,\n}\n","import walk from 'css-tree/walker'\n\nconst analyzeRule = function (ruleNode) {\n let numSelectors = 0\n let numDeclarations = 0\n\n walk(ruleNode, function (childNode) {\n if (childNode.type === 'Selector') {\n numSelectors++\n return this.skip\n }\n\n if (childNode.type === 'Declaration') {\n numDeclarations++\n return this.skip\n }\n })\n\n return [numSelectors, numDeclarations]\n}\n\nexport {\n analyzeRule,\n}"],"names":["compareChar","referenceCode","testCode","strEquals","base","test","length","i","charCodeAt","endsWith","offset","startsWith","compareSpecificity","a","b","analyzeSpecificity","node","A","B","C","complexity","isA11y","walk","selector","type","Boolean","value","name","skip","selectorList","childSelectors","visit","enter","push","sort","specificity","listItem","isId","colorNames","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","canvas","canvastext","linktext","visitedtext","activetext","buttonface","buttontext","buttonborder","field","fieldtext","highlight","highlighttext","selecteditem","selecteditemtext","mark","marktext","graytext","colorFunctions","rgb","rgba","hsl","hsla","hwb","lab","lch","oklab","oklch","color","CountableCollection","initial","this","items","total","totalUnique","index","item","size","count","unique","uniquenessRatio","systemKeywords","inherit","unset","revert","caption","icon","menu","keywordDisallowList","normal","small","medium","large","larger","smaller","bold","bolder","lighter","condensed","expanded","italic","oblique","analyzeFontFamilies","fontValues","stringifyNode","all","fontFamilyValues","firstChild","children","first","parts","reverse","fontNode","loc","start","quote","line","column","end","sizeKeywords","keywords","analyzeFontSizes","fontSizeValues","operator","auto","none","analyzeValues","values","timingKeywords","linear","ease","analyzeAnimations","animations","timingFunctions","allDurations","durations","allTimingFunctions","durationFound","forEach","child","hasVendorPrefix","keyword","indexOf","isAstVendorPrefixed","toArray","analyzeVendorPrefixes","analyzeAtRules","atrules","fontfaces","layers","imports","medias","charsets","supports","keyframes","prefixedKeyframes","containers","machine","descriptors","block","descriptor","property","media","prelude","import","charset","container","layer","trim","split","map","atRuleName","action","fontface","prefixed","ratio","ContextCollection","list","contexts","context","itemsPerContext","Object","assign","AggregateCollection","add","aggregate","min","max","mean","mode","median","range","sum","arr","middle","lowerMiddleRank","sorted","slice","reduce","num","frequencies","create","maxOccurrences","maxOccurenceCount","element","updatedCount","Mode","Math","floor","isCustom","isProperty","basename","css","Date","lines","substring","maxSpecificity","minSpecificity","startParse","totalComments","commentsSize","ast","parse","parseAtrulePrelude","parseCustomProperty","positions","onComment","comment","startAnalysis","embeds","totalRules","emptyRules","selectorsPerRule","declarationsPerRule","keyframeSelectors","declarationsCache","totalDeclarations","importantDeclarations","importantsInKeyframes","properties","propertyHacks","propertyVendorPrefixes","customProperties","zindex","textShadows","boxShadows","colors","units","selectorCounts","specificityA","specificityB","specificityC","complexityAggregator","specificities","complexities","ids","a11y","ruleNode","numSelectors","numDeclarations","childNode","analyzeRule","atrule","undefined","declaration","unit","important","code","isHack","valueNode","toLowerCase","embeddedContent","embedSize","keys","join","totalUniqueDeclarations","totalSelectors","aggregatesA","aggregatesB","aggregatesC","complexityCount","totalUniqueSelectors","stylesheet","sourceLinesOfCode","linesOfCode","comments","rules","empty","selectors","declarations","id","accessibility","importants","inKeyframes","custom","browserhacks","fontFamilies","fontSizes","zindexes","prefixes","__meta__","parseTime","analyzeTime"],"mappings":"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"}
1
+ {"version":3,"file":"analyzer.cjs","sources":["../src/string-utils.js","../src/selectors/specificity.js","../src/values/colors.js","../src/countable-collection.js","../src/values/font-families.js","../src/values/font-sizes.js","../src/values/values.js","../src/values/animations.js","../src/vendor-prefix.js","../src/values/vendor-prefix.js","../src/atrules/atrules.js","../src/context-collection.js","../src/aggregate-collection.js","../src/properties/property-utils.js","../src/occurrence-counter.js","../src/index.js","../src/rules/rules.js"],"sourcesContent":["/**\n * Case-insensitive compare two character codes\n * @param {string} charA\n * @param {string} charB\n * @see https://github.com/csstree/csstree/blob/41f276e8862d8223eeaa01a3d113ab70bb13d2d9/lib/tokenizer/utils.js#L22\n */\nfunction compareChar(referenceCode, testCode) {\n // if uppercase\n if (testCode >= 0x0041 && testCode <= 0x005A) {\n // shifting the 6th bit makes a letter lowercase\n testCode = testCode | 32\n }\n return referenceCode === testCode\n}\n\n/**\n * Case-insensitive string-comparison\n * @param {string} base\n * @param {string} test\n * @returns {boolean} true if the two strings are the same, false otherwise\n */\nexport function strEquals(base, test) {\n if (base.length !== test.length) return false\n\n for (let i = 0; i < base.length; i++) {\n if (compareChar(base.charCodeAt(i), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Case-insensitive testing whether a string ends with a given substring\n * @param {string} base e.g. '-webkit-transform'\n * @param {string} cmp e.g. 'transform'\n * @returns {boolean} true if `test` ends with `base`, false otherwise\n */\nexport function endsWith(base, test) {\n const offset = test.length - base.length\n\n if (offset < 0) {\n return false\n }\n\n for (let i = test.length - 1; i >= offset; i--) {\n if (compareChar(base.charCodeAt(i - offset), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Case-insensitive testing whether a string starts with a given substring\n * @param {string} base\n * @param {test} test\n * @returns {boolean} true if `test` starts with `base`, false otherwise\n */\nexport function startsWith(base, test) {\n if (test.length < base.length) return false\n\n for (let i = 0; i < base.length; i++) {\n if (compareChar(base.charCodeAt(i), test.charCodeAt(i)) === false) {\n return false\n }\n }\n\n return true\n}\n","import walk from 'css-tree/walker'\nimport { startsWith } from '../string-utils.js'\n\n/**\n * Compare specificity A to Specificity B\n * @param {[number,number,number]} a - Specificity A\n * @param {[number,number,number]} b - Specificity B\n * @returns {number} sortIndex - 0 when a==b, 1 when a<b, -1 when a>b\n */\nfunction compareSpecificity(a, b) {\n if (a[0] === b[0]) {\n if (a[1] === b[1]) {\n return b[2] - a[2]\n }\n\n return b[1] - a[1]\n }\n\n return b[0] - a[0]\n}\n\n/**\n *\n * @param {import('css-tree').SelectorList} selectorListAst\n * @returns {Selector} topSpecificitySelector\n */\nfunction selectorListSpecificities(selectorListAst) {\n const childSelectors = []\n walk(selectorListAst, {\n visit: 'Selector',\n enter(node) {\n childSelectors.push(analyzeSpecificity(node))\n }\n })\n\n return childSelectors.sort((a, b) => compareSpecificity(a.specificity, b.specificity))\n}\n\n/**\n * Get the Specificity for the AST of a Selector Node\n * @param {import('css-tree').Selector} ast - AST Node for a Selector\n * @return {Object}\n * @property {[number,number,number]} specificity\n * @property {number} complexity\n * @property {Boolean} isId\n * @property {Boolean} isA11y\n */\nconst analyzeSpecificity = (node) => {\n let A = 0\n let B = 0\n let C = 0\n let complexity = 0\n let isA11y = false\n\n walk(node, function (selector) {\n switch (selector.type) {\n case 'IdSelector': {\n A++\n complexity++\n break\n }\n case 'ClassSelector': {\n B++\n complexity++\n break\n }\n case 'AttributeSelector': {\n B++\n complexity++\n\n // Add 1 for [attr=value] (or any variation using *= $= ^= |= )\n if (Boolean(selector.value)) {\n complexity++\n }\n\n isA11y = selector.name.name === 'role' || startsWith('aria-', selector.name.name)\n break\n }\n case 'PseudoElementSelector':\n case 'TypeSelector': {\n complexity++\n\n // 42 === '*'.charCodeAt(0)\n if (selector.name.charCodeAt(0) === 42 && selector.name.length === 1) {\n break\n }\n\n C++\n break\n }\n case 'PseudoClassSelector': {\n switch (selector.name) {\n case 'before':\n case 'after':\n case 'first-letter':\n case 'first-line': {\n C++\n complexity++\n return this.skip\n }\n\n // The specificity of an :is(), :not(), or :has() pseudo-class is\n // replaced by the specificity of the most specific complex\n // selector in its selector list argument.\n case 'where':\n case 'is':\n case 'has':\n case 'matches':\n case '-webkit-any':\n case '-moz-any':\n case 'not':\n case 'nth-child':\n case 'nth-last-child': {\n // The specificity of an :nth-child() or :nth-last-child() selector\n // is the specificity of the pseudo class itself (counting as one\n // pseudo-class selector) plus the specificity of the most\n // specific complex selector in its selector list argument (if any).\n if (selector.name === 'nth-child' || selector.name === 'nth-last-child') {\n // +1 for the pseudo class itself\n B++\n }\n\n const selectorList = selectorListSpecificities(selector)\n\n // Bail out for empty/non-existent :nth-child() params\n if (selectorList.length === 0) return\n\n // The specificity of a :where() pseudo-class is replaced by zero,\n // but it does count towards complexity.\n if (selector.name !== 'where') {\n const [topA, topB, topC] = selectorList[0].specificity\n A += topA\n B += topB\n C += topC\n }\n\n for (let i = 0; i < selectorList.length; i++) {\n const listItem = selectorList[i]\n if (listItem.isA11y) {\n isA11y = true\n }\n complexity += listItem.complexity\n }\n\n complexity++\n return this.skip\n }\n\n default: {\n // Regular pseudo classes have specificity [0,1,0]\n complexity++\n B++\n return this.skip\n }\n }\n }\n case 'Combinator': {\n complexity++\n break\n }\n }\n })\n\n return {\n /** @type {[number,number,number]} */\n specificity: [A, B, C],\n complexity,\n isId: A > 0,\n isA11y\n }\n}\n\nexport {\n analyzeSpecificity,\n compareSpecificity,\n}","export const colorNames = {\n // CSS Named Colors\n // Spec: https://drafts.csswg.org/css-color/#named-colors\n aliceblue: 1,\n antiquewhite: 1,\n aqua: 1,\n aquamarine: 1,\n azure: 1,\n beige: 1,\n bisque: 1,\n black: 1,\n blanchedalmond: 1,\n blue: 1,\n blueviolet: 1,\n brown: 1,\n burlywood: 1,\n cadetblue: 1,\n chartreuse: 1,\n chocolate: 1,\n coral: 1,\n cornflowerblue: 1,\n cornsilk: 1,\n crimson: 1,\n cyan: 1,\n darkblue: 1,\n darkcyan: 1,\n darkgoldenrod: 1,\n darkgray: 1,\n darkgreen: 1,\n darkgrey: 1,\n darkkhaki: 1,\n darkmagenta: 1,\n darkolivegreen: 1,\n darkorange: 1,\n darkorchid: 1,\n darkred: 1,\n darksalmon: 1,\n darkseagreen: 1,\n darkslateblue: 1,\n darkslategray: 1,\n darkslategrey: 1,\n darkturquoise: 1,\n darkviolet: 1,\n deeppink: 1,\n deepskyblue: 1,\n dimgray: 1,\n dimgrey: 1,\n dodgerblue: 1,\n firebrick: 1,\n floralwhite: 1,\n forestgreen: 1,\n fuchsia: 1,\n gainsboro: 1,\n ghostwhite: 1,\n gold: 1,\n goldenrod: 1,\n gray: 1,\n green: 1,\n greenyellow: 1,\n grey: 1,\n honeydew: 1,\n hotpink: 1,\n indianred: 1,\n indigo: 1,\n ivory: 1,\n khaki: 1,\n lavender: 1,\n lavenderblush: 1,\n lawngreen: 1,\n lemonchiffon: 1,\n lightblue: 1,\n lightcoral: 1,\n lightcyan: 1,\n lightgoldenrodyellow: 1,\n lightgray: 1,\n lightgreen: 1,\n lightgrey: 1,\n lightpink: 1,\n lightsalmon: 1,\n lightseagreen: 1,\n lightskyblue: 1,\n lightslategray: 1,\n lightslategrey: 1,\n lightsteelblue: 1,\n lightyellow: 1,\n lime: 1,\n limegreen: 1,\n linen: 1,\n magenta: 1,\n maroon: 1,\n mediumaquamarine: 1,\n mediumblue: 1,\n mediumorchid: 1,\n mediumpurple: 1,\n mediumseagreen: 1,\n mediumslateblue: 1,\n mediumspringgreen: 1,\n mediumturquoise: 1,\n mediumvioletred: 1,\n midnightblue: 1,\n mintcream: 1,\n mistyrose: 1,\n moccasin: 1,\n navajowhite: 1,\n navy: 1,\n oldlace: 1,\n olive: 1,\n olivedrab: 1,\n orange: 1,\n orangered: 1,\n orchid: 1,\n palegoldenrod: 1,\n palegreen: 1,\n paleturquoise: 1,\n palevioletred: 1,\n papayawhip: 1,\n peachpuff: 1,\n peru: 1,\n pink: 1,\n plum: 1,\n powderblue: 1,\n purple: 1,\n rebeccapurple: 1,\n red: 1,\n rosybrown: 1,\n royalblue: 1,\n saddlebrown: 1,\n salmon: 1,\n sandybrown: 1,\n seagreen: 1,\n seashell: 1,\n sienna: 1,\n silver: 1,\n skyblue: 1,\n slateblue: 1,\n slategray: 1,\n slategrey: 1,\n snow: 1,\n springgreen: 1,\n steelblue: 1,\n tan: 1,\n teal: 1,\n thistle: 1,\n tomato: 1,\n turquoise: 1,\n violet: 1,\n wheat: 1,\n white: 1,\n whitesmoke: 1,\n yellow: 1,\n yellowgreen: 1,\n\n // CSS System Colors\n // Spec: https://drafts.csswg.org/css-color/#css-system-colors\n canvas: 1,\n canvastext: 1,\n linktext: 1,\n visitedtext: 1,\n activetext: 1,\n buttonface: 1,\n buttontext: 1,\n buttonborder: 1,\n field: 1,\n fieldtext: 1,\n highlight: 1,\n highlighttext: 1,\n selecteditem: 1,\n selecteditemtext: 1,\n mark: 1,\n marktext: 1,\n graytext: 1,\n\n // TODO: Deprecated CSS System colors\n // Spec: https://drafts.csswg.org/css-color/#deprecated-system-colors\n}\n\nexport const colorFunctions = {\n rgb: 1,\n rgba: 1,\n hsl: 1,\n hsla: 1,\n hwb: 1,\n lab: 1,\n lch: 1,\n oklab: 1,\n oklch: 1,\n color: 1,\n}\n","class CountableCollection {\n /**\n * @param {string[]} initial\n */\n constructor(initial) {\n /** @type [index: string]: string */\n this._items = {}\n /** @type number */\n this._total = 0\n /** @type number */\n this._totalUnique = 0\n\n if (initial) {\n for (let i = 0; i < initial.length; i++) {\n this.push(initial[i])\n }\n }\n }\n\n /**\n * Push an item to the end of this collection\n * @param {string} item\n * @returns {void}\n */\n push(item) {\n this._total++\n\n if (this._items[item]) {\n this._items[item]++\n return\n }\n\n this._items[item] = 1\n this._totalUnique++\n }\n\n /**\n * Get the size of this collection\n * @returns {number} the size of this collection\n */\n size() {\n return this._total\n }\n\n /**\n * Get the counts of this collection, like total, uniques, etc.\n */\n count() {\n return {\n total: this._total,\n totalUnique: this._totalUnique,\n unique: this._items,\n uniquenessRatio: this._total === 0 ? 0 : this._totalUnique / this._total,\n }\n }\n}\n\nexport {\n CountableCollection\n}","import walk from 'css-tree/walker'\nimport { CountableCollection } from '../countable-collection.js'\n\nconst systemKeywords = {\n // Global CSS keywords\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n\n // System font keywords\n 'caption': 1,\n 'icon': 1,\n 'menu': 1,\n 'message-box': 1,\n 'small-caption': 1,\n 'status-bar': 1,\n}\n\nconst keywordDisallowList = {\n // font-weight, font-stretch, font-style\n 'normal': 1,\n\n // font-size keywords\n 'xx-small': 1,\n 'x-small': 1,\n 'small': 1,\n 'medium': 1,\n 'large': 1,\n 'x-large': 1,\n 'xx-large': 1,\n 'larger': 1,\n 'smaller': 1,\n\n // font-weight keywords\n 'bold': 1,\n 'bolder': 1,\n 'lighter': 1,\n\n // font-stretch keywords\n 'ultra-condensed': 1,\n 'extra-condensed': 1,\n 'condensed': 1,\n 'semi-condensed': 1,\n 'semi-expanded': 1,\n 'expanded': 1,\n 'extra-expanded': 1,\n 'ultra-expanded': 1,\n\n // font-style keywords\n 'italic': 1,\n 'oblique': 1,\n}\n\nconst COMMA = 44 // ','.charCodeAt(0) === 44\n\nconst analyzeFontFamilies = ({ fontValues, fontFamilyValues, stringifyNode }) => {\n const all = new CountableCollection(fontFamilyValues)\n\n for (let index = 0; index < fontValues.length; index++) {\n const value = fontValues[index]\n\n // Avoid tree traversal as soon as possible\n const firstChild = value.children.first\n\n if (firstChild.type === 'Identifier' && systemKeywords[firstChild.name]) {\n continue\n }\n\n let parts = ''\n\n walk(value, {\n reverse: true,\n enter: function (fontNode) {\n if (fontNode.type === 'String') {\n const loc = fontNode.loc.start\n // Stringify the first character to get the correct quote character\n const quote = stringifyNode({\n loc: {\n start: {\n line: loc.line,\n column: loc.column\n },\n end: {\n line: loc.line,\n column: loc.column + 1\n }\n }\n })\n return parts = quote + fontNode.value + quote + parts\n }\n if (fontNode.type === 'Operator' && fontNode.value.charCodeAt(0) === COMMA) {\n return parts = fontNode.value + parts\n }\n if (fontNode.type === 'Identifier') {\n if (keywordDisallowList[fontNode.name]) {\n return this.skip\n }\n return parts = fontNode.name + parts\n }\n }\n })\n\n all.push(parts)\n }\n\n return all.count()\n}\n\nexport {\n analyzeFontFamilies\n}","import walk from 'css-tree/walker'\nimport { CountableCollection } from '../countable-collection.js'\n\nconst sizeKeywords = {\n 'xx-small': 1,\n 'x-small': 1,\n 'small': 1,\n 'medium': 1,\n 'large': 1,\n 'x-large': 1,\n 'xx-large': 1,\n 'larger': 1,\n 'smaller': 1,\n}\n\nconst keywords = {\n // Global CSS keywords\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n\n // System font keywords\n 'caption': 1,\n 'icon': 1,\n 'menu': 1,\n 'message-box': 1,\n 'small-caption': 1,\n 'status-bar': 1,\n}\n\nconst ZERO = 48 // '0'.charCodeAt(0) === 48\nconst SLASH = 47 // '/'.charCodeAt(0) === 47\n\nconst analyzeFontSizes = ({ stringifyNode, fontSizeValues, fontValues }) => {\n const all = new CountableCollection(fontSizeValues)\n\n for (let index = 0; index < fontValues.length; index++) {\n const fontNode = fontValues[index];\n // Try to eliminate a keyword before we continue\n const firstChild = fontNode.children.first\n\n if (firstChild.type === 'Identifier' && keywords[firstChild.name]) {\n continue\n }\n\n let operator = false\n let size\n\n walk(fontNode, function (fontNode) {\n switch (fontNode.type) {\n case 'Number': {\n // Special case for `font: 0/0 a`\n if (fontNode.value.charCodeAt(0) === ZERO) {\n size = '0'\n return this.break\n }\n }\n case 'Operator': {\n if (fontNode.value.charCodeAt(0) === SLASH) {\n operator = true\n }\n break\n }\n case 'Dimension': {\n if (!operator) {\n size = stringifyNode(fontNode)\n return this.break\n }\n }\n case 'Identifier': {\n if (sizeKeywords[fontNode.name]) {\n size = fontNode.name\n return this.break\n }\n }\n }\n })\n\n if (size) {\n all.push(size)\n }\n }\n\n return all.count()\n}\n\nexport {\n analyzeFontSizes\n}","import { CountableCollection } from '../countable-collection.js'\n\nconst keywords = {\n 'auto': 1,\n 'inherit': 1,\n 'initial': 1,\n 'unset': 1,\n 'revert': 1,\n 'none': 1, // for `text-shadow` and `box-shadow`\n}\n\nconst analyzeValues = ({ values, stringifyNode }) => {\n const all = new CountableCollection()\n\n for (let i = 0; i < values.length; i++) {\n const node = values[i]\n const firstChild = node.children.first\n\n if (!firstChild) continue\n if (firstChild.type === 'Identifier' && keywords[firstChild.name]) continue\n\n all.push(stringifyNode(node))\n }\n\n return all.count()\n}\n\nexport {\n analyzeValues\n}","import { CountableCollection } from '../countable-collection.js'\n\nconst timingKeywords = {\n 'linear': 1,\n 'ease': 1,\n 'ease-in': 1,\n 'ease-out': 1,\n 'ease-in-out': 1,\n 'step-start': 1,\n 'step-end': 1,\n}\n\nconst analyzeAnimations = ({ animations, durations, timingFunctions, stringifyNode }) => {\n const allDurations = new CountableCollection(durations)\n const allTimingFunctions = new CountableCollection(timingFunctions)\n\n for (let index = 0; index < animations.length; index++) {\n // Flag to know if we've grabbed the first Duration\n // yet (the first Dimension in a shorthand)\n let durationFound = false\n\n animations[index].forEach(child => {\n // Right after a ',' we start over again\n if (child.type === 'Operator') {\n return durationFound = false\n }\n if (child.type === 'Dimension' && durationFound === false) {\n durationFound = true\n return allDurations.push(stringifyNode(child))\n }\n if (child.type === 'Identifier' && timingKeywords[child.name]) {\n return allTimingFunctions.push(stringifyNode(child))\n }\n if (child.type === 'Function'\n && (\n child.name === 'cubic-bezier' || child.name === 'steps'\n )\n ) {\n return allTimingFunctions.push(stringifyNode(child))\n }\n })\n }\n\n return {\n durations: allDurations.count(),\n timingFunctions: allTimingFunctions.count(),\n }\n}\n\nexport {\n analyzeAnimations\n}","const HYPHENMINUS = 45; // '-'.charCodeAt()\n\n/**\n * @param {string} keyword\n * @returns {boolean}\n */\nfunction hasVendorPrefix(keyword) {\n if (keyword.charCodeAt(0) === HYPHENMINUS && keyword.charCodeAt(1) !== HYPHENMINUS) {\n // String must have a 2nd occurrence of '-', at least at position 3 (offset=2)\n if (keyword.indexOf('-', 2) !== -1) {\n return true\n }\n }\n\n return false\n}\n\nexport {\n hasVendorPrefix\n}","import { CountableCollection } from '../countable-collection.js'\nimport { hasVendorPrefix } from '../vendor-prefix.js'\n\nfunction isAstVendorPrefixed(children) {\n children = children.toArray()\n\n for (let index = 0; index < children.length; index++) {\n const child = children[index];\n\n if (child.type === 'Identifier' && child.name.length >= 3) {\n if (hasVendorPrefix(child.name)) {\n return true\n }\n }\n\n if (child.type === 'Function') {\n if (hasVendorPrefix(child.name)) {\n return true\n }\n\n if (child.children && isAstVendorPrefixed(child.children)) {\n return true\n }\n }\n }\n return false\n}\n\nconst analyzeVendorPrefixes = ({ values, stringifyNode }) => {\n const all = new CountableCollection()\n\n for (let i = 0; i < values.length; i++) {\n /** @type {import('css-tree').Value} */\n const value = values[i]\n\n if (value.children && isAstVendorPrefixed(value.children)) {\n all.push(stringifyNode(value))\n }\n }\n\n return all.count()\n}\n\nexport {\n analyzeVendorPrefixes\n}","import { CountableCollection } from '../countable-collection.js'\nimport { hasVendorPrefix } from '../vendor-prefix.js'\nimport { endsWith } from '../string-utils.js'\n\nconst analyzeAtRules = ({ atrules, stringifyNode }) => {\n /** @type {{[index: string]: string}[]} */\n const fontfaces = []\n const layers = new CountableCollection()\n const imports = new CountableCollection()\n const medias = new CountableCollection()\n const charsets = new CountableCollection()\n const supports = new CountableCollection()\n const keyframes = new CountableCollection()\n const prefixedKeyframes = new CountableCollection()\n const containers = new CountableCollection()\n\n const machine = {\n 'font-face': (node) => {\n /** @type {[index: string]: string} */\n const descriptors = {}\n\n node.block.children.forEach(\n /** @param {import('css-tree').Declaration} descriptor */\n descriptor => (descriptors[descriptor.property] = stringifyNode(descriptor.value))\n )\n\n fontfaces.push(descriptors)\n },\n 'media': node => medias.push(node.prelude),\n 'supports': node => supports.push(node.prelude),\n 'keyframes': node => keyframes.push(`@${node.name} ${node.prelude}`),\n 'import': node => imports.push(node.prelude),\n 'charset': node => charsets.push(node.prelude),\n 'container': node => containers.push(node.prelude),\n 'layer': node => {\n node.prelude.trim()\n .split(',')\n .map(name => name.trim())\n .forEach(name => layers.push(name))\n },\n }\n\n for (let i = 0; i < atrules.length; i++) {\n /** @type {import('css-tree').Atrule} */\n const node = atrules[i]\n const atRuleName = node.name\n const action = machine[atRuleName]\n if (action) {\n action(node)\n continue\n }\n\n if (endsWith('keyframes', atRuleName)) {\n const name = `@${atRuleName} ${node.prelude}`\n keyframes.push(name)\n\n if (hasVendorPrefix(atRuleName)) {\n prefixedKeyframes.push(name)\n }\n continue\n }\n }\n\n return {\n fontface: {\n total: fontfaces.length,\n totalUnique: fontfaces.length,\n unique: fontfaces,\n uniquenessRatio: fontfaces.length === 0 ? 0 : 1\n },\n import: imports.count(),\n media: medias.count(),\n charset: charsets.count(),\n supports: supports.count(),\n keyframes: Object.assign(\n keyframes.count(), {\n prefixed: Object.assign(\n prefixedKeyframes.count(), {\n ratio: keyframes.size() === 0 ? 0 : prefixedKeyframes.size() / keyframes.size()\n }),\n }),\n container: containers.count(),\n layer: layers.count(),\n }\n}\n\nexport {\n analyzeAtRules\n}","import { CountableCollection } from './countable-collection.js'\n\nclass ContextCollection {\n constructor() {\n this._list = new CountableCollection()\n /** @type {[index; string]: CountableCollection} */\n this._contexts = {}\n }\n\n /**\n * Add an item to this _list's context\n * @param {string} item Item to push\n * @param {string} context Context to push Item to\n */\n push(item, context) {\n this._list.push(item)\n\n if (!this._contexts[context]) {\n this._contexts[context] = new CountableCollection()\n }\n\n this._contexts[context].push(item)\n }\n\n count() {\n /** @type {[index: string]: string} */\n const itemsPerContext = {}\n\n for (let context in this._contexts) {\n itemsPerContext[context] = this._contexts[context].count()\n }\n\n return Object.assign(this._list.count(), {\n itemsPerContext\n })\n }\n}\n\nexport {\n ContextCollection\n}","/**\n * Find the mode (most occurring value) in an array of Numbers\n * Takes the mean/average of multiple values if multiple values occur the same amount of times.\n *\n * @see https://github.com/angus-c/just/blob/684af9ca0c7808bc78543ec89379b1fdfce502b1/packages/array-mode/index.js\n * @param {Array} arr - Array to find the mode value for\n * @returns {Number} mode - The `mode` value of `arr`\n */\nfunction Mode(arr) {\n const frequencies = Object.create(null)\n let maxOccurrences = -1\n let maxOccurenceCount = 0\n let sum = 0\n\n for (let i = 0; i < arr.length; i++) {\n const element = arr[i]\n const updatedCount = (frequencies[element] || 0) + 1\n frequencies[element] = updatedCount\n\n if (updatedCount > maxOccurrences) {\n maxOccurrences = updatedCount\n maxOccurenceCount = 0\n sum = 0\n }\n\n if (updatedCount >= maxOccurrences) {\n maxOccurenceCount++\n sum += element\n }\n }\n\n return sum / maxOccurenceCount\n}\n\n/**\n * Find the middle number in an Array of Numbers\n * Returns the average of 2 numbers if the Array length is an even number\n * @see https://github.com/angus-c/just/blob/684af9ca0c7808bc78543ec89379b1fdfce502b1/packages/array-median/index.js\n * @param {Array} arr - A sorted Array\n * @returns {Number} - The array's Median\n */\nfunction Median(arr) {\n const middle = arr.length / 2\n const lowerMiddleRank = Math.floor(middle)\n\n if (middle !== lowerMiddleRank) {\n return arr[lowerMiddleRank]\n }\n return (arr[lowerMiddleRank] + arr[lowerMiddleRank - 1]) / 2\n}\n\nclass AggregateCollection {\n constructor() {\n /** @type number[] */\n this._items = []\n }\n\n /**\n * Add a new Integer at the end of this AggregateCollection\n * @param {number} item - The item to add\n */\n add(item) {\n this._items.push(item)\n }\n\n aggregate() {\n if (this._items.length === 0) {\n return {\n min: 0,\n max: 0,\n mean: 0,\n mode: 0,\n median: 0,\n range: 0,\n sum: 0,\n }\n }\n\n /** @type Number[] */\n const sorted = this._items.slice().sort((a, b) => a - b)\n const min = sorted[0]\n const max = sorted[sorted.length - 1]\n\n const sum = this._items.reduce((total, num) => (total += num))\n const mode = Mode(this._items)\n const median = Median(sorted)\n\n return {\n min,\n max,\n mean: sum / this._items.length,\n mode,\n median,\n range: max - min,\n sum,\n }\n }\n\n /**\n * @returns {number[]} All _items in this collection\n */\n toArray() {\n return this._items\n }\n}\n\nexport {\n AggregateCollection\n}","import { hasVendorPrefix } from '../vendor-prefix.js'\nimport { endsWith } from '../string-utils.js'\n\n/**\n * @param {string} property\n * @see https://github.com/csstree/csstree/blob/master/lib/utils/names.js#L69\n */\nexport function isHack(property) {\n if (isCustom(property) || hasVendorPrefix(property)) return false\n\n let code = property.charCodeAt(0)\n\n return code === 47 // /\n || code === 95 // _\n || code === 43 // +\n || code === 42 // *\n || code === 38 // &\n || code === 36 // $\n || code === 35 // #\n}\n\nexport function isCustom(property) {\n if (property.length < 3) return false\n // 45 === '-'.charCodeAt(0)\n return property.charCodeAt(0) === 45 && property.charCodeAt(1) === 45\n}\n\nexport function isProperty(basename, property) {\n if (isCustom(property)) return false\n return endsWith(basename, property)\n}","export class OccurrenceCounter {\n constructor() {\n this._items = Object.create(null)\n }\n\n push(item) {\n if (this._items[item]) {\n return this._items[item]++\n }\n\n return this._items[item] = 1\n }\n\n count() {\n return Object.keys(this._items).length\n }\n}\n","import parse from 'css-tree/parser'\nimport walk from 'css-tree/walker'\nimport { analyzeRule } from './rules/rules.js'\nimport { analyzeSpecificity, compareSpecificity } from './selectors/specificity.js'\nimport { colorFunctions, colorNames } from './values/colors.js'\nimport { analyzeFontFamilies } from './values/font-families.js'\nimport { analyzeFontSizes } from './values/font-sizes.js'\nimport { analyzeValues } from './values/values.js'\nimport { analyzeAnimations } from './values/animations.js'\nimport { analyzeVendorPrefixes } from './values/vendor-prefix.js'\nimport { analyzeAtRules } from './atrules/atrules.js'\nimport { ContextCollection } from './context-collection.js'\nimport { CountableCollection } from './countable-collection.js'\nimport { AggregateCollection } from './aggregate-collection.js'\nimport { strEquals, startsWith, endsWith } from './string-utils.js'\nimport { hasVendorPrefix } from './vendor-prefix.js'\nimport { isCustom, isHack, isProperty } from './properties/property-utils.js'\nimport { OccurrenceCounter } from './occurrence-counter.js'\n\n/**\n * Analyze CSS\n * @param {string} css\n */\nconst analyze = (css) => {\n const start = new Date()\n\n // We need all lines later on when we need to stringify the AST again\n // e.g. for Selectors\n const lines = css.split(/\\r?\\n/)\n\n /**\n * Recreate the authored CSS from a CSSTree node\n * @param {import('css-tree').CssNode} node - Node from CSSTree AST to stringify\n * @returns {string} str - The stringified node\n */\n function stringifyNode(node) {\n const start = node.loc.start\n const end = node.loc.end\n const lineCount = end.line - start.line\n\n // Single-line nodes\n if (lineCount === 0) {\n return lines[start.line - 1].substring(start.column - 1, end.column - 1)\n }\n\n // Multi-line nodes\n let value = ''\n\n for (let i = start.line; i <= end.line; i++) {\n const line = lines[i - 1]\n // First line\n if (i === start.line) {\n value += line.substring(start.column - 1) + '\\n'\n continue\n }\n // Last line\n if (i === end.line) {\n value += line.substring(0, end.column - 1)\n continue\n }\n // All lines in between first and last\n value += line + '\\n'\n }\n\n return value\n }\n\n const startParse = new Date()\n let totalComments = 0\n let commentsSize = 0\n\n const ast = parse(css, {\n parseAtrulePrelude: false,\n parseCustomProperty: true, // To find font-families, colors, etc.\n positions: true, // So we can use stringifyNode()\n onComment: function (comment) {\n totalComments++\n commentsSize += comment.length\n },\n })\n\n const startAnalysis = new Date()\n const embeds = new CountableCollection()\n const atrules = []\n\n let totalRules = 0\n let emptyRules = 0\n const selectorsPerRule = new AggregateCollection()\n const declarationsPerRule = new AggregateCollection()\n\n const keyframeSelectors = new CountableCollection()\n const uniqueDeclarations = new OccurrenceCounter()\n let totalDeclarations = 0\n let importantDeclarations = 0\n let importantsInKeyframes = 0\n\n const properties = new CountableCollection()\n const propertyHacks = new CountableCollection()\n const propertyVendorPrefixes = new CountableCollection()\n const customProperties = new CountableCollection()\n\n const values = []\n const zindex = []\n const textShadows = []\n const boxShadows = []\n const fontValues = []\n const fontFamilyValues = []\n const fontSizeValues = []\n const animations = []\n const timingFunctions = []\n const durations = []\n const colors = new ContextCollection()\n const units = new ContextCollection()\n\n // SELECTORS\n /** @type number */\n const uniqueSelectors = new OccurrenceCounter()\n /** @type [number,number,number] */\n let maxSpecificity\n /** @type [number,number,number] */\n let minSpecificity\n let specificityA = new AggregateCollection()\n let specificityB = new AggregateCollection()\n let specificityC = new AggregateCollection()\n const complexityAggregator = new AggregateCollection()\n /** @type [number,number,number][] */\n const specificities = []\n /** @type number[] */\n const complexities = []\n const ids = new CountableCollection()\n const a11y = new CountableCollection()\n\n walk(ast, function (node) {\n switch (node.type) {\n case 'Atrule': {\n atrules.push({\n name: node.name,\n prelude: node.prelude && node.prelude.value,\n block: strEquals('font-face', node.name) && node.block,\n })\n break\n }\n case 'Rule': {\n const [numSelectors, numDeclarations] = analyzeRule(node)\n\n totalRules++\n\n if (numDeclarations === 0) {\n emptyRules++\n }\n\n selectorsPerRule.add(numSelectors)\n declarationsPerRule.add(numDeclarations)\n break\n }\n case 'Selector': {\n const selector = stringifyNode(node)\n\n if (this.atrule && endsWith('keyframes', this.atrule.name)) {\n keyframeSelectors.push(selector)\n return this.skip\n }\n\n const { specificity, complexity, isId, isA11y } = analyzeSpecificity(node)\n\n if (isId) {\n ids.push(selector)\n }\n\n if (isA11y) {\n a11y.push(selector)\n }\n\n uniqueSelectors.push(selector)\n complexityAggregator.add(complexity)\n\n if (maxSpecificity === undefined) {\n maxSpecificity = specificity\n }\n\n if (minSpecificity === undefined) {\n minSpecificity = specificity\n }\n\n specificityA.add(specificity[0])\n specificityB.add(specificity[1])\n specificityC.add(specificity[2])\n\n if (minSpecificity !== undefined && compareSpecificity(minSpecificity, specificity) < 0) {\n minSpecificity = specificity\n }\n\n if (maxSpecificity !== undefined && compareSpecificity(maxSpecificity, specificity) > 0) {\n maxSpecificity = specificity\n }\n\n specificities.push(specificity)\n complexities.push(complexity)\n\n // Avoid deeper walking of selectors to not mess with\n // our specificity calculations in case of a selector\n // with :where() or :is() that contain SelectorLists\n // as children\n return this.skip\n }\n case 'Dimension': {\n if (!this.declaration) {\n break\n }\n\n units.push(node.unit, this.declaration.property)\n\n return this.skip\n }\n case 'Url': {\n if (startsWith('data:', node.value)) {\n embeds.push(node.value)\n }\n break\n }\n case 'Value': {\n values.push(node)\n\n const property = this.declaration.property\n\n // Process properties first that don't have colors,\n // so we can avoid further walking them;\n if (isProperty('z-index', property)) {\n zindex.push(node)\n return this.skip\n } else if (isProperty('font', property)) {\n fontValues.push(node)\n break\n } else if (isProperty('font-size', property)) {\n fontSizeValues.push(stringifyNode(node))\n break\n } else if (isProperty('font-family', property)) {\n fontFamilyValues.push(stringifyNode(node))\n break\n } else if (isProperty('transition', property) || isProperty('animation', property)) {\n animations.push(node.children)\n break\n } else if (isProperty('animation-duration', property) || isProperty('transition-duration', property)) {\n durations.push(stringifyNode(node))\n break\n } else if (isProperty('transition-timing-function', property) || isProperty('animation-timing-function', property)) {\n timingFunctions.push(stringifyNode(node))\n break\n } else if (isProperty('text-shadow', property)) {\n textShadows.push(node)\n // no break here: potentially contains colors\n } else if (isProperty('box-shadow', property)) {\n boxShadows.push(node)\n // no break here: potentially contains colors\n }\n\n walk(node, function (valueNode) {\n switch (valueNode.type) {\n case 'Hash': {\n colors.push('#' + valueNode.value, property)\n\n return this.skip\n }\n case 'Identifier': {\n const { name } = valueNode\n // Bail out if it can't be a color name\n // 20 === 'lightgoldenrodyellow'.length\n // 3 === 'red'.length\n if (name.length > 20 || name.length < 3) {\n return this.skip\n }\n if (colorNames[name.toLowerCase()]) {\n colors.push(stringifyNode(valueNode), property)\n }\n return this.skip\n }\n case 'Function': {\n // Don't walk var() multiple times\n if (strEquals('var', valueNode.name)) {\n return this.skip\n }\n if (colorFunctions[valueNode.name.toLowerCase()]) {\n colors.push(stringifyNode(valueNode), property)\n }\n // No this.skip here intentionally,\n // otherwise we'll miss colors in linear-gradient() etc.\n }\n }\n })\n break\n }\n case 'Declaration': {\n totalDeclarations++\n\n const declaration = stringifyNode(node)\n uniqueDeclarations.push(declaration)\n\n if (node.important) {\n importantDeclarations++\n\n if (this.atrule && endsWith('keyframes', this.atrule.name)) {\n importantsInKeyframes++\n }\n }\n\n const { property } = node\n\n properties.push(property)\n\n if (hasVendorPrefix(property)) {\n propertyVendorPrefixes.push(property)\n } else if (isHack(property)) {\n propertyHacks.push(property)\n } else if (isCustom(property)) {\n customProperties.push(property)\n }\n break\n }\n }\n })\n\n const embeddedContent = embeds.count()\n const embedSize = Object.keys(embeddedContent.unique).join('').length\n\n const totalUniqueDeclarations = uniqueDeclarations.count()\n\n const totalSelectors = complexities.length\n const aggregatesA = specificityA.aggregate()\n const aggregatesB = specificityB.aggregate()\n const aggregatesC = specificityC.aggregate()\n const complexityCount = new CountableCollection(complexities).count()\n const totalUniqueSelectors = uniqueSelectors.count()\n\n return {\n stylesheet: {\n sourceLinesOfCode: atrules.length + totalSelectors + totalDeclarations + keyframeSelectors.size(),\n linesOfCode: lines.length,\n size: css.length,\n comments: {\n total: totalComments,\n size: commentsSize,\n },\n embeddedContent: Object.assign(embeddedContent, {\n size: {\n total: embedSize,\n ratio: css.length === 0 ? 0 : embedSize / css.length,\n },\n }),\n },\n atrules: analyzeAtRules({ atrules, stringifyNode }),\n rules: {\n total: totalRules,\n empty: {\n total: emptyRules,\n ratio: totalRules === 0 ? 0 : emptyRules / totalRules\n },\n selectors: Object.assign(\n selectorsPerRule.aggregate(), {\n items: selectorsPerRule.toArray(),\n }),\n declarations: Object.assign(\n declarationsPerRule.aggregate(), {\n items: declarationsPerRule.toArray()\n }),\n },\n selectors: {\n total: totalSelectors,\n totalUnique: totalUniqueSelectors,\n uniquenessRatio: totalSelectors === 0 ? 0 : totalUniqueSelectors / totalSelectors,\n specificity: {\n min: minSpecificity === undefined ? [0, 0, 0] : minSpecificity,\n max: maxSpecificity === undefined ? [0, 0, 0] : maxSpecificity,\n sum: [aggregatesA.sum, aggregatesB.sum, aggregatesC.sum],\n mean: [aggregatesA.mean, aggregatesB.mean, aggregatesC.mean],\n mode: [aggregatesA.mode, aggregatesB.mode, aggregatesC.mode],\n median: [aggregatesA.median, aggregatesB.median, aggregatesC.median],\n items: specificities\n },\n complexity: Object.assign(\n complexityAggregator.aggregate(),\n complexityCount, {\n items: complexities\n }),\n id: Object.assign(\n ids.count(), {\n ratio: totalSelectors === 0 ? 0 : ids.size() / totalSelectors,\n }),\n accessibility: Object.assign(\n a11y.count(), {\n ratio: totalSelectors === 0 ? 0 : a11y.size() / totalSelectors,\n }),\n keyframes: keyframeSelectors.count(),\n },\n declarations: {\n total: totalDeclarations,\n unique: {\n total: totalUniqueDeclarations,\n ratio: totalDeclarations === 0 ? 0 : totalUniqueDeclarations / totalDeclarations,\n },\n importants: {\n total: importantDeclarations,\n ratio: totalDeclarations === 0 ? 0 : importantDeclarations / totalDeclarations,\n inKeyframes: {\n total: importantsInKeyframes,\n ratio: importantDeclarations === 0 ? 0 : importantsInKeyframes / importantDeclarations,\n },\n },\n },\n properties: Object.assign(\n properties.count(), {\n prefixed: Object.assign(\n propertyVendorPrefixes.count(), {\n ratio: properties.size() === 0 ? 0 : propertyVendorPrefixes.size() / properties.size(),\n }),\n custom: Object.assign(\n customProperties.count(), {\n ratio: properties.size() === 0 ? 0 : customProperties.size() / properties.size(),\n }),\n browserhacks: Object.assign(\n propertyHacks.count(), {\n ratio: properties.size() === 0 ? 0 : propertyHacks.size() / properties.size(),\n }),\n }),\n values: {\n colors: colors.count(),\n fontFamilies: analyzeFontFamilies({ stringifyNode, fontValues, fontFamilyValues }),\n fontSizes: analyzeFontSizes({ stringifyNode, fontValues, fontSizeValues }),\n zindexes: analyzeValues({ values: zindex, stringifyNode }),\n textShadows: analyzeValues({ values: textShadows, stringifyNode }),\n boxShadows: analyzeValues({ values: boxShadows, stringifyNode }),\n animations: analyzeAnimations({ animations, timingFunctions, durations, stringifyNode }),\n prefixes: analyzeVendorPrefixes({ values, stringifyNode }),\n units: units.count(),\n },\n __meta__: {\n parseTime: startAnalysis - startParse,\n analyzeTime: new Date() - startAnalysis,\n total: new Date() - start\n }\n }\n}\n\nexport {\n analyze,\n compareSpecificity,\n}\n","import walk from 'css-tree/walker'\n\nconst analyzeRule = function (ruleNode) {\n let numSelectors = 0\n let numDeclarations = 0\n\n walk(ruleNode, function (childNode) {\n if (childNode.type === 'Selector') {\n numSelectors++\n return this.skip\n }\n\n if (childNode.type === 'Declaration') {\n numDeclarations++\n return this.skip\n }\n })\n\n return [numSelectors, numDeclarations]\n}\n\nexport {\n analyzeRule,\n}"],"names":["compareChar","referenceCode","testCode","strEquals","base","test","length","i","charCodeAt","endsWith","offset","startsWith","compareSpecificity","a","b","analyzeSpecificity","node","A","B","C","complexity","isA11y","walk","selector","type","Boolean","value","name","skip","selectorList","childSelectors","visit","enter","push","sort","specificity","listItem","isId","colorNames","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","canvas","canvastext","linktext","visitedtext","activetext","buttonface","buttontext","buttonborder","field","fieldtext","highlight","highlighttext","selecteditem","selecteditemtext","mark","marktext","graytext","colorFunctions","rgb","rgba","hsl","hsla","hwb","lab","lch","oklab","oklch","color","CountableCollection","initial","this","_items","_total","_totalUnique","item","size","count","total","totalUnique","unique","uniquenessRatio","systemKeywords","inherit","unset","revert","caption","icon","menu","keywordDisallowList","normal","small","medium","large","larger","smaller","bold","bolder","lighter","condensed","expanded","italic","oblique","analyzeFontFamilies","fontValues","stringifyNode","all","fontFamilyValues","index","firstChild","children","first","parts","reverse","fontNode","loc","start","quote","line","column","end","sizeKeywords","keywords","analyzeFontSizes","fontSizeValues","operator","auto","none","analyzeValues","values","timingKeywords","linear","ease","analyzeAnimations","animations","timingFunctions","allDurations","durations","allTimingFunctions","durationFound","forEach","child","hasVendorPrefix","keyword","indexOf","isAstVendorPrefixed","toArray","analyzeVendorPrefixes","analyzeAtRules","atrules","fontfaces","layers","imports","medias","charsets","supports","keyframes","prefixedKeyframes","containers","machine","descriptors","block","descriptor","property","media","prelude","import","charset","container","layer","trim","split","map","atRuleName","action","fontface","Object","assign","prefixed","ratio","ContextCollection","_list","_contexts","context","itemsPerContext","AggregateCollection","add","aggregate","min","max","mean","mode","median","range","sum","arr","middle","lowerMiddleRank","sorted","slice","reduce","num","frequencies","create","maxOccurrences","maxOccurenceCount","element","updatedCount","Mode","Math","floor","isCustom","isProperty","basename","OccurrenceCounter","keys","css","Date","lines","substring","maxSpecificity","minSpecificity","startParse","totalComments","commentsSize","ast","parse","parseAtrulePrelude","parseCustomProperty","positions","onComment","comment","startAnalysis","embeds","totalRules","emptyRules","selectorsPerRule","declarationsPerRule","keyframeSelectors","uniqueDeclarations","totalDeclarations","importantDeclarations","importantsInKeyframes","properties","propertyHacks","propertyVendorPrefixes","customProperties","zindex","textShadows","boxShadows","colors","units","uniqueSelectors","specificityA","specificityB","specificityC","complexityAggregator","specificities","complexities","ids","a11y","ruleNode","numSelectors","numDeclarations","childNode","analyzeRule","atrule","undefined","declaration","unit","valueNode","toLowerCase","important","code","isHack","embeddedContent","embedSize","join","totalUniqueDeclarations","totalSelectors","aggregatesA","aggregatesB","aggregatesC","complexityCount","totalUniqueSelectors","stylesheet","sourceLinesOfCode","linesOfCode","comments","rules","empty","selectors","items","declarations","id","accessibility","importants","inKeyframes","custom","browserhacks","fontFamilies","fontSizes","zindexes","prefixes","__meta__","parseTime","analyzeTime"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import e from"css-tree/parser";import t from"css-tree/walker";function n(){return n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e},n.apply(this,arguments)}function i(e,t){return t>=65&&t<=90&&(t|=32),e===t}function r(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!1===i(e.charCodeAt(n),t.charCodeAt(n)))return!1;return!0}function s(e,t){const n=t.length-e.length;if(n<0)return!1;for(let r=t.length-1;r>=n;r--)if(!1===i(e.charCodeAt(r-n),t.charCodeAt(r)))return!1;return!0}function a(e,t){if(t.length<e.length)return!1;for(let n=0;n<e.length;n++)if(!1===i(e.charCodeAt(n),t.charCodeAt(n)))return!1;return!0}function o(e,t){return e[0]===t[0]?e[1]===t[1]?t[2]-e[2]:t[1]-e[1]:t[0]-e[0]}const l=e=>{let n=0,i=0,r=0,s=0,u=!1;return t(e,function(e){switch(e.type){case"IdSelector":n++,s++;break;case"ClassSelector":i++,s++;break;case"AttributeSelector":i++,s++,Boolean(e.value)&&s++,u="role"===e.name.name||a("aria-",e.name.name);break;case"PseudoElementSelector":case"TypeSelector":if(s++,42===e.name.charCodeAt(0)&&1===e.name.length)break;r++;break;case"PseudoClassSelector":switch(e.name){case"before":case"after":case"first-letter":case"first-line":return r++,s++,this.skip;case"where":case"is":case"has":case"matches":case"-webkit-any":case"-moz-any":case"not":case"nth-child":case"nth-last-child":{"nth-child"!==e.name&&"nth-last-child"!==e.name||i++;const a=function(e){const n=[];return t(e,{visit:"Selector",enter(e){n.push(l(e))}}),n.sort((e,t)=>o(e.specificity,t.specificity))}(e);if(0===a.length)return;if("where"!==e.name){const[e,t,s]=a[0].specificity;n+=e,i+=t,r+=s}for(let e=0;e<a.length;e++){const t=a[e];t.isA11y&&(u=!0),s+=t.complexity}return s++,this.skip}default:return s++,i++,this.skip}case"Combinator":s++}}),{specificity:[n,i,r],complexity:s,isId:n>0,isA11y:u}},u={aliceblue:1,antiquewhite:1,aqua:1,aquamarine:1,azure:1,beige:1,bisque:1,black:1,blanchedalmond:1,blue:1,blueviolet:1,brown:1,burlywood:1,cadetblue:1,chartreuse:1,chocolate:1,coral:1,cornflowerblue:1,cornsilk:1,crimson:1,cyan:1,darkblue:1,darkcyan:1,darkgoldenrod:1,darkgray:1,darkgreen:1,darkgrey:1,darkkhaki:1,darkmagenta:1,darkolivegreen:1,darkorange:1,darkorchid:1,darkred:1,darksalmon:1,darkseagreen:1,darkslateblue:1,darkslategray:1,darkslategrey:1,darkturquoise:1,darkviolet:1,deeppink:1,deepskyblue:1,dimgray:1,dimgrey:1,dodgerblue:1,firebrick:1,floralwhite:1,forestgreen:1,fuchsia:1,gainsboro:1,ghostwhite:1,gold:1,goldenrod:1,gray:1,green:1,greenyellow:1,grey:1,honeydew:1,hotpink:1,indianred:1,indigo:1,ivory:1,khaki:1,lavender:1,lavenderblush:1,lawngreen:1,lemonchiffon:1,lightblue:1,lightcoral:1,lightcyan:1,lightgoldenrodyellow:1,lightgray:1,lightgreen:1,lightgrey:1,lightpink:1,lightsalmon:1,lightseagreen:1,lightskyblue:1,lightslategray:1,lightslategrey:1,lightsteelblue:1,lightyellow:1,lime:1,limegreen:1,linen:1,magenta:1,maroon:1,mediumaquamarine:1,mediumblue:1,mediumorchid:1,mediumpurple:1,mediumseagreen:1,mediumslateblue:1,mediumspringgreen:1,mediumturquoise:1,mediumvioletred:1,midnightblue:1,mintcream:1,mistyrose:1,moccasin:1,navajowhite:1,navy:1,oldlace:1,olive:1,olivedrab:1,orange:1,orangered:1,orchid:1,palegoldenrod:1,palegreen:1,paleturquoise:1,palevioletred:1,papayawhip:1,peachpuff:1,peru:1,pink:1,plum:1,powderblue:1,purple:1,rebeccapurple:1,red:1,rosybrown:1,royalblue:1,saddlebrown:1,salmon:1,sandybrown:1,seagreen:1,seashell:1,sienna:1,silver:1,skyblue:1,slateblue:1,slategray:1,slategrey:1,snow:1,springgreen:1,steelblue:1,tan:1,teal:1,thistle:1,tomato:1,turquoise:1,violet:1,wheat:1,white:1,whitesmoke:1,yellow:1,yellowgreen:1,canvas:1,canvastext:1,linktext:1,visitedtext:1,activetext:1,buttonface:1,buttontext:1,buttonborder:1,field:1,fieldtext:1,highlight:1,highlighttext:1,selecteditem:1,selecteditemtext:1,mark:1,marktext:1,graytext:1},c={rgb:1,rgba:1,hsl:1,hsla:1,hwb:1,lab:1,lch:1,oklab:1,oklch:1,color:1};class h{constructor(e){if(this.items={},this.total=0,this.totalUnique=0,e)for(let t=0;t<e.length;t++)this.push(e[t])}push(e){this.total++,this.items[e]?this.items[e]++:(this.items[e]=1,this.totalUnique++)}size(){return this.total}count(){return{total:this.total,totalUnique:this.totalUnique,unique:this.items,uniquenessRatio:0===this.total?0:this.totalUnique/this.total}}}const d={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},m={normal:1,"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1,bold:1,bolder:1,lighter:1,"ultra-condensed":1,"extra-condensed":1,condensed:1,"semi-condensed":1,"semi-expanded":1,expanded:1,"extra-expanded":1,"ultra-expanded":1,italic:1,oblique:1},p=({fontValues:e,fontFamilyValues:n,stringifyNode:i})=>{const r=new h(n);for(let n=0;n<e.length;n++){const s=e[n],a=s.children.first;if("Identifier"===a.type&&d[a.name])continue;let o="";t(s,{reverse:!0,enter:function(e){if("String"===e.type){const t=e.loc.start,n=i({loc:{start:{line:t.line,column:t.column},end:{line:t.line,column:t.column+1}}});return o=n+e.value+n+o}return"Operator"===e.type&&44===e.value.charCodeAt(0)?o=e.value+o:"Identifier"===e.type?m[e.name]?this.skip:o=e.name+o:void 0}}),r.push(o)}return r.count()},g={"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1},f={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},y=({stringifyNode:e,fontSizeValues:n,fontValues:i})=>{const r=new h(n);for(let n=0;n<i.length;n++){const s=i[n],a=s.children.first;if("Identifier"===a.type&&f[a.name])continue;let o,l=!1;t(s,function(t){switch(t.type){case"Number":if(48===t.value.charCodeAt(0))return o="0",this.break;case"Operator":47===t.value.charCodeAt(0)&&(l=!0);break;case"Dimension":if(!l)return o=e(t),this.break;case"Identifier":if(g[t.name])return o=t.name,this.break}}),o&&r.push(o)}return r.count()},b={auto:1,inherit:1,initial:1,unset:1,revert:1,none:1},k=({values:e,stringifyNode:t})=>{const n=new h;for(let i=0;i<e.length;i++){const r=e[i],s=r.children.first;s&&("Identifier"===s.type&&b[s.name]||n.push(t(r)))}return n.count()},w={linear:1,ease:1,"ease-in":1,"ease-out":1,"ease-in-out":1,"step-start":1,"step-end":1},v=({animations:e,durations:t,timingFunctions:n,stringifyNode:i})=>{const r=new h(t),s=new h(n);for(let t=0;t<e.length;t++){let n=!1;e[t].forEach(e=>"Operator"===e.type?n=!1:"Dimension"===e.type&&!1===n?(n=!0,r.push(i(e))):"Identifier"===e.type&&w[e.name]?s.push(i(e)):"Function"!==e.type||"cubic-bezier"!==e.name&&"steps"!==e.name?void 0:s.push(i(e)))}return{durations:r.count(),timingFunctions:s.count()}};function x(e){return 45===e.charCodeAt(0)&&45!==e.charCodeAt(1)&&-1!==e.indexOf("-",2)}function z(e){e=e.toArray();for(let t=0;t<e.length;t++){const n=e[t];if("Identifier"===n.type&&n.name.length>=3&&x(n.name))return!0;if("Function"===n.type){if(x(n.name))return!0;if(n.children&&z(n.children))return!0}}return!1}const C=({values:e,stringifyNode:t})=>{const n=new h;for(let i=0;i<e.length;i++){const r=e[i];r.children&&z(r.children)&&n.push(t(r))}return n.count()},A=({atrules:e,stringifyNode:t})=>{const i=[],r=new h,a=new h,o=new h,l=new h,u=new h,c=new h,d=new h,m=new h,p={"font-face":e=>{const n={};e.block.children.forEach(e=>n[e.property]=t(e.value)),i.push(n)},media:e=>o.push(e.prelude),supports:e=>u.push(e.prelude),keyframes:e=>c.push(`@${e.name} ${e.prelude}`),import:e=>a.push(e.prelude),charset:e=>l.push(e.prelude),container:e=>m.push(e.prelude),layer:e=>{e.prelude.trim().split(",").map(e=>e.trim()).forEach(e=>r.push(e))}};for(let t=0;t<e.length;t++){const n=e[t],i=n.name,r=p[i];if(r)r(n);else if(s("keyframes",i)){const e=`@${i} ${n.prelude}`;c.push(e),x(i)&&d.push(e)}}return{fontface:{total:i.length,totalUnique:i.length,unique:i,uniquenessRatio:0===i.length?0:1},import:a.count(),media:o.count(),charset:l.count(),supports:u.count(),keyframes:n({},c.count(),{prefixed:n({},d.count(),{ratio:0===c.size()?0:d.size()/c.size()})}),container:m.count(),layer:r.count()}};class q{constructor(){this.list=new h,this.contexts={}}push(e,t){this.list.push(e),this.contexts[t]||(this.contexts[t]=new h),this.contexts[t].push(e)}count(){const e={};for(let t in this.contexts)e[t]=this.contexts[t].count();return Object.assign(this.list.count(),{itemsPerContext:e})}}class O{constructor(){this.items=[]}add(e){this.items.push(e)}aggregate(){if(0===this.items.length)return{min:0,max:0,mean:0,mode:0,median:0,range:0,sum:0};const e=this.items.slice().sort((e,t)=>e-t),t=e[0],n=e[e.length-1],i=this.items.reduce((e,t)=>e+t),r=function(e){const t=Object.create(null);let n=-1,i=0,r=0;for(let s=0;s<e.length;s++){const a=e[s],o=(t[a]||0)+1;t[a]=o,o>n&&(n=o,i=0,r=0),o>=n&&(i++,r+=a)}return r/i}(this.items),s=function(e){const t=e.length/2,n=Math.floor(t);return t!==n?e[n]:(e[n]+e[n-1])/2}(e);return{min:t,max:n,mean:i/this.items.length,mode:r,median:s,range:n-t,sum:i}}toArray(){return this.items}}function N(e){return!(e.length<3)&&45===e.charCodeAt(0)&&45===e.charCodeAt(1)}function S(e,t){return!N(t)&&s(e,t)}const j=i=>{const d=new Date,m=i.split(/\r?\n/);function g(e){const t=e.loc.start,n=e.loc.end;if(0==n.line-t.line)return m[t.line-1].substring(t.column-1,n.column-1);let i="";for(let e=t.line;e<=n.line;e++){const r=m[e-1];i+=e!==t.line?e!==n.line?r+"\n":r.substring(0,n.column-1):r.substring(t.column-1)+"\n"}return i}const f=new Date;let b=0,w=0;const z=e(i,{parseAtrulePrelude:!1,parseCustomProperty:!0,positions:!0,onComment:function(e){b++,w+=e.length}}),j=new Date,I=new h,D=[];let F=0,U=0;const V=new O,P=new O,E=new h,R=Object.create(null);let $=0,_=0,L=0;const T=new h,B=new h,H=new h,K=new h,M=[],G=[],J=[],Q=[],W=[],X=[],Y=[],Z=[],ee=[],te=[],ne=new q,ie=new q,re=Object.create(null);let se,ae,oe=new O,le=new O,ue=new O;const ce=new O,he=[],de=[],me=new h,pe=new h;t(z,function(e){switch(e.type){case"Atrule":D.push({name:e.name,prelude:e.prelude&&e.prelude.value,block:r("font-face",e.name)&&e.block});break;case"Rule":{const[n,i]=function(e){let n=0,i=0;return t(e,function(e){return"Selector"===e.type?(n++,this.skip):"Declaration"===e.type?(i++,this.skip):void 0}),[n,i]}(e);F++,0===i&&U++,V.add(n),P.add(i);break}case"Selector":{const t=g(e);if(this.atrule&&s("keyframes",this.atrule.name))return E.push(t),this.skip;const{specificity:n,complexity:i,isId:r,isA11y:a}=l(e);return r&&me.push(t),a&&pe.push(t),re[t]?re[t]++:re[t]=1,ce.add(i),void 0===se&&(se=n),void 0===ae&&(ae=n),oe.add(n[0]),le.add(n[1]),ue.add(n[2]),void 0!==ae&&o(ae,n)<0&&(ae=n),void 0!==se&&o(se,n)>0&&(se=n),he.push(n),de.push(i),this.skip}case"Dimension":if(!this.declaration)break;return ie.push(e.unit,this.declaration.property),this.skip;case"Url":a("data:",e.value)&&I.push(e.value);break;case"Declaration":{$++;const n=g(e);R[n]?R[n]++:R[n]=1,e.important&&(_++,this.atrule&&s("keyframes",this.atrule.name)&&L++);const{value:i,property:r}=e;if(T.push(r),M.push(i),x(r)?H.push(r):function(e){if(N(e)||x(e))return!1;let t=e.charCodeAt(0);return 47===t||95===t||43===t||42===t||38===t||36===t||35===t}(r)?B.push(r):N(r)&&K.push(r),S("z-index",r))return G.push(i),this.skip;if(S("font",r)){W.push(i);break}if(S("font-size",r)){Y.push(g(i));break}if(S("font-family",r)){X.push(g(i));break}if(S("transition",r)||S("animation",r)){Z.push(i.children);break}if(S("animation-duration",r)||S("transition-duration",r)){te.push(g(i));break}if(S("transition-timing-function",r)||S("animation-timing-function",r)){ee.push(g(i));break}S("text-shadow",r)?J.push(i):S("box-shadow",r)&&Q.push(i),t(i,function(e){switch(e.type){case"Hash":return ne.push("#"+e.value,r),this.skip;case"Identifier":{const{name:t}=e;return t.length>20||t.length<3||u[t.toLowerCase()]&&ne.push(g(e),r),this.skip}case"Function":c[e.name.toLowerCase()]&&ne.push(g(e),r)}})}}});const ge=I.count(),fe=Object.keys(ge.unique).join("").length,ye=Object.keys(R).length,be=de.length,ke=oe.aggregate(),we=le.aggregate(),ve=ue.aggregate(),xe=new h(de).count(),ze=Object.values(re).length;return{stylesheet:{sourceLinesOfCode:D.length+be+$+E.size(),linesOfCode:m.length,size:i.length,comments:{total:b,size:w},embeddedContent:Object.assign(ge,{size:{total:fe,ratio:0===i.length?0:fe/i.length}})},atrules:A({atrules:D,stringifyNode:g}),rules:{total:F,empty:{total:U,ratio:0===F?0:U/F},selectors:n({},V.aggregate(),{items:V.toArray()}),declarations:n({},P.aggregate(),{items:P.toArray()})},selectors:{total:be,totalUnique:ze,uniquenessRatio:0===be?0:ze/be,specificity:{min:void 0===ae?[0,0,0]:ae,max:void 0===se?[0,0,0]:se,sum:[ke.sum,we.sum,ve.sum],mean:[ke.mean,we.mean,ve.mean],mode:[ke.mode,we.mode,ve.mode],median:[ke.median,we.median,ve.median],items:he},complexity:n({},ce.aggregate(),xe,{items:de}),id:n({},me.count(),{ratio:0===be?0:me.size()/be}),accessibility:n({},pe.count(),{ratio:0===be?0:pe.size()/be}),keyframes:E.count()},declarations:{total:$,unique:{total:ye,ratio:0===$?0:ye/$},importants:{total:_,ratio:0===$?0:_/$,inKeyframes:{total:L,ratio:0===_?0:L/_}}},properties:n({},T.count(),{prefixed:n({},H.count(),{ratio:0===T.size()?0:H.size()/T.size()}),custom:n({},K.count(),{ratio:0===T.size()?0:K.size()/T.size()}),browserhacks:n({},B.count(),{ratio:0===T.size()?0:B.size()/T.size()})}),values:{colors:ne.count(),fontFamilies:p({stringifyNode:g,fontValues:W,fontFamilyValues:X}),fontSizes:y({stringifyNode:g,fontValues:W,fontSizeValues:Y}),zindexes:k({values:G,stringifyNode:g}),textShadows:k({values:J,stringifyNode:g}),boxShadows:k({values:Q,stringifyNode:g}),animations:v({animations:Z,timingFunctions:ee,durations:te,stringifyNode:g}),prefixes:C({values:M,stringifyNode:g}),units:ie.count()},__meta__:{parseTime:j-f,analyzeTime:new Date-j,total:new Date-d}}};export{j as analyze,o as compareSpecificity};
1
+ import e from"css-tree/parser";import t from"css-tree/walker";function n(e,t){return t>=65&&t<=90&&(t|=32),e===t}function i(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!1===n(e.charCodeAt(i),t.charCodeAt(i)))return!1;return!0}function r(e,t){const i=t.length-e.length;if(i<0)return!1;for(let r=t.length-1;r>=i;r--)if(!1===n(e.charCodeAt(r-i),t.charCodeAt(r)))return!1;return!0}function s(e,t){if(t.length<e.length)return!1;for(let i=0;i<e.length;i++)if(!1===n(e.charCodeAt(i),t.charCodeAt(i)))return!1;return!0}function a(e,t){return e[0]===t[0]?e[1]===t[1]?t[2]-e[2]:t[1]-e[1]:t[0]-e[0]}const o=e=>{let n=0,i=0,r=0,l=0,c=!1;return t(e,function(e){switch(e.type){case"IdSelector":n++,l++;break;case"ClassSelector":i++,l++;break;case"AttributeSelector":i++,l++,Boolean(e.value)&&l++,c="role"===e.name.name||s("aria-",e.name.name);break;case"PseudoElementSelector":case"TypeSelector":if(l++,42===e.name.charCodeAt(0)&&1===e.name.length)break;r++;break;case"PseudoClassSelector":switch(e.name){case"before":case"after":case"first-letter":case"first-line":return r++,l++,this.skip;case"where":case"is":case"has":case"matches":case"-webkit-any":case"-moz-any":case"not":case"nth-child":case"nth-last-child":{"nth-child"!==e.name&&"nth-last-child"!==e.name||i++;const s=function(e){const n=[];return t(e,{visit:"Selector",enter(e){n.push(o(e))}}),n.sort((e,t)=>a(e.specificity,t.specificity))}(e);if(0===s.length)return;if("where"!==e.name){const[e,t,a]=s[0].specificity;n+=e,i+=t,r+=a}for(let e=0;e<s.length;e++){const t=s[e];t.isA11y&&(c=!0),l+=t.complexity}return l++,this.skip}default:return l++,i++,this.skip}case"Combinator":l++}}),{specificity:[n,i,r],complexity:l,isId:n>0,isA11y:c}},l={aliceblue:1,antiquewhite:1,aqua:1,aquamarine:1,azure:1,beige:1,bisque:1,black:1,blanchedalmond:1,blue:1,blueviolet:1,brown:1,burlywood:1,cadetblue:1,chartreuse:1,chocolate:1,coral:1,cornflowerblue:1,cornsilk:1,crimson:1,cyan:1,darkblue:1,darkcyan:1,darkgoldenrod:1,darkgray:1,darkgreen:1,darkgrey:1,darkkhaki:1,darkmagenta:1,darkolivegreen:1,darkorange:1,darkorchid:1,darkred:1,darksalmon:1,darkseagreen:1,darkslateblue:1,darkslategray:1,darkslategrey:1,darkturquoise:1,darkviolet:1,deeppink:1,deepskyblue:1,dimgray:1,dimgrey:1,dodgerblue:1,firebrick:1,floralwhite:1,forestgreen:1,fuchsia:1,gainsboro:1,ghostwhite:1,gold:1,goldenrod:1,gray:1,green:1,greenyellow:1,grey:1,honeydew:1,hotpink:1,indianred:1,indigo:1,ivory:1,khaki:1,lavender:1,lavenderblush:1,lawngreen:1,lemonchiffon:1,lightblue:1,lightcoral:1,lightcyan:1,lightgoldenrodyellow:1,lightgray:1,lightgreen:1,lightgrey:1,lightpink:1,lightsalmon:1,lightseagreen:1,lightskyblue:1,lightslategray:1,lightslategrey:1,lightsteelblue:1,lightyellow:1,lime:1,limegreen:1,linen:1,magenta:1,maroon:1,mediumaquamarine:1,mediumblue:1,mediumorchid:1,mediumpurple:1,mediumseagreen:1,mediumslateblue:1,mediumspringgreen:1,mediumturquoise:1,mediumvioletred:1,midnightblue:1,mintcream:1,mistyrose:1,moccasin:1,navajowhite:1,navy:1,oldlace:1,olive:1,olivedrab:1,orange:1,orangered:1,orchid:1,palegoldenrod:1,palegreen:1,paleturquoise:1,palevioletred:1,papayawhip:1,peachpuff:1,peru:1,pink:1,plum:1,powderblue:1,purple:1,rebeccapurple:1,red:1,rosybrown:1,royalblue:1,saddlebrown:1,salmon:1,sandybrown:1,seagreen:1,seashell:1,sienna:1,silver:1,skyblue:1,slateblue:1,slategray:1,slategrey:1,snow:1,springgreen:1,steelblue:1,tan:1,teal:1,thistle:1,tomato:1,turquoise:1,violet:1,wheat:1,white:1,whitesmoke:1,yellow:1,yellowgreen:1,canvas:1,canvastext:1,linktext:1,visitedtext:1,activetext:1,buttonface:1,buttontext:1,buttonborder:1,field:1,fieldtext:1,highlight:1,highlighttext:1,selecteditem:1,selecteditemtext:1,mark:1,marktext:1,graytext:1},c={rgb:1,rgba:1,hsl:1,hsla:1,hwb:1,lab:1,lch:1,oklab:1,oklch:1,color:1};class u{constructor(e){if(this.t={},this.i=0,this.o=0,e)for(let t=0;t<e.length;t++)this.push(e[t])}push(e){this.i++,this.t[e]?this.t[e]++:(this.t[e]=1,this.o++)}size(){return this.i}count(){return{total:this.i,totalUnique:this.o,unique:this.t,uniquenessRatio:0===this.i?0:this.o/this.i}}}const d={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},f={normal:1,"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1,bold:1,bolder:1,lighter:1,"ultra-condensed":1,"extra-condensed":1,condensed:1,"semi-condensed":1,"semi-expanded":1,expanded:1,"extra-expanded":1,"ultra-expanded":1,italic:1,oblique:1},h=({fontValues:e,fontFamilyValues:n,stringifyNode:i})=>{const r=new u(n);for(let n=0;n<e.length;n++){const s=e[n],a=s.children.first;if("Identifier"===a.type&&d[a.name])continue;let o="";t(s,{reverse:!0,enter:function(e){if("String"===e.type){const t=e.loc.start,n=i({loc:{start:{line:t.line,column:t.column},end:{line:t.line,column:t.column+1}}});return o=n+e.value+n+o}return"Operator"===e.type&&44===e.value.charCodeAt(0)?o=e.value+o:"Identifier"===e.type?f[e.name]?this.skip:o=e.name+o:void 0}}),r.push(o)}return r.count()},m={"xx-small":1,"x-small":1,small:1,medium:1,large:1,"x-large":1,"xx-large":1,larger:1,smaller:1},g={inherit:1,initial:1,unset:1,revert:1,caption:1,icon:1,menu:1,"message-box":1,"small-caption":1,"status-bar":1},b=({stringifyNode:e,fontSizeValues:n,fontValues:i})=>{const r=new u(n);for(let n=0;n<i.length;n++){const s=i[n],a=s.children.first;if("Identifier"===a.type&&g[a.name])continue;let o,l=!1;t(s,function(t){switch(t.type){case"Number":if(48===t.value.charCodeAt(0))return o="0",this.break;case"Operator":47===t.value.charCodeAt(0)&&(l=!0);break;case"Dimension":if(!l)return o=e(t),this.break;case"Identifier":if(m[t.name])return o=t.name,this.break}}),o&&r.push(o)}return r.count()},y={auto:1,inherit:1,initial:1,unset:1,revert:1,none:1},w=({values:e,stringifyNode:t})=>{const n=new u;for(let i=0;i<e.length;i++){const r=e[i],s=r.children.first;s&&("Identifier"===s.type&&y[s.name]||n.push(t(r)))}return n.count()},p={linear:1,ease:1,"ease-in":1,"ease-out":1,"ease-in-out":1,"step-start":1,"step-end":1},k=({animations:e,durations:t,timingFunctions:n,stringifyNode:i})=>{const r=new u(t),s=new u(n);for(let t=0;t<e.length;t++){let n=!1;e[t].forEach(e=>"Operator"===e.type?n=!1:"Dimension"===e.type&&!1===n?(n=!0,r.push(i(e))):"Identifier"===e.type&&p[e.name]?s.push(i(e)):"Function"!==e.type||"cubic-bezier"!==e.name&&"steps"!==e.name?void 0:s.push(i(e)))}return{durations:r.count(),timingFunctions:s.count()}};function x(e){return 45===e.charCodeAt(0)&&45!==e.charCodeAt(1)&&-1!==e.indexOf("-",2)}function v(e){e=e.toArray();for(let t=0;t<e.length;t++){const n=e[t];if("Identifier"===n.type&&n.name.length>=3&&x(n.name))return!0;if("Function"===n.type){if(x(n.name))return!0;if(n.children&&v(n.children))return!0}}return!1}const O=({values:e,stringifyNode:t})=>{const n=new u;for(let i=0;i<e.length;i++){const r=e[i];r.children&&v(r.children)&&n.push(t(r))}return n.count()},q=({atrules:e,stringifyNode:t})=>{const n=[],i=new u,s=new u,a=new u,o=new u,l=new u,c=new u,d=new u,f=new u,h={"font-face":e=>{const i={};e.block.children.forEach(e=>i[e.property]=t(e.value)),n.push(i)},media:e=>a.push(e.prelude),supports:e=>l.push(e.prelude),keyframes:e=>c.push(`@${e.name} ${e.prelude}`),import:e=>s.push(e.prelude),charset:e=>o.push(e.prelude),container:e=>f.push(e.prelude),layer:e=>{e.prelude.trim().split(",").map(e=>e.trim()).forEach(e=>i.push(e))}};for(let t=0;t<e.length;t++){const n=e[t],i=n.name,s=h[i];if(s)s(n);else if(r("keyframes",i)){const e=`@${i} ${n.prelude}`;c.push(e),x(i)&&d.push(e)}}return{fontface:{total:n.length,totalUnique:n.length,unique:n,uniquenessRatio:0===n.length?0:1},import:s.count(),media:a.count(),charset:o.count(),supports:l.count(),keyframes:Object.assign(c.count(),{prefixed:Object.assign(d.count(),{ratio:0===c.size()?0:d.size()/c.size()})}),container:f.count(),layer:i.count()}};class j{constructor(){this.l=new u,this.u={}}push(e,t){this.l.push(e),this.u[t]||(this.u[t]=new u),this.u[t].push(e)}count(){const e={};for(let t in this.u)e[t]=this.u[t].count();return Object.assign(this.l.count(),{itemsPerContext:e})}}class N{constructor(){this.t=[]}add(e){this.t.push(e)}aggregate(){if(0===this.t.length)return{min:0,max:0,mean:0,mode:0,median:0,range:0,sum:0};const e=this.t.slice().sort((e,t)=>e-t),t=e[0],n=e[e.length-1],i=this.t.reduce((e,t)=>e+t),r=function(e){const t=Object.create(null);let n=-1,i=0,r=0;for(let s=0;s<e.length;s++){const a=e[s],o=(t[a]||0)+1;t[a]=o,o>n&&(n=o,i=0,r=0),o>=n&&(i++,r+=a)}return r/i}(this.t),s=function(e){const t=e.length/2,n=Math.floor(t);return t!==n?e[n]:(e[n]+e[n-1])/2}(e);return{min:t,max:n,mean:i/this.t.length,mode:r,median:s,range:n-t,sum:i}}toArray(){return this.t}}function S(e){return!(e.length<3)&&45===e.charCodeAt(0)&&45===e.charCodeAt(1)}function z(e,t){return!S(t)&&r(e,t)}class I{constructor(){this.t=Object.create(null)}push(e){return this.t[e]?this.t[e]++:this.t[e]=1}count(){return Object.keys(this.t).length}}const D=n=>{const d=new Date,f=n.split(/\r?\n/);function m(e){const t=e.loc.start,n=e.loc.end;if(0==n.line-t.line)return f[t.line-1].substring(t.column-1,n.column-1);let i="";for(let e=t.line;e<=n.line;e++){const r=f[e-1];i+=e!==t.line?e!==n.line?r+"\n":r.substring(0,n.column-1):r.substring(t.column-1)+"\n"}return i}const g=new Date;let y=0,p=0;const v=e(n,{parseAtrulePrelude:!1,parseCustomProperty:!0,positions:!0,onComment:function(e){y++,p+=e.length}}),D=new Date,C=new u,F=[];let V=0,A=0;const P=new N,R=new N,U=new u,$=new I;let _=0,T=0,B=0;const E=new u,H=new u,K=new u,L=new u,M=[],G=[],J=[],Q=[],W=[],X=[],Y=[],Z=[],ee=[],te=[],ne=new j,ie=new j,re=new I;let se,ae,oe=new N,le=new N,ce=new N;const ue=new N,de=[],fe=[],he=new u,me=new u;t(v,function(e){switch(e.type){case"Atrule":F.push({name:e.name,prelude:e.prelude&&e.prelude.value,block:i("font-face",e.name)&&e.block});break;case"Rule":{const[n,i]=function(e){let n=0,i=0;return t(e,function(e){return"Selector"===e.type?(n++,this.skip):"Declaration"===e.type?(i++,this.skip):void 0}),[n,i]}(e);V++,0===i&&A++,P.add(n),R.add(i);break}case"Selector":{const t=m(e);if(this.atrule&&r("keyframes",this.atrule.name))return U.push(t),this.skip;const{specificity:n,complexity:i,isId:s,isA11y:l}=o(e);return s&&he.push(t),l&&me.push(t),re.push(t),ue.add(i),void 0===se&&(se=n),void 0===ae&&(ae=n),oe.add(n[0]),le.add(n[1]),ce.add(n[2]),void 0!==ae&&a(ae,n)<0&&(ae=n),void 0!==se&&a(se,n)>0&&(se=n),de.push(n),fe.push(i),this.skip}case"Dimension":if(!this.declaration)break;return ie.push(e.unit,this.declaration.property),this.skip;case"Url":s("data:",e.value)&&C.push(e.value);break;case"Value":{M.push(e);const n=this.declaration.property;if(z("z-index",n))return G.push(e),this.skip;if(z("font",n)){W.push(e);break}if(z("font-size",n)){Y.push(m(e));break}if(z("font-family",n)){X.push(m(e));break}if(z("transition",n)||z("animation",n)){Z.push(e.children);break}if(z("animation-duration",n)||z("transition-duration",n)){te.push(m(e));break}if(z("transition-timing-function",n)||z("animation-timing-function",n)){ee.push(m(e));break}z("text-shadow",n)?J.push(e):z("box-shadow",n)&&Q.push(e),t(e,function(e){switch(e.type){case"Hash":return ne.push("#"+e.value,n),this.skip;case"Identifier":{const{name:t}=e;return t.length>20||t.length<3||l[t.toLowerCase()]&&ne.push(m(e),n),this.skip}case"Function":if(i("var",e.name))return this.skip;c[e.name.toLowerCase()]&&ne.push(m(e),n)}});break}case"Declaration":{_++;const t=m(e);$.push(t),e.important&&(T++,this.atrule&&r("keyframes",this.atrule.name)&&B++);const{property:n}=e;E.push(n),x(n)?K.push(n):function(e){if(S(e)||x(e))return!1;let t=e.charCodeAt(0);return 47===t||95===t||43===t||42===t||38===t||36===t||35===t}(n)?H.push(n):S(n)&&L.push(n);break}}});const ge=C.count(),be=Object.keys(ge.unique).join("").length,ye=$.count(),we=fe.length,pe=oe.aggregate(),ke=le.aggregate(),xe=ce.aggregate(),ve=new u(fe).count(),Oe=re.count();return{stylesheet:{sourceLinesOfCode:F.length+we+_+U.size(),linesOfCode:f.length,size:n.length,comments:{total:y,size:p},embeddedContent:Object.assign(ge,{size:{total:be,ratio:0===n.length?0:be/n.length}})},atrules:q({atrules:F,stringifyNode:m}),rules:{total:V,empty:{total:A,ratio:0===V?0:A/V},selectors:Object.assign(P.aggregate(),{items:P.toArray()}),declarations:Object.assign(R.aggregate(),{items:R.toArray()})},selectors:{total:we,totalUnique:Oe,uniquenessRatio:0===we?0:Oe/we,specificity:{min:void 0===ae?[0,0,0]:ae,max:void 0===se?[0,0,0]:se,sum:[pe.sum,ke.sum,xe.sum],mean:[pe.mean,ke.mean,xe.mean],mode:[pe.mode,ke.mode,xe.mode],median:[pe.median,ke.median,xe.median],items:de},complexity:Object.assign(ue.aggregate(),ve,{items:fe}),id:Object.assign(he.count(),{ratio:0===we?0:he.size()/we}),accessibility:Object.assign(me.count(),{ratio:0===we?0:me.size()/we}),keyframes:U.count()},declarations:{total:_,unique:{total:ye,ratio:0===_?0:ye/_},importants:{total:T,ratio:0===_?0:T/_,inKeyframes:{total:B,ratio:0===T?0:B/T}}},properties:Object.assign(E.count(),{prefixed:Object.assign(K.count(),{ratio:0===E.size()?0:K.size()/E.size()}),custom:Object.assign(L.count(),{ratio:0===E.size()?0:L.size()/E.size()}),browserhacks:Object.assign(H.count(),{ratio:0===E.size()?0:H.size()/E.size()})}),values:{colors:ne.count(),fontFamilies:h({stringifyNode:m,fontValues:W,fontFamilyValues:X}),fontSizes:b({stringifyNode:m,fontValues:W,fontSizeValues:Y}),zindexes:w({values:G,stringifyNode:m}),textShadows:w({values:J,stringifyNode:m}),boxShadows:w({values:Q,stringifyNode:m}),animations:k({animations:Z,timingFunctions:ee,durations:te,stringifyNode:m}),prefixes:O({values:M,stringifyNode:m}),units:ie.count()},h:{parseTime:D-g,analyzeTime:new Date-D,total:new Date-d}}};export{D as analyze,a as compareSpecificity};
2
2
  //# sourceMappingURL=analyzer.modern.js.map