New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

css-patch

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

css-patch - npm Package Compare versions

Comparing version
1.1.2
to
1.2.0
+1
-1
dist/cjs/bundle.cjs

@@ -1,2 +0,2 @@

"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var diff=require("diff"),stylis=require("stylis");function findAtRuleBySelector(selector,rules){return rules.find((rule=>rule.value===selector))}function findDeclarationByKey(key,declarations){return declarations.find((declaration=>key===declaration.props))}function findRuleBySelector(selector,rules){return rules.find((rule=>rule.props.join(",")===selector))}function getAtRulesSelectors(rules){return rules.map((rule=>rule.value))}const typesMap={"@":"atRule",rule:"rule",comm:"comment",decl:"declaration",root:"root"};function getNodeType(el){var _typesMap$type;if(Array.isArray(el))return typesMap.root;const{type:type}=el;return type?null!==(_typesMap$type=typesMap[type])&&void 0!==_typesMap$type?_typesMap$type:type.startsWith("@")?typesMap["@"]:null:null}function getRulesSelectors(rules){return rules.map((rule=>rule.props.join(",")))}class CSSTransformerBase{static transform(el){return(new this).getTransformer(el)(el)}constructor(){}transformSubElements(elements,list,whitelist){return elements.forEach(((child,_i,_children)=>{list&&(whitelist&&!list.includes(getNodeType(child))||!whitelist&&list.includes(getNodeType(child)))||this.getTransformer(child)(child,_i,_children)}))}getTransformer(el){var _this$getNodeType$bin,_this$getNodeType,_this$getNodeType$bin2;return null!==(_this$getNodeType$bin=null===(_this$getNodeType=this[getNodeType(el)])||void 0===_this$getNodeType||null===(_this$getNodeType$bin2=_this$getNodeType.bind)||void 0===_this$getNodeType$bin2?void 0:_this$getNodeType$bin2.call(_this$getNodeType,this))&&void 0!==_this$getNodeType$bin?_this$getNodeType$bin:null}root(el,i,parentChildren,cb){const rootAnchor=Object.create(null);return el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)&&(child.parent=rootAnchor)})),this.transformSubElements(el)}atRule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}rule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}declaration(el,i,parentChildren,cb){}comment(el,i,parentChildren,cb){}}function compareValues(a,b){return a<b?-1:a>b?1:0}function nodesSorter(a,b){return"atRule"!==getNodeType(a)&&"atRule"===getNodeType(b)?1:"atRule"===getNodeType(a)?"atRule"===getNodeType(b)?compareValues(a.value,b.value):-1:"rule"!==getNodeType(a)&&"rule"===getNodeType(b)?1:"rule"===getNodeType(a)?"rule"===getNodeType(b)?compareValues(a.props.join(","),b.props.join(",")):-1:0}class SortAndMerge extends CSSTransformerBase{constructor(){super(),this.rulesMaps=new WeakMap,this.rootsMaps=new WeakMap}root(el,i,parentChildren,cb){let rootAnchor=Object.create(null);el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)?child.parent=rootAnchor:rootAnchor=child.parent})),this.transformSubElements(el);const{rootsMaps:rootsMaps}=this,root=rootsMaps.get(rootAnchor),rules="object"==typeof root?Object.keys(root):[];let _i=0;const droppedItems=[];el.forEach(((child,childIndex,_el)=>!["rule","atRule"].includes(getNodeType(child))||(rules[_i]?(_el[childIndex]=root[rules[_i]],_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.splice(el.indexOf(item),1))),el.sort(nodesSorter).map(((item,i)=>el[i]=item))}atRule(el,i,parentChildren,cb){this.rule(el,i,parentChildren,cb),this.root(el.children,i,parentChildren,cb)}rule(el,i,parentChildren,cb){const{rootsMaps:rootsMaps}=this,{parent:parent}=el,id="atRule"!==getNodeType(el)?el.props.join(","):el.value;rootsMaps.has(parent)||rootsMaps.set(parent,{});const root=rootsMaps.get(parent);root[id]&&root[id].children.forEach((child=>{child.parent=el,el.children.unshift(child)})),root[id]=el,"atRule"!==getNodeType(el)?this.transformSubElements(el.children):this.transformSubElements(el.children,["declaration"],!0);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;const droppedItems=[];el.children.forEach((child=>"declaration"!==getNodeType(child)||(declarations[_i]?(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.children.splice(el.children.indexOf(item),1)))}declaration(el,i,parentChildren,cb){const{rulesMaps:rulesMaps}=this,{parent:parent}=el;rulesMaps.has(parent)||rulesMaps.set(parent,{});rulesMaps.get(parent)[el.props]=el.children}}class Unset extends CSSTransformerBase{declaration(el,i,children,cb){el.children="unset",el.value=`${el.props}:${el.children};`}}class UpdateDeclarations extends CSSTransformerBase{declaration(el,i,children,cb){el.value=`${el.props}:${el.children};`}}var index=Object.freeze({__proto__:null,CSSTransformerBase:CSSTransformerBase,SortAndMerge:SortAndMerge,Unset:Unset,UpdateDeclarations:UpdateDeclarations});function normalize(ast){return SortAndMerge.transform(ast),ast}var index$1=Object.freeze({__proto__:null,getNodeType:getNodeType,findAtRuleBySelector:findAtRuleBySelector,findDeclarationByKey:findDeclarationByKey,findRuleBySelector:findRuleBySelector,getAtRulesSelectors:getAtRulesSelectors,getRulesSelectors:getRulesSelectors,normalize:normalize});function getDiffPartState(diffPart){return diffPart.added?1:diffPart.removed?-1:0}function diffAtRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"atRule"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((rules=>getAtRulesSelectors(rules).sort()))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findAtRuleBySelector(selector,state>0?expected:original):{original:findAtRuleBySelector(selector,original),expected:findAtRuleBySelector(selector,expected)},state:state}))))})),result}function diffDeclarations(originalRule,expectedRule){const[original,expected]=[originalRule,expectedRule].map((rule=>rule.children.filter((child=>"declaration"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((declarations=>declarations.map((declaration=>declaration.props))))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);result.push(...diffPart.value.map((key=>({declaration:0!==state?findDeclarationByKey(key,state>0?expected:original):{original:findDeclarationByKey(key,original),expected:findDeclarationByKey(key,expected)},state:state}))))})),result}function diffRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"rule"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((rules=>getRulesSelectors(rules).sort()))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findRuleBySelector(selector,state>0?expected:original):{original:findRuleBySelector(selector,original),expected:findRuleBySelector(selector,expected)},state:state}))))})),result}function transformDiffDeclarations(originalRule,expectedRule){return diffDeclarations(originalRule,expectedRule).map((({state:state,declaration:declaration})=>{switch(state){case-1:Unset.transform(findDeclarationByKey(declaration.props,originalRule.children));break;case 1:originalRule.children.push(declaration);break;case 0:{const{original:originalDeclaration,expected:expectedDeclaration}=declaration;originalDeclaration.children!==expectedDeclaration.children?(originalDeclaration.children=expectedDeclaration.children,UpdateDeclarations.transform(originalDeclaration)):originalRule.children.splice(originalRule.children.indexOf(originalDeclaration),1);break}}})),originalRule}function transformDiffRules(original,expected){const diff=diffRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>{result.push(0!==state?state<0?(Unset.transform(rule),rule):rule:transformDiffDeclarations(rule.original,rule.expected))})),result}function transformDiffAtRules(original,expected){const diff=diffAtRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>0!==state?result.push(state<0?(Unset.transform(rule),rule):rule):(transformDiffDeclarations(rule.original,rule.expected),transformDiffRules(rule.original.children,rule.expected.children),result.push(rule.original)))),result}var index$2=Object.freeze({__proto__:null,diffAtRules:diffAtRules,diffRules:diffRules,diffDeclarations:diffDeclarations,getDiffPartState:getDiffPartState,transformDiffRules:transformDiffRules,transformDiffAtRules:transformDiffAtRules,transformDiffDeclarations:transformDiffDeclarations});exports.AST=index$1,exports.CSSTransformers=index,exports.diff=index$2,exports.generateCSSPatch=function generateCSSPatch(original,expected){const ast=[original,expected].map((ast=>normalize(stylis.compile(stylis.serialize(stylis.compile(ast),stylis.stringify))))),result=[];return result.push(...transformDiffRules(ast[0],ast[1]),...transformDiffAtRules(ast[0],ast[1])),stylis.serialize(result,stylis.stringify)},exports.transformCSS=function transformCSS(css,transformer){const ast=stylis.compile(css);let result=transformer(ast);return stylis.serialize(result||ast,stylis.stringify)};
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var diff=require("diff"),stylis=require("stylis");function findAtRuleBySelector(selector,rules){return rules.find((rule=>rule.value===selector))}function findDeclarationByKey(key,declarations){return declarations.find((declaration=>key===declaration.props))}function findRuleBySelector(selector,rules){return rules.find((rule=>rule.props.join(",")===selector))}function getAtRulesSelectors(rules){return rules.map((rule=>rule.value))}const typesMap={"@":"atRule",rule:"rule",comm:"comment",decl:"declaration",root:"root"};function getNodeType(el){var _typesMap$type;if(Array.isArray(el))return typesMap.root;const{type:type}=el;return type?null!==(_typesMap$type=typesMap[type])&&void 0!==_typesMap$type?_typesMap$type:type.startsWith("@")?typesMap["@"]:null:null}function getRulesSelectors(rules){return rules.map((rule=>rule.props.join(",")))}class CSSTransformerBase{static transform(el){return(new this).getTransformer(el)(el)}constructor(){}transformSubElements(elements,list,whitelist){return elements.forEach(((child,_i,_children)=>{list&&(whitelist&&!list.includes(getNodeType(child))||!whitelist&&list.includes(getNodeType(child)))||this.getTransformer(child)(child,_i,_children)}))}getTransformer(el){var _this$getNodeType$bin,_this$getNodeType,_this$getNodeType$bin2;return null!==(_this$getNodeType$bin=null===(_this$getNodeType=this[getNodeType(el)])||void 0===_this$getNodeType||null===(_this$getNodeType$bin2=_this$getNodeType.bind)||void 0===_this$getNodeType$bin2?void 0:_this$getNodeType$bin2.call(_this$getNodeType,this))&&void 0!==_this$getNodeType$bin?_this$getNodeType$bin:null}root(el,i,parentChildren,cb){const rootAnchor=Object.create(null);return el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)&&(child.parent=rootAnchor)})),this.transformSubElements(el)}atRule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}rule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}declaration(el,i,parentChildren,cb){}comment(el,i,parentChildren,cb){}}function compareValues(a,b){return a<b?-1:a>b?1:0}function nodesSorter(a,b){return"atRule"!==getNodeType(a)&&"atRule"===getNodeType(b)?1:"atRule"===getNodeType(a)?"atRule"===getNodeType(b)?compareValues(a.value,b.value):-1:"rule"!==getNodeType(a)&&"rule"===getNodeType(b)?1:"rule"===getNodeType(a)?"rule"===getNodeType(b)?compareValues(a.props.join(","),b.props.join(",")):-1:0}class SortAndMerge extends CSSTransformerBase{constructor(){super(),this.rulesMaps=new WeakMap,this.rootsMaps=new WeakMap}root(el,i,parentChildren,cb){let rootAnchor=Object.create(null);el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)?child.parent=rootAnchor:rootAnchor=child.parent})),this.transformSubElements(el);const{rootsMaps:rootsMaps}=this,root=rootsMaps.get(rootAnchor),rules="object"==typeof root?Object.keys(root):[];let _i=0;const droppedItems=[];el.forEach(((child,childIndex,_el)=>!["rule","atRule"].includes(getNodeType(child))||(rules[_i]?(_el[childIndex]=root[rules[_i]],_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.splice(el.indexOf(item),1))),el.sort(nodesSorter).map(((item,i)=>el[i]=item))}atRule(el,i,parentChildren,cb){this.rule(el,i,parentChildren,cb),this.root(el.children,i,parentChildren,cb)}rule(el,i,parentChildren,cb){const{rootsMaps:rootsMaps}=this,{parent:parent}=el,id="atRule"!==getNodeType(el)?el.props.join(","):el.value;rootsMaps.has(parent)||rootsMaps.set(parent,{});const root=rootsMaps.get(parent);root[id]&&root[id].children.forEach((child=>{child.parent=el,el.children.unshift(child)})),root[id]=el,"atRule"!==getNodeType(el)?this.transformSubElements(el.children):this.transformSubElements(el.children,["declaration"],!0);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;const droppedItems=[];el.children.forEach((child=>"declaration"!==getNodeType(child)||(declarations[_i]?(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.children.splice(el.children.indexOf(item),1)))}declaration(el,i,parentChildren,cb){const{rulesMaps:rulesMaps}=this,{parent:parent}=el;rulesMaps.has(parent)||rulesMaps.set(parent,{});rulesMaps.get(parent)[el.props]=el.children}}class Unset extends CSSTransformerBase{declaration(el,i,children,cb){el.children="unset",el.value=`${el.props}:${el.children};`}}class UpdateDeclarations extends CSSTransformerBase{declaration(el,i,children,cb){el.value=`${el.props}:${el.children};`}}var index$2=Object.freeze({__proto__:null,CSSTransformerBase:CSSTransformerBase,SortAndMerge:SortAndMerge,Unset:Unset,UpdateDeclarations:UpdateDeclarations});function normalize(ast){return SortAndMerge.transform(ast),ast}var index$1=Object.freeze({__proto__:null,getNodeType:getNodeType,findAtRuleBySelector:findAtRuleBySelector,findDeclarationByKey:findDeclarationByKey,findRuleBySelector:findRuleBySelector,getAtRulesSelectors:getAtRulesSelectors,getRulesSelectors:getRulesSelectors,normalize:normalize});function getDiffPartState(diffPart){return diffPart.added?1:diffPart.removed?-1:0}function diffAtRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"atRule"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((rules=>getAtRulesSelectors(rules).sort()))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findAtRuleBySelector(selector,state>0?expected:original):{original:findAtRuleBySelector(selector,original),expected:findAtRuleBySelector(selector,expected)},state:state}))))})),result}function diffDeclarations(originalRule,expectedRule){const[original,expected]=[originalRule,expectedRule].map((rule=>rule.children.filter((child=>"declaration"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((declarations=>declarations.map((declaration=>declaration.props))))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);result.push(...diffPart.value.map((key=>({declaration:0!==state?findDeclarationByKey(key,state>0?expected:original):{original:findDeclarationByKey(key,original),expected:findDeclarationByKey(key,expected)},state:state}))))})),result}function diffRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"rule"===getNodeType(child))))),diff$1=diff.diffArrays(...[original,expected].map((rules=>getRulesSelectors(rules).sort()))),result=[];return diff$1.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findRuleBySelector(selector,state>0?expected:original):{original:findRuleBySelector(selector,original),expected:findRuleBySelector(selector,expected)},state:state}))))})),result}function transformDiffDeclarations(originalRule,expectedRule){return diffDeclarations(originalRule,expectedRule).map((({state:state,declaration:declaration})=>{switch(state){case-1:Unset.transform(findDeclarationByKey(declaration.props,originalRule.children));break;case 1:originalRule.children.push(declaration);break;case 0:{const{original:originalDeclaration,expected:expectedDeclaration}=declaration;originalDeclaration.children!==expectedDeclaration.children?(originalDeclaration.children=expectedDeclaration.children,UpdateDeclarations.transform(originalDeclaration)):originalRule.children.splice(originalRule.children.indexOf(originalDeclaration),1);break}}})),originalRule}function transformDiffRules(original,expected){const diff=diffRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>{result.push(0!==state?state<0?(Unset.transform(rule),rule):rule:transformDiffDeclarations(rule.original,rule.expected))})),result}function transformDiffAtRules(original,expected){const diff=diffAtRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>0!==state?result.push(state<0?(Unset.transform(rule),rule):rule):(transformDiffDeclarations(rule.original,rule.expected),transformDiffRules(rule.original.children,rule.expected.children),result.push(rule.original)))),result}var index=Object.freeze({__proto__:null,diffAtRules:diffAtRules,diffRules:diffRules,diffDeclarations:diffDeclarations,getDiffPartState:getDiffPartState,transformDiffRules:transformDiffRules,transformDiffAtRules:transformDiffAtRules,transformDiffDeclarations:transformDiffDeclarations});exports.AST=index$1,exports.CSSTransformers=index$2,exports.diff=index,exports.generateCSSPatch=function generateCSSPatch(original,expected){const ast=[original,expected].map((ast=>normalize(stylis.compile(stylis.serialize(stylis.compile(ast),stylis.stringify))))),result=[];return result.push(...transformDiffRules(ast[0],ast[1]),...transformDiffAtRules(ast[0],ast[1])),stylis.serialize(result,stylis.stringify)},exports.transformCSS=function transformCSS(css,transformer){const ast=stylis.compile(css);let result=transformer(ast);return stylis.serialize(result||ast,stylis.stringify)};
//# sourceMappingURL=bundle.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"bundle.cjs","sources":["../../src/AST/findAtRuleBySelector.js","../../src/AST/findDeclarationByKey.js","../../src/AST/findRuleBySelector.js","../../src/AST/getAtRulesSelectors.js","../../src/AST/getNodeType.js","../../src/AST/getRulesSelectors.js","../../src/CSSTransformers/CSSTransformerBase.js","../../src/CSSTransformers/SortAndMerge.js","../../src/CSSTransformers/Unset.js","../../src/CSSTransformers/UpdateDeclarations.js","../../src/AST/normalize.js","../../src/diff/getDiffPartState.js","../../src/diff/diffAtRules.js","../../src/diff/diffDeclarations.js","../../src/diff/diffRules.js","../../src/diff/transformDiffDeclarations.js","../../src/diff/transformDiffRules.js","../../src/diff/transformDiffAtRules.js","../../src/generateCSSPatch.js","../../src/transformCSS.js"],"sourcesContent":["import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find at rule object in list of at rules by given selector.\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {AtRule}\r\n */\r\nfunction findAtRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.value === selector);\r\n}\r\n\r\nexport default findAtRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find declaration object in list of declarations by given key.\r\n * @param {string} selector Declaration key.\r\n * @param {Declaration[]} declarations List of declarations.\r\n * @returns {Declaration}\r\n */\r\nfunction findDeclarationByKey(key, declarations) {\r\n\treturn declarations.find(declaration => key === declaration.props);\r\n}\r\n\r\nexport default findDeclarationByKey;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find rule object in list of rules by given selector.\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {Rule}\r\n */\r\nfunction findRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.props.join(',') === selector);\r\n}\r\n\r\nexport default findRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getAtRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.value);\r\n}\r\n\r\nexport default getAtRulesSelectors;\r\n","import './nodeTypes';\r\n\r\n\r\nconst typesMap = {\r\n\t'@' : 'atRule',\r\n\trule: 'rule',\r\n\tcomm: 'comment',\r\n\tdecl: 'declaration',\r\n\troot: 'root',\r\n};\r\n\r\n/**\r\n * Get node type.\r\n * @param {ASTNode|ASTNode[]} el Element.\r\n * @returns {?string} Node transformer name.\r\n */\r\nfunction getNodeType(el) {\r\n\tif (Array.isArray(el))\r\n\t\treturn typesMap.root;\r\n\r\n\tconst { type, } = el;\r\n\r\n\tif (!type)\r\n\t\treturn null;\r\n\r\n\treturn typesMap[type] ?? (type.startsWith('@')\r\n\t\t? typesMap['@']\r\n\t\t: null);\r\n}\r\n\r\nexport default getNodeType;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.props.join(','));\r\n}\r\n\r\nexport default getRulesSelectors;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\n\r\n/**\r\n * CSS AST transformer.\r\n * In order to apply this transformer use static `CSSTransformerBase.transform(el)`.\r\n * Advanced usage notes:\r\n * This is a base class for CSS AST transformer.\r\n * You can subclass this class to implement your transformer.\r\n * Just remember to call `this.transformSubElements(el.children)`\r\n * if you deal with multi-level items (roots, rules, at rules).\r\n */\r\nclass CSSTransformerBase {\r\n\t/**\r\n\t * Transform AST using this transformer.\r\n\t * @param {ASTNode | ASTNode[]} el Element.\r\n\t */\r\n\tstatic transform(el) {\r\n\t\treturn new this().getTransformer(el)(el);\r\n\t}\r\n\r\n\t/**\r\n\t * This is internal state initializer.\r\n\t * Use static `CSSTransformerBase.transform(el)` method instead.\r\n\t */\r\n\tconstructor() {}\r\n\r\n\t/**\r\n\t * Transform all (or with exclusions) provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t * @param {?string[]} list Blacklist or whitelist of types.\r\n\t * @param {?boolean} whitelist Whatever to use whitelist.\r\n\t */\r\n\ttransformSubElements(elements, list, whitelist) {\r\n\t\treturn elements.forEach((child, _i, _children) => {\r\n\t\t\tif (\r\n\t\t\t\tlist && (\r\n\t\t\t\t\t(whitelist && !list.includes(getNodeType(child))) ||\r\n\t\t\t\t\t(!whitelist && list.includes(getNodeType(child)))\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\treturn;\r\n\t\t\tthis.getTransformer(child)(child, _i, _children);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Get node transformer.\r\n\t * @param {ASTNode} el Element.\r\n\t * @returns {Function} Node transformer.\r\n\t */\r\n\tgetTransformer(el) {\r\n\t\treturn this[getNodeType(el)]?.bind?.(this) ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t});\r\n\r\n\t\treturn this.transformSubElements(el);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Comment transformer.\r\n\t * @param {Comment} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tcomment(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default CSSTransformerBase;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Compare values.\r\n * @param {any} a Value A.\r\n * @param {any} b Value B.\r\n * @returns {number}\r\n */\r\nfunction compareValues(a, b) {\r\n\treturn a < b\r\n\t\t? -1\r\n\t\t: a > b\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n}\r\n\r\n/**\r\n * Compare nodes.\r\n * Higher means closer to the start.\r\n * Sorting rule is simple: atRule > rule > anything else.\r\n * Same typed nodes are sorted in alphabetic order.\r\n * @param {ASTNode} a Node A.\r\n * @param {ASTNode} b Node B.\r\n * @returns {number}\r\n */\r\nfunction nodesSorter(a, b) {\r\n\tif ('atRule' !== getNodeType(a) && 'atRule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('atRule' === getNodeType(a)) {\r\n\t\tif ('atRule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.value, b.value);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tif ('rule' !== getNodeType(a) && 'rule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('rule' === getNodeType(a)) {\r\n\t\tif ('rule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.props.join(','), b.props.join(','));\r\n\t\treturn -1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * Merge duplicate declarations. For duplicated identifies last one would be used.\r\n * In order to apply this transformer use static `SortAndMerge.transform(el)`.\r\n */\r\nclass SortAndMerge extends CSSTransformerBase {\r\n\t/**\r\n\t * This is internal state initializer.\r\n\t * Use static `SortAndMerge.transform(el)` method instead.\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.rulesMaps = new WeakMap();\r\n\t\tthis.rootsMaps = new WeakMap();\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tlet rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t\telse\r\n\t\t\t\trootAnchor = child.parent;\r\n\t\t});\r\n\r\n\t\tthis.transformSubElements(el);\r\n\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\troot = rootsMaps.get(rootAnchor),\r\n\t\t\trules = 'object' === typeof root\r\n\t\t\t\t? Object.keys(root)\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.forEach((child, childIndex, _el) => {\r\n\t\t\tif ([ 'rule', 'atRule', ].includes(getNodeType(child))) {\r\n\t\t\t\tif (rules[_i]) {\r\n\t\t\t\t\t_el[childIndex] = root[rules[_i]];\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.splice(el.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\tel.sort(nodesSorter).map((item, i) => el[i] = item);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tthis.rule(el, i, parentChildren, cb);\r\n\t\tthis.root(el.children, i, parentChildren, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\t{ parent, } = el,\r\n\t\t\tid = 'atRule' !== getNodeType(el)\r\n\t\t\t\t? el.props.join(',')\r\n\t\t\t\t: el.value;\r\n\r\n\t\tif (!rootsMaps.has(parent))\r\n\t\t\trootsMaps.set(parent, {});\r\n\r\n\t\tconst root = rootsMaps.get(parent);\r\n\r\n\t\tif (root[id])\r\n\t\t\troot[id].children.forEach(child => {\r\n\t\t\t\tchild.parent = el;\r\n\t\t\t\tel.children.unshift(child);\r\n\t\t\t});\r\n\r\n\t\troot[id] = el;\r\n\r\n\t\tif ('atRule' !== getNodeType(el))\r\n\t\t\tthis.transformSubElements(el.children);\r\n\t\telse\r\n\t\t\tthis.transformSubElements(el.children, [ 'declaration', ], true);\r\n\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\trule = rulesMaps.get(el),\r\n\t\t\tdeclarations = 'object' === typeof rule\r\n\t\t\t\t? Object.keys(rule).sort()\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.children.forEach(child => {\r\n\t\t\tif ('declaration' === getNodeType(child)) {\r\n\t\t\t\tif (declarations[_i]) {\r\n\t\t\t\t\tchild.props = declarations[_i];\r\n\t\t\t\t\tchild.children = rule[declarations[_i]];\r\n\t\t\t\t\tchild.value = `${child.props}:${child.children};`;\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.children.splice(el.children.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\treturn;\r\n\t}\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\t{ parent, } = el;\r\n\r\n\t\tif (!rulesMaps.has(parent))\r\n\t\t\trulesMaps.set(parent, {});\r\n\r\n\t\tconst rule = rulesMaps.get(parent);\r\n\r\n\t\trule[el.props] = el.children;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default SortAndMerge;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Unset all declarations.\r\n * In order to apply this transformer use static `Unset.transform(el)`.\r\n */\r\nclass Unset extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.children = 'unset';\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default Unset;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Update all declarations.\r\n * In order to apply this transformer use static `UpdateDeclarations.transform(el)`.\r\n */\r\nclass UpdateDeclarations extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default UpdateDeclarations;\r\n","import { SortAndMerge, } from '../CSSTransformers';\r\n\r\n\r\n/**\r\n * Sort declarations and merge equal rules in order they appear.\r\n * @param {stylis.Element[]} ast\r\n */\r\nfunction normalize(ast) {\r\n\tSortAndMerge.transform(ast);\r\n\treturn ast;\r\n}\r\n\r\nexport default normalize;\r\n","import 'diff';\r\n\r\n\r\n/**\r\n * Get numeric state of a diff part.\r\n * @param {Diff.ArrayChange.<any>} diffPart Diff part.\r\n * @returns {number}\r\n */\r\nfunction getDiffPartState(diffPart) {\r\n\treturn diffPart.added\r\n\t\t? 1\r\n\t\t: diffPart.removed\r\n\t\t\t? -1\r\n\t\t\t: 0;\r\n}\r\n\r\nexport default getDiffPartState;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindAtRuleBySelector,\r\n\tgetAtRulesSelectors,\r\n\tgetNodeType,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare at rules between lists of AST nodes.\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffAtRules(originalNodes, expectedNodes) {\r\n\t/** @type {AtRule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'atRule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getAtRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findAtRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findAtRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findAtRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffAtRules;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport { findDeclarationByKey, getNodeType, } from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare declarations between rules.\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n */\r\nfunction diffDeclarations(originalRule, expectedRule) {\r\n\t/** @type {Declaration[][]} */\r\n\tconst [ original, expected, ] = [ originalRule, expectedRule, ].map(\r\n\t\trule => rule.children.filter(\r\n\t\t\tchild => 'declaration' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\tdeclarations => declarations.map(\r\n\t\t\t\t\tdeclaration => declaration.props\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\tresult.push(\r\n\t\t\t...diffPart.value.map(key => ({\r\n\t\t\t\tdeclaration: 0 !== state\r\n\t\t\t\t\t? findDeclarationByKey(\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findDeclarationByKey(key, original),\r\n\t\t\t\t\t\texpected: findDeclarationByKey(key, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t\treturn;\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffDeclarations;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindRuleBySelector,\r\n\tgetNodeType,\r\n\tgetRulesSelectors,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare rules between lists of AST nodes.\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffRules(originalNodes, expectedNodes) {\r\n\t/** @type {Rule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'rule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffRules;\r\n","import findDeclarationByKey from '../AST/findDeclarationByKey';\r\nimport { Unset, UpdateDeclarations, } from '../CSSTransformers';\r\n\r\nimport diffDeclarations from './diffDeclarations';\r\n\r\n\r\n/**\r\n * Compare declarations between rules and apply diff transformation.\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n * @returns {Rule}\r\n */\r\nfunction transformDiffDeclarations(originalRule, expectedRule) {\r\n\tconst diff = diffDeclarations(originalRule, expectedRule);\r\n\r\n\tdiff.map(({ state, declaration, }) => {\r\n\t\tswitch (state) {\r\n\t\t\tcase -1:\r\n\t\t\t\tUnset.transform(\r\n\t\t\t\t\tfindDeclarationByKey(\r\n\t\t\t\t\t\tdeclaration.props, originalRule.children\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\toriginalRule.children.push(declaration);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0: {\r\n\t\t\t\tconst { original: originalDeclaration, expected: expectedDeclaration, } = declaration;\r\n\r\n\t\t\t\tif (originalDeclaration.children !== expectedDeclaration.children) {\r\n\t\t\t\t\toriginalDeclaration.children = expectedDeclaration.children;\r\n\t\t\t\t\tUpdateDeclarations.transform(originalDeclaration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\toriginalRule.children.splice(originalRule.children.indexOf(originalDeclaration), 1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn originalRule;\r\n}\r\n\r\nexport default transformDiffDeclarations;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffRules from './diffRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\n\r\n\r\n/**\r\n * Compare rules and apply diff transformation.\r\n * @param {Rule[]} original Original rules set.\r\n * @param {Rule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffRules(original, expected) {\r\n\tconst diff = diffRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tresult.push(\r\n\t\t\t0 !== state\r\n\t\t\t\t? state < 0\r\n\t\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t\t: rule\r\n\t\t\t\t: transformDiffDeclarations(rule.original, rule.expected)\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffRules;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffAtRules from './diffAtRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\nimport transformDiffRules from './transformDiffRules';\r\n\r\n/**\r\n * Compare at rules and apply diff transformation.\r\n * @param {AtRule[]} original Original rules set.\r\n * @param {AtRule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffAtRules(original, expected) {\r\n\tconst diff = diffAtRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tif (0 !== state) return result.push(\r\n\t\t\tstate < 0\r\n\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t: rule\r\n\t\t);\r\n\r\n\t\ttransformDiffDeclarations(rule.original, rule.expected);\r\n\t\ttransformDiffRules(rule.original.children, rule.expected.children);\r\n\r\n\t\treturn result.push(rule.original);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffAtRules;\r\n","import './AST/nodeTypes';\r\nimport { compile, serialize, stringify, } from 'stylis';\r\n\r\nimport { normalize, } from './AST';\r\nimport { transformDiffRules, transformDiffAtRules, } from './diff';\r\n\r\n\r\n/**\r\n * Generate CSS difference patch between two CSS stylesheets.\r\n * @param {string} original Original CSS stylesheet.\r\n * @param {string} expected Desired CSS stylesheet.\r\n * @returns {string} CSS patch difference.\r\n */\r\nfunction generateCSSPatch(original, expected) {\r\n\tconst ast = [\r\n\t\t\toriginal,\r\n\t\t\texpected,\r\n\t\t].map(ast => normalize(\r\n\t\t\tcompile(\r\n\t\t\t\tserialize(\r\n\t\t\t\t\tcompile(ast),\r\n\t\t\t\t\tstringify\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)),\r\n\t\tresult = [];\r\n\r\n\tresult.push(...[\r\n\t\t...transformDiffRules(ast[0], ast[1]),\r\n\t\t...transformDiffAtRules(ast[0], ast[1]),\r\n\t]);\r\n\r\n\treturn serialize(result, stringify);\r\n}\r\n\r\nexport default generateCSSPatch;\r\n","import { compile, serialize, stringify, } from 'stylis';\r\n\r\n\r\n/**\r\n * Apply transformations to CSS AST.\r\n * Transformer function can ether return AST or falsy value\r\n * (if transformations was applied to the original AST).\r\n * @param {string} css Stylesheet to transform.\r\n * @param {Function} transformer Transformer function.\r\n * @returns {string} Transformed stylesheet.\r\n */\r\nfunction transformCSS(css, transformer) {\r\n\tconst ast = compile(css);\r\n\r\n\tlet result = transformer(ast);\r\n\r\n\treturn serialize(\r\n\t\tresult || ast,\r\n\t\tstringify\r\n\t);\r\n}\r\n\r\nexport default transformCSS;\r\n"],"names":["findAtRuleBySelector","selector","rules","find","rule","value","findDeclarationByKey","key","declarations","declaration","props","findRuleBySelector","join","getAtRulesSelectors","map","typesMap","comm","decl","root","getNodeType","el","Array","isArray","type","startsWith","getRulesSelectors","CSSTransformerBase","this","getTransformer","constructor","transformSubElements","elements","list","whitelist","forEach","child","_i","_children","includes","_this$getNodeType","bind","_this$getNodeType$bin2","i","parentChildren","cb","rootAnchor","Object","create","parent","atRule","children","comment","compareValues","a","b","nodesSorter","SortAndMerge","rulesMaps","WeakMap","rootsMaps","get","keys","droppedItems","childIndex","_el","push","item","splice","indexOf","sort","id","has","set","unshift","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","filter","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify","transformCSS","css","transformer"],"mappings":"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"}
{"version":3,"file":"bundle.cjs","sources":["../../src/AST/findAtRuleBySelector.js","../../src/AST/findDeclarationByKey.js","../../src/AST/findRuleBySelector.js","../../src/AST/getAtRulesSelectors.js","../../src/AST/getNodeType.js","../../src/AST/getRulesSelectors.js","../../src/CSSTransformers/CSSTransformerBase.js","../../src/CSSTransformers/SortAndMerge.js","../../src/CSSTransformers/Unset.js","../../src/CSSTransformers/UpdateDeclarations.js","../../src/AST/normalize.js","../../src/diff/getDiffPartState.js","../../src/diff/diffAtRules.js","../../src/diff/diffDeclarations.js","../../src/diff/diffRules.js","../../src/diff/transformDiffDeclarations.js","../../src/diff/transformDiffRules.js","../../src/diff/transformDiffAtRules.js","../../src/generateCSSPatch.js","../../src/transformCSS.js"],"sourcesContent":["import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find at rule object in list of at rules by given selector.\r\n * @memberof AST\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {AtRule}\r\n */\r\nfunction findAtRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.value === selector);\r\n}\r\n\r\nexport default findAtRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find declaration object in list of declarations by given key.\r\n * @memberof AST\r\n * @param {string} selector Declaration key.\r\n * @param {Declaration[]} declarations List of declarations.\r\n * @returns {Declaration}\r\n */\r\nfunction findDeclarationByKey(key, declarations) {\r\n\treturn declarations.find(declaration => key === declaration.props);\r\n}\r\n\r\nexport default findDeclarationByKey;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find rule object in list of rules by given selector.\r\n * @memberof AST\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {Rule}\r\n */\r\nfunction findRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.props.join(',') === selector);\r\n}\r\n\r\nexport default findRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @memberof AST\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getAtRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.value);\r\n}\r\n\r\nexport default getAtRulesSelectors;\r\n","import './nodeTypes';\r\n\r\n\r\nconst typesMap = {\r\n\t'@' : 'atRule',\r\n\trule: 'rule',\r\n\tcomm: 'comment',\r\n\tdecl: 'declaration',\r\n\troot: 'root',\r\n};\r\n\r\n/**\r\n * Get node type.\r\n * @memberof AST\r\n * @param {ASTNode|ASTNode[]} el Element.\r\n * @returns {?string} Node transformer name.\r\n */\r\nfunction getNodeType(el) {\r\n\tif (Array.isArray(el))\r\n\t\treturn typesMap.root;\r\n\r\n\tconst { type, } = el;\r\n\r\n\tif (!type)\r\n\t\treturn null;\r\n\r\n\treturn typesMap[type] ?? (type.startsWith('@')\r\n\t\t? typesMap['@']\r\n\t\t: null);\r\n}\r\n\r\nexport default getNodeType;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @memberof AST\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.props.join(','));\r\n}\r\n\r\nexport default getRulesSelectors;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\n\r\n/**\r\n * CSS AST transformer.\r\n * To apply this transformer call `CSSTransformerBase.transform(el)`.\r\n * Base class for CSS AST transformer.\r\n * Advanced usage notes:\r\n * You can subclass it to implement your own transformer.\r\n * Just remember to call `this.transformSubElements(el.children)` if you deal\r\n * with multi-level items (roots, rules, at rules).\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass CSSTransformerBase {\r\n\t/**\r\n\t * Transform AST using this transformer.\r\n\t * @param {ASTNode | ASTNode[]} el Element.\r\n\t */\r\n\tstatic transform(el) {\r\n\t\treturn new this().getTransformer(el)(el);\r\n\t}\r\n\r\n\t/**\r\n\t * Internal state initializer.\r\n\t * To apply transformer use `CSSTransformerBase.transform(el)` instead.\r\n\t */\r\n\tconstructor() {}\r\n\r\n\t/**\r\n\t * Transform all (or with exclusions) provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t * @param {?string[]} list Blacklist or whitelist of types.\r\n\t * @param {?boolean} whitelist Whether list is whitelist or blacklist.\r\n\t */\r\n\ttransformSubElements(elements, list, whitelist) {\r\n\t\treturn elements.forEach((child, _i, _children) => {\r\n\t\t\tif (\r\n\t\t\t\tlist && (\r\n\t\t\t\t\t(whitelist && !list.includes(getNodeType(child))) ||\r\n\t\t\t\t\t(!whitelist && list.includes(getNodeType(child)))\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\treturn;\r\n\t\t\tthis.getTransformer(child)(child, _i, _children);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Get node transformer.\r\n\t * @param {ASTNode} el Element.\r\n\t * @returns {Function} Node transformer.\r\n\t */\r\n\tgetTransformer(el) {\r\n\t\treturn this[getNodeType(el)]?.bind?.(this) ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t});\r\n\r\n\t\treturn this.transformSubElements(el);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Comment transformer.\r\n\t * @param {Comment} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tcomment(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default CSSTransformerBase;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Compare values.\r\n * @memberof CSSTransformers\r\n * @param {any} a Value A.\r\n * @param {any} b Value B.\r\n * @returns {number}\r\n */\r\nfunction compareValues(a, b) {\r\n\treturn a < b\r\n\t\t? -1\r\n\t\t: a > b\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n}\r\n\r\n/**\r\n * Compare nodes.\r\n * Higher means closer to the start.\r\n * Sorting rule is simple: atRule > rule > anything else.\r\n * Same typed nodes are sorted in alphabetic order.\r\n * @memberof CSSTransformers\r\n * @param {ASTNode} a Node A.\r\n * @param {ASTNode} b Node B.\r\n * @returns {number}\r\n */\r\nfunction nodesSorter(a, b) {\r\n\tif ('atRule' !== getNodeType(a) && 'atRule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('atRule' === getNodeType(a)) {\r\n\t\tif ('atRule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.value, b.value);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tif ('rule' !== getNodeType(a) && 'rule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('rule' === getNodeType(a)) {\r\n\t\tif ('rule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.props.join(','), b.props.join(','));\r\n\t\treturn -1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * Merge duplicate declarations. For duplicated identifies last one would be used.\r\n * To apply this transformer call `SortAndMerge.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass SortAndMerge extends CSSTransformerBase {\r\n\t/**\r\n\t * Internal state initializer.\r\n\t * To apply transformer use `SortAndMerge.transform(el)` instead.\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.rulesMaps = new WeakMap();\r\n\t\tthis.rootsMaps = new WeakMap();\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tlet rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t\telse\r\n\t\t\t\trootAnchor = child.parent;\r\n\t\t});\r\n\r\n\t\tthis.transformSubElements(el);\r\n\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\troot = rootsMaps.get(rootAnchor),\r\n\t\t\trules = 'object' === typeof root\r\n\t\t\t\t? Object.keys(root)\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.forEach((child, childIndex, _el) => {\r\n\t\t\tif ([ 'rule', 'atRule', ].includes(getNodeType(child))) {\r\n\t\t\t\tif (rules[_i]) {\r\n\t\t\t\t\t_el[childIndex] = root[rules[_i]];\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.splice(el.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\tel.sort(nodesSorter).map((item, i) => el[i] = item);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tthis.rule(el, i, parentChildren, cb);\r\n\t\tthis.root(el.children, i, parentChildren, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\t{ parent, } = el,\r\n\t\t\tid = 'atRule' !== getNodeType(el)\r\n\t\t\t\t? el.props.join(',')\r\n\t\t\t\t: el.value;\r\n\r\n\t\tif (!rootsMaps.has(parent))\r\n\t\t\trootsMaps.set(parent, {});\r\n\r\n\t\tconst root = rootsMaps.get(parent);\r\n\r\n\t\tif (root[id])\r\n\t\t\troot[id].children.forEach(child => {\r\n\t\t\t\tchild.parent = el;\r\n\t\t\t\tel.children.unshift(child);\r\n\t\t\t});\r\n\r\n\t\troot[id] = el;\r\n\r\n\t\tif ('atRule' !== getNodeType(el))\r\n\t\t\tthis.transformSubElements(el.children);\r\n\t\telse\r\n\t\t\tthis.transformSubElements(el.children, [ 'declaration', ], true);\r\n\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\trule = rulesMaps.get(el),\r\n\t\t\tdeclarations = 'object' === typeof rule\r\n\t\t\t\t? Object.keys(rule).sort()\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.children.forEach(child => {\r\n\t\t\tif ('declaration' === getNodeType(child)) {\r\n\t\t\t\tif (declarations[_i]) {\r\n\t\t\t\t\tchild.props = declarations[_i];\r\n\t\t\t\t\tchild.children = rule[declarations[_i]];\r\n\t\t\t\t\tchild.value = `${child.props}:${child.children};`;\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.children.splice(el.children.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\treturn;\r\n\t}\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\t{ parent, } = el;\r\n\r\n\t\tif (!rulesMaps.has(parent))\r\n\t\t\trulesMaps.set(parent, {});\r\n\r\n\t\tconst rule = rulesMaps.get(parent);\r\n\r\n\t\trule[el.props] = el.children;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default SortAndMerge;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Unset all declarations.\r\n * To apply this transformer call `Unset.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass Unset extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.children = 'unset';\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default Unset;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Update all declarations.\r\n * To apply this transformer call `UpdateDeclarations.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass UpdateDeclarations extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default UpdateDeclarations;\r\n","import { SortAndMerge, } from '../CSSTransformers';\r\n\r\n\r\n/**\r\n * Sort declarations and merge equal rules in order they appear.\r\n * @memberof AST\r\n * @param {stylis.Element[]} ast\r\n */\r\nfunction normalize(ast) {\r\n\tSortAndMerge.transform(ast);\r\n\treturn ast;\r\n}\r\n\r\nexport default normalize;\r\n","import 'diff';\r\n\r\n\r\n/**\r\n * Get numeric state of a diff part.\r\n * @memberof diff\r\n * @param {Diff.ArrayChange.<any>} diffPart Diff part.\r\n * @returns {number}\r\n */\r\nfunction getDiffPartState(diffPart) {\r\n\treturn diffPart.added\r\n\t\t? 1\r\n\t\t: diffPart.removed\r\n\t\t\t? -1\r\n\t\t\t: 0;\r\n}\r\n\r\nexport default getDiffPartState;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindAtRuleBySelector,\r\n\tgetAtRulesSelectors,\r\n\tgetNodeType,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare at rules between lists of AST nodes.\r\n * @memberof diff\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffAtRules(originalNodes, expectedNodes) {\r\n\t/** @type {AtRule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'atRule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getAtRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findAtRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findAtRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findAtRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffAtRules;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport { findDeclarationByKey, getNodeType, } from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare declarations between rules.\r\n * @memberof diff\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n */\r\nfunction diffDeclarations(originalRule, expectedRule) {\r\n\t/** @type {Declaration[][]} */\r\n\tconst [ original, expected, ] = [ originalRule, expectedRule, ].map(\r\n\t\trule => rule.children.filter(\r\n\t\t\tchild => 'declaration' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\tdeclarations => declarations.map(\r\n\t\t\t\t\tdeclaration => declaration.props\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\tresult.push(\r\n\t\t\t...diffPart.value.map(key => ({\r\n\t\t\t\tdeclaration: 0 !== state\r\n\t\t\t\t\t? findDeclarationByKey(\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findDeclarationByKey(key, original),\r\n\t\t\t\t\t\texpected: findDeclarationByKey(key, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t\treturn;\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffDeclarations;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindRuleBySelector,\r\n\tgetNodeType,\r\n\tgetRulesSelectors,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare rules between lists of AST nodes.\r\n * @memberof diff\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffRules(originalNodes, expectedNodes) {\r\n\t/** @type {Rule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'rule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffRules;\r\n","import findDeclarationByKey from '../AST/findDeclarationByKey';\r\nimport { Unset, UpdateDeclarations, } from '../CSSTransformers';\r\n\r\nimport diffDeclarations from './diffDeclarations';\r\n\r\n\r\n/**\r\n * Compare declarations between rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n * @returns {Rule}\r\n */\r\nfunction transformDiffDeclarations(originalRule, expectedRule) {\r\n\tconst diff = diffDeclarations(originalRule, expectedRule);\r\n\r\n\tdiff.map(({ state, declaration, }) => {\r\n\t\tswitch (state) {\r\n\t\t\tcase -1:\r\n\t\t\t\tUnset.transform(\r\n\t\t\t\t\tfindDeclarationByKey(\r\n\t\t\t\t\t\tdeclaration.props, originalRule.children\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\toriginalRule.children.push(declaration);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0: {\r\n\t\t\t\tconst { original: originalDeclaration, expected: expectedDeclaration, } = declaration;\r\n\r\n\t\t\t\tif (originalDeclaration.children !== expectedDeclaration.children) {\r\n\t\t\t\t\toriginalDeclaration.children = expectedDeclaration.children;\r\n\t\t\t\t\tUpdateDeclarations.transform(originalDeclaration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\toriginalRule.children.splice(originalRule.children.indexOf(originalDeclaration), 1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn originalRule;\r\n}\r\n\r\nexport default transformDiffDeclarations;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffRules from './diffRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\n\r\n\r\n/**\r\n * Compare rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {Rule[]} original Original rules set.\r\n * @param {Rule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffRules(original, expected) {\r\n\tconst diff = diffRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tresult.push(\r\n\t\t\t0 !== state\r\n\t\t\t\t? state < 0\r\n\t\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t\t: rule\r\n\t\t\t\t: transformDiffDeclarations(rule.original, rule.expected)\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffRules;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffAtRules from './diffAtRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\nimport transformDiffRules from './transformDiffRules';\r\n\r\n/**\r\n * Compare at rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {AtRule[]} original Original rules set.\r\n * @param {AtRule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffAtRules(original, expected) {\r\n\tconst diff = diffAtRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tif (0 !== state) return result.push(\r\n\t\t\tstate < 0\r\n\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t: rule\r\n\t\t);\r\n\r\n\t\ttransformDiffDeclarations(rule.original, rule.expected);\r\n\t\ttransformDiffRules(rule.original.children, rule.expected.children);\r\n\r\n\t\treturn result.push(rule.original);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffAtRules;\r\n","import './AST/nodeTypes';\r\nimport { compile, serialize, stringify, } from 'stylis';\r\n\r\nimport { normalize, } from './AST';\r\nimport { transformDiffRules, transformDiffAtRules, } from './diff';\r\n\r\n\r\n/**\r\n * Generate CSS difference patch between two CSS stylesheets.\r\n * @param {string} original Original CSS stylesheet.\r\n * @param {string} expected Desired CSS stylesheet.\r\n * @returns {string} CSS patch difference.\r\n */\r\nfunction generateCSSPatch(original, expected) {\r\n\tconst ast = [\r\n\t\t\toriginal,\r\n\t\t\texpected,\r\n\t\t].map(ast => normalize(\r\n\t\t\tcompile(\r\n\t\t\t\tserialize(\r\n\t\t\t\t\tcompile(ast),\r\n\t\t\t\t\tstringify\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)),\r\n\t\tresult = [];\r\n\r\n\tresult.push(...[\r\n\t\t...transformDiffRules(ast[0], ast[1]),\r\n\t\t...transformDiffAtRules(ast[0], ast[1]),\r\n\t]);\r\n\r\n\treturn serialize(result, stringify);\r\n}\r\n\r\nexport default generateCSSPatch;\r\n","import { compile, serialize, stringify, } from 'stylis';\r\n\r\n\r\n/**\r\n * Apply transformations to CSS AST.\r\n * Transformer function can ether return AST or falsy value\r\n * (if transformations was applied to the original AST).\r\n * @param {string} css Stylesheet to transform.\r\n * @param {Function} transformer Transformer function.\r\n * @returns {string} Transformed stylesheet.\r\n */\r\nfunction transformCSS(css, transformer) {\r\n\tconst ast = compile(css);\r\n\r\n\tlet result = transformer(ast);\r\n\r\n\treturn serialize(\r\n\t\tresult || ast,\r\n\t\tstringify\r\n\t);\r\n}\r\n\r\nexport default transformCSS;\r\n"],"names":["findAtRuleBySelector","selector","rules","find","rule","value","findDeclarationByKey","key","declarations","declaration","props","findRuleBySelector","join","getAtRulesSelectors","map","typesMap","comm","decl","root","getNodeType","el","Array","isArray","type","startsWith","getRulesSelectors","CSSTransformerBase","this","getTransformer","constructor","transformSubElements","elements","list","whitelist","forEach","child","_i","_children","includes","_this$getNodeType","bind","_this$getNodeType$bin2","i","parentChildren","cb","rootAnchor","Object","create","parent","atRule","children","comment","compareValues","a","b","nodesSorter","SortAndMerge","rulesMaps","WeakMap","rootsMaps","get","keys","droppedItems","childIndex","_el","push","item","splice","indexOf","sort","id","has","set","unshift","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","filter","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify","transformCSS","css","transformer"],"mappings":"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"}

@@ -1,2 +0,2 @@

import{diffArrays}from"diff";import{compile,serialize,stringify}from"stylis";function findAtRuleBySelector(selector,rules){return rules.find((rule=>rule.value===selector))}function findDeclarationByKey(key,declarations){return declarations.find((declaration=>key===declaration.props))}function findRuleBySelector(selector,rules){return rules.find((rule=>rule.props.join(",")===selector))}function getAtRulesSelectors(rules){return rules.map((rule=>rule.value))}const typesMap={"@":"atRule",rule:"rule",comm:"comment",decl:"declaration",root:"root"};function getNodeType(el){var _typesMap$type;if(Array.isArray(el))return typesMap.root;const{type:type}=el;return type?null!==(_typesMap$type=typesMap[type])&&void 0!==_typesMap$type?_typesMap$type:type.startsWith("@")?typesMap["@"]:null:null}function getRulesSelectors(rules){return rules.map((rule=>rule.props.join(",")))}class CSSTransformerBase{static transform(el){return(new this).getTransformer(el)(el)}constructor(){}transformSubElements(elements,list,whitelist){return elements.forEach(((child,_i,_children)=>{list&&(whitelist&&!list.includes(getNodeType(child))||!whitelist&&list.includes(getNodeType(child)))||this.getTransformer(child)(child,_i,_children)}))}getTransformer(el){var _this$getNodeType$bin,_this$getNodeType,_this$getNodeType$bin2;return null!==(_this$getNodeType$bin=null===(_this$getNodeType=this[getNodeType(el)])||void 0===_this$getNodeType||null===(_this$getNodeType$bin2=_this$getNodeType.bind)||void 0===_this$getNodeType$bin2?void 0:_this$getNodeType$bin2.call(_this$getNodeType,this))&&void 0!==_this$getNodeType$bin?_this$getNodeType$bin:null}root(el,i,parentChildren,cb){const rootAnchor=Object.create(null);return el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)&&(child.parent=rootAnchor)})),this.transformSubElements(el)}atRule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}rule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}declaration(el,i,parentChildren,cb){}comment(el,i,parentChildren,cb){}}function compareValues(a,b){return a<b?-1:a>b?1:0}function nodesSorter(a,b){return"atRule"!==getNodeType(a)&&"atRule"===getNodeType(b)?1:"atRule"===getNodeType(a)?"atRule"===getNodeType(b)?compareValues(a.value,b.value):-1:"rule"!==getNodeType(a)&&"rule"===getNodeType(b)?1:"rule"===getNodeType(a)?"rule"===getNodeType(b)?compareValues(a.props.join(","),b.props.join(",")):-1:0}class SortAndMerge extends CSSTransformerBase{constructor(){super(),this.rulesMaps=new WeakMap,this.rootsMaps=new WeakMap}root(el,i,parentChildren,cb){let rootAnchor=Object.create(null);el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)?child.parent=rootAnchor:rootAnchor=child.parent})),this.transformSubElements(el);const{rootsMaps:rootsMaps}=this,root=rootsMaps.get(rootAnchor),rules="object"==typeof root?Object.keys(root):[];let _i=0;const droppedItems=[];el.forEach(((child,childIndex,_el)=>!["rule","atRule"].includes(getNodeType(child))||(rules[_i]?(_el[childIndex]=root[rules[_i]],_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.splice(el.indexOf(item),1))),el.sort(nodesSorter).map(((item,i)=>el[i]=item))}atRule(el,i,parentChildren,cb){this.rule(el,i,parentChildren,cb),this.root(el.children,i,parentChildren,cb)}rule(el,i,parentChildren,cb){const{rootsMaps:rootsMaps}=this,{parent:parent}=el,id="atRule"!==getNodeType(el)?el.props.join(","):el.value;rootsMaps.has(parent)||rootsMaps.set(parent,{});const root=rootsMaps.get(parent);root[id]&&root[id].children.forEach((child=>{child.parent=el,el.children.unshift(child)})),root[id]=el,"atRule"!==getNodeType(el)?this.transformSubElements(el.children):this.transformSubElements(el.children,["declaration"],!0);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;const droppedItems=[];el.children.forEach((child=>"declaration"!==getNodeType(child)||(declarations[_i]?(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.children.splice(el.children.indexOf(item),1)))}declaration(el,i,parentChildren,cb){const{rulesMaps:rulesMaps}=this,{parent:parent}=el;rulesMaps.has(parent)||rulesMaps.set(parent,{});rulesMaps.get(parent)[el.props]=el.children}}class Unset extends CSSTransformerBase{declaration(el,i,children,cb){el.children="unset",el.value=`${el.props}:${el.children};`}}class UpdateDeclarations extends CSSTransformerBase{declaration(el,i,children,cb){el.value=`${el.props}:${el.children};`}}var index=Object.freeze({__proto__:null,CSSTransformerBase:CSSTransformerBase,SortAndMerge:SortAndMerge,Unset:Unset,UpdateDeclarations:UpdateDeclarations});function normalize(ast){return SortAndMerge.transform(ast),ast}var index$1=Object.freeze({__proto__:null,getNodeType:getNodeType,findAtRuleBySelector:findAtRuleBySelector,findDeclarationByKey:findDeclarationByKey,findRuleBySelector:findRuleBySelector,getAtRulesSelectors:getAtRulesSelectors,getRulesSelectors:getRulesSelectors,normalize:normalize});function getDiffPartState(diffPart){return diffPart.added?1:diffPart.removed?-1:0}function diffAtRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"atRule"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((rules=>getAtRulesSelectors(rules).sort()))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findAtRuleBySelector(selector,state>0?expected:original):{original:findAtRuleBySelector(selector,original),expected:findAtRuleBySelector(selector,expected)},state:state}))))})),result}function diffDeclarations(originalRule,expectedRule){const[original,expected]=[originalRule,expectedRule].map((rule=>rule.children.filter((child=>"declaration"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((declarations=>declarations.map((declaration=>declaration.props))))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);result.push(...diffPart.value.map((key=>({declaration:0!==state?findDeclarationByKey(key,state>0?expected:original):{original:findDeclarationByKey(key,original),expected:findDeclarationByKey(key,expected)},state:state}))))})),result}function diffRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"rule"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((rules=>getRulesSelectors(rules).sort()))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findRuleBySelector(selector,state>0?expected:original):{original:findRuleBySelector(selector,original),expected:findRuleBySelector(selector,expected)},state:state}))))})),result}function transformDiffDeclarations(originalRule,expectedRule){return diffDeclarations(originalRule,expectedRule).map((({state:state,declaration:declaration})=>{switch(state){case-1:Unset.transform(findDeclarationByKey(declaration.props,originalRule.children));break;case 1:originalRule.children.push(declaration);break;case 0:{const{original:originalDeclaration,expected:expectedDeclaration}=declaration;originalDeclaration.children!==expectedDeclaration.children?(originalDeclaration.children=expectedDeclaration.children,UpdateDeclarations.transform(originalDeclaration)):originalRule.children.splice(originalRule.children.indexOf(originalDeclaration),1);break}}})),originalRule}function transformDiffRules(original,expected){const diff=diffRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>{result.push(0!==state?state<0?(Unset.transform(rule),rule):rule:transformDiffDeclarations(rule.original,rule.expected))})),result}function transformDiffAtRules(original,expected){const diff=diffAtRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>0!==state?result.push(state<0?(Unset.transform(rule),rule):rule):(transformDiffDeclarations(rule.original,rule.expected),transformDiffRules(rule.original.children,rule.expected.children),result.push(rule.original)))),result}var index$2=Object.freeze({__proto__:null,diffAtRules:diffAtRules,diffRules:diffRules,diffDeclarations:diffDeclarations,getDiffPartState:getDiffPartState,transformDiffRules:transformDiffRules,transformDiffAtRules:transformDiffAtRules,transformDiffDeclarations:transformDiffDeclarations});function generateCSSPatch(original,expected){const ast=[original,expected].map((ast=>normalize(compile(serialize(compile(ast),stringify))))),result=[];return result.push(...transformDiffRules(ast[0],ast[1]),...transformDiffAtRules(ast[0],ast[1])),serialize(result,stringify)}function transformCSS(css,transformer){const ast=compile(css);let result=transformer(ast);return serialize(result||ast,stringify)}export{index$1 as AST,index as CSSTransformers,index$2 as diff,generateCSSPatch,transformCSS};
import{diffArrays}from"diff";import{compile,serialize,stringify}from"stylis";function findAtRuleBySelector(selector,rules){return rules.find((rule=>rule.value===selector))}function findDeclarationByKey(key,declarations){return declarations.find((declaration=>key===declaration.props))}function findRuleBySelector(selector,rules){return rules.find((rule=>rule.props.join(",")===selector))}function getAtRulesSelectors(rules){return rules.map((rule=>rule.value))}const typesMap={"@":"atRule",rule:"rule",comm:"comment",decl:"declaration",root:"root"};function getNodeType(el){var _typesMap$type;if(Array.isArray(el))return typesMap.root;const{type:type}=el;return type?null!==(_typesMap$type=typesMap[type])&&void 0!==_typesMap$type?_typesMap$type:type.startsWith("@")?typesMap["@"]:null:null}function getRulesSelectors(rules){return rules.map((rule=>rule.props.join(",")))}class CSSTransformerBase{static transform(el){return(new this).getTransformer(el)(el)}constructor(){}transformSubElements(elements,list,whitelist){return elements.forEach(((child,_i,_children)=>{list&&(whitelist&&!list.includes(getNodeType(child))||!whitelist&&list.includes(getNodeType(child)))||this.getTransformer(child)(child,_i,_children)}))}getTransformer(el){var _this$getNodeType$bin,_this$getNodeType,_this$getNodeType$bin2;return null!==(_this$getNodeType$bin=null===(_this$getNodeType=this[getNodeType(el)])||void 0===_this$getNodeType||null===(_this$getNodeType$bin2=_this$getNodeType.bind)||void 0===_this$getNodeType$bin2?void 0:_this$getNodeType$bin2.call(_this$getNodeType,this))&&void 0!==_this$getNodeType$bin?_this$getNodeType$bin:null}root(el,i,parentChildren,cb){const rootAnchor=Object.create(null);return el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)&&(child.parent=rootAnchor)})),this.transformSubElements(el)}atRule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}rule(el,i,parentChildren,cb){return this.transformSubElements(el.children)}declaration(el,i,parentChildren,cb){}comment(el,i,parentChildren,cb){}}function compareValues(a,b){return a<b?-1:a>b?1:0}function nodesSorter(a,b){return"atRule"!==getNodeType(a)&&"atRule"===getNodeType(b)?1:"atRule"===getNodeType(a)?"atRule"===getNodeType(b)?compareValues(a.value,b.value):-1:"rule"!==getNodeType(a)&&"rule"===getNodeType(b)?1:"rule"===getNodeType(a)?"rule"===getNodeType(b)?compareValues(a.props.join(","),b.props.join(",")):-1:0}class SortAndMerge extends CSSTransformerBase{constructor(){super(),this.rulesMaps=new WeakMap,this.rootsMaps=new WeakMap}root(el,i,parentChildren,cb){let rootAnchor=Object.create(null);el.forEach((child=>{var _child$parent;"object"!=typeof(null!==(_child$parent=child.parent)&&void 0!==_child$parent?_child$parent:void 0)?child.parent=rootAnchor:rootAnchor=child.parent})),this.transformSubElements(el);const{rootsMaps:rootsMaps}=this,root=rootsMaps.get(rootAnchor),rules="object"==typeof root?Object.keys(root):[];let _i=0;const droppedItems=[];el.forEach(((child,childIndex,_el)=>!["rule","atRule"].includes(getNodeType(child))||(rules[_i]?(_el[childIndex]=root[rules[_i]],_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.splice(el.indexOf(item),1))),el.sort(nodesSorter).map(((item,i)=>el[i]=item))}atRule(el,i,parentChildren,cb){this.rule(el,i,parentChildren,cb),this.root(el.children,i,parentChildren,cb)}rule(el,i,parentChildren,cb){const{rootsMaps:rootsMaps}=this,{parent:parent}=el,id="atRule"!==getNodeType(el)?el.props.join(","):el.value;rootsMaps.has(parent)||rootsMaps.set(parent,{});const root=rootsMaps.get(parent);root[id]&&root[id].children.forEach((child=>{child.parent=el,el.children.unshift(child)})),root[id]=el,"atRule"!==getNodeType(el)?this.transformSubElements(el.children):this.transformSubElements(el.children,["declaration"],!0);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;const droppedItems=[];el.children.forEach((child=>"declaration"!==getNodeType(child)||(declarations[_i]?(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0):(droppedItems.push(child),!1)))),droppedItems.forEach((item=>el.children.splice(el.children.indexOf(item),1)))}declaration(el,i,parentChildren,cb){const{rulesMaps:rulesMaps}=this,{parent:parent}=el;rulesMaps.has(parent)||rulesMaps.set(parent,{});rulesMaps.get(parent)[el.props]=el.children}}class Unset extends CSSTransformerBase{declaration(el,i,children,cb){el.children="unset",el.value=`${el.props}:${el.children};`}}class UpdateDeclarations extends CSSTransformerBase{declaration(el,i,children,cb){el.value=`${el.props}:${el.children};`}}var index$2=Object.freeze({__proto__:null,CSSTransformerBase:CSSTransformerBase,SortAndMerge:SortAndMerge,Unset:Unset,UpdateDeclarations:UpdateDeclarations});function normalize(ast){return SortAndMerge.transform(ast),ast}var index$1=Object.freeze({__proto__:null,getNodeType:getNodeType,findAtRuleBySelector:findAtRuleBySelector,findDeclarationByKey:findDeclarationByKey,findRuleBySelector:findRuleBySelector,getAtRulesSelectors:getAtRulesSelectors,getRulesSelectors:getRulesSelectors,normalize:normalize});function getDiffPartState(diffPart){return diffPart.added?1:diffPart.removed?-1:0}function diffAtRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"atRule"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((rules=>getAtRulesSelectors(rules).sort()))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findAtRuleBySelector(selector,state>0?expected:original):{original:findAtRuleBySelector(selector,original),expected:findAtRuleBySelector(selector,expected)},state:state}))))})),result}function diffDeclarations(originalRule,expectedRule){const[original,expected]=[originalRule,expectedRule].map((rule=>rule.children.filter((child=>"declaration"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((declarations=>declarations.map((declaration=>declaration.props))))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);result.push(...diffPart.value.map((key=>({declaration:0!==state?findDeclarationByKey(key,state>0?expected:original):{original:findDeclarationByKey(key,original),expected:findDeclarationByKey(key,expected)},state:state}))))})),result}function diffRules(originalNodes,expectedNodes){const[original,expected]=[originalNodes,expectedNodes].map((nodes=>nodes.filter((child=>"rule"===getNodeType(child))))),diff=diffArrays(...[original,expected].map((rules=>getRulesSelectors(rules).sort()))),result=[];return diff.forEach((diffPart=>{const state=getDiffPartState(diffPart);return result.push(...diffPart.value.map((selector=>({rule:0!==state?findRuleBySelector(selector,state>0?expected:original):{original:findRuleBySelector(selector,original),expected:findRuleBySelector(selector,expected)},state:state}))))})),result}function transformDiffDeclarations(originalRule,expectedRule){return diffDeclarations(originalRule,expectedRule).map((({state:state,declaration:declaration})=>{switch(state){case-1:Unset.transform(findDeclarationByKey(declaration.props,originalRule.children));break;case 1:originalRule.children.push(declaration);break;case 0:{const{original:originalDeclaration,expected:expectedDeclaration}=declaration;originalDeclaration.children!==expectedDeclaration.children?(originalDeclaration.children=expectedDeclaration.children,UpdateDeclarations.transform(originalDeclaration)):originalRule.children.splice(originalRule.children.indexOf(originalDeclaration),1);break}}})),originalRule}function transformDiffRules(original,expected){const diff=diffRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>{result.push(0!==state?state<0?(Unset.transform(rule),rule):rule:transformDiffDeclarations(rule.original,rule.expected))})),result}function transformDiffAtRules(original,expected){const diff=diffAtRules(original,expected),result=[];return diff.map((({state:state,rule:rule})=>0!==state?result.push(state<0?(Unset.transform(rule),rule):rule):(transformDiffDeclarations(rule.original,rule.expected),transformDiffRules(rule.original.children,rule.expected.children),result.push(rule.original)))),result}var index=Object.freeze({__proto__:null,diffAtRules:diffAtRules,diffRules:diffRules,diffDeclarations:diffDeclarations,getDiffPartState:getDiffPartState,transformDiffRules:transformDiffRules,transformDiffAtRules:transformDiffAtRules,transformDiffDeclarations:transformDiffDeclarations});function generateCSSPatch(original,expected){const ast=[original,expected].map((ast=>normalize(compile(serialize(compile(ast),stringify))))),result=[];return result.push(...transformDiffRules(ast[0],ast[1]),...transformDiffAtRules(ast[0],ast[1])),serialize(result,stringify)}function transformCSS(css,transformer){const ast=compile(css);let result=transformer(ast);return serialize(result||ast,stringify)}export{index$1 as AST,index$2 as CSSTransformers,index as diff,generateCSSPatch,transformCSS};
//# sourceMappingURL=bundle.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"bundle.mjs","sources":["../../src/AST/findAtRuleBySelector.js","../../src/AST/findDeclarationByKey.js","../../src/AST/findRuleBySelector.js","../../src/AST/getAtRulesSelectors.js","../../src/AST/getNodeType.js","../../src/AST/getRulesSelectors.js","../../src/CSSTransformers/CSSTransformerBase.js","../../src/CSSTransformers/SortAndMerge.js","../../src/CSSTransformers/Unset.js","../../src/CSSTransformers/UpdateDeclarations.js","../../src/AST/normalize.js","../../src/diff/getDiffPartState.js","../../src/diff/diffAtRules.js","../../src/diff/diffDeclarations.js","../../src/diff/diffRules.js","../../src/diff/transformDiffDeclarations.js","../../src/diff/transformDiffRules.js","../../src/diff/transformDiffAtRules.js","../../src/generateCSSPatch.js","../../src/transformCSS.js"],"sourcesContent":["import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find at rule object in list of at rules by given selector.\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {AtRule}\r\n */\r\nfunction findAtRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.value === selector);\r\n}\r\n\r\nexport default findAtRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find declaration object in list of declarations by given key.\r\n * @param {string} selector Declaration key.\r\n * @param {Declaration[]} declarations List of declarations.\r\n * @returns {Declaration}\r\n */\r\nfunction findDeclarationByKey(key, declarations) {\r\n\treturn declarations.find(declaration => key === declaration.props);\r\n}\r\n\r\nexport default findDeclarationByKey;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find rule object in list of rules by given selector.\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {Rule}\r\n */\r\nfunction findRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.props.join(',') === selector);\r\n}\r\n\r\nexport default findRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getAtRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.value);\r\n}\r\n\r\nexport default getAtRulesSelectors;\r\n","import './nodeTypes';\r\n\r\n\r\nconst typesMap = {\r\n\t'@' : 'atRule',\r\n\trule: 'rule',\r\n\tcomm: 'comment',\r\n\tdecl: 'declaration',\r\n\troot: 'root',\r\n};\r\n\r\n/**\r\n * Get node type.\r\n * @param {ASTNode|ASTNode[]} el Element.\r\n * @returns {?string} Node transformer name.\r\n */\r\nfunction getNodeType(el) {\r\n\tif (Array.isArray(el))\r\n\t\treturn typesMap.root;\r\n\r\n\tconst { type, } = el;\r\n\r\n\tif (!type)\r\n\t\treturn null;\r\n\r\n\treturn typesMap[type] ?? (type.startsWith('@')\r\n\t\t? typesMap['@']\r\n\t\t: null);\r\n}\r\n\r\nexport default getNodeType;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.props.join(','));\r\n}\r\n\r\nexport default getRulesSelectors;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\n\r\n/**\r\n * CSS AST transformer.\r\n * In order to apply this transformer use static `CSSTransformerBase.transform(el)`.\r\n * Advanced usage notes:\r\n * This is a base class for CSS AST transformer.\r\n * You can subclass this class to implement your transformer.\r\n * Just remember to call `this.transformSubElements(el.children)`\r\n * if you deal with multi-level items (roots, rules, at rules).\r\n */\r\nclass CSSTransformerBase {\r\n\t/**\r\n\t * Transform AST using this transformer.\r\n\t * @param {ASTNode | ASTNode[]} el Element.\r\n\t */\r\n\tstatic transform(el) {\r\n\t\treturn new this().getTransformer(el)(el);\r\n\t}\r\n\r\n\t/**\r\n\t * This is internal state initializer.\r\n\t * Use static `CSSTransformerBase.transform(el)` method instead.\r\n\t */\r\n\tconstructor() {}\r\n\r\n\t/**\r\n\t * Transform all (or with exclusions) provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t * @param {?string[]} list Blacklist or whitelist of types.\r\n\t * @param {?boolean} whitelist Whatever to use whitelist.\r\n\t */\r\n\ttransformSubElements(elements, list, whitelist) {\r\n\t\treturn elements.forEach((child, _i, _children) => {\r\n\t\t\tif (\r\n\t\t\t\tlist && (\r\n\t\t\t\t\t(whitelist && !list.includes(getNodeType(child))) ||\r\n\t\t\t\t\t(!whitelist && list.includes(getNodeType(child)))\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\treturn;\r\n\t\t\tthis.getTransformer(child)(child, _i, _children);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Get node transformer.\r\n\t * @param {ASTNode} el Element.\r\n\t * @returns {Function} Node transformer.\r\n\t */\r\n\tgetTransformer(el) {\r\n\t\treturn this[getNodeType(el)]?.bind?.(this) ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t});\r\n\r\n\t\treturn this.transformSubElements(el);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Comment transformer.\r\n\t * @param {Comment} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tcomment(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default CSSTransformerBase;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Compare values.\r\n * @param {any} a Value A.\r\n * @param {any} b Value B.\r\n * @returns {number}\r\n */\r\nfunction compareValues(a, b) {\r\n\treturn a < b\r\n\t\t? -1\r\n\t\t: a > b\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n}\r\n\r\n/**\r\n * Compare nodes.\r\n * Higher means closer to the start.\r\n * Sorting rule is simple: atRule > rule > anything else.\r\n * Same typed nodes are sorted in alphabetic order.\r\n * @param {ASTNode} a Node A.\r\n * @param {ASTNode} b Node B.\r\n * @returns {number}\r\n */\r\nfunction nodesSorter(a, b) {\r\n\tif ('atRule' !== getNodeType(a) && 'atRule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('atRule' === getNodeType(a)) {\r\n\t\tif ('atRule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.value, b.value);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tif ('rule' !== getNodeType(a) && 'rule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('rule' === getNodeType(a)) {\r\n\t\tif ('rule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.props.join(','), b.props.join(','));\r\n\t\treturn -1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * Merge duplicate declarations. For duplicated identifies last one would be used.\r\n * In order to apply this transformer use static `SortAndMerge.transform(el)`.\r\n */\r\nclass SortAndMerge extends CSSTransformerBase {\r\n\t/**\r\n\t * This is internal state initializer.\r\n\t * Use static `SortAndMerge.transform(el)` method instead.\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.rulesMaps = new WeakMap();\r\n\t\tthis.rootsMaps = new WeakMap();\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tlet rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t\telse\r\n\t\t\t\trootAnchor = child.parent;\r\n\t\t});\r\n\r\n\t\tthis.transformSubElements(el);\r\n\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\troot = rootsMaps.get(rootAnchor),\r\n\t\t\trules = 'object' === typeof root\r\n\t\t\t\t? Object.keys(root)\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.forEach((child, childIndex, _el) => {\r\n\t\t\tif ([ 'rule', 'atRule', ].includes(getNodeType(child))) {\r\n\t\t\t\tif (rules[_i]) {\r\n\t\t\t\t\t_el[childIndex] = root[rules[_i]];\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.splice(el.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\tel.sort(nodesSorter).map((item, i) => el[i] = item);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tthis.rule(el, i, parentChildren, cb);\r\n\t\tthis.root(el.children, i, parentChildren, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\t{ parent, } = el,\r\n\t\t\tid = 'atRule' !== getNodeType(el)\r\n\t\t\t\t? el.props.join(',')\r\n\t\t\t\t: el.value;\r\n\r\n\t\tif (!rootsMaps.has(parent))\r\n\t\t\trootsMaps.set(parent, {});\r\n\r\n\t\tconst root = rootsMaps.get(parent);\r\n\r\n\t\tif (root[id])\r\n\t\t\troot[id].children.forEach(child => {\r\n\t\t\t\tchild.parent = el;\r\n\t\t\t\tel.children.unshift(child);\r\n\t\t\t});\r\n\r\n\t\troot[id] = el;\r\n\r\n\t\tif ('atRule' !== getNodeType(el))\r\n\t\t\tthis.transformSubElements(el.children);\r\n\t\telse\r\n\t\t\tthis.transformSubElements(el.children, [ 'declaration', ], true);\r\n\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\trule = rulesMaps.get(el),\r\n\t\t\tdeclarations = 'object' === typeof rule\r\n\t\t\t\t? Object.keys(rule).sort()\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.children.forEach(child => {\r\n\t\t\tif ('declaration' === getNodeType(child)) {\r\n\t\t\t\tif (declarations[_i]) {\r\n\t\t\t\t\tchild.props = declarations[_i];\r\n\t\t\t\t\tchild.children = rule[declarations[_i]];\r\n\t\t\t\t\tchild.value = `${child.props}:${child.children};`;\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.children.splice(el.children.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\treturn;\r\n\t}\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\t{ parent, } = el;\r\n\r\n\t\tif (!rulesMaps.has(parent))\r\n\t\t\trulesMaps.set(parent, {});\r\n\r\n\t\tconst rule = rulesMaps.get(parent);\r\n\r\n\t\trule[el.props] = el.children;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default SortAndMerge;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Unset all declarations.\r\n * In order to apply this transformer use static `Unset.transform(el)`.\r\n */\r\nclass Unset extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.children = 'unset';\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default Unset;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Update all declarations.\r\n * In order to apply this transformer use static `UpdateDeclarations.transform(el)`.\r\n */\r\nclass UpdateDeclarations extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default UpdateDeclarations;\r\n","import { SortAndMerge, } from '../CSSTransformers';\r\n\r\n\r\n/**\r\n * Sort declarations and merge equal rules in order they appear.\r\n * @param {stylis.Element[]} ast\r\n */\r\nfunction normalize(ast) {\r\n\tSortAndMerge.transform(ast);\r\n\treturn ast;\r\n}\r\n\r\nexport default normalize;\r\n","import 'diff';\r\n\r\n\r\n/**\r\n * Get numeric state of a diff part.\r\n * @param {Diff.ArrayChange.<any>} diffPart Diff part.\r\n * @returns {number}\r\n */\r\nfunction getDiffPartState(diffPart) {\r\n\treturn diffPart.added\r\n\t\t? 1\r\n\t\t: diffPart.removed\r\n\t\t\t? -1\r\n\t\t\t: 0;\r\n}\r\n\r\nexport default getDiffPartState;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindAtRuleBySelector,\r\n\tgetAtRulesSelectors,\r\n\tgetNodeType,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare at rules between lists of AST nodes.\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffAtRules(originalNodes, expectedNodes) {\r\n\t/** @type {AtRule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'atRule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getAtRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findAtRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findAtRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findAtRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffAtRules;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport { findDeclarationByKey, getNodeType, } from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare declarations between rules.\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n */\r\nfunction diffDeclarations(originalRule, expectedRule) {\r\n\t/** @type {Declaration[][]} */\r\n\tconst [ original, expected, ] = [ originalRule, expectedRule, ].map(\r\n\t\trule => rule.children.filter(\r\n\t\t\tchild => 'declaration' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\tdeclarations => declarations.map(\r\n\t\t\t\t\tdeclaration => declaration.props\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\tresult.push(\r\n\t\t\t...diffPart.value.map(key => ({\r\n\t\t\t\tdeclaration: 0 !== state\r\n\t\t\t\t\t? findDeclarationByKey(\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findDeclarationByKey(key, original),\r\n\t\t\t\t\t\texpected: findDeclarationByKey(key, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t\treturn;\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffDeclarations;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindRuleBySelector,\r\n\tgetNodeType,\r\n\tgetRulesSelectors,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare rules between lists of AST nodes.\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffRules(originalNodes, expectedNodes) {\r\n\t/** @type {Rule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'rule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffRules;\r\n","import findDeclarationByKey from '../AST/findDeclarationByKey';\r\nimport { Unset, UpdateDeclarations, } from '../CSSTransformers';\r\n\r\nimport diffDeclarations from './diffDeclarations';\r\n\r\n\r\n/**\r\n * Compare declarations between rules and apply diff transformation.\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n * @returns {Rule}\r\n */\r\nfunction transformDiffDeclarations(originalRule, expectedRule) {\r\n\tconst diff = diffDeclarations(originalRule, expectedRule);\r\n\r\n\tdiff.map(({ state, declaration, }) => {\r\n\t\tswitch (state) {\r\n\t\t\tcase -1:\r\n\t\t\t\tUnset.transform(\r\n\t\t\t\t\tfindDeclarationByKey(\r\n\t\t\t\t\t\tdeclaration.props, originalRule.children\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\toriginalRule.children.push(declaration);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0: {\r\n\t\t\t\tconst { original: originalDeclaration, expected: expectedDeclaration, } = declaration;\r\n\r\n\t\t\t\tif (originalDeclaration.children !== expectedDeclaration.children) {\r\n\t\t\t\t\toriginalDeclaration.children = expectedDeclaration.children;\r\n\t\t\t\t\tUpdateDeclarations.transform(originalDeclaration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\toriginalRule.children.splice(originalRule.children.indexOf(originalDeclaration), 1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn originalRule;\r\n}\r\n\r\nexport default transformDiffDeclarations;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffRules from './diffRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\n\r\n\r\n/**\r\n * Compare rules and apply diff transformation.\r\n * @param {Rule[]} original Original rules set.\r\n * @param {Rule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffRules(original, expected) {\r\n\tconst diff = diffRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tresult.push(\r\n\t\t\t0 !== state\r\n\t\t\t\t? state < 0\r\n\t\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t\t: rule\r\n\t\t\t\t: transformDiffDeclarations(rule.original, rule.expected)\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffRules;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffAtRules from './diffAtRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\nimport transformDiffRules from './transformDiffRules';\r\n\r\n/**\r\n * Compare at rules and apply diff transformation.\r\n * @param {AtRule[]} original Original rules set.\r\n * @param {AtRule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffAtRules(original, expected) {\r\n\tconst diff = diffAtRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tif (0 !== state) return result.push(\r\n\t\t\tstate < 0\r\n\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t: rule\r\n\t\t);\r\n\r\n\t\ttransformDiffDeclarations(rule.original, rule.expected);\r\n\t\ttransformDiffRules(rule.original.children, rule.expected.children);\r\n\r\n\t\treturn result.push(rule.original);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffAtRules;\r\n","import './AST/nodeTypes';\r\nimport { compile, serialize, stringify, } from 'stylis';\r\n\r\nimport { normalize, } from './AST';\r\nimport { transformDiffRules, transformDiffAtRules, } from './diff';\r\n\r\n\r\n/**\r\n * Generate CSS difference patch between two CSS stylesheets.\r\n * @param {string} original Original CSS stylesheet.\r\n * @param {string} expected Desired CSS stylesheet.\r\n * @returns {string} CSS patch difference.\r\n */\r\nfunction generateCSSPatch(original, expected) {\r\n\tconst ast = [\r\n\t\t\toriginal,\r\n\t\t\texpected,\r\n\t\t].map(ast => normalize(\r\n\t\t\tcompile(\r\n\t\t\t\tserialize(\r\n\t\t\t\t\tcompile(ast),\r\n\t\t\t\t\tstringify\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)),\r\n\t\tresult = [];\r\n\r\n\tresult.push(...[\r\n\t\t...transformDiffRules(ast[0], ast[1]),\r\n\t\t...transformDiffAtRules(ast[0], ast[1]),\r\n\t]);\r\n\r\n\treturn serialize(result, stringify);\r\n}\r\n\r\nexport default generateCSSPatch;\r\n","import { compile, serialize, stringify, } from 'stylis';\r\n\r\n\r\n/**\r\n * Apply transformations to CSS AST.\r\n * Transformer function can ether return AST or falsy value\r\n * (if transformations was applied to the original AST).\r\n * @param {string} css Stylesheet to transform.\r\n * @param {Function} transformer Transformer function.\r\n * @returns {string} Transformed stylesheet.\r\n */\r\nfunction transformCSS(css, transformer) {\r\n\tconst ast = compile(css);\r\n\r\n\tlet result = transformer(ast);\r\n\r\n\treturn serialize(\r\n\t\tresult || ast,\r\n\t\tstringify\r\n\t);\r\n}\r\n\r\nexport default transformCSS;\r\n"],"names":["findAtRuleBySelector","selector","rules","find","rule","value","findDeclarationByKey","key","declarations","declaration","props","findRuleBySelector","join","getAtRulesSelectors","map","typesMap","comm","decl","root","getNodeType","el","Array","isArray","type","startsWith","getRulesSelectors","CSSTransformerBase","this","getTransformer","constructor","transformSubElements","elements","list","whitelist","forEach","child","_i","_children","includes","_this$getNodeType","bind","_this$getNodeType$bin2","i","parentChildren","cb","rootAnchor","Object","create","parent","atRule","children","comment","compareValues","a","b","nodesSorter","SortAndMerge","rulesMaps","WeakMap","rootsMaps","get","keys","droppedItems","childIndex","_el","push","item","splice","indexOf","sort","id","has","set","unshift","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","filter","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify","transformCSS","css","transformer"],"mappings":"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"}
{"version":3,"file":"bundle.mjs","sources":["../../src/AST/findAtRuleBySelector.js","../../src/AST/findDeclarationByKey.js","../../src/AST/findRuleBySelector.js","../../src/AST/getAtRulesSelectors.js","../../src/AST/getNodeType.js","../../src/AST/getRulesSelectors.js","../../src/CSSTransformers/CSSTransformerBase.js","../../src/CSSTransformers/SortAndMerge.js","../../src/CSSTransformers/Unset.js","../../src/CSSTransformers/UpdateDeclarations.js","../../src/AST/normalize.js","../../src/diff/getDiffPartState.js","../../src/diff/diffAtRules.js","../../src/diff/diffDeclarations.js","../../src/diff/diffRules.js","../../src/diff/transformDiffDeclarations.js","../../src/diff/transformDiffRules.js","../../src/diff/transformDiffAtRules.js","../../src/generateCSSPatch.js","../../src/transformCSS.js"],"sourcesContent":["import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find at rule object in list of at rules by given selector.\r\n * @memberof AST\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {AtRule}\r\n */\r\nfunction findAtRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.value === selector);\r\n}\r\n\r\nexport default findAtRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find declaration object in list of declarations by given key.\r\n * @memberof AST\r\n * @param {string} selector Declaration key.\r\n * @param {Declaration[]} declarations List of declarations.\r\n * @returns {Declaration}\r\n */\r\nfunction findDeclarationByKey(key, declarations) {\r\n\treturn declarations.find(declaration => key === declaration.props);\r\n}\r\n\r\nexport default findDeclarationByKey;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Find rule object in list of rules by given selector.\r\n * @memberof AST\r\n * @param {string} selector String selector (multiple selectors are joined by comma).\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {Rule}\r\n */\r\nfunction findRuleBySelector(selector, rules) {\r\n\treturn rules.find(rule => rule.props.join(',') === selector);\r\n}\r\n\r\nexport default findRuleBySelector;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @memberof AST\r\n * @param {AtRule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getAtRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.value);\r\n}\r\n\r\nexport default getAtRulesSelectors;\r\n","import './nodeTypes';\r\n\r\n\r\nconst typesMap = {\r\n\t'@' : 'atRule',\r\n\trule: 'rule',\r\n\tcomm: 'comment',\r\n\tdecl: 'declaration',\r\n\troot: 'root',\r\n};\r\n\r\n/**\r\n * Get node type.\r\n * @memberof AST\r\n * @param {ASTNode|ASTNode[]} el Element.\r\n * @returns {?string} Node transformer name.\r\n */\r\nfunction getNodeType(el) {\r\n\tif (Array.isArray(el))\r\n\t\treturn typesMap.root;\r\n\r\n\tconst { type, } = el;\r\n\r\n\tif (!type)\r\n\t\treturn null;\r\n\r\n\treturn typesMap[type] ?? (type.startsWith('@')\r\n\t\t? typesMap['@']\r\n\t\t: null);\r\n}\r\n\r\nexport default getNodeType;\r\n","import './nodeTypes';\r\n\r\n\r\n/**\r\n * Get all selectors from a rules set.\r\n * @memberof AST\r\n * @param {Rule[]} rules List of rules.\r\n * @returns {string[]} Selectors.\r\n */\r\nfunction getRulesSelectors(rules) {\r\n\treturn rules.map(rule => rule.props.join(','));\r\n}\r\n\r\nexport default getRulesSelectors;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\n\r\n/**\r\n * CSS AST transformer.\r\n * To apply this transformer call `CSSTransformerBase.transform(el)`.\r\n * Base class for CSS AST transformer.\r\n * Advanced usage notes:\r\n * You can subclass it to implement your own transformer.\r\n * Just remember to call `this.transformSubElements(el.children)` if you deal\r\n * with multi-level items (roots, rules, at rules).\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass CSSTransformerBase {\r\n\t/**\r\n\t * Transform AST using this transformer.\r\n\t * @param {ASTNode | ASTNode[]} el Element.\r\n\t */\r\n\tstatic transform(el) {\r\n\t\treturn new this().getTransformer(el)(el);\r\n\t}\r\n\r\n\t/**\r\n\t * Internal state initializer.\r\n\t * To apply transformer use `CSSTransformerBase.transform(el)` instead.\r\n\t */\r\n\tconstructor() {}\r\n\r\n\t/**\r\n\t * Transform all (or with exclusions) provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t * @param {?string[]} list Blacklist or whitelist of types.\r\n\t * @param {?boolean} whitelist Whether list is whitelist or blacklist.\r\n\t */\r\n\ttransformSubElements(elements, list, whitelist) {\r\n\t\treturn elements.forEach((child, _i, _children) => {\r\n\t\t\tif (\r\n\t\t\t\tlist && (\r\n\t\t\t\t\t(whitelist && !list.includes(getNodeType(child))) ||\r\n\t\t\t\t\t(!whitelist && list.includes(getNodeType(child)))\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t\t\treturn;\r\n\t\t\tthis.getTransformer(child)(child, _i, _children);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Get node transformer.\r\n\t * @param {ASTNode} el Element.\r\n\t * @returns {Function} Node transformer.\r\n\t */\r\n\tgetTransformer(el) {\r\n\t\treturn this[getNodeType(el)]?.bind?.(this) ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t});\r\n\r\n\t\treturn this.transformSubElements(el);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn this.transformSubElements(el.children);\r\n\t}\r\n\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n\r\n\t/**\r\n\t * Comment transformer.\r\n\t * @param {Comment} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tcomment(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default CSSTransformerBase;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { getNodeType, } from '../AST';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Compare values.\r\n * @memberof CSSTransformers\r\n * @param {any} a Value A.\r\n * @param {any} b Value B.\r\n * @returns {number}\r\n */\r\nfunction compareValues(a, b) {\r\n\treturn a < b\r\n\t\t? -1\r\n\t\t: a > b\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n}\r\n\r\n/**\r\n * Compare nodes.\r\n * Higher means closer to the start.\r\n * Sorting rule is simple: atRule > rule > anything else.\r\n * Same typed nodes are sorted in alphabetic order.\r\n * @memberof CSSTransformers\r\n * @param {ASTNode} a Node A.\r\n * @param {ASTNode} b Node B.\r\n * @returns {number}\r\n */\r\nfunction nodesSorter(a, b) {\r\n\tif ('atRule' !== getNodeType(a) && 'atRule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('atRule' === getNodeType(a)) {\r\n\t\tif ('atRule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.value, b.value);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tif ('rule' !== getNodeType(a) && 'rule' === getNodeType(b))\r\n\t\treturn 1;\r\n\r\n\tif ('rule' === getNodeType(a)) {\r\n\t\tif ('rule' === getNodeType(b))\r\n\t\t\treturn compareValues(a.props.join(','), b.props.join(','));\r\n\t\treturn -1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * Merge duplicate declarations. For duplicated identifies last one would be used.\r\n * To apply this transformer call `SortAndMerge.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass SortAndMerge extends CSSTransformerBase {\r\n\t/**\r\n\t * Internal state initializer.\r\n\t * To apply transformer use `SortAndMerge.transform(el)` instead.\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.rulesMaps = new WeakMap();\r\n\t\tthis.rootsMaps = new WeakMap();\r\n\t}\r\n\r\n\t/**\r\n\t * Root node transformer.\r\n\t * @param {Rule[]} el Root element.\r\n\t * @param {?number} i Root element index if any.\r\n\t * @param {?ASTNode[]} parentChildren Children of root element parent if there is any parent.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\troot(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tlet rootAnchor = Object.create(null);\r\n\r\n\t\tel.forEach(child => {\r\n\t\t\tif ('object' !== typeof (child.parent ?? void 0))\r\n\t\t\t\tchild.parent = rootAnchor;\r\n\t\t\telse\r\n\t\t\t\trootAnchor = child.parent;\r\n\t\t});\r\n\r\n\t\tthis.transformSubElements(el);\r\n\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\troot = rootsMaps.get(rootAnchor),\r\n\t\t\trules = 'object' === typeof root\r\n\t\t\t\t? Object.keys(root)\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.forEach((child, childIndex, _el) => {\r\n\t\t\tif ([ 'rule', 'atRule', ].includes(getNodeType(child))) {\r\n\t\t\t\tif (rules[_i]) {\r\n\t\t\t\t\t_el[childIndex] = root[rules[_i]];\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.splice(el.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\tel.sort(nodesSorter).map((item, i) => el[i] = item);\r\n\t}\r\n\r\n\t/**\r\n\t * At rule transformer.\r\n\t * @param {AtRule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tatRule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tthis.rule(el, i, parentChildren, cb);\r\n\t\tthis.root(el.children, i, parentChildren, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Rule transformer.\r\n\t * @param {Rule} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\trule(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rootsMaps, } = this,\r\n\t\t\t{ parent, } = el,\r\n\t\t\tid = 'atRule' !== getNodeType(el)\r\n\t\t\t\t? el.props.join(',')\r\n\t\t\t\t: el.value;\r\n\r\n\t\tif (!rootsMaps.has(parent))\r\n\t\t\trootsMaps.set(parent, {});\r\n\r\n\t\tconst root = rootsMaps.get(parent);\r\n\r\n\t\tif (root[id])\r\n\t\t\troot[id].children.forEach(child => {\r\n\t\t\t\tchild.parent = el;\r\n\t\t\t\tel.children.unshift(child);\r\n\t\t\t});\r\n\r\n\t\troot[id] = el;\r\n\r\n\t\tif ('atRule' !== getNodeType(el))\r\n\t\t\tthis.transformSubElements(el.children);\r\n\t\telse\r\n\t\t\tthis.transformSubElements(el.children, [ 'declaration', ], true);\r\n\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\trule = rulesMaps.get(el),\r\n\t\t\tdeclarations = 'object' === typeof rule\r\n\t\t\t\t? Object.keys(rule).sort()\r\n\t\t\t\t: [];\r\n\r\n\t\tlet _i = 0;\r\n\r\n\t\tconst droppedItems = [];\r\n\t\tel.children.forEach(child => {\r\n\t\t\tif ('declaration' === getNodeType(child)) {\r\n\t\t\t\tif (declarations[_i]) {\r\n\t\t\t\t\tchild.props = declarations[_i];\r\n\t\t\t\t\tchild.children = rule[declarations[_i]];\r\n\t\t\t\t\tchild.value = `${child.props}:${child.children};`;\r\n\t\t\t\t\t_i++;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tdroppedItems.push(child);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tdroppedItems.forEach(\r\n\t\t\titem => el.children.splice(el.children.indexOf(item), 1)\r\n\t\t);\r\n\r\n\t\treturn;\r\n\t}\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} parentChildren Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, parentChildren, cb) { // eslint-disable-line no-unused-vars\r\n\t\tconst\r\n\t\t\t{ rulesMaps, } = this,\r\n\t\t\t{ parent, } = el;\r\n\r\n\t\tif (!rulesMaps.has(parent))\r\n\t\t\trulesMaps.set(parent, {});\r\n\r\n\t\tconst rule = rulesMaps.get(parent);\r\n\r\n\t\trule[el.props] = el.children;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default SortAndMerge;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Unset all declarations.\r\n * To apply this transformer call `Unset.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass Unset extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.children = 'unset';\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default Unset;\r\n","import '../AST/nodeTypes';\r\n\r\nimport CSSTransformerBase from './CSSTransformerBase';\r\n\r\n\r\n/**\r\n * Update all declarations.\r\n * To apply this transformer call `UpdateDeclarations.transform(el)`.\r\n * @memberof CSSTransformers\r\n * @class\r\n */\r\nclass UpdateDeclarations extends CSSTransformerBase {\r\n\t/**\r\n\t * Declaration transformer.\r\n\t * @param {Declaration} el Element.\r\n\t * @param {number} i Element index.\r\n\t * @param {ASTNode[]} children Element's parent children list.\r\n\t * @param {?Function} cb Callback.\r\n\t */\r\n\tdeclaration(el, i, children, cb) { // eslint-disable-line no-unused-vars\r\n\t\tel.value = `${el.props}:${el.children};`;\r\n\t\treturn;\r\n\t}\r\n}\r\n\r\nexport default UpdateDeclarations;\r\n","import { SortAndMerge, } from '../CSSTransformers';\r\n\r\n\r\n/**\r\n * Sort declarations and merge equal rules in order they appear.\r\n * @memberof AST\r\n * @param {stylis.Element[]} ast\r\n */\r\nfunction normalize(ast) {\r\n\tSortAndMerge.transform(ast);\r\n\treturn ast;\r\n}\r\n\r\nexport default normalize;\r\n","import 'diff';\r\n\r\n\r\n/**\r\n * Get numeric state of a diff part.\r\n * @memberof diff\r\n * @param {Diff.ArrayChange.<any>} diffPart Diff part.\r\n * @returns {number}\r\n */\r\nfunction getDiffPartState(diffPart) {\r\n\treturn diffPart.added\r\n\t\t? 1\r\n\t\t: diffPart.removed\r\n\t\t\t? -1\r\n\t\t\t: 0;\r\n}\r\n\r\nexport default getDiffPartState;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindAtRuleBySelector,\r\n\tgetAtRulesSelectors,\r\n\tgetNodeType,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare at rules between lists of AST nodes.\r\n * @memberof diff\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffAtRules(originalNodes, expectedNodes) {\r\n\t/** @type {AtRule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'atRule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getAtRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findAtRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findAtRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findAtRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffAtRules;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport { findDeclarationByKey, getNodeType, } from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare declarations between rules.\r\n * @memberof diff\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n */\r\nfunction diffDeclarations(originalRule, expectedRule) {\r\n\t/** @type {Declaration[][]} */\r\n\tconst [ original, expected, ] = [ originalRule, expectedRule, ].map(\r\n\t\trule => rule.children.filter(\r\n\t\t\tchild => 'declaration' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\tdeclarations => declarations.map(\r\n\t\t\t\t\tdeclaration => declaration.props\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\tresult.push(\r\n\t\t\t...diffPart.value.map(key => ({\r\n\t\t\t\tdeclaration: 0 !== state\r\n\t\t\t\t\t? findDeclarationByKey(\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findDeclarationByKey(key, original),\r\n\t\t\t\t\t\texpected: findDeclarationByKey(key, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t\treturn;\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffDeclarations;\r\n","import '../AST/nodeTypes';\r\n\r\nimport { diffArrays, } from 'diff';\r\n\r\nimport {\r\n\tfindRuleBySelector,\r\n\tgetNodeType,\r\n\tgetRulesSelectors,\r\n} from '../AST';\r\n\r\nimport getDiffPartState from './getDiffPartState';\r\n\r\n\r\n/**\r\n * Compare rules between lists of AST nodes.\r\n * @memberof diff\r\n * @param {ASTNode[]} originalNodes Original nodes list.\r\n * @param {ASTNode[]} expectedNodes Expected nodes list.\r\n */\r\nfunction diffRules(originalNodes, expectedNodes) {\r\n\t/** @type {Rule[][]} */\r\n\tconst [ original, expected, ] = [ originalNodes, expectedNodes, ].map(\r\n\t\tnodes => nodes.filter(\r\n\t\t\tchild => 'rule' === getNodeType(child)\r\n\t\t)\r\n\t);\r\n\r\n\t/** @type {Array.<Diff.ArrayChange.<string>>} */\r\n\tconst diff = diffArrays( // eslint-disable-line one-var\r\n\t\t\t...[ original, expected, ].map(\r\n\t\t\t\trules => getRulesSelectors(rules).sort()\r\n\t\t\t)\r\n\t\t),\r\n\t\tresult = [];\r\n\r\n\tdiff.forEach(diffPart => {\r\n\t\tconst state = getDiffPartState(diffPart);\r\n\r\n\t\treturn result.push(\r\n\t\t\t...diffPart.value.map(selector => ({\r\n\t\t\t\trule: 0 !== state\r\n\t\t\t\t\t? findRuleBySelector(\r\n\t\t\t\t\t\tselector,\r\n\t\t\t\t\t\tstate > 0\r\n\t\t\t\t\t\t\t? expected\r\n\t\t\t\t\t\t\t: original\r\n\t\t\t\t\t) : {\r\n\t\t\t\t\t\toriginal: findRuleBySelector(selector, original),\r\n\t\t\t\t\t\texpected: findRuleBySelector(selector, expected),\r\n\t\t\t\t\t},\r\n\t\t\t\tstate,\r\n\t\t\t}))\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default diffRules;\r\n","import findDeclarationByKey from '../AST/findDeclarationByKey';\r\nimport { Unset, UpdateDeclarations, } from '../CSSTransformers';\r\n\r\nimport diffDeclarations from './diffDeclarations';\r\n\r\n\r\n/**\r\n * Compare declarations between rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {Rule} originalRule Original rule.\r\n * @param {Rule} expectedRule Expected rule.\r\n * @returns {Rule}\r\n */\r\nfunction transformDiffDeclarations(originalRule, expectedRule) {\r\n\tconst diff = diffDeclarations(originalRule, expectedRule);\r\n\r\n\tdiff.map(({ state, declaration, }) => {\r\n\t\tswitch (state) {\r\n\t\t\tcase -1:\r\n\t\t\t\tUnset.transform(\r\n\t\t\t\t\tfindDeclarationByKey(\r\n\t\t\t\t\t\tdeclaration.props, originalRule.children\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\toriginalRule.children.push(declaration);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0: {\r\n\t\t\t\tconst { original: originalDeclaration, expected: expectedDeclaration, } = declaration;\r\n\r\n\t\t\t\tif (originalDeclaration.children !== expectedDeclaration.children) {\r\n\t\t\t\t\toriginalDeclaration.children = expectedDeclaration.children;\r\n\t\t\t\t\tUpdateDeclarations.transform(originalDeclaration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\toriginalRule.children.splice(originalRule.children.indexOf(originalDeclaration), 1);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn originalRule;\r\n}\r\n\r\nexport default transformDiffDeclarations;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffRules from './diffRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\n\r\n\r\n/**\r\n * Compare rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {Rule[]} original Original rules set.\r\n * @param {Rule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffRules(original, expected) {\r\n\tconst diff = diffRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tresult.push(\r\n\t\t\t0 !== state\r\n\t\t\t\t? state < 0\r\n\t\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t\t: rule\r\n\t\t\t\t: transformDiffDeclarations(rule.original, rule.expected)\r\n\t\t);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffRules;\r\n","import { Unset, } from '../CSSTransformers';\r\n\r\nimport diffAtRules from './diffAtRules';\r\nimport transformDiffDeclarations from './transformDiffDeclarations';\r\nimport transformDiffRules from './transformDiffRules';\r\n\r\n/**\r\n * Compare at rules and apply diff transformation.\r\n * @memberof diff\r\n * @param {AtRule[]} original Original rules set.\r\n * @param {AtRule[]} expected Expected rules set.\r\n */\r\nfunction transformDiffAtRules(original, expected) {\r\n\tconst diff = diffAtRules(original, expected),\r\n\t\tresult = [];\r\n\r\n\tdiff.map(({ state, rule, }) => {\r\n\t\tif (0 !== state) return result.push(\r\n\t\t\tstate < 0\r\n\t\t\t\t? (Unset.transform(rule), rule)\r\n\t\t\t\t: rule\r\n\t\t);\r\n\r\n\t\ttransformDiffDeclarations(rule.original, rule.expected);\r\n\t\ttransformDiffRules(rule.original.children, rule.expected.children);\r\n\r\n\t\treturn result.push(rule.original);\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport default transformDiffAtRules;\r\n","import './AST/nodeTypes';\r\nimport { compile, serialize, stringify, } from 'stylis';\r\n\r\nimport { normalize, } from './AST';\r\nimport { transformDiffRules, transformDiffAtRules, } from './diff';\r\n\r\n\r\n/**\r\n * Generate CSS difference patch between two CSS stylesheets.\r\n * @param {string} original Original CSS stylesheet.\r\n * @param {string} expected Desired CSS stylesheet.\r\n * @returns {string} CSS patch difference.\r\n */\r\nfunction generateCSSPatch(original, expected) {\r\n\tconst ast = [\r\n\t\t\toriginal,\r\n\t\t\texpected,\r\n\t\t].map(ast => normalize(\r\n\t\t\tcompile(\r\n\t\t\t\tserialize(\r\n\t\t\t\t\tcompile(ast),\r\n\t\t\t\t\tstringify\r\n\t\t\t\t)\r\n\t\t\t)\r\n\t\t)),\r\n\t\tresult = [];\r\n\r\n\tresult.push(...[\r\n\t\t...transformDiffRules(ast[0], ast[1]),\r\n\t\t...transformDiffAtRules(ast[0], ast[1]),\r\n\t]);\r\n\r\n\treturn serialize(result, stringify);\r\n}\r\n\r\nexport default generateCSSPatch;\r\n","import { compile, serialize, stringify, } from 'stylis';\r\n\r\n\r\n/**\r\n * Apply transformations to CSS AST.\r\n * Transformer function can ether return AST or falsy value\r\n * (if transformations was applied to the original AST).\r\n * @param {string} css Stylesheet to transform.\r\n * @param {Function} transformer Transformer function.\r\n * @returns {string} Transformed stylesheet.\r\n */\r\nfunction transformCSS(css, transformer) {\r\n\tconst ast = compile(css);\r\n\r\n\tlet result = transformer(ast);\r\n\r\n\treturn serialize(\r\n\t\tresult || ast,\r\n\t\tstringify\r\n\t);\r\n}\r\n\r\nexport default transformCSS;\r\n"],"names":["findAtRuleBySelector","selector","rules","find","rule","value","findDeclarationByKey","key","declarations","declaration","props","findRuleBySelector","join","getAtRulesSelectors","map","typesMap","comm","decl","root","getNodeType","el","Array","isArray","type","startsWith","getRulesSelectors","CSSTransformerBase","this","getTransformer","constructor","transformSubElements","elements","list","whitelist","forEach","child","_i","_children","includes","_this$getNodeType","bind","_this$getNodeType$bin2","i","parentChildren","cb","rootAnchor","Object","create","parent","atRule","children","comment","compareValues","a","b","nodesSorter","SortAndMerge","rulesMaps","WeakMap","rootsMaps","get","keys","droppedItems","childIndex","_el","push","item","splice","indexOf","sort","id","has","set","unshift","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","filter","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify","transformCSS","css","transformer"],"mappings":"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"}

@@ -1,2 +0,2 @@

Copyright 2020 Yaroslav Vorobev and contributors. All rights reserved.
Copyright 2020-2022 Yaroslav Vorobev and contributors. All rights reserved.

@@ -3,0 +3,0 @@ Permission to use, copy, modify, and/or distribute this software for any

@@ -13,3 +13,3 @@ {

"name": "css-patch",
"version": "1.1.2",
"version": "1.2.0",
"description": "CSS patch generator.",

@@ -44,32 +44,32 @@ "keywords": [

"devDependencies": {
"@babel/core": "^7.12.13",
"@babel/preset-env": "^7.12.13",
"@rollup/plugin-babel": "^5.2.3",
"@rollup/plugin-commonjs": "^17.1.0",
"@babel/core": "^7.16.7",
"@babel/eslint-parser": "^7.16.5",
"@babel/preset-env": "^7.16.7",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-commonjs": "^21.0.1",
"@rollup/plugin-json": "^4.0.2",
"@rollup/plugin-node-resolve": "^11.1.1",
"@types/diff": "^5.0.0",
"@types/stylis": "^4.0.0",
"@zekfad/eslint-config": "^1.0.0",
"babel-eslint": "^10.1.0",
"codecov": "^3.7.2",
"eslint": "^7.19.0",
"eslint-plugin-import": "^2.22.1",
"jsdoc": "^3.6.6",
"@rollup/plugin-node-resolve": "^13.1.3",
"@types/diff": "^5.0.2",
"@types/stylis": "^4.0.2",
"@zekfad/eslint-config": "^1.0.2",
"codecov": "^3.8.3",
"eslint": "^8.6.0",
"eslint-plugin-import": "^2.25.4",
"jsdoc": "^3.6.7",
"magic-string": "^0.25.7",
"mocha": "^8.1.3",
"mocha": "^9.1.3",
"npm-run-all": "^4.1.5",
"nyc": "^15.1.0",
"rollup": "^2.38.5",
"rollup": "^2.63.0",
"rollup-plugin-terser": "^7.0.2",
"tui-jsdoc-template": "^1.2.2",
"typescript": "^4.1.4"
"typescript": "^4.5.4"
},
"engines": {
"node": ">=10"
"node": ">=12"
},
"dependencies": {
"diff": "^5.0.0",
"stylis": "^4.0.7"
"stylis": "^4.0.13"
}
}
+27
-20

@@ -8,12 +8,12 @@ # css-patch

## Reasons to use
## Use cases
### Themes generation
The easiest way to make a new theme is just copy the file and change some stuff
or if you use preprocessor (such as SCSS, Less, etc.) you can just change some
variables and get a new style.
The easiest way to make a new theme is to copy the file and change some stuff
or, if you use a preprocessor (such as SCSS, Less, etc.), change some
variables and get a new stylesheet.
But serving files with big amount of literally the same code is not a good idea,
so this is when css-patch can help you.
But serving files with big amount of the same code is not a good idea, so this
is when css-patch can help you.

@@ -28,5 +28,5 @@ You can pass 2 stylesheets (`original`/`base` and `expected`) to `generateCSSPatch`

Imagine if you have two versions of the same CSS.
Imagine that you have two versions of the same CSS stylesheet.
You can use this module to get the "difference" between them.
By using this module you can get the difference between them.

@@ -51,14 +51,14 @@ ## Install

For advanced usage see the docs for [`transformCSS`](https://zekfad.github.io/css-patch/global.html#transformCSS) function and [`CSSTransformerBase`](https://zekfad.github.io/css-patch/CSSTransformerBase.html) class.
For advanced usage see the docs for [`transformCSS`](https://zekfad.github.io/css-patch/global.html#transformCSS) function and [`CSSTransformerBase`](https://zekfad.github.io/css-patch/CSSTransformers.CSSTransformerBase.html) class.
## Possible caveats
### `unset`
### `unset`
If something existed in `original` stylesheet missing in `expected` one,
will result of being transformed to `<something>: unset;`.
Declarations missing in `expected` stylesheet, but present in `original` one,
will be set to `unset`.
### Combined rule orders
Logically the same but with a different order combined rules (e.g. `.a,.b` and `.b,.a`)
Logically the same but with a different order combined rules (e.g.`.a,.b` and `.b,.a`)
will be considered as a different rules.

@@ -68,6 +68,6 @@

If rules have exact the same name their declarations would be merged (later appeared
declarations will be a higher priority).
Rules with the same name will have their declarations merged with each other,
overriding previous declarations in the order they appear.
For example `.a{a:1;c:3;}.a{a:2;b:2;}` will be threat as `.a{a:2;b:2;c;3}`.
For example `.a{a:1;c:3;}.a{a:2;b:2;}` will be treated as `.a{a:2;b:2;c;3}`.

@@ -98,7 +98,14 @@ ### Sorting

console.log(
generateCSSPatch(
'a{a:1;b:1;}b{b:1;}c{a:1;}d{a:1;}',
'a{a:1;}b{b:2;}c{a:1;}'
generateCSSPatch(`
a { same: value; missing: value; }
b { different: original_value; }
c { same: rule; }
missing_rule { missing: value; }
`, `
a { same: value; }
b { different: new_value; }
c { same: rule; }
`
)
); // 'a{b:unset;}b{b:2;}d{a:unset;}'
); // 'a{missing:unset;}b{different:new_value;}missing_rule{missing:unset;}'
```
export default findAtRuleBySelector;
/**
* Find at rule object in list of at rules by given selector.
* @memberof AST
* @param {string} selector String selector (multiple selectors are joined by comma).

@@ -5,0 +6,0 @@ * @param {AtRule[]} rules List of rules.

export default findDeclarationByKey;
/**
* Find declaration object in list of declarations by given key.
* @memberof AST
* @param {string} selector Declaration key.

@@ -5,0 +6,0 @@ * @param {Declaration[]} declarations List of declarations.

export default findRuleBySelector;
/**
* Find rule object in list of rules by given selector.
* @memberof AST
* @param {string} selector String selector (multiple selectors are joined by comma).

@@ -5,0 +6,0 @@ * @param {Rule[]} rules List of rules.

export default getAtRulesSelectors;
/**
* Get all selectors from a rules set.
* @memberof AST
* @param {AtRule[]} rules List of rules.

@@ -5,0 +6,0 @@ * @returns {string[]} Selectors.

export default getNodeType;
/**
* Get node type.
* @memberof AST
* @param {ASTNode|ASTNode[]} el Element.

@@ -5,0 +6,0 @@ * @returns {?string} Node transformer name.

export default getRulesSelectors;
/**
* Get all selectors from a rules set.
* @memberof AST
* @param {Rule[]} rules List of rules.

@@ -5,0 +6,0 @@ * @returns {string[]} Selectors.

export default normalize;
/**
* Sort declarations and merge equal rules in order they appear.
* @memberof AST
* @param {stylis.Element[]} ast
*/
declare function normalize(ast: stylis.Element[]): import("stylis").Element[];
export default CSSTransformerBase;
/**
* CSS AST transformer.
* In order to apply this transformer use static `CSSTransformerBase.transform(el)`.
* To apply this transformer call `CSSTransformerBase.transform(el)`.
* Base class for CSS AST transformer.
* Advanced usage notes:
* This is a base class for CSS AST transformer.
* You can subclass this class to implement your transformer.
* Just remember to call `this.transformSubElements(el.children)`
* if you deal with multi-level items (roots, rules, at rules).
* You can subclass it to implement your own transformer.
* Just remember to call `this.transformSubElements(el.children)` if you deal
* with multi-level items (roots, rules, at rules).
* @memberof CSSTransformers
* @class
*/

@@ -21,3 +23,3 @@ declare class CSSTransformerBase {

* @param {?string[]} list Blacklist or whitelist of types.
* @param {?boolean} whitelist Whatever to use whitelist.
* @param {?boolean} whitelist Whether list is whitelist or blacklist.
*/

@@ -24,0 +26,0 @@ transformSubElements(elements: ASTNode[], list: string[] | null, whitelist: boolean | null): void;

export default SortAndMerge;
/**
* Merge duplicate declarations. For duplicated identifies last one would be used.
* In order to apply this transformer use static `SortAndMerge.transform(el)`.
* To apply this transformer call `SortAndMerge.transform(el)`.
* @memberof CSSTransformers
* @class
*/

@@ -6,0 +8,0 @@ declare class SortAndMerge extends CSSTransformerBase {

export default Unset;
/**
* Unset all declarations.
* In order to apply this transformer use static `Unset.transform(el)`.
* To apply this transformer call `Unset.transform(el)`.
* @memberof CSSTransformers
* @class
*/

@@ -6,0 +8,0 @@ declare class Unset extends CSSTransformerBase {

export default UpdateDeclarations;
/**
* Update all declarations.
* In order to apply this transformer use static `UpdateDeclarations.transform(el)`.
* To apply this transformer call `UpdateDeclarations.transform(el)`.
* @memberof CSSTransformers
* @class
*/

@@ -6,0 +8,0 @@ declare class UpdateDeclarations extends CSSTransformerBase {

export default diffAtRules;
/**
* Compare at rules between lists of AST nodes.
* @memberof diff
* @param {ASTNode[]} originalNodes Original nodes list.

@@ -5,0 +6,0 @@ * @param {ASTNode[]} expectedNodes Expected nodes list.

export default diffDeclarations;
/**
* Compare declarations between rules.
* @memberof diff
* @param {Rule} originalRule Original rule.

@@ -5,0 +6,0 @@ * @param {Rule} expectedRule Expected rule.

export default diffRules;
/**
* Compare rules between lists of AST nodes.
* @memberof diff
* @param {ASTNode[]} originalNodes Original nodes list.

@@ -5,0 +6,0 @@ * @param {ASTNode[]} expectedNodes Expected nodes list.

export default getDiffPartState;
/**
* Get numeric state of a diff part.
* @memberof diff
* @param {Diff.ArrayChange.<any>} diffPart Diff part.

@@ -5,0 +6,0 @@ * @returns {number}

export default transformDiffAtRules;
/**
* Compare at rules and apply diff transformation.
* @memberof diff
* @param {AtRule[]} original Original rules set.

@@ -5,0 +6,0 @@ * @param {AtRule[]} expected Expected rules set.

export default transformDiffDeclarations;
/**
* Compare declarations between rules and apply diff transformation.
* @memberof diff
* @param {Rule} originalRule Original rule.

@@ -5,0 +6,0 @@ * @param {Rule} expectedRule Expected rule.

export default transformDiffRules;
/**
* Compare rules and apply diff transformation.
* @memberof diff
* @param {Rule[]} original Original rules set.

@@ -5,0 +6,0 @@ * @param {Rule[]} expected Expected rules set.