@@ -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
-1
@@ -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 |
+19
-19
@@ -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. |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
103025
1.45%440
5.26%107
7%0
-100%Updated