| export default transformCSS; | ||
| /** | ||
| * Apply transformations to CSS AST. | ||
| * Transformer function can ether return AST or return falsy value | ||
| * if transformations was applied to original AST. | ||
| * @param {string} css Stylesheet to transform. | ||
| * @param {Function} transformer Transformer function. | ||
| * @returns {string} Transformed stylesheet. | ||
| */ | ||
| declare function transformCSS(css: string, transformer: Function): string; |
@@ -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){return elements.forEach(((child,_i,_children)=>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=>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: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,this.transformSubElements(el.children);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;el.children=el.children.filter((child=>"declaration"!==getNodeType(child)||!!declarations[_i]&&(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0)))}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)}; | ||
| "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){return elements.forEach(((child,_i,_children)=>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=>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: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,this.transformSubElements(el.children);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;el.children=el.children.filter((child=>"declaration"!==getNodeType(child)||!!declarations[_i]&&(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0)))}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)}; | ||
| //# 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"],"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 */\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 provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t */\r\n\ttransformSubElements(elements) {\r\n\t\treturn elements.forEach((child, _i, _children) =>\r\n\t\t\tthis.getTransformer(child)(child, _i, _children));\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 => child.parent = rootAnchor);\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\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\tthis.transformSubElements(el.children);\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\tel.children = el.children.filter(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\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\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"],"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","forEach","child","_i","_children","_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","includes","push","item","splice","indexOf","sort","id","has","set","unshift","filter","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify"],"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 * @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 */\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 provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t */\r\n\ttransformSubElements(elements) {\r\n\t\treturn elements.forEach((child, _i, _children) =>\r\n\t\t\tthis.getTransformer(child)(child, _i, _children));\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 => child.parent = rootAnchor);\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\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\tthis.transformSubElements(el.children);\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\tel.children = el.children.filter(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\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\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 return falsy value\r\n * if transformations was applied to 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","forEach","child","_i","_children","_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","includes","push","item","splice","indexOf","sort","id","has","set","unshift","filter","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","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){return elements.forEach(((child,_i,_children)=>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=>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: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,this.transformSubElements(el.children);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;el.children=el.children.filter((child=>"declaration"!==getNodeType(child)||!!declarations[_i]&&(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0)))}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)}export{index$1 as AST,index as CSSTransformers,index$2 as diff,generateCSSPatch}; | ||
| 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){return elements.forEach(((child,_i,_children)=>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=>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: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,this.transformSubElements(el.children);const{rulesMaps:rulesMaps}=this,rule=rulesMaps.get(el),declarations="object"==typeof rule?Object.keys(rule).sort():[];let _i=0;el.children=el.children.filter((child=>"declaration"!==getNodeType(child)||!!declarations[_i]&&(child.props=declarations[_i],child.children=rule[declarations[_i]],child.value=`${child.props}:${child.children};`,_i++,!0)))}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}; | ||
| //# 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"],"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 */\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 provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t */\r\n\ttransformSubElements(elements) {\r\n\t\treturn elements.forEach((child, _i, _children) =>\r\n\t\t\tthis.getTransformer(child)(child, _i, _children));\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 => child.parent = rootAnchor);\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\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\tthis.transformSubElements(el.children);\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\tel.children = el.children.filter(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\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\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"],"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","forEach","child","_i","_children","_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","includes","push","item","splice","indexOf","sort","id","has","set","unshift","filter","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","diff","diffArrays","result","state","diffDeclarations","originalRule","expectedRule","diffRules","transformDiffDeclarations","originalDeclaration","expectedDeclaration","transformDiffRules","transformDiffAtRules","generateCSSPatch","compile","serialize","stringify"],"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 * @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 */\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 provided sub elements.\r\n\t * @param {ASTNode[]} elements Array of elements.\r\n\t */\r\n\ttransformSubElements(elements) {\r\n\t\treturn elements.forEach((child, _i, _children) =>\r\n\t\t\tthis.getTransformer(child)(child, _i, _children));\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 => child.parent = rootAnchor);\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\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\tthis.transformSubElements(el.children);\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\tel.children = el.children.filter(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\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\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 return falsy value\r\n * if transformations was applied to 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","forEach","child","_i","_children","_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","includes","push","item","splice","indexOf","sort","id","has","set","unshift","filter","Unset","UpdateDeclarations","normalize","ast","transform","getDiffPartState","diffPart","added","removed","diffAtRules","originalNodes","expectedNodes","original","expected","nodes","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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"} |
+9
-7
@@ -13,3 +13,3 @@ { | ||
| "name": "css-patch", | ||
| "version": "1.0.1", | ||
| "version": "1.1.0", | ||
| "description": "CSS patch generator.", | ||
@@ -20,3 +20,5 @@ "keywords": [ | ||
| "patch", | ||
| "stylesheets" | ||
| "stylesheets", | ||
| "stylesheet", | ||
| "transformer" | ||
| ], | ||
@@ -45,6 +47,6 @@ "homepage": "https://github.com/Zekfad/css-patch", | ||
| "@babel/preset-env": "^7.12.11", | ||
| "@rollup/plugin-babel": "^5.2.1", | ||
| "@rollup/plugin-commonjs": "^17.0.0", | ||
| "@rollup/plugin-babel": "^5.2.3", | ||
| "@rollup/plugin-commonjs": "^17.1.0", | ||
| "@rollup/plugin-json": "^4.0.2", | ||
| "@rollup/plugin-node-resolve": "^11.1.0", | ||
| "@rollup/plugin-node-resolve": "^11.1.1", | ||
| "@types/diff": "^5.0.0", | ||
@@ -62,3 +64,3 @@ "@types/stylis": "^4.0.0", | ||
| "nyc": "^15.1.0", | ||
| "rollup": "^2.38.0", | ||
| "rollup": "^2.38.1", | ||
| "rollup-plugin-terser": "^7.0.2", | ||
@@ -73,4 +75,4 @@ "tui-jsdoc-template": "^1.2.2", | ||
| "diff": "^5.0.0", | ||
| "stylis": "^4.0.6" | ||
| "stylis": "^4.0.7" | ||
| } | ||
| } |
+2
-1
| import * as AST from "./AST"; | ||
| import * as CSSTransformers from "./CSSTransformers"; | ||
| import * as diff from "./diff"; | ||
| import transformCSS from "./transformCSS"; | ||
| import generateCSSPatch from "./generateCSSPatch"; | ||
| export { AST, CSSTransformers, diff, generateCSSPatch }; | ||
| export { AST, CSSTransformers, diff, transformCSS, generateCSSPatch }; |
95776
2.63%32
3.23%408
3.29%Updated