@oracle/oraclejet-audit 18.1.5 → 19.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corePackMigrator/corePackMigrator.js +1 -1
- package/corePackMigrator/metadata/badgeMetadata.json +66 -0
- package/corePackMigrator/metadata/checkboxsetMetadata.json +101 -0
- package/corePackMigrator/metadata/inputNumberMetadata.json +0 -3
- package/corePackMigrator/metadata/inputTextMetadata.json +0 -3
- package/corePackMigrator/metadata/labelMetadata.json +285 -222
- package/corePackMigrator/metadata/labelValueMetadata.json +226 -137
- package/corePackMigrator/metadata/listviewMetadata.json +7 -0
- package/corePackMigrator/metadata/radiosetMetadata.json +20 -9
- package/corePackMigrator/metadata/selectorMetadata.json +6 -0
- package/corePackMigrator/resource/astUtils.js +1 -1
- package/corePackMigrator/resource/componentMigrator.js +1 -1
- package/corePackMigrator/resource/fileScanner.js +1 -1
- package/corePackMigrator/resource/htmlUtils.js +1 -1
- package/corePackMigrator/resource/manifest.json +57 -49
- package/corePackMigrator/resource/migrationConfig.json +1 -1
- package/corePackMigrator/utilities/logging.js +2 -2
- package/jaf-amd.js +1 -1
- package/lib/Components.js +1 -1
- package/lib/Config.js +1 -1
- package/lib/FsUtils.js +1 -1
- package/lib/HtmlUtils.js +1 -1
- package/lib/JafLib.js +1 -1
- package/lib/MetaLib.js +1 -1
- package/lib/OjCPack.js +1 -1
- package/lib/RegTypes.js +1 -1
- package/lib/Registry.js +1 -1
- package/lib/Rules.js +1 -1
- package/lib/Ts.js +1 -1
- package/lib/TsUtils.js +1 -1
- package/lib/TsxUtils.js +1 -1
- package/lib/checkage.js +1 -1
- package/lib/defaults.js +1 -1
- package/lib/extends.js +1 -1
- package/lib/ns.js +1 -1
- package/lib/scaffold.js +1 -1
- package/lib/scopewalker.js +1 -1
- package/lib/sublib/precomp/Precompiler.js +1 -1
- package/libext/expparser.js +1 -1
- package/meta/18.0.0/jetauditmeta.js +1 -1
- package/meta/18.1.0/jetauditmeta.js +1 -1
- package/meta/19.0.0/jetauditmeta.js +9 -0
- package/meta/metaverlist.json +1 -1
- package/package.json +4 -4
- package/profiles/best-practice.json +3 -0
- package/profiles/redwood-strict.json +10 -1
- package/rulepacks/jetwc/jetwc-use-public-apis.js +6 -0
- package/rulepacks/jetwc/msgid.json +1 -1
- package/rulepacks/jetwc/rules.json +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +1 -1
- package/rulepacks/jetwco/jetwco-cacc-properties.js +1 -1
- package/rulepacks/jetwco/rules.json +1 -1
- package/rules/jet/msgid.json +1 -1
- package/rules/jet/oj-acc-aria-accessible.js +1 -1
- package/rules/jet/oj-acc-aria-prop.js +1 -1
- package/rules/jet/oj-acc-navigable-link.js +6 -0
- package/rules/jet/oj-acc-select-aria-label.js +1 -1
- package/rules/jet/oj-cca-compjson-prop-conflict.js +6 -0
- package/rules/jet/oj-css-bp-zindex.js +7 -0
- package/rules/jet/oj-html-badge-maintenance.js +6 -0
- package/rules/jet/oj-html-binding-as-slot-child.js +1 -1
- package/rules/jet/oj-html-corequired.js +6 -0
- package/rules/jet/oj-html-nav-tab-nointeractive.js +6 -0
- package/rules/jet/oj-html-oj-ux-ico-slot.js +6 -0
- package/rules/jet/oj-html-ojtag-id.js +1 -1
- package/rules/jet/oj-html-redwood-ojoption-disabled.js +6 -0
- package/rules/jet/oj-html-slot-pref-content.js +1 -1
- package/rules/jet/oj-html-tabbar-progressive-popup.js +1 -1
- package/rules/jet/oj-html-wctag-for.js +1 -1
- package/rules/jet/oj-html-wctag-id.js +1 -1
- package/rules/jet/oj-html-wctag-maintenance.js +1 -1
- package/rules/jet/oj-html-wctag-packprivate.js +1 -1
- package/rules/jet/oj-js-poly-promise.js +1 -1
- package/rules/jet/oj-ts-poly-promise.js +1 -1
- package/rules/jet/oj-tsx-acc-navigable-link.js +6 -0
- package/rules/jet/oj-tsx-aria-prop.js +1 -1
- package/rules/jet/oj-tsx-corequired.js +6 -0
- package/rules/jet/oj-tsx-prop-ko-binding.js +6 -0
- package/rules/jet/oj-tsx-tabbar-progressive-popup.js +6 -0
- package/rules/jet/oj-tsx-wctag-packprivate.js +1 -1
- package/rules/jet/rules.json +1 -1
- package/schema/component-schema.json +1 -1
- package/src/JafCore.js +1 -1
- package/types/index.d.ts +5 -0
- package/corePackMigrator/metadata/messagesMetadata.json +0 -41
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const traverse=require("ast-traverse");const logging=require("../utilities/logging");const generate=require("@babel/generator").default;const{parse}=require("@babel/parser");const self=require("./astUtils");function inManifestData(tag){for(let obj of global.manifestData){if(obj.componentName===tag){return obj}}return false}function checkFileUpdate(){if(!global.fileIsUpdated){logging.logFilePath(global.filePath);global.fileIsUpdated=true;global.migrationMetrics.files+=1;return true}return false}function generateAST(code){try{return parse(code,{sourceType:"unambiguous",plugins:global.plugins})}catch(e){if(e instanceof SyntaxError){logging.logFilePath(global.filePath,true);logging.logMessage(`\tCouldn't migrate file because file syntax is not clear`);global.errorInFile=true}}}function generateCode(ast){return generate(ast,{retainLines:false}).code}function _generateSpecCode(ast){return generateCode(ast).replace(/^\s*$(?:\r\n?|\n)/gm,"")}function _appendAttribute(name,value,tag){for(let attr of tag.attributes){if(attr.name.name===name){return false}}let node;if(!value.expression){node={type:"StringLiteral",value:`${value}`}}else{const expAst=generateAST(`{${value.expression}}`).program.body[0].body[0].expression;node={type:"JSXExpressionContainer",expression:expAst}}const attrNode={type:"JSXAttribute",name:{type:"JSXIdentifier",name:`${name}`},value:node};tag.attributes.push(attrNode);return true}function appendImport(value,index,ast){const importNode={type:"JSXText",value:`import "${value}";\n`};ast.program.body.splice(index,0,importNode)}function _appendImportToRequire(toImport,node,parent){const importNode={type:"StringLiteral",value:`${toImport}`};if(parent){parent.elements.push(importNode)}else{node.expression.arguments.push(importNode)}}function _hasImportInRequire(args,fromImport){for(let arg of args){if(arg.type==="ArrayExpression"){obj=_hasImportInRequire(arg.elements,fromImport);if(obj&&!obj.parent){obj.parent=arg}return obj}else if(arg.type==="StringLiteral"&&arg.value===fromImport){return{child:arg}}}return false}function _hasImport(body,importVal,newImports){for(let node of body){if(node.type==="ImportDeclaration"&&node.source.value===importVal||node.type==="JSXText"&&node.value.includes(importVal)){return true}}for(let obj of newImports){if(obj.name===importVal){return true}}return false}function _commentJSX(node){return node.type==="JSXElement"?`{ /* ${_generateSpecCode(node)} */ }`:`{ /* ${node.value} */ }`}function _getText(text,locObj){let specificText;const dataArray=text.split("\n");const{start,end}=locObj;if(start.line===end.line){specificText=dataArray[start.line-1].substring(start.column,end.column);return specificText}else{dataArray[start.line-1]=dataArray[start.line-1].substring(start.column);const textByLines=dataArray.slice(start.line-1,end.line).map(s=>s.trim());specificText=textByLines.join("\n");return specificText}}function _getLabelFromLegacyComponent(node,slotName,labelVal="",cnodesArr=[]){for(let child of node.children){switch(child.type){case"JSXText":if(/\S/.test(child.value)){if(labelVal){if(labelVal.expression){labelVal.expression=`(${labelVal.expression}) + ' ${child.value.trim()}'`}else{labelVal+=" "+child.value.trim()}}else{labelVal=child.value.trim()}child.type="JSXText";child.value="";cnodesArr.push(child)}break;case"JSXExpressionContainer":if(child.expression&&child.expression.type!="JSXEmptyExpression"){if(labelVal){if(labelVal.expression){labelVal.expression=`(${labelVal.expression}) + (${_generateSpecCode(child.expression)})`}else{labelVal={expression:`'${labelVal} ' + (${_generateSpecCode(child.expression)})`}}}else{labelVal={expression:_generateSpecCode(child.expression)}}child.type="JSXText";child.value="";cnodesArr.push(child)}break;case"JSXElement":let slotValue;switch(child.openingElement.name.name.toUpperCase()){case"OJ-BIND-TEXT":for(let attr of child.openingElement.attributes){if(attr.name.name=="value"){if(attr.value.type==="JSXExpressionContainer"){if(labelVal.expression){labelVal.expression=`${labelVal.expression} + (${_generateSpecCode(attr.value.expression)})`}else{if(labelVal){labelVal={expression:`'${labelVal} ' + (${_generateSpecCode(attr.value.expression)})`}}else{labelVal={expression:_generateSpecCode(attr.value.expression)}}}}else if(attr.value.type==="StringLiteral"){if(labelVal.expression){labelVal.expression=`${labelVal.expression} + ' ${attr.value.value}'`}else{if(labelVal){labelVal+=" "+attr.value.value}else{labelVal=attr.value.value}}}child.type="JSXText";child.value="";cnodesArr.push(child);break}}break;case"SPAN":case"DIV":child.openingElement.attributes.forEach(attr=>{if(attr.name.name=="slot"&&(attr.value.value===slotName||!attr.value.value.length))slotValue=true});if(!child.openingElement.attributes.map(att=>att.name.name).includes("slot")){slotValue=true}if(slotValue){const result=_getLabelFromLegacyComponent(child,slotName,labelVal,cnodesArr);let emptyChildren=true;let i=0;var regex=new RegExp("^[^\\dA-Za-z]*$");while(emptyChildren===true&&child.children[i]){if(!(child.children[i].type==="JSXText"&®ex.test(child.children[i].value))){emptyChildren=false}i++}if(emptyChildren){result.cnodes.push(child)}return{label:result.label,cnodes:result.cnodes}}break}}}return{label:labelVal,cnodes:cnodesArr}}function _findPeer(ast,node,peerTag,componentAttr,peerAttr){const attributeValue=_findAttribute(node.openingElement.attributes,componentAttr).attrValue;let peer;if(attributeValue){traverse(ast,{pre:function(n){if(n.type==="JSXElement"&&n.openingElement.name&&n.openingElement.name.name===peerTag){if(_findAttribute(n.openingElement.attributes,peerAttr,attributeValue).attrValue===attributeValue){peer=n}}}});return peer}}function _findVariable(ast,name){let variable;traverse(ast,{pre:function(n){if(n.type==="VariableDeclarator"&&n.id.name===name){variable=n}}});return variable}function _hasAttributesToIgnoreHelper(node,rule,key,parent,ast,corePackTag){let keys;if(rule.missPeerTag){const peerRule=rule.missPeerTag;for(let tag of peerRule.tag){for(let attrSet of peerRule.matchValues){const peer=_findPeer(ast,node,tag,attrSet.ownAttribute,attrSet.peerAttribute);if(peer&&(!peerRule.attribute||!_findAttribute(peer.openingElement.attributes,peerRule.attribute))&&(!peerRule.missSlot||_findAttribute(peer.openingElement.attributes,"slot",peerRule.missSlot))){return false}}}return true};if(rule.missDescendant){const descRule=rule.missDescendant;for(let tag of descRule.tag){const desc=_findDescendant(node,tag,descRule.missSlot);if(desc&&(!descRule.attribute||!_findAttribute(desc.openingElement.attributes,descRule.attribute))){return false}}return true};if(rule.missAttribute){keys=Object.keys(rule.missAttribute);for(let key in rule.missAttribute){rule.missAttribute[_toCamelCase(key)]=rule.missAttribute[key];keys.push(_toCamelCase(key))}}if(!rule.descendant&&node.openingElement.attributes.length){for(let i=0;i<node.openingElement.attributes.length;i++){const attribute=node.openingElement.attributes[i];if(rule.missAttribute){if(keys.includes(attribute.name.name)&&(!rule.missAttribute[attribute.name.name]||attribute.value.value===rule.missAttribute[attribute.name.name])){return false}}else{if(rule.attribute){const hasAttribute=_findAttribute(attribute,rule.attribute);if(hasAttribute&&(rule.allowedValues&&!rule.allowedValues.includes(attribute.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attribute.value.value)||!rule.allowedValues&&!rule.prohibitedValues)){const value=rule.allowedValues||rule.prohibitedValues?attribute.value.value:"";if(corePackTag){if(rule.typeDefined){const variable=_findVariable(ast,hasAttribute.attrValue.expression?hasAttribute.attrValue.expression.expression.name:hasAttribute.attrValue);if(variable&&variable.id.typeAnnotation){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,hasAttribute.format?hasAttribute.attribute:rule.attribute,"",parent,"",`Component needs manual migration due to a legacy type`);return true}return false}else{checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,hasAttribute.format?hasAttribute.attribute:rule.attribute,value,parent)}}return true}}if(attribute.name.name===key&&attribute.value.value===rule[key]){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key],parent)}return true}}}}if(!rule.descendant&&rule.missAttribute){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,rule.missAttribute,"",parent,true)}return true}if(node.children){for(let j=0;j<node.children.length;j++){let child=node.children[j];if(child.type==="JSXElement"){if(rule.descendant){if(child.openingElement.name&&child.openingElement.name.name===rule.descendant){if(rule.attribute||rule.slotName||rule.missSlot){for(let attr of child.openingElement.attributes){if(rule.attribute){const hasAttribute=_findAttribute(attr,rule.attribute);if(hasAttribute&&(rule.allowedValues&&!rule.allowedValues.includes(attr.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attr.value.value)||!rule.prohibitedValues&&!rule.allowedValues)){if(hasAttribute.format){rule.attribute=hasAttribute.attribute}if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,rule.attribute,attr.value.value,parent)}return true}}else if(attr.name.name==="slot"){if(rule.slotName&&rule.slotName===attr.value.value){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",attr.value.value,parent)}return true}else if(rule.missSlot&&attr.value.value===rule.missSlot){return false}}}if(rule.missSlot){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",rule.missSlot,parent,true)}return true}}else{if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(rule.descendant,"","",parent)}return true}}else if(_hasAttributesToIgnoreHelper(child,rule,key,parent,ast,corePackTag)){return true}}if(child.openingElement.attributes&&!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(child,rule,key,parent,ast,corePackTag)){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key])}return true}}}}}function hasAttributesToIgnore(node,metadata,ast,parent=""){const ignoreRuleData=metadata.ruleSetToIgnore;if(node.openingElement){if(ignoreRuleData){for(let rule of ignoreRuleData){let arr=Object.keys(rule);let key=arr[0];if(rule.descendant){parent=node.openingElement.name.name}if(_hasAttributesToIgnoreHelper(node,rule,key,parent,ast,metadata.corePackTag)){return true}}}}return false}function hasExpressionAttributes(component,componentName,code,importantAttributes=null,isPre=false){const excludedAttributes=global.configData.excludeAttributeExpressions[componentName];if(global.jaf.options.dryRunMode&&importantAttributes){component.attributes.forEach(attribute=>{if(importantAttributes.includes(attribute.name.name)&&attribute.value&&attribute.value.type==="JSXExpressionContainer"){const expression=_getText(code,attribute.value.loc);if(checkFileUpdate()){logging.logAttributeExpression(componentName,attribute.name.name,expression)}}})}if(excludedAttributes&&excludedAttributes.length){for(let exAtt of excludedAttributes){for(let i=0;i<component.attributes.length;i++){const attribute=component.attributes[i];if(exAtt===attribute.name.name&&attribute.value.type==="JSXExpressionContainer"){const expression=attribute.value.loc?_getText(code,attribute.value.loc):_generateSpecCode(attribute.value);checkFileUpdate();logging.logExcludeAttributeExpression(componentName,exAtt,expression);return true}}}}return false}function commentSlotContent(node,data){for(let child of node.children){if(child.openingElement&&child.openingElement.attributes){for(let attribute of child.openingElement.attributes){if(attribute.name.name=="slot"&&attribute.value.value==data.slot){const value=_commentJSX(child);index=node.children.indexOf(child);node.children[index]=generateAST(_generateSpecCode({type:"JSXText",value:`${value}`}));checkFileUpdate();return[logging.logCommentSlotContent(node.openingElement.name.name,data.slot)]}};}};}function _transferAttribute(fromTag,toTag,attribute,value){for(let attr in fromTag.attributes){if(fromTag.attributes[attr].name.name===attribute&&(fromTag.attributes[attr].value.value===value||value.expression&&_generateSpecCode(fromTag.attributes[attr].value.expression)===value.expression)){_appendAttribute(attribute,value,toTag);fromTag.attributes.splice(attr,1);break}}}function _findDescendant(node,tagName,slotName){if(node.children){for(let child of node.children){if(child.type==="JSXElement"&&child.openingElement.name&&child.openingElement.name.name===tagName){if(!slotName){return child}else{for(let attr of child.openingElement.attributes){if(attr.name.name==="slot"&&attr.value.value===slotName){return child}}}}else{const descendant=_findDescendant(child,tagName,slotName?slotName:"");if(descendant){return descendant}}}}return false}function slotContentToAttribute(node,data,code,ast){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){const descendant=_findDescendant(node,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){const descendant=_findDescendant(node,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){node=descendant}else{continue}}if(obj.toPeer||obj.fromPeer){const peer=_findPeer(ast,node,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peer){if(obj.toPeer){toNode=peer}else{node=peer}}else{continue}}if(!node.openingElement.attributes.map(att=>att.name.name).includes(obj.attribute)){const component=node.openingElement;const legacyButtonLabel=_getLabelFromLegacyComponent(node,obj.slotName);if(legacyButtonLabel){let{label,cnodes}=legacyButtonLabel;if(label){for(let cnode of cnodes){if(cnode.type==="JSXElement"&&(cnode.openingElement.name.name==="span"||cnode.openingElement.name.name==="div")){for(let child of cnode.children){if(!child.type==="JSXText"){cnode.value="";cnode.type="JSXText"}}}cnode.value="";cnode.type="JSXText"}checkFileUpdate();_appendAttribute(obj.attribute,label,component);logs.push(logging.logSlotContentToAttribute(node.openingElement.name.name,obj.attribute,label.expression?`{${label.expression}}`:label));if(toNode){_transferAttribute(component,toNode.openingElement,obj.attribute,label);logs.push(logging.logAttributeTransfer(component.name.name,toNode.openingElement.name.name,obj.attribute,label.expression?`{${label.expression}}`:label))}return logs}}}}}function classNameToAttribute(node,data){let logs=[];for(let obj of data){for(let attr of node.openingElement.attributes){if(attr.name.name=="class"&&attr.value?.value?.includes(obj.className)){if(obj.attribute){classNames=attr.value.value.split(" ");index=classNames.indexOf(obj.className);classNames.splice(index,1);if(classNames.length===0){attr.name.name=`${obj.attribute}`;attr.value.value=`${obj.attributeValue}`}else{attr.value.value=`${classNames.join(" ")}`;_appendAttribute(obj.attribute,obj.attributeValue,node.openingElement)}checkFileUpdate();logs.push(logging.logClassNameToAttribute(obj.className,obj.attribute,obj.attributeValue))}break}}}return logs}function handleSpecialCase(code,data){let obj;let regex;if(data[1]){obj=data[1];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString)}obj=data[0];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString);return code}function migrateTag(node,legacyComponentName,coreComponentName,isChild){node.openingElement.name.name=coreComponentName;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===legacyComponentName){node.closingElement.name.name=coreComponentName}return logging.logTagMigration(legacyComponentName,coreComponentName,isChild)}function migrateTagByAttribute(node,data,isChild){for(const tagSet of data){if(tagSet.attribute){let attribute=_findAttribute(node.openingElement.attributes,tagSet.attribute,tagSet.attributeValue);if(attribute){node.openingElement.name.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return logging.logTagMigration(tagSet.fromTag,tagSet.toTag)}}else{node.openingElement.name.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return logging.logTagMigration(tagSet.fromTag,tagSet.toTag,isChild)}}}function migrateImports(ast,metadata,code,newImports=[]){let importIndex;let importTag="";let importUpdated=false;const importData=metadata.migrateImports;const corePackTag=metadata.corePackTag;const legacyTag=metadata.legacyTag;const ruleSetToIgnore=metadata.ruleSetToIgnore;if(global.plugins[0]!="jsx"||Array.isArray(corePackTag)&&corePackTag.some(s=>code.includes(`<${s}`))||code.includes(`<${corePackTag}`)){if(ruleSetToIgnore&&ruleSetToIgnore.length>0&&!global.configData.forceMigration.includes(legacyTag)&&(global.plugins[0]!="jsx"||code.includes(`<${legacyTag}`))){if(Array.isArray(importData.to)&&importData.to.length>0&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length){for(let i=0;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[i],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to[i],index:importIndex});checkFileUpdate();logging.logImportAppend(importData.to[i],importData.from)}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){const parent=fromImportLoc.parent?fromImportLoc.parent:false;for(let i=0;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[i])&&(global.plugins[0]!="jsx"||code.includes(importTag))){_appendImportToRequire(importData.to[i],node,parent);checkFileUpdate();logging.logImportAppend(importData.to[i],importData.from);newImports=false}}}}}})}else if(!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports)){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length&&!_hasImport(ast.program.body,importData.to,newImports)){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to,index:importIndex});checkFileUpdate();logging.logImportAppend(importData.to,importData.from)}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc&&!_hasImportInRequire(node.expression.arguments,importData.to)){const parent=fromImportLoc.parent?fromImportLoc.parent:false;_appendImportToRequire(importData.to,node,parent);checkFileUpdate();logging.logImportAppend(importData.to,importData.from);newImports=false}}}})}}else{if(Array.isArray(importData.to)&&importData.to.length>0&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length){importTag=`<${importData.to[0].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[0],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){importUpdated=true;node.source.value=importData.to[0];checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0])}for(let i=1;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[i],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){if(importUpdated){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to[i],index:importIndex});logging.logImportAppend(importData.to[i],importData.from)}else{importUpdated=true;node.source.value=importData.to[i];logging.logImportUpdate(importData.from,importData.to[i])}checkFileUpdate()}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){const parent=fromImportLoc.parent?fromImportLoc.parent:false;importTag=`<${importData.to[0].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[0])&&(global.plugins[0]!="jsx"||code.includes(importTag))){importUpdated=true;fromImportLoc.child.value=importData.to[0];checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0]);newImports=false}for(let i=1;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[i])&&(global.plugins[0]!="jsx"||code.includes(importTag))){if(importUpdated){_appendImportToRequire(importData.to[i],node,parent);logging.logImportAppend(importData.to[i],importData.from)}else{importUpdated=true;fromImportLoc.child.value=importData.to[i];logging.logImportUpdate(importData.from,importData.to[i])}checkFileUpdate()}}}}}})}else if(!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports)){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&!node.specifiers.length&&node.source.value===importData.from&&!_hasImport(ast.program.body,importData.to,newImports)){node.source.value=importData.to;checkFileUpdate();logging.logImportUpdate(importData.from,importData.to);newImports=false}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")&&!_hasImportInRequire(node.expression.arguments,importData.to)){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){fromImportLoc.child.value=importData.to;checkFileUpdate();logging.logImportUpdate(importData.from,importData.to);newImports=false}}}})}}if(Array.isArray(corePackTag)){for(tag of corePackTag){const startTag="<"+tag;if(code.includes(startTag)&&(Array.isArray(importData.to)&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))||!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports))){if(Array.isArray(importData.to)){importData.to.forEach(toImport=>{importTag=`<${toImport.replace("/","-")}`;if(global.plugins[0]!="jsx"||code.includes(importTag)){newImports.push({name:toImport,index:0});checkFileUpdate();logging.logMissingImport(tag,toImport)}})}else{newImports.push({name:importData.to,index:0});checkFileUpdate();logging.logMissingImport(tag,importData.to)}break}}}else{startTag="<"+corePackTag;if(code.includes(startTag)&&(Array.isArray(importData.to)&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))||!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports))){if(Array.isArray(importData.to)){importData.to.forEach(toImport=>{importTag=`<${toImport.replace("/","-")}`;if(global.plugins[0]!="jsx"||code.includes(importTag)){newImports.push({name:toImport,index:0});checkFileUpdate();logging.logMissingImport(toImport.replace("/","-"),toImport)}})}else{newImports.push({name:importData.to,index:0});checkFileUpdate();logging.logMissingImport(importData.to.replace("/","-"),importData.to)}}}}if(global.plugins[0]==="jsx"){startTag="<"+legacyTag;if((code.includes(startTag+" ")||code.includes(startTag+">"))&&!_hasImport(ast.program.body,importData.from,newImports)){newImports.push({name:importData.from,index:0});checkFileUpdate();logging.logMissingImport(legacyTag,importData.from)}}return newImports}function _toCamelCase(attribute){let camelCaseName=attribute.split("-");for(let i in camelCaseName){if(i>0){camelCaseName[i]=camelCaseName[i][0].toUpperCase()+camelCaseName[i].slice(1)}}camelCaseName=camelCaseName.join("");return camelCaseName}function _findAttribute(attribs,name,value=""){if(name){const camelCaseName=_toCamelCase(name);if(Array.isArray(attribs)){for(let attr of attribs){if(attr.name.name===name||attr.name.name===`:${name}`||attr.name.name===camelCaseName){if(value&&attr.value.value!=value){return false}if(attr.name.name===name){let attrValue="";if(attr.value){if(attr.value.type==="JSXExpressionContainer"){attrValue={expression:attr.value}}else{attrValue=attr.value.value}}return{"attribute":name,"attrValue":attrValue}}else if(attr.name.name===camelCaseName){let attrValue="";if(attr.value){if(attr.value.type==="JSXExpressionContainer"){attrValue={expression:attr.value}}else{attrValue=attr.value.value}}return{"attribute":camelCaseName,"format":"camel","attrValue":attrValue}}}}}else{if(attribs.name.name===name||attribs.name.name===camelCaseName){if(value&&!(attribs.value.value===value)){return false}if(attribs.name.name===name){let attrValue="";if(attribs.value){if(attribs.value.type==="JSXExpressionContainer"){attrValue={expression:attribs.value}}else{attrValue=attribs.value.value}}return{"attribute":name,"attrValue":attrValue}}else if(attribs.name.name===camelCaseName){let attrValue="";if(attribs.value){if(attribs.value.type==="JSXExpressionContainer"){attrValue={expression:attribs.value}}else{attrValue=attribs.value.value}}return{"attribute":camelCaseName,"format":"camel","attrValue":attrValue}}}}}return false}function migrateAttributes(node,data,code,ast,legacyTag){let logs=[];for(const attributeSet in data){let toNode;let tagExists=true;let component=node.openingElement;let obj=data[attributeSet];if(obj.fromDescendant||obj.fromPeer||obj.toDescendant||obj.toPeer){tagExists=false;if(obj.fromDescendant||obj.toDescendant){if(node.children){const descendant=_findDescendant(node,obj.fromDescendant?obj.fromDescendant:obj.toDescendant,obj.slotName);if(descendant){tagExists=true;if(obj.fromDescendant){component=descendant.openingElement;toNode=node.openingElement}else{toNode=descendant.openingElement}}else{continue}}}else{const peerTag=_findPeer(ast,node,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peerTag){tagExists=true;if(obj.fromPeer){component=peerTag.openingElement;toNode=node.openingElement}else{toNode=peerTag.openingElement}}else{continue}}}if(tagExists){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=_findAttribute(component.attributes,obj.depAttribute)}const hasToAttribute=_findAttribute(component.attributes,obj.toAttribute);component.attributes.forEach(attribute=>{const hasFromAttribute=_findAttribute(attribute,obj.fromAttribute,obj.fromValue);if(hasFromAttribute.format){obj.fromAttribute=hasFromAttribute.attribute;obj.toAttribute=_toCamelCase(obj.toAttribute)}if(!(obj.fromAttribute===obj.toAttribute&&obj.fromValue===obj.toValue)&&!obj.fromKeyValue){if(hasDepAttribute&&hasFromAttribute&&obj.toAttribute){if(obj.toValue){attribute.name.name=obj.toAttribute;attribute.value.value=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,obj.fromValue,obj.toAttribute,obj.toValue))}else{const attValue=attribute.value.value||{expression:_getText(code,attribute.value.loc)};if(obj.fromValue){attribute.name.name=obj.toAttribute;attribute.value.value="";checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,attValue.expression||attValue,obj.toAttribute,obj.toValue))}else{attribute.name.name=obj.toAttribute;attribute.value.value=attValue.expression||attValue;checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,attValue.expression||attValue,obj.toAttribute))}}}else if(hasDepAttribute&&hasFromAttribute&&!obj.toAttribute){index=component.attributes.indexOf(attribute);component.attributes.splice(index,1);checkFileUpdate();logs.push(logging.logAttributeDeprecation(obj.fromAttribute,obj.fromValue))}}if(hasFromAttribute&&obj.fromKeyValue&&attribute.value.type==="JSXExpressionContainer"){let inline=true;let variable;if(attribute.value.expression.type==="Identifier"){inline=false;const varName=attribute.value.expression.name;variable=_findVariable(ast,varName)}if(variable&&variable.init.elements||attribute.value.expression.elements){for(let elem of inline?attribute.value.expression.elements:variable.init.elements){if(elem.properties){for(let prop of elem.properties){const fromKeys=Object.keys(obj.fromKeyValue);const toKeys=Object.keys(obj.toKeyValue);for(let key in fromKeys){if((prop.key.name?prop.key.name:prop.key.value)===fromKeys[key]){if(!obj.fromKeyValue[fromKeys[key]]||obj.fromKeyValue[fromKeys[key]]===prop.value.value){if(prop.key.name){prop.key.name=toKeys[key]}else if(prop.key.value){prop.key.value=toKeys[key]}const fromVal=prop.value.value;if(obj.toKeyValue[toKeys[key]]){prop.value.type="StringLiteral";prop.value.value=obj.toKeyValue[toKeys[key]]}checkFileUpdate();logs.push(logging.logObjectManipulation(attribute.name.name,fromKeys[key],prop.key.name?prop.key.name:prop.key.value,fromVal,prop.value.value))}}}}}else{const log=logging.logAttributeWarning(obj.fromAttribute);if(!logs.includes(log)){logs.push(logging.logAttributeWarning(obj.fromAttribute));checkFileUpdate()}break}}}else{checkFileUpdate();logs.push(logging.logAttributeWarning(obj.fromAttribute))}}if(toNode&&hasFromAttribute){checkFileUpdate();let val=attribute.value.expression?{expression:_generateSpecCode(attribute.value.expression)}:attribute.value.value;_transferAttribute(component,toNode,attribute.name.name,val);logs.push(logging.logAttributeTransfer(component.name.name,toNode.name.name,attribute.name.name,val.expression?`{${val.expression}}`:val))}});if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){_appendAttribute(obj.toAttribute,obj.toValue,toNode?toNode:component);checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue,toNode?toNode.name.name:""))}}}return logs}function _migrateDescendantsHelper(children,componentMetadata,ast,code,newImports,childrenLogs,parent,migratedComp){for(let child of children){if(child.type==="JSXElement"&&child.openingElement.name&&child.openingElement.name.name===componentMetadata.legacyTag){if(!hasAttributesToIgnore(child,componentMetadata,parent)&&!hasExpressionAttributes(child.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)){if(componentMetadata["migrateTagByAttribute"]){childrenLogs.push(migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true))}else{childrenLogs.push(migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true))}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){if(key==="migrateDescendants"){let childInfo=migrateDescendants(child,componentMetadata[key],code,ast,newImports,childrenLogs,parent);newImports=childInfo.imports;childrenLogs=childInfo.logs}else{let newLogs=self[key](child,componentMetadata[key],code,ast);if(newLogs&&newLogs.length>0){childrenLogs=childrenLogs.concat(newLogs)}}}}if(!migratedComp[componentMetadata.legacyTag]){migratedComp[componentMetadata.legacyTag]=1}else{migratedComp[componentMetadata.legacyTag]+=1}code=generateCode(ast);if(componentMetadata["migrateImports"]&&!inManifestData(componentMetadata.legacyTag)){newImports=[componentMetadata]}}}else{if(child.children){let childInfo=_migrateDescendantsHelper(child.children,componentMetadata,ast,code,newImports,childrenLogs,parent,migratedComp);childrenLogs=childInfo.logs;newImports=childInfo.imports;migratedComp=childInfo.migrated}}}return{imports:newImports,logs:childrenLogs,migrated:migratedComp}}function migrateDescendants(node,metadata,code,ast,newImports=[],childrenLogs=[]){let migratedComp={};const data=metadata.migrateDescendants;let returnValue=false;for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(node.children){returnValue=_migrateDescendantsHelper(node.children,componentMetadata,ast,code,newImports,childrenLogs,metadata.legacyTag,migratedComp);newImports=returnValue.imports;if(!returnValue){return false}}}return returnValue}function removeComponent(node){const tag=node.openingElement.name.name;const emptyNode={type:"JSXText",value:""};if(node.type==="JSXElement"){node.openingElement=emptyNode;node.closingElement=emptyNode}return logging.logComponentRemoved(tag)}function replaceComponent(fromNode,data){const tag=fromNode.openingElement.name.name;for(let obj of data){const descendant=_findDescendant(fromNode,obj.descendant);if(descendant){fromNode.openingElement=descendant.openingElement;fromNode.closingElement=descendant.closingElement;fromNode.children=descendant.children;return logging.logComponentReplacement(tag,descendant.openingElement.name.name)}}}exports.inManifestData=inManifestData;exports.generateAST=generateAST;exports.generateCode=generateCode;exports.hasAttributesToIgnore=hasAttributesToIgnore;exports.hasExpressionAttributes=hasExpressionAttributes;exports.appendImport=appendImport;exports.commentSlotContent=commentSlotContent;exports.slotContentToAttribute=slotContentToAttribute;exports.classNameToAttribute=classNameToAttribute;exports.handleSpecialCase=handleSpecialCase;exports.migrateImports=migrateImports;exports.migrateTag=migrateTag;exports.migrateTagByAttribute=migrateTagByAttribute;exports.migrateAttributes=migrateAttributes;exports.migrateDescendants=migrateDescendants;exports.checkFileUpdate=checkFileUpdate;exports.replaceComponent=replaceComponent;exports.removeComponent=removeComponent;
|
|
6
|
+
const traverse=require("ast-traverse");const logging=require("../utilities/logging");const generate=require("@babel/generator").default;const{parse}=require("@babel/parser");const self=require("./astUtils");function inManifestData(node){for(let obj of global.manifestData){if(obj.componentName&&node.openingElement&&obj.componentName===node.openingElement.name.name||node===obj.componentName){return obj}else if(obj.componentClass&&node.openingElement){const classAttr=_findAttribute(node.openingElement.attributes,"class");if(classAttr&&classAttr.node.value&&!classAttr.node.value.expression&&classAttr.node.value.value.includes(obj.componentClass)){return obj}}}return false}function modelIsEmpty(ast){let i=0;while(ast.program.body[i]&&ast.program.body[i].type!="ClassDeclaration"&&ast.program.body[i].type!="ExportNamedDeclaration"&&(!ast.program.body[i].declaration||ast.program.body[i].declaration.type!="ClassDeclaration")){i+=1}if(ast.program.body[i]){return false}else{return true}}function checkFileUpdate(){if(!global.fileIsUpdated){logging.logFilePath(global.filePath);global.fileIsUpdated=true;global.migrationMetrics.files+=1;return true}return false}function generateAST(code){try{return parse(code,{sourceType:"unambiguous",plugins:global.plugins})}catch(e){if(e instanceof SyntaxError){logging.logFilePath(global.filePath,true);logging.logMessage(`\tCouldn't migrate file because file syntax is not clear`);global.errorInFile=true}}}function generateCode(ast){return generate(ast,{retainLines:false}).code}function _generateSpecCode(ast){return generateCode(ast).replace(/^\s*$(?:\r\n?|\n)/gm,"")}function _appendAttribute(name,value,tag){for(let attr of tag.attributes){if(attr.name.name===name){return false}}let node;if(value.expression){const expAst=generateAST(`{${value.expression}}`).program.body[0].body[0].expression;node={type:"JSXExpressionContainer",expression:expAst}}else if(value.identifier){node={type:"Identifier",name:`{${value.identifier}}`}}else{node={type:"StringLiteral",value:`${value}`}}const attrNode={type:"JSXAttribute",name:{type:"JSXIdentifier",name:`${name}`},value:node};tag.attributes.push(attrNode);return true}function appendImport(value,index,ast){const importNode={type:"JSXText",value:`import "${value}";\n`};ast.program.body.splice(index,0,importNode)}function _appendImportToRequire(toImport,node,parent){const importNode={type:"StringLiteral",value:`${toImport}`};if(parent){parent.elements.push(importNode)}else{node.expression.arguments.push(importNode)}}function _hasImportInRequire(args,fromImport){for(let arg of args){if(arg.type==="ArrayExpression"){obj=_hasImportInRequire(arg.elements,fromImport);if(obj&&!obj.parent){obj.parent=arg}return obj}else if(arg.type==="StringLiteral"&&arg.value===fromImport){return{child:arg}}}return false}function _hasImport(body,importVal,newImports){for(let node of body){if(node.type==="ImportDeclaration"&&node.source.value===importVal&&!node.specifiers.length||node.type==="JSXText"&&node.value.includes(importVal)){return true}else if(!importVal&&node.type==="ImportDeclaration"){return true}}for(let obj of newImports){if(obj.name===importVal){return true}}return false}function _commentJSX(node){return node.type==="JSXElement"?`{ /* ${_generateSpecCode(node)} */ }`:`{ /* ${node.value} */ }`}function _getText(text,locObj){let specificText;const dataArray=text.split("\n");const{start,end}=locObj;if(start.line===end.line){specificText=dataArray[start.line-1].substring(start.column,end.column);return specificText}else{dataArray[start.line-1]=dataArray[start.line-1].substring(start.column);const textByLines=dataArray.slice(start.line-1,end.line).map(s=>s.trim());specificText=textByLines.join("\n");return specificText}}function _getLabelFromLegacyComponent(node,slotName,labelVal="",cnodesArr=[]){for(let child of node.children){switch(child.type){case"JSXText":if(/\S/.test(child.value)){if(labelVal){if(labelVal.expression){labelVal.expression=`(${labelVal.expression}) + ' ${child.value.trim()}'`}else{labelVal+=" "+child.value.trim()}}else{labelVal=child.value.trim()}child.type="JSXText";child.value="";cnodesArr.push(child)}break;case"JSXExpressionContainer":if(child.expression&&child.expression.type!="JSXEmptyExpression"){if(child.expression.type==="StringLiteral"&&/\S/.test(child.expression.value)){if(labelVal){if(labelVal.expression){labelVal.expression=`(${labelVal.expression}) + ' ${child.expression.value.trim()}'`}else{labelVal+=" "+child.expression.value.trim()}}else{labelVal=child.expression.value.trim()}child.type="JSXText";child.value="";cnodesArr.push(child)}else{if(labelVal){if(labelVal.expression){labelVal.expression=`(${labelVal.expression}) + (${_generateSpecCode(child.expression)})`}else{labelVal={expression:`'${labelVal} ' + (${_generateSpecCode(child.expression)})`}}}else{labelVal={expression:_generateSpecCode(child.expression)}}}child.type="JSXText";child.value="";cnodesArr.push(child)}break;case"JSXElement":let slotValue;switch(child.openingElement.name.name.toUpperCase()){case"OJ-BIND-TEXT":for(let attr of child.openingElement.attributes){if(attr.name.name=="value"){if(attr.value.type==="JSXExpressionContainer"){if(labelVal.expression){labelVal.expression=`${labelVal.expression} + (${_generateSpecCode(attr.value.expression)})`}else{if(labelVal){labelVal={expression:`'${labelVal} ' + (${_generateSpecCode(attr.value.expression)})`}}else{labelVal={expression:_generateSpecCode(attr.value.expression)}}}}else if(attr.value.type==="StringLiteral"){if(labelVal.expression){labelVal.expression=`${labelVal.expression} + ' ${attr.value.value}'`}else{if(labelVal){labelVal+=" "+attr.value.value}else{labelVal=attr.value.value}}}child.type="JSXText";child.value="";cnodesArr.push(child);break}}break;case"SPAN":case"DIV":child.openingElement.attributes.forEach(attr=>{if(attr.name.name=="slot"&&attr.value.value&&(attr.value.value===slotName||!attr.value.value.length))slotValue=true});if(!child.openingElement.attributes.map(att=>att.name.name).includes("slot")){slotValue=true}if(slotValue){const result=_getLabelFromLegacyComponent(child,slotName,labelVal,cnodesArr);let emptyChildren=true;let i=0;var regex=new RegExp("^[^\\dA-Za-z]*$");while(emptyChildren===true&&child.children[i]){if(!(child.children[i].type==="JSXText"&®ex.test(child.children[i].value))){emptyChildren=false}i++}if(emptyChildren){result.cnodes.push(child)}return{label:result.label,cnodes:result.cnodes}}break}}}return{label:labelVal,cnodes:cnodesArr}}function _findPeer(ast,node,peerTag,componentAttr,peerAttr){const attributeValue=_findAttribute(node.openingElement.attributes,componentAttr).attrValue;let peer;if(attributeValue){traverse(ast,{pre:function(n){if(n.type==="JSXElement"&&n.openingElement.name&&n.openingElement.name.name===peerTag){if(_findAttribute(n.openingElement.attributes,peerAttr,attributeValue).attrValue===attributeValue){peer=n}}}});return peer}}function _findVariable(ast,name){let variable;traverse(ast,{pre:function(n){if(n.type==="VariableDeclarator"&&n.id.name===name||n.type==="AssignmentExpression"&&n.left.property&&n.left.property.name===name||n.type==="ClassProperty"&&n.key.name===name){variable=n}}});return variable}function _hasAttributesToIgnoreHelper(node,rule,key,parent,ast,corePackTag){let keys;if(rule.missPeerTag){const peerRule=rule.missPeerTag;for(let tagAttrSet of peerRule.tagAttributes){let tag=tagAttrSet.name;for(let attrSet of peerRule.matchValues){const peer=_findPeer(ast,node,tag,attrSet.ownAttribute,attrSet.peerAttribute);if(peer){let migratable=true;if(tagAttrSet.attribute){for(let set of tagAttrSet.attribute){migratable=_hasAttributesToIgnoreHelper(peer,{"missAttribute":set});if(!migratable){break}}}if(tagAttrSet.missSlot&&migratable){migratable=_findAttribute(peer.openingElement.attributes,"slot",tagAttrSet.missSlot)}if(tagAttrSet.descendant){migratable=!_hasAttributesToIgnoreHelper(peer,tagAttrSet.descendant)}if(migratable){return false}}}}return true};if(rule.missDescendant){const descRule=rule.missDescendant;for(let tagAttrSet of descRule.tagAttributes){let tag=tagAttrSet.name;const desc=_findDescendant(node,tag,tagAttrSet.missSlot);if(desc){let migratable=true;if(tagAttrSet.attribute){for(let set of tagAttrSet.attribute){migratable=_hasAttributesToIgnoreHelper(desc,{"missAttribute":set});if(!migratable){break}}}if(tagAttrSet.descendant){migratable=!_hasAttributesToIgnoreHelper(desc,tagAttrSet.descendant)}if(migratable){return false}}}return true};if(rule.missAttribute){keys=Object.keys(rule.missAttribute);for(let key in rule.missAttribute){rule.missAttribute[_toCamelCase(key)]=rule.missAttribute[key];keys.push(_toCamelCase(key))}}if(!rule.descendant&&node.openingElement.attributes.length){for(let i=0;i<node.openingElement.attributes.length;i++){const attribute=node.openingElement.attributes[i];if(attribute.type==="JSXAttribute"){if(rule.missAttribute){if(keys.includes(attribute.name.name)&&(!rule.missAttribute[attribute.name.name]||attribute.value.value===rule.missAttribute[attribute.name.name])){return false}}else{if(rule.attribute){const hasAttribute=_findAttribute(attribute,rule.attribute);if(hasAttribute&&(rule.allowedValues&&!rule.allowedValues.includes(attribute.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attribute.value.value)||!rule.allowedValues&&!rule.prohibitedValues)){const value=rule.allowedValues||rule.prohibitedValues?attribute.value.value:"";if(corePackTag){if(rule.typeDefined){const variable=_findVariable(ast,hasAttribute.attrValue.expression?hasAttribute.node.value.expression.name:hasAttribute.attrValue);if(variable&&variable.id.typeAnnotation){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,hasAttribute.format?hasAttribute.attribute:rule.attribute,"",parent,"",`Component needs manual migration due to a legacy type`);return true}return false}else{checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,hasAttribute.format?hasAttribute.attribute:rule.attribute,value,parent)}}return true}}if(attribute.name.name===key&&attribute.value.value===rule[key]){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key],parent)}return true}}}}}if(!rule.descendant&&rule.missAttribute){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,rule.missAttribute,"",parent,true)}return true}if(node.children){for(let j=0;j<node.children.length;j++){let child=node.children[j];if(child.type==="JSXElement"){if(rule.descendant){if(child.openingElement.name&&child.openingElement.name.name===rule.descendant){if(rule.attribute||rule.slotName||rule.missSlot){for(let attr of child.openingElement.attributes){if(rule.attribute){const hasAttribute=_findAttribute(attr,rule.attribute);if(hasAttribute&&(rule.allowedValues&&!rule.allowedValues.includes(attr.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attr.value.value)||!rule.prohibitedValues&&!rule.allowedValues)){if(hasAttribute.format){rule.attribute=hasAttribute.attribute}if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,rule.attribute,attr.value.value,parent)}return true}}else if(attr.name.name==="slot"){if(rule.slotName&&rule.slotName===attr.value.value){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",attr.value.value,parent)}return true}else if(rule.missSlot&&attr.value.value===rule.missSlot){return false}}}if(rule.missSlot){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",rule.missSlot,parent,true)}return true}}else{if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(rule.descendant,"","",parent)}return true}}else if(_hasAttributesToIgnoreHelper(child,rule,key,parent,ast,corePackTag)){return true}}if(child.openingElement.attributes&&!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(child,rule,key,parent,ast,corePackTag)){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key])}return true}}}}}function hasAttributesToIgnore(node,metadata,ast,parent=""){const ignoreRuleData=metadata.ruleSetToIgnore;if(node.openingElement){if(ignoreRuleData){for(let rule of ignoreRuleData){let arr=Object.keys(rule);let key=arr[0];if(rule.descendant){parent=node.openingElement.name.name}if(_hasAttributesToIgnoreHelper(node,rule,key,parent,ast,metadata.corePackTag)){return true}}}}return false}function hasExpressionAttributes(component,componentName,code,importantAttributes=null,isPre=false){const excludedAttributes=global.configData.excludeAttributeExpressions[componentName];if(global.jaf.options.dryRunMode&&importantAttributes){component.attributes.forEach(attribute=>{if(attribute.type==="JSXAttribute"&&importantAttributes.includes(attribute.name.name)&&attribute.value&&attribute.value.type==="JSXExpressionContainer"){const expression=_getText(code,attribute.value.loc);if(checkFileUpdate()){logging.logAttributeExpression(componentName,attribute.name.name,expression)}}})}if(excludedAttributes&&excludedAttributes.length){for(let exAtt of excludedAttributes){for(let i=0;i<component.attributes.length;i++){const attribute=component.attributes[i];if(attribute.type="JSXAttribute"&&exAtt===attribute.name.name&&attribute.value.type==="JSXExpressionContainer"){const expression=attribute.value.loc?_getText(code,attribute.value.loc):_generateSpecCode(attribute.value);checkFileUpdate();logging.logExcludeAttributeExpression(componentName,exAtt,expression);return true}}}}return false}function commentSlotContent(node,data){for(let child of node.children){if(child.openingElement&&child.openingElement.attributes){for(let attribute of child.openingElement.attributes){if(attribute.type==="JSXAttribute"&&attribute.name.name=="slot"&&attribute.value.value==data.slot){const value=_commentJSX(child);index=node.children.indexOf(child);node.children[index]=generateAST(_generateSpecCode({type:"JSXText",value:`${value}`}));checkFileUpdate();return[logging.logCommentSlotContent(node.openingElement.name.name,data.slot)]}};}};}function _transferAttribute(fromTag,toTag,attribute,value){for(let attr in fromTag.attributes){if(fromTag.attributes[attr].name.name===attribute&&(fromTag.attributes[attr].value.value===value||value.expression&&_generateSpecCode(fromTag.attributes[attr].value.expression)===value.expression)){_appendAttribute(attribute,value,toTag);fromTag.attributes.splice(attr,1);break}}}function _findDescendant(node,tagName,slotName){if(node.children){for(let child of node.children){if(child.type==="JSXElement"&&child.openingElement.name&&child.openingElement.name.name===tagName){if(!slotName){return child}else{for(let attr of child.openingElement.attributes){if(attr.name.name==="slot"&&attr.value.value===slotName){return child}}}}else{const descendant=_findDescendant(child,tagName,slotName?slotName:"");if(descendant){return descendant}}}}return false}function slotContentToAttribute(node,data,code,ast){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){const descendant=_findDescendant(node,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){const descendant=_findDescendant(node,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){node=descendant}else{continue}}if(obj.toPeer||obj.fromPeer){const peer=_findPeer(ast,node,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peer){if(obj.toPeer){toNode=peer}else{node=peer}}else{continue}}if(!node.openingElement.attributes.map(att=>att.name.name).includes(obj.attribute)){const component=node.openingElement;const legacyButtonLabel=_getLabelFromLegacyComponent(node,obj.slotName);if(legacyButtonLabel){let{label,cnodes}=legacyButtonLabel;if(label){for(let cnode of cnodes){if(cnode.type==="JSXElement"&&(cnode.openingElement.name.name==="span"||cnode.openingElement.name.name==="div")){for(let child of cnode.children){if(!child.type==="JSXText"){cnode.value="";cnode.type="JSXText"}}}cnode.value="";cnode.type="JSXText"}checkFileUpdate();_appendAttribute(obj.attribute,label,component);logs.push(logging.logSlotContentToAttribute(node.openingElement.name.name,obj.attribute,label.expression?`{${label.expression}}`:label));if(toNode){_transferAttribute(component,toNode.openingElement,obj.attribute,label);logs.push(logging.logAttributeTransfer(component.name.name,toNode.openingElement.name.name,obj.attribute,label.expression?`{${label.expression}}`:label))}return logs}}}}}function classNameToAttribute(node,data){let logs=[];for(let obj of data){for(let attr of node.openingElement.attributes){if(attr.type==="JSXAttribute"&&attr.name.name==="class"){if(typeof obj.className==="string"&&attr.value?.value?.includes(obj.className)){let classNames=attr.value.value.split(" ");index=classNames.indexOf(obj.className);classNames.splice(index,1);if(classNames.length===0){attr.name.name=`${obj.attribute}`;attr.value.value=`${obj.attributeValue}`}else{attr.value.value=`${classNames.join(" ")}`;_appendAttribute(obj.attribute,obj.attributeValue,node.openingElement)}checkFileUpdate();logs.push(logging.logClassNameToAttribute(obj.className,obj.attribute,obj.attributeValue))}else if(typeof obj.className==="object"){let hasClasses=true;for(let className of obj.className){if(!attr.value.value.includes(className)){hasClasses=false;break}}if(hasClasses){let classNames=attr.value.value.split(" ");for(let className of obj.className){index=classNames.indexOf(className);classNames.splice(index,1)}if(classNames.length===0){attr.name.name=`${obj.attribute}`;attr.value.value=`${obj.attributeValue}`}else{attr.value.value=`${classNames.join(" ")}`;_appendAttribute(obj.attribute,obj.attributeValue,node.openingElement)}checkFileUpdate();logs.push(logging.logClassNameToAttribute(obj.className,obj.attribute,obj.attributeValue))}}break}}}return logs}function handleSpecialCase(code,data){let obj;let regex;if(data[1]){obj=data[1];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString)}obj=data[0];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString);return code}function migrateTag(node,legacyComponentName,coreComponentName,isDescendant){node.openingElement.name.name=coreComponentName;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===legacyComponentName){node.closingElement.name.name=coreComponentName}return logging.logTagMigration(legacyComponentName,coreComponentName,isDescendant)}function migrateClassToTag(node,legacyClassName,coreComponentName,isDescendant){const fromTag=node.openingElement.name.name;node.openingElement.name.name=coreComponentName;if(node.closingElement.name){node.closingElement.name.name=coreComponentName}const classAttr=_findAttribute(node.openingElement.attributes,"class");classNames=classAttr.node.value.value.split(" ");index=classNames.indexOf(legacyClassName);classNames.splice(index,1);if(classNames.length===0){removeNode(classAttr.node)}else{classAttr.node.value.value=classNames.join(" ")}checkFileUpdate();global.migrationMetrics.components+=1;return logging.logClassToTagMigration(fromTag,legacyClassName,coreComponentName,isDescendant)}function migrateTagByAttribute(node,data,isDescendant){for(const tagSet of data){if(tagSet.attribute){let attribute=_findAttribute(node.openingElement.attributes,tagSet.attribute,tagSet.attributeValue);if(attribute){node.openingElement.name.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return logging.logTagMigration(tagSet.fromTag,tagSet.toTag)}}else{node.openingElement.name.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return logging.logTagMigration(tagSet.fromTag,tagSet.toTag,isDescendant)}}}function migrateImportsModel(modelCode,importData){let ast=generateAST(modelCode);let body=ast.program.body;let importAppended=false;if(_hasImport(body)){if(!_hasImport(body,importData.to,[])){appendImport(importData.to,0,ast);logging.logImportAppend(importData.to,"",true);importAppended=true}}else{traverse(ast,{pre:function(node){if(node.type==="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){if(!_hasImportInRequire(node.expression.arguments,importData.to)){_appendImportToRequire(importData.to,node);logging.logImportAppend(importData.to,"",true);importAppended=true}}}})}if(!importAppended){if(!_hasImport(body,importData.to,[])){appendImport(importData.to,0,ast);logging.logImportAppend(importData.to);importAppended=true}}if(importAppended){modelCode=generateCode(ast)}return modelCode}function migrateImports(ast,metadata,code,newImports=[]){let importIndex;let importTag="";let importUpdated=false;const importData=metadata.migrateImports;const corePackTag=metadata.corePackTag;const legacyTag=metadata.legacyTag;const ruleSetToIgnore=metadata.ruleSetToIgnore;if(global.plugins[0]!="jsx"||Array.isArray(corePackTag)&&corePackTag.some(s=>code.includes(`<${s}`))||code.includes(`<${corePackTag}`)){if(ruleSetToIgnore&&ruleSetToIgnore.length>0&&!global.configData.forceMigration.includes(legacyTag)&&(global.plugins[0]!="jsx"||code.includes(`<${legacyTag}`))){if(Array.isArray(importData.to)&&importData.to.length>0&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length){for(let i=0;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[i],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to[i],index:importIndex});checkFileUpdate();logging.logImportAppend(importData.to[i],importData.from)}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){const parent=fromImportLoc.parent?fromImportLoc.parent:false;for(let i=0;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[i])&&(global.plugins[0]!="jsx"||code.includes(importTag))){_appendImportToRequire(importData.to[i],node,parent);checkFileUpdate();logging.logImportAppend(importData.to[i],importData.from);newImports=false}}}}}})}else if(!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports)){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length&&!_hasImport(ast.program.body,importData.to,newImports)){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to,index:importIndex});checkFileUpdate();logging.logImportAppend(importData.to,importData.from)}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc&&!_hasImportInRequire(node.expression.arguments,importData.to)){const parent=fromImportLoc.parent?fromImportLoc.parent:false;_appendImportToRequire(importData.to,node,parent);checkFileUpdate();logging.logImportAppend(importData.to,importData.from);newImports=false}}}})}}else{if(Array.isArray(importData.to)&&importData.to.length>0&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&node.source.value===importData.from&&!node.specifiers.length){importTag=`<${importData.to[0].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[0],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){importUpdated=true;node.source.value=importData.to[0];checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0])}for(let i=1;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImport(ast.program.body,importData.to[i],newImports)&&(global.plugins[0]!="jsx"||code.includes(importTag))){if(importUpdated){importIndex=ast.program.body.indexOf(node);newImports.push({name:importData.to[i],index:importIndex});logging.logImportAppend(importData.to[i],importData.from)}else{importUpdated=true;node.source.value=importData.to[i];logging.logImportUpdate(importData.from,importData.to[i])}checkFileUpdate()}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){const parent=fromImportLoc.parent?fromImportLoc.parent:false;importTag=`<${importData.to[0].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[0])&&(global.plugins[0]!="jsx"||code.includes(importTag))){importUpdated=true;fromImportLoc.child.value=importData.to[0];checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0]);newImports=false}for(let i=1;i<importData.to.length;i++){importTag=`<${importData.to[i].replace("/","-")}`;if(!_hasImportInRequire(node.expression.arguments,importData.to[i])&&(global.plugins[0]!="jsx"||code.includes(importTag))){if(importUpdated){_appendImportToRequire(importData.to[i],node,parent);logging.logImportAppend(importData.to[i],importData.from)}else{importUpdated=true;fromImportLoc.child.value=importData.to[i];logging.logImportUpdate(importData.from,importData.to[i])}checkFileUpdate()}}}}}})}else if(!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports)){traverse(ast,{pre:function(node){if(node.type=="ImportDeclaration"&&!node.specifiers.length&&node.source.value===importData.from&&!_hasImport(ast.program.body,importData.to,newImports)){node.source.value=importData.to;checkFileUpdate();logging.logImportUpdate(importData.from,importData.to);newImports=false}else if(node.type=="ExpressionStatement"&&node.expression.callee&&(node.expression.callee.name=="require"||node.expression.callee.name=="define")&&!_hasImportInRequire(node.expression.arguments,importData.to)){const fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){fromImportLoc.child.value=importData.to;checkFileUpdate();logging.logImportUpdate(importData.from,importData.to);newImports=false}}}})}}if(Array.isArray(corePackTag)){for(tag of corePackTag){const startTag="<"+tag;if(code.includes(startTag)&&(Array.isArray(importData.to)&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))||!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports))){if(Array.isArray(importData.to)){importData.to.forEach(toImport=>{importTag=`<${toImport.replace("/","-")}`;if(global.plugins[0]!="jsx"||code.includes(importTag)){newImports.push({name:toImport,index:0});checkFileUpdate();logging.logMissingImport(tag,toImport)}})}else{newImports.push({name:importData.to,index:0});checkFileUpdate();logging.logMissingImport(tag,importData.to)}break}}}else{startTag="<"+corePackTag;if(code.includes(startTag)&&(Array.isArray(importData.to)&&!importData.to.some(s=>_hasImport(ast.program.body,s,newImports))||!Array.isArray(importData.to)&&!_hasImport(ast.program.body,importData.to,newImports))){if(Array.isArray(importData.to)){importData.to.forEach(toImport=>{importTag=`<${toImport.replace("/","-")}`;if(global.plugins[0]!="jsx"||code.includes(importTag)){newImports.push({name:toImport,index:0});checkFileUpdate();logging.logMissingImport(toImport.replace("/","-"),toImport)}})}else{newImports.push({name:importData.to,index:0});checkFileUpdate();logging.logMissingImport(importData.to.replace("/","-"),importData.to)}}}}if(global.plugins[0]==="jsx"){traverse(ast,{pre:function(n){if(n.type==="JSXElement"&&n.openingElement.name&&n.openingElement.name.name===legacyTag&&!_hasImport(ast.program.body,importData.from,newImports)){newImports.push({name:importData.from,index:0});checkFileUpdate();logging.logMissingImport(legacyTag,importData.from)}}})}return newImports}function _toCamelCase(attribute){let camelCaseName=attribute.split("-");for(let i in camelCaseName){if(i>0){camelCaseName[i]=camelCaseName[i][0].toUpperCase()+camelCaseName[i].slice(1)}}camelCaseName=camelCaseName.join("");return camelCaseName}function _findAttribute(attribs,name,value=""){if(name){let val;const camelCaseName=_toCamelCase(name);if(Array.isArray(attribs)){for(let attr of attribs){if(attr.type==="JSXAttribute"){if(attr.name.name===name||attr.name.name===`:${name}`||attr.name.name===camelCaseName){if(value){if(attr.value.type==="StringLiteral"&&attr.value.value!=value){return false}else if(attr.value.expression&&attr.value.expression.type==="StringLiteral"&&attr.value.expression.value!=value){return false}}if(attr.name.name===name){if(attr.value){if(attr.value&&attr.value.type==="JSXExpressionContainer"){val=attr.value.expression.value?attr.value.expression.value:{expression:attr.value.expression.name}}else{val=attr.value.value?attr.value.value:""}}return{attribute:name,attrValue:val,node:attr}}else if(attr.name.name===camelCaseName){if(attr.value){if(attr.value.type==="JSXExpressionContainer"){val={expression:_generateSpecCode(attr.value)}}else{val=attr.value.value?attr.value.value:""}}return{attribute:camelCaseName,format:"camel",attrValue:val,node:attr}}}}}}else{if(attribs.type==="JSXAttribute"){if(attribs.name.name===name||attribs.name.name===camelCaseName){if(value&&attribs.value.value!=value){return false}if(attribs.name.name===name){if(attribs.value){if(attribs.value.type==="JSXExpressionContainer"){val={expression:_generateSpecCode(attribs.value)}}else{val=attribs.value.value?attribs.value.value:""}}return{attribute:name,attrValue:val,node:attribs}}else if(attribs.name.name===camelCaseName){if(attribs.value){if(attribs.value.type==="JSXExpressionContainer"){val={expression:_generateSpecCode(attribs.value)}}else{val=attribs.value.value?attribs.value.value:""}}return{attribute:camelCaseName,format:"camel",attrValue:val,node:attribs}}}}}}return false}function migrateAttributes(node,data,code,ast){let logs=[];for(const attributeSet in data){let toNode;let tagExists=true;let component=node.openingElement;let obj=data[attributeSet];if(obj.fromDescendant||obj.fromPeer||obj.toDescendant||obj.toPeer){tagExists=false;if(obj.fromDescendant||obj.toDescendant){if(node.children){const descendant=_findDescendant(node,obj.fromDescendant?obj.fromDescendant:obj.toDescendant,obj.slotName);if(descendant){tagExists=true;if(obj.fromDescendant){component=descendant.openingElement;toNode=node.openingElement}else{toNode=descendant.openingElement}}else{continue}}}else{const peerTag=_findPeer(ast,node,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peerTag){tagExists=true;if(obj.fromPeer){component=peerTag.openingElement;toNode=node.openingElement}else{toNode=peerTag.openingElement}}else{continue}}}if(tagExists){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=_findAttribute(component.attributes,obj.depAttribute)}const hasToAttribute=_findAttribute(toNode?toNode.attributes:component.attributes,obj.toAttribute);component.attributes.forEach(attribute=>{const hasFromAttribute=_findAttribute(attribute,obj.fromAttribute,obj.fromValue);if(hasFromAttribute.format){obj.fromAttribute=hasFromAttribute.attribute;obj.toAttribute=_toCamelCase(obj.toAttribute)}if(!(obj.fromAttribute===obj.toAttribute&&obj.fromValue===obj.toValue)&&!obj.fromKeyValue){if(hasDepAttribute&&hasFromAttribute&&obj.toAttribute){if(obj.toValue){attribute.name.name=obj.toAttribute;attribute.value.value=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,obj.fromValue,obj.toAttribute,obj.toValue))}else{const attValue=attribute.value.value||{expression:_getText(code,attribute.value.loc)};if(obj.fromValue){attribute.name.name=obj.toAttribute;attribute.value.value="";checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,attValue.expression||attValue,obj.toAttribute,obj.toValue))}else{attribute.name.name=obj.toAttribute;attribute.value.value=attValue.expression||attValue;checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,attValue.expression||attValue,obj.toAttribute))}}}else if(hasDepAttribute&&hasFromAttribute&&!obj.toAttribute){index=component.attributes.indexOf(attribute);component.attributes.splice(index,1);checkFileUpdate();logs.push(logging.logAttributeDeprecation(obj.fromAttribute,obj.fromValue))}}if(hasFromAttribute&&obj.fromKeyValue&&attribute.value.type==="JSXExpressionContainer"){let inline=true;let variable;if(attribute.value.expression.type==="Identifier"){inline=false;const varName=attribute.value.expression.name;variable=_findVariable(ast,varName)}if(variable&&variable.init.elements||attribute.value.expression.elements){for(let elem of inline?attribute.value.expression.elements:variable.init.elements){if(elem.properties){for(let prop of elem.properties){const fromKeys=Object.keys(obj.fromKeyValue);const toKeys=Object.keys(obj.toKeyValue);for(let key in fromKeys){if((prop.key.name?prop.key.name:prop.key.value)===fromKeys[key]){if(!obj.fromKeyValue[fromKeys[key]]||obj.fromKeyValue[fromKeys[key]]===prop.value.value){if(prop.key.name){prop.key.name=toKeys[key]}else if(prop.key.value){prop.key.value=toKeys[key]}const fromVal=prop.value.value;if(obj.toKeyValue[toKeys[key]]){prop.value.type="StringLiteral";prop.value.value=obj.toKeyValue[toKeys[key]]}checkFileUpdate();logs.push(logging.logObjectManipulation(attribute.name.name,fromKeys[key],prop.key.name?prop.key.name:prop.key.value,fromVal,prop.value.value))}}}}}else{const log=logging.logAttributeWarning(obj.fromAttribute);if(!logs.includes(log)){logs.push(logging.logAttributeWarning(obj.fromAttribute));checkFileUpdate()}break}}}else{checkFileUpdate();logs.push(logging.logAttributeWarning(obj.fromAttribute))}}if(toNode&&hasFromAttribute){checkFileUpdate();let val=attribute.value.expression?{expression:_generateSpecCode(attribute.value.expression)}:attribute.value.value;_transferAttribute(component,toNode,attribute.name.name,val);logs.push(logging.logAttributeTransfer(component.name.name,toNode.name.name,attribute.name.name,val.expression?`{${val.expression}}`:val))}});if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){_appendAttribute(obj.toAttribute,obj.toValue,toNode?toNode:component);checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue,toNode?toNode.name.name:""))}}}return logs}function _migrateDescendantsHelper(children,componentMetadata,ast,code,newImports,childrenLogs,parent,fileCompInfo,newVariables){for(let child of children){if(child.type==="JSXElement"&&child.openingElement.name&&child.openingElement.name.name===componentMetadata.legacyTag){if(!hasAttributesToIgnore(child,componentMetadata,parent)&&!hasExpressionAttributes(child.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)){if(componentMetadata["migrateTagByAttribute"]){childrenLogs.push(migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true))}else{childrenLogs.push(migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true))}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){if(key==="migrateDescendants"){let childInfo=migrateDescendants(child,componentMetadata[key],code,ast,newImports,childrenLogs,parent);newImports=childInfo.imports;childrenLogs=childInfo.logs}else if(key==="migrateOptions"){let info=self[key](child,componentMetadata,fileCompInfo.migrated[componentMetadata.legacyTag]?fileCompInfo.migrated[componentMetadata.legacyTag]:0,ast);if(info.newVariable){childrenLogs=childrenLogs.concat(info.newLogs);newVariables.push(info.newVariable)}}else{let newLogs=self[key](child,componentMetadata[key],code,ast);if(newLogs&&newLogs.length>0){childrenLogs=childrenLogs.concat(newLogs)}}}}if(!fileCompInfo.migrated[componentMetadata.legacyTag]){fileCompInfo.migrated[componentMetadata.legacyTag]=1}else{fileCompInfo.migrated[componentMetadata.legacyTag]+=1}code=generateCode(ast);if(componentMetadata["migrateImports"]&&!inManifestData(componentMetadata.legacyTag)){newImports=[componentMetadata]}}}else{if(child.children){let childInfo=_migrateDescendantsHelper(child.children,componentMetadata,ast,code,newImports,childrenLogs,parent,fileCompInfo,newVariables);childrenLogs=childInfo.logs;newImports=childInfo.imports;fileCompInfo.migrated=childInfo.migrated}}}return{imports:newImports,logs:childrenLogs,migrated:fileCompInfo.migrated}}function migrateDescendants(node,metadata,code,ast,newImports=[],childrenLogs=[],fileCompInfo,newVariables){const data=metadata.migrateDescendants;let returnValue=false;for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(node.children){returnValue=_migrateDescendantsHelper(node.children,componentMetadata,ast,code,newImports,childrenLogs,metadata.legacyTag,fileCompInfo,newVariables);newImports=returnValue.imports;if(!returnValue){return false}}}return returnValue}function removeNode(node){const emptyNode={type:"JSXText",value:""};if(node.type==="JSXElement"){const tag=node.openingElement.name.name;node.openingElement=emptyNode;node.closingElement=emptyNode;if(node.children){for(let child of node.children){removeNode(child)}}return logging.logComponentRemoved(tag)}else if(node.type==="JSXExpressionContainer"){node.type="JSXText";node.expression="";node.value=""}else if(node.type==="JSXAttribute"){node.type="JSXText";node.value="";node.name=""}}function replaceComponent(fromNode,data){const tag=fromNode.openingElement.name.name;for(let obj of data){const descendant=_findDescendant(fromNode,obj.descendant);if(descendant){fromNode.openingElement=descendant.openingElement;fromNode.closingElement=descendant.closingElement;fromNode.children=descendant.children;return logging.logComponentReplacement(tag,descendant.openingElement.name.name)}}}function appendVariable(name,value,ast){const varCode=`let ${name} = ""`;const varNode=generateAST(varCode).program.body[0];if(value.node){varNode.declarations[0].init=value.node}else{varNode.declarations[0].init.value=value}let i=0;let body;let indexToAppend=0;if(global.plugins[0]==="jsx"){while(ast.program.body[i]&&ast.program.body[i].type!="ExportNamedDeclaration"){i+=1}if(!ast.program.body[i]){i=0;while(ast.program.body[i].type!="VariableDeclaration"||!ast.program.body[i].declarations){i+=1}}if(ast.program.body[i].declarations){body=ast.program.body[i].declarations[0].init.body.body}else if(ast.program.body[i].declaration){if(ast.program.body[i].declaration.body){body=ast.program.body[i].declaration.body.body}else if(ast.program.body[i].declaration.declarations){body=ast.program.body[i].declaration.declarations[0].init.body.body}}while(body[indexToAppend]&&body[indexToAppend].type!="ReturnStatement"){indexToAppend+=1}if(!body[indexToAppend]){indexToAppend=0}body.splice(indexToAppend,0,varNode)}else{while(ast.program.body[i].type!="ClassDeclaration"&&ast.program.body[i].type!="ExportNamedDeclaration"&&(!ast.program.body[i].declaration||ast.program.body[i].declaration.type!="ClassDeclaration")){i+=1}let classDeclaration;if(ast.program.body[i].type==="ExportNamedDeclaration"){classDeclaration=ast.program.body[i].declaration}else{classDeclaration=ast.program.body[i]}let propertyNode={type:"ClassProperty",key:{type:"Identifier",name:name},typeAnnotation:{type:"TSTypeAnnotation",typeAnnotation:value.node?{type:"TSTypeReference",typeName:{type:"Identifier",name:"Array"},typeParameters:{type:"TSTypeParameterInstantiation",params:[{type:"TSObjectKeyword"}]}}:{type:"TSStringKeyword"}}};let j=0;while(classDeclaration.body.body[j]&&(classDeclaration.body.body[j].type!="ClassMethod"||classDeclaration.body.body[j].key.name!="constructor")){j+=1}if(!classDeclaration.body.body[j]){propertyNode.value=value.node}else{let varNode={type:"ExpressionStatement",expression:{type:"AssignmentExpression",operator:"=",left:{type:"MemberExpression",object:{type:"ThisExpression"},property:{type:"Identifier",name:name}},right:value.node?value.node:{type:"StringLiteral",value:value}}};classDeclaration.body.body[j].body.body.push(varNode)}classDeclaration.body.body.unshift(propertyNode)}}function expressionStrToNode(expression){const quotesRegex=new RegExp("^['\"]|['\"]$","g");if(expression.startsWith("[[")&&expression.endsWith("]]")){expression=expression.replace(/[\[\]]/g,"");expression=expression.split("+");if(expression.length>1){for(let exp in expression){expression[exp]=expression[exp].trim();if(expression[exp][0]==="'"&&expression[exp][expression[exp].length-1]==="'"){expression[exp]=expression[exp].replace(quotesRegex,"");expression[exp]={type:"StringLiteral",value:expression[exp]}}else{if(expression[exp][0]==="$"){expression[exp]=expression[exp].slice(1)}expression[exp]={type:"Identifier",name:`this.${expression[exp]}`}}}let i=expression.length-1;let expressionNode={type:"BinaryExpression",operator:"+",right:expression[i]};i-=1;let currentNode=expressionNode;while(i>0){currentNode.left={type:"BinaryExpression",operator:"+",right:expression[i]};currentNode=currentNode.left;i-=1}currentNode.left=expression[i];expression=expressionNode}else{if(quotesRegex.test(expression[0])){expression={type:"StringLiteral",value:expression[0].replace(quotesRegex,"")}}else{if(expression[0][0]==="$"){expression[0]=expression[0].slice(1)}expression={type:"Identifier",name:`this.${expression[0]}`}}}}else{expression={type:"StringLiteral",value:expression}}return expression}function migrateOptions(node,metadata,idNum,ast){let data=metadata.migrateOptions;let map=false;let ignoreComponent=false;for(let child of node.children){if(child.type==="JSXExpressionContainer"&&child.expression.callee&&child.expression.callee.property.name==="map"){map=true}}if(!_findAttribute(node.openingElement.attributes,data.toAttribute)&&(_findDescendant(node,"oj-option")||map)){let logs=[];let dataNode={type:"ArrayExpression","elements":[]};let tag=metadata.legacyTag.slice(3);tag=tag[0].toUpperCase()+tag.slice(1);let varName=`optionsMig${tag}${idNum}`;let suffixCount=0;while(_findVariable(ast,`${varName}${suffixCount?`_${suffixCount}`:""}`)){suffixCount+=1}varName+=suffixCount?`_${suffixCount}`:"";if(node.children){for(let child of node.children){if(child.type==="JSXElement"){if(child.openingElement.name.name==="oj-option"){let optionInfo={type:"ObjectExpression",properties:[]};let optionLog={};for(let attr of child.openingElement.attributes){let attrName=attr.name.name;if(metadata.migrateOptions.ignoreAttribute.includes(attrName)){logging.logIgnoreComponent(child.openingElement.name.name,attrName,"",metadata.legacyTag);return{newLogs:true}}let attrValue=attr.value.expression?attr.value.expression:attr.value;let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:attrName},value:attrValue};optionLog[attrName]=_generateSpecCode(attrValue);optionInfo.properties.push(keyNode)}let label=_getLabelFromLegacyComponent(child).label;if(label){let keyNode={};if(label.expression){label=generateAST(label.expression).program.body[0].expression}keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:"label"},value:label.type?label:{type:"StringLiteral",value:label}};optionLog.label=label.type?_generateSpecCode(label):label;optionInfo.properties.push(keyNode)}let icon=_findDescendant(child,"span")?_findDescendant(child,"span"):_findDescendant(child,"div");icon=icon?icon:_findDescendant(child,"oj-avatar");if(icon){let slotAttr=_findAttribute(icon.openingElement.attributes,"slot");let classAttr=_findAttribute(icon.openingElement.attributes,"class");let srcAttr=_findAttribute(icon.openingElement.attributes,"src");let roleAttr=_findAttribute(icon.openingElement.attributes,"role");if(slotAttr&&slotAttr.node.value.type==="StringLiteral"&&(classAttr||roleAttr&&srcAttr)){let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:slotAttr.attrValue},value:{type:"ObjectExpression",properties:[{type:"ObjectProperty",key:{type:"StringLiteral"}}]}};if(classAttr){keyNode.value.properties[0].key.value="class";keyNode.value.properties[0].value=classAttr.node.value.expression?classAttr.node.value.expression:{type:"StringLiteral",value:classAttr.attrValue};optionLog[slotAttr]={"class":classAttr.node.value.expression?_generateSpecCode(classAttr.node.value.expression):classAttr.attrValue}}else if(srcAttr&&roleAttr){keyNode.value.properties[0].key.value="type";keyNode.value.properties[0].value=roleAttr.node.value.expression?roleAttr.node.value.expression:{type:"StringLiteral",value:roleAttr.attrValue};keyNode.value.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:"src"}});keyNode.value.properties[1].value=srcAttr.node.value.expression?srcAttr.node.value.expression:{type:"StringLiteral",value:srcAttr.attrValue};optionLog[slotAttr]={"type":roleAttr.node.value.expression?_generateSpecCode(roleAttr.node.value.expression):roleAttr.attrValue,"src":srcAttr.node.value.expression?srcAttr.node.value.expression:srcAttr.attrValue}}optionInfo.properties.push(keyNode)}}checkFileUpdate();logs.push(logging.logOptionMigration("oj-option",data.toAttribute,JSON.stringify(optionLog)));dataNode.elements.push(optionInfo);logs.push(removeNode(child))}}else if(child.type==="JSXExpressionContainer"&&child.expression.type==="CallExpression"&&child.expression.callee.property.name==="map"){traverse(child,{pre:function(n){if(n.type==="JSXElement"&&n.openingElement.name.name==="oj-option"){const mappingVar=_findVariable(ast,child.expression.callee.object.name);const mappingItem=child.expression.arguments[0].params[0].name;let itemInstances=[];let optionInstances=[];let optionLogs=[];for(let i in mappingVar.init.elements){optionInstances.push({type:"ObjectExpression",properties:[]});optionLogs.push({})};for(let attribute of n.openingElement.attributes){if(attribute.type==="JSXAttribute"){let key=attribute.name.name;if(metadata.migrateOptions.ignoreAttribute.includes(key)){logging.logIgnoreComponent(n.openingElement.name.name,key,"",metadata.legacyTag);ignoreComponent=true}if(key[0]===":"){key=key.slice(1)}if(attribute.value.type==="StringLiteral"){let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:{type:"StringLiteral",value:attribute.value.value}};for(let i in mappingVar.init.elements){optionLogs[i][key]=attribute.value.value;optionInstances[i].properties.push(keyNode)}}else{if(attribute.value.type==="JSXExpressionContainer"){let valueNodes=[];if(attribute.value.expression.type==="BinaryExpression"){let binaryExpression=attribute.value.expression;while(binaryExpression.type==="BinaryExpression"){valueNodes.push(binaryExpression.right);binaryExpression=binaryExpression.left}valueNodes.push(binaryExpression)}else if(attribute.value.expression.type==="MemberExpression"){valueNodes.push(attribute.value.expression)}else if(attribute.value.expression.type==="BooleanLiteral"){valueNodes.push(attribute.value.expression)}let mapNodes=[];for(let elem in mappingVar.init.elements){mapNodes.push([])}for(let exp of valueNodes){if(exp.type==="MemberExpression"){let properties=[];let expression=exp;while(expression.object.type!="Identifier"&&expression.object.name!=mappingItem){properties.unshift(expression.property.name);expression=expression.object}if(expression.object.name===mappingItem){properties.unshift(expression.property.name)}for(let obj in mappingVar.init.elements){let valueNode;let objNode=mappingVar.init.elements[obj];for(let prop of properties){let i=0;while(objNode.properties[i].key.name!=prop){i++}valueNode=objNode.properties[i].value;objNode=objNode.properties[i].value}mapNodes[obj].push(valueNode)}}else{for(let option of mapNodes){option.push(exp)}}}for(let op in mapNodes){if(mapNodes[op].length===1){let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:mapNodes[op][0]};optionLogs[op][key]=generateCode(mapNodes[op][0]);optionInstances[op].properties.push(keyNode)}else{let valNode={type:"BinaryExpression",operator:"+",right:mapNodes[op][0]};let i=1;let currentNode=valNode;while(i<mapNodes[op].length-1){currentNode.left={type:"BinaryExpression",operator:"+",right:mapNodes[op][i]};currentNode=currentNode.left;i+=1}currentNode.left=mapNodes[op][i];let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:valNode};optionLogs[op][key]=generateCode(valNode);optionInstances[op].properties.push(keyNode)}}}}}}let opLabel=_getLabelFromLegacyComponent(n,"").label;if(!opLabel.expression){let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:"label"},value:{type:"StringLiteral",value:opLabel}};for(let i in mappingVar.init.elements){optionLogs[i][key]=opLabel;optionInstances[i].properties.push(keyNode)}}else{let valueNodes=[];opLabel.expression=generateAST(opLabel.expression).program.body[0].expression;if(opLabel.expression.type==="BinaryExpression"){let binaryExpression=opLabel.expression;while(binaryExpression.type==="BinaryExpression"){valueNodes.push(binaryExpression.right);binaryExpression=binaryExpression.left}valueNodes.push(binaryExpression)}else if(opLabel.expression.type==="MemberExpression"){valueNodes.push(opLabel.expression)}let mapNodes=[];for(let elem in mappingVar.init.elements){mapNodes.push([])}for(let exp of valueNodes){if(exp.type==="MemberExpression"){let properties=[];let expression=exp;while(expression.object.type!="Identifier"&&expression.object.name!=mappingItem){properties.unshift(expression.property.name);expression=expression.object}if(expression.object.name===mappingItem){properties.unshift(expression.property.name)}for(let obj in mappingVar.init.elements){let valueNode;let objNode=mappingVar.init.elements[obj];for(let prop of properties){let i=0;while(objNode.properties[i].key.name!=prop){i++}valueNode=objNode.properties[i].value;objNode=objNode.properties[i].value}mapNodes[obj].push(valueNode)}}else{for(let option of mapNodes){option.push(exp)}}}for(let op in mapNodes){if(mapNodes[op].length===1){let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:"label"},value:mapNodes[op][0]};optionLogs[op]["label"]=generateCode(mapNodes[op][0]);optionInstances[op].properties.push(keyNode)}else{let valNode={type:"BinaryExpression",operator:"+",right:mapNodes[op][0]};let i=1;let currentNode=valNode;while(i<mapNodes[op].length-1){currentNode.left={type:"BinaryExpression",operator:"+",right:mapNodes[op][i]};currentNode=currentNode.left;i+=1}currentNode.left=mapNodes[op][i];let keyNode={type:"ObjectProperty",key:{type:"StringLiteral",value:"label"},value:valNode};optionLogs[op]["label"]=generateCode(valNode);optionInstances[op].properties.push(keyNode)}}}let icon=_findDescendant(n,"span")?_findDescendant(n,"span"):_findDescendant(n,"div");icon=icon?icon:_findDescendant(n,"oj-avatar");if(icon){let slotAttr=_findAttribute(icon.openingElement.attributes,"slot");let classAttr=_findAttribute(icon.openingElement.attributes,"class");let srcAttr=_findAttribute(icon.openingElement.attributes,"src");let roleAttr=_findAttribute(icon.openingElement.attributes,"role");if(slotAttr&&(classAttr||srcAttr&&roleAttr)){if(slotAttr.node.value.type==="StringLiteral"){let iconsArr=[];for(let i in mappingVar.init.elements){iconsArr.push({type:"ObjectProperty",value:{type:"ObjectExpression",properties:[{type:"ObjectProperty",key:{type:"StringLiteral"}}]}})}for(let i in iconsArr){iconsArr[i].key={type:"StringLiteral"};iconsArr[i].key.value=slotAttr.attrValue}if(classAttr){if(classAttr.node.value.type==="StringLiteral"){for(let i in iconsArr){iconsArr[i].value.properties[0].key.value="class";iconsArr[i].value.properties[0].value={type:"StringLiteral",value:classAttr.attrValue};optionLogs[i][slotAttr.attrValue]={class:classAttr.attrValue}}}else{if(classAttr.node.value.type==="JSXExpressionContainer"){let valueNodes=[];if(classAttr.node.value.expression.type==="BinaryExpression"){let binaryExpression=classAttr.node.value.expression;while(binaryExpression.type==="BinaryExpression"){valueNodes.push(binaryExpression.right);binaryExpression=binaryExpression.left}valueNodes.push(binaryExpression)}else if(classAttr.node.value.expression.type==="MemberExpression"){valueNodes.push(classAttr.node.value.expression)}let mapNodes=[];for(let elem in mappingVar.init.elements){mapNodes.push([])}for(let exp of valueNodes){if(exp.type==="MemberExpression"){let properties=[];let expression=exp;while(expression.object.type!="Identifier"&&expression.object.name!=mappingItem){properties.unshift(expression.property.name);expression=expression.object}if(expression.object.name===mappingItem){properties.unshift(expression.property.name)}for(let obj in mappingVar.init.elements){let valueNode;let objNode=mappingVar.init.elements[obj];for(let prop of properties){let i=0;while(objNode.properties[i].key.name!=prop){i++}valueNode=objNode.properties[i].value;objNode=objNode.properties[i].value}mapNodes[obj].push(valueNode)}}else{for(let option of mapNodes){option.push(exp)}}}for(let op in mapNodes){iconsArr[op].value.properties[0].key.value="class";if(mapNodes[op].length===1){optionLogs[op][slotAttr.attrValue]={class:generateCode(mapNodes[op][0])};iconsArr[op].value.properties[0].value=mapNodes[op][0]}else{let valNode={type:"BinaryExpression",operator:"+",right:mapNodes[op][0]};let i=1;let currentNode=valNode;while(i<mapNodes[op].length-1){currentNode.left={type:"BinaryExpression",operator:"+",right:mapNodes[op][i]};currentNode=currentNode.left;i+=1}currentNode.left=mapNodes[op][i];optionLogs[op][slotAttr.attrValue]={class:generateCode(valNode)};iconsArr[op].value.properties[0].value=valNode}}}}for(let i in optionInstances){optionInstances[i].properties.push(iconsArr[i])}}else{for(let i in iconsArr){iconsArr[i].value.properties[0].key.value="type";iconsArr[i].value.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:"src"}})}if(roleAttr.node.value.type==="StringLiteral"){for(let i in iconsArr){iconsArr[i].value.properties[0].value={type:"StringLiteral"};iconsArr[i].value.properties[0].value.value=roleAttr.attrValue;optionLogs[i][slotAttr.attrValue]={type:roleAttr.attrValue}}}else{if(roleAttr.node.value.type==="JSXExpressionContainer"){let valueNodes=[];if(roleAttr.node.value.expression.type==="BinaryExpression"){let binaryExpression=roleAttr.node.value.expression;while(binaryExpression.type==="BinaryExpression"){valueNodes.push(binaryExpression.right);binaryExpression=binaryExpression.left}valueNodes.push(binaryExpression)}else if(roleAttr.node.value.expression.type==="MemberExpression"){valueNodes.push(roleAttr.node.value.expression)}let mapNodes=[];for(let elem in mappingVar.init.elements){mapNodes.push([])}for(let exp of valueNodes){if(exp.type==="MemberExpression"){let properties=[];let expression=exp;while(expression.object.type!="Identifier"&&expression.object.name!=mappingItem){properties.unshift(expression.property.name);expression=expression.object}if(expression.object.name===mappingItem){properties.unshift(expression.property.name)}for(let obj in mappingVar.init.elements){let valueNode;let objNode=mappingVar.init.elements[obj];for(let prop of properties){let i=0;while(objNode.properties[i].key.name!=prop){i++}valueNode=objNode.properties[i].value;objNode=objNode.properties[i].value}mapNodes[obj].push(valueNode)}}else{for(let option of mapNodes){option.push(exp)}}}for(let op in mapNodes){if(mapNodes[op].length===1){iconsArr[op].value.properties[0].value=mapNodes[op][0];optionLogs[op][slotAttr.attrValue]={type:generateCode(mapNodes[op][0])}}else{let valNode={type:"BinaryExpression",operator:"+",right:mapNodes[op][0]};let i=1;let currentNode=valNode;while(i<mapNodes[op].length-1){currentNode.left={type:"BinaryExpression",operator:"+",right:mapNodes[op][i]};currentNode=currentNode.left;i+=1}currentNode.left=mapNodes[op][i];iconsArr[op].value.properties[0].value=valNode;optionLogs[op][slotAttr.attrValue]={type:generateCode(valNode)}}}}}if(srcAttr.node.value.type==="StringLiteral"){for(let i in iconsArr){iconsArr[i].value.properties[1].value={type:"StringLiteral"};iconsArr[i].value.properties[1].value.value=srcAttr.attrValue;optionLogs[i][slotAttr.attrValue].src=srcAttr.attrValue}}else{if(srcAttr.node.value.type==="JSXExpressionContainer"){let valueNodes=[];if(srcAttr.node.value.expression.type==="BinaryExpression"){let binaryExpression=srcAttr.node.value.expression;while(binaryExpression.type==="BinaryExpression"){valueNodes.push(binaryExpression.right);binaryExpression=binaryExpression.left}valueNodes.push(binaryExpression)}else if(srcAttr.node.value.expression.type==="MemberExpression"){valueNodes.push(srcAttr.node.value.expression)}let mapNodes=[];for(let elem in mappingVar.init.elements){mapNodes.push([])}for(let exp of valueNodes){if(exp.type==="MemberExpression"){let properties=[];let expression=exp;while(expression.object.type!="Identifier"&&expression.object.name!=mappingItem){properties.unshift(expression.property.name);expression=expression.object}if(expression.object.name===mappingItem){properties.unshift(expression.property.name)}for(let obj in mappingVar.init.elements){let valueNode;let objNode=mappingVar.init.elements[obj];for(let prop of properties){let i=0;while(objNode.properties[i].key.name!=prop){i++}valueNode=objNode.properties[i].value;objNode=objNode.properties[i].value}mapNodes[obj].push(valueNode)}}else{for(let option of mapNodes){option.push(exp)}}}for(let op in mapNodes){if(mapNodes[op].length===1){iconsArr[op].value.properties[1].value=mapNodes[op][0];optionLogs[op][slotAttr.attrValue].src={type:generateCode(mapNodes[op][0])}}else{let valNode={type:"BinaryExpression",operator:"+",right:mapNodes[op][0]};let i=1;let currentNode=valNode;while(i<mapNodes[op].length-1){currentNode.left={type:"BinaryExpression",operator:"+",right:mapNodes[op][i]};currentNode=currentNode.left;i+=1}currentNode.left=mapNodes[op][i];iconsArr[op].value.properties[1].value=valNode;optionLogs[op][slotAttr.attrValue].src={type:generateCode(valNode)}}}}}for(let i in optionInstances){optionInstances[i].properties.push(iconsArr[i])}}itemInstances=[]}else{logs.push(logging.logTagWarning("oj-option","If slot attribute has an expression as its value, icon information will be lost post migration"))}}}checkFileUpdate();for(let optionLog of optionLogs){logs.push(logging.logOptionMigration("oj-option",data.toAttribute,JSON.stringify(optionLog)))}dataNode.elements=optionInstances}}});if(!ignoreComponent){removeNode(child)}}}if(!ignoreComponent){if(dataNode.elements.length){_appendAttribute(data.toAttribute,{identifier:varName},node.openingElement)}else{dataNode=""}}}return ignoreComponent?{newLogs:true}:{newLogs:logs,newVariable:dataNode?{name:varName,value:{node:dataNode}}:""}}else{return false}};function migrateOptionsModel(data,name,value,modelCode,template){let modelAST=generateAST(modelCode);let suffixCount=0;while(_findVariable(modelAST,`${name}${suffixCount?`_${suffixCount}`:""}`)){suffixCount+=1}name+=suffixCount?`_${suffixCount}`:"";if(!modelIsEmpty(modelAST)){let logs=[];let dataNode={type:"ArrayExpression",elements:[]};if(template){let templateVar=_findVariable(modelAST,template);let val;let elements;if(templateVar.type==="ClassProperty"){if(templateVar.value.type==="CallExpression"){elements=templateVar.value.arguments[0].elements}else if(templateVar.value.type==="ArrayExpression"){elements=templateVar.value.elements}}else if(templateVar.type==="AssignmentExpression"){if(templateVar.right.type==="CallExpression"){if(templateVar.right.arguments[0].type==="ArrayExpression"){elements=templateVar.right.arguments[0].elements}else{templateVar=_findVariable(modelAST,templateVar.right.arguments[0].property.name);elements=templateVar.right.elements}}else{elements=templateVar.right.elements}}const bracketsRegex=new RegExp("^\\[\\[.*\\]\\]$");for(let obj of elements){let objNode={type:"ObjectExpression",properties:[]};for(let attribute of Object.keys(value[0])){let key=attribute;if(key[0]===":"){key=key.slice(1)}if(typeof value[0][attribute]==="object"){valNode={type:"ObjectExpression",properties:[]};for(let key of Object.keys(value[0][attribute])){val=value[0][attribute][key].split("+");let dataKeys={};for(let exp in val){if(bracketsRegex.test(value[0][attribute])){val[exp]=val[exp].replace(/[\[\]]/g,"").trim();if(val[exp].includes("$current.data.")){let dataKey=val[exp].split(".");dataKey=dataKey.slice(2);if(dataKey.length>1){let expNode=obj;for(let k of dataKey){let i=0;while(expNode.properties[i].key.name!=k){i+=1}expNode=expNode.properties[i].value}val[exp]=expNode}else{let i=0;while(obj.properties[i].key.name!=dataKey[0]){i+=1}val[exp]=obj.properties[i].value}dataKeys[exp]=dataKey}else{if(val[exp][0]==="'"&&val[exp][val[exp].length-1]==="'"){val[exp]=val[exp].replace(/['"]/g,"");val[exp]={type:"StringLiteral",value:val[exp]}}else{val[exp]={type:"Identifier",name:`this.${val[exp]}`}}}}else{val[exp]={type:"StringLiteral",value:val[exp]}}}if(val.length>1){let i=val.length-1;let valNode={type:"BinaryExpression",operator:"+",right:val[i]};i-=1;let currentNode=valNode;while(i>0){currentNode.left={type:"BinaryExpression",operator:"+",right:val[i]};currentNode=currentNode.left;i-=1}currentNode.left=val[i];val=valNode}else{val=val[0]}valNode.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:val})}val=valNode}else{val=value[0][attribute].split("+");let dataKeys={};for(let exp in val){if(bracketsRegex.test(value[0][attribute])){val[exp]=val[exp].replace(/[\[\]]/g,"").trim();if(val[exp].includes("$current.data.")){let dataKey=val[exp].split(".");dataKey=dataKey.slice(2);if(dataKey.length>1){let expNode=obj;for(let k of dataKey){let i=0;while(expNode.properties[i].key.name!=k){i+=1}expNode=expNode.properties[i].value}val[exp]=expNode}else{let i=0;while(obj.properties[i].key.name!=dataKey[0]){i+=1}val[exp]=obj.properties[i].value}dataKeys[exp]=dataKey}else{if(val[exp][0]==="'"&&val[exp][val[exp].length-1]==="'"){val[exp]=val[exp].replace(/['"]/g,"");val[exp]={type:"StringLiteral",value:val[exp]}}else{val[exp]={type:"Identifier",name:`this.${val[exp]}`}}}}else{val[exp]={type:"StringLiteral",value:val[exp]}}}if(val.length>1){let i=val.length-1;let valNode={type:"BinaryExpression",operator:"+",right:val[i]};i-=1;let currentNode=valNode;while(i>0){currentNode.left={type:"BinaryExpression",operator:"+",right:val[i]};currentNode=currentNode.left;i-=1}currentNode.left=val[i];val=valNode}else{val=val[0]}}objNode.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:val})}checkFileUpdate();logs.push(logging.logOptionMigration("oj-option",data.toAttribute,generateCode(objNode).replace(/(\r\n|\n|\r|\s+)/g,"")));dataNode.elements.push(objNode)}}else{for(let optionInfo of value){checkFileUpdate();logs.push(logging.logOptionMigration("oj-option",data.toAttribute,JSON.stringify(optionInfo)));let objNode={type:"ObjectExpression",properties:[]};for(let attribute of Object.keys(optionInfo)){let key=attribute;if(attribute[0]===":"){key=attribute.slice(1)}let val=optionInfo[attribute];if(typeof val==="object"){valNode={type:"ObjectExpression",properties:[]};for(let key of Object.keys(val)){let keyValue=expressionStrToNode(val[key]);valNode.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:keyValue})}val=valNode}else{val=expressionStrToNode(val)}objNode.properties.push({type:"ObjectProperty",key:{type:"StringLiteral",value:key},value:val})}dataNode.elements.push(objNode)}}value=dataNode;appendVariable(name,{node:value},modelAST);return{"code":generateCode(modelAST),"logs":logs,"varName":name}}else{return{emptyModel:true}}}exports.inManifestData=inManifestData;exports.modelIsEmpty=modelIsEmpty;exports.generateAST=generateAST;exports.generateCode=generateCode;exports.hasAttributesToIgnore=hasAttributesToIgnore;exports.hasExpressionAttributes=hasExpressionAttributes;exports.appendImport=appendImport;exports.appendVariable=appendVariable;exports.commentSlotContent=commentSlotContent;exports.slotContentToAttribute=slotContentToAttribute;exports.classNameToAttribute=classNameToAttribute;exports.handleSpecialCase=handleSpecialCase;exports.migrateImports=migrateImports;exports.migrateTag=migrateTag;exports.migrateTagByAttribute=migrateTagByAttribute;exports.migrateClassToTag=migrateClassToTag;exports.migrateImportsModel=migrateImportsModel;exports.migrateAttributes=migrateAttributes;exports.migrateDescendants=migrateDescendants;exports.checkFileUpdate=checkFileUpdate;exports.replaceComponent=replaceComponent;exports.removeNode=removeNode;exports.migrateOptionsModel=migrateOptionsModel;exports.migrateOptions=migrateOptions;
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
"use strict";const{DomUtils}=require("htmlparser2");const utils=require("./htmlUtils");const astUtils=require("./astUtils");const testUtils=require("./testUtils");const logging=require("../utilities/logging");const traverse=require("ast-traverse");const render=require("dom-serializer").default;function migrateHTML(code,allComponentsInfo){let dom=utils.getDom(code);let components=DomUtils.findAll(elem=>astUtils.inManifestData(elem.name),dom.children);let iniFileCount=global.migrationMetrics.files;let fileComponentsInfo={path:global.filePath,skipped:{},migrated:{}};for(let component of components){let componentInfo=astUtils.inManifestData(component.name);if(componentInfo){if(componentInfo.dataDriven){utils.checkFileUpdate();logging.logIgnoreDataDriven(component.name)}else if(componentInfo.metadata){let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let componentName=componentMetadata.legacyTag;let componentCopy={...component};let logs=[];if((global.configData.forceMigration.includes(componentName)||!utils.hasAttributesToIgnore(dom,component,componentMetadata))&&!utils.hasExpressionAttributes(component,componentMetadata.legacyTag,componentMetadata.importantAttributes)){if(componentMetadata.migrateTagByAttribute){logs.push(utils["migrateTagByAttribute"](component,componentMetadata["migrateTagByAttribute"]))}else if(componentMetadata.corePackTag){logs.push(utils["migrateTag"](component,componentMetadata.legacyTag,componentMetadata.corePackTag))}else{utils.checkFileUpdate();logs.push(logging.logTagProcessed(componentMetadata.legacyTag))}for(let key in componentMetadata){if(typeof utils[key]=="function"&&key!=="migrateTagByAttribute"&&key!=="migrateImports"){if(key==="migrateDescendants"){let child=utils[key](dom,component,componentMetadata);logs=logs.concat(child.logs);for(let key of Object.keys(child.migrated)){if(!fileComponentsInfo.migrated[key]){fileComponentsInfo.migrated[key]=child.migrated[key]}else{fileComponentsInfo.migrated[key]+=child.migrated[key]}}}else{let newLogs=utils[key](component,componentMetadata[key],dom);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}}}}if(utils.hasExpressionAttributes(component,componentMetadata.legacyTag,componentMetadata.importantAttributes)){DomUtils.replaceElement(component,componentCopy);global.migrationMetrics.components-=1}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.migrated[componentMetadata.legacyTag]){fileComponentsInfo.migrated[componentMetadata.legacyTag]=1}else{fileComponentsInfo.migrated[componentMetadata.legacyTag]+=1}}for(let log of logs){global.jaf.log.msg(log)}}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.skipped[component.name]){fileComponentsInfo.skipped[component.name]=1}else{fileComponentsInfo.skipped[component.name]+=1}}}}else{if(!fileComponentsInfo.skipped[component.name]){fileComponentsInfo.skipped[component.name]=1}else{fileComponentsInfo.skipped[component.name]+=1}}}}if(Object.keys(fileComponentsInfo.migrated).length>0||Object.keys(fileComponentsInfo.skipped).length>0){allComponentsInfo.push(fileComponentsInfo)}if(!Object.keys(fileComponentsInfo.migrated).length&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return{code:render(dom,{decodeEntities:false}),compInfo:allComponentsInfo}}function migrateTSX(code,allComponentsInfo){let ast=astUtils.generateAST(code);let childrenImports=[];let importAdded=false;let iniFileCount=global.migrationMetrics.files;let fileComponentsInfo={path:global.filePath,skipped:{},migrated:{}};if(!errorInFile){traverse(ast,{pre:function(node){if(node.type==="JSXElement"&&node.openingElement.name){let componentInfo=astUtils.inManifestData(node.openingElement.name.name);if(componentInfo){let componentName=componentInfo.componentName;if(componentInfo.dataDriven){astUtils.checkFileUpdate();logging.logIgnoreDataDriven(componentName)}else if(componentInfo.metadata){let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let copyNode=JSON.parse(JSON.stringify(node));let restoreNode=false;if((global.configData.forceMigration.includes(componentName)||!astUtils.hasAttributesToIgnore(node,componentMetadata,ast))&&!astUtils.hasExpressionAttributes(node.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)){let logs=[];if(componentMetadata.migrateTagByAttribute){logs.push(astUtils["migrateTagByAttribute"](node,componentMetadata["migrateTagByAttribute"]))}else if(componentMetadata.corePackTag){logs.push(astUtils["migrateTag"](node,componentMetadata.legacyTag,componentMetadata.corePackTag))}else{astUtils.checkFileUpdate();logs.push(logging.logTagProcessed(componentMetadata.legacyTag))}for(let key in componentMetadata){if(typeof astUtils[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){if(key==="migrateDescendants"){let child=astUtils[key](node,componentMetadata,code,ast,childrenImports);if(child){childrenImports=child.imports;logs=logs.concat(child.logs);for(let key of Object.keys(child.migrated)){if(!fileComponentsInfo.migrated[key]){fileComponentsInfo.migrated[key]=child.migrated[key]}else{fileComponentsInfo.migrated[key]+=child.migrated[key]}}}else{restoreNode=true;break}}else{let newLogs=astUtils[key](node,componentMetadata[key],code,ast,componentMetadata.legacyTag);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}else if(newLogs===false){restoreNode=true;break}}}}if(astUtils.hasExpressionAttributes(node.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)||restoreNode){node.openingElement=copyNode.openingElement;node.closingElement=copyNode.closingElement;node.children=copyNode.children;global.migrationMetrics.components-=1;if(!fileComponentsInfo.skipped[componentMetadata.legacyTag]){fileComponentsInfo.skipped[componentMetadata.legacyTag]=1}else{fileComponentsInfo.skipped[componentMetadata.legacyTag]+=1}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.migrated[componentMetadata.legacyTag]){fileComponentsInfo.migrated[componentMetadata.legacyTag]=1}else{fileComponentsInfo.migrated[componentMetadata.legacyTag]+=1}}for(let log of logs){global.jaf.log.msg(log)}}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.skipped[node.openingElement.name.name]){fileComponentsInfo.skipped[node.openingElement.name.name]=1}else{fileComponentsInfo.skipped[node.openingElement.name.name]+=1}}}}else{if(!fileComponentsInfo.skipped[node.openingElement.name.name]){fileComponentsInfo.skipped[node.openingElement.name.name]=1}else{fileComponentsInfo.skipped[node.openingElement.name.name]+=1}}}}}});code=astUtils.generateCode(ast);if(childrenImports){for(let metadata of childrenImports){astUtils.migrateImports(ast,metadata,code)}}code=astUtils.generateCode(ast);for(let obj of global.manifestData){let newImports=[];if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateImports){newImports=astUtils.migrateImports(ast,componentMetadata,code);if(!newImports||newImports.length>0){importAdded=true}if(newImports){for(let i of newImports){astUtils.appendImport(i.name,i.index,ast)}}}}}if(Object.keys(fileComponentsInfo.migrated).length>0||Object.keys(fileComponentsInfo.skipped).length>0){allComponentsInfo.push(fileComponentsInfo)}if(!Object.keys(fileComponentsInfo.migrated).length&&!importAdded&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return{code:astUtils.generateCode(ast),compInfo:allComponentsInfo}}}function migrateTest(code){if(!errorInFile){let imports=[];let ast=testUtils.generateAST(code);let importIndex;let corePackImport;for(let obj of global.manifestData){if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(!Array.isArray(componentMetadata.corePackTag)){let globalInstances=[];let instances=[...globalInstances];traverse(ast,{pre:function(node){if(componentMetadata.migrateTest&&(node.type==="VariableDeclarator"&&node.id.typeAnnotation&&node.id.typeAnnotation.typeAnnotation.typeName&&node.id.typeAnnotation.typeAnnotation.typeName.name===componentMetadata.migrateTest.type.from||node.type==="MemberExpression"&&node.object&&node.object.name===componentMetadata.migrateTest.type.from)){globalInstances=testUtils.migrateType(node,componentMetadata.migrateTest.type,globalInstances)}else if(node.type==="CallExpression"&&(node.callee.name&&node.callee.name==="it"||node.callee.object&&node.callee.object.name==="it")||node.type==="FunctionDeclaration"||node.type==="ClassMethod"){let n=node.type==="CallExpression"?node.arguments[1]:node;let body=n.body.body;instances=[...globalInstances];if(componentMetadata.migrateTest){testUtils.hasMethodToIgnore(body,componentMetadata.migrateTest,instances);instances=testUtils.migrateLocator(body,componentMetadata.migrateTest.locator,instances);for(let key of global.testMigration){if(componentMetadata[key]){testUtils[key](body,componentMetadata[key],instances,componentMetadata.migrateTest.type.to)}}}testUtils.migrateCssLoc(body,componentMetadata)}else if(componentMetadata.migrateTest&&node.type==="CallExpression"&&node.callee.name&&node.callee.name==="before"){instances=testUtils.migrateLocator(node.arguments[0].body.body,componentMetadata.migrateTest.locator,instances)}else if(componentMetadata.migrateTest&&node.type==="ImportDeclaration"){if(node.source.value==="@oracle/oraclejet-webdriver/elements"){importIndex=importIndex?importIndex:ast.program.body.indexOf(node);imports=testUtils.migrateImports(node,componentMetadata.migrateTest,imports)}else if(node.source.value==="@oracle/oraclejet-core-pack/webdriver"){corePackImport=node}}else if(componentMetadata.migrateTest&&node.type==="TSTypeReference"&&node.typeName.name===componentMetadata.migrateTest.type.from){node.typeName.name=componentMetadata.migrateTest.type.to;astUtils.checkFileUpdate();logging.logTypeMigration(componentMetadata.migrateTest.type.from,componentMetadata.migrateTest.type.to)}}})}}}code=testUtils.generateCode(ast);for(let obj of global.manifestData){if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateTest){let type=componentMetadata.migrateTest.type.to;let locator=componentMetadata.migrateTest.locator.to;if(code.includes(type)&&!imports.includes(type)){imports.push(type)}else if(code.includes(locator)&&!imports.includes(locator)){imports.push(locator)}}}}if(imports.length>0){testUtils.appendImports(ast,importIndex,imports,corePackImport)}code=testUtils.generateCode(ast)}return code}exports.migrateHTML=migrateHTML;exports.migrateTSX=migrateTSX;exports.migrateTest=migrateTest;
|
|
6
|
+
"use strict";const{DomUtils}=require("htmlparser2");const utils=require("./htmlUtils");const astUtils=require("./astUtils");const testUtils=require("./testUtils");const logging=require("../utilities/logging");const traverse=require("ast-traverse");const render=require("dom-serializer").default;function migrateHTML(code,allComponentsInfo,modelCode){let dom=utils.getDom(code);let components=DomUtils.findAll(elem=>utils.inManifestData(elem),dom.children);let iniFileCount=global.migrationMetrics.files;let fileComponentsInfo={path:global.filePath,skipped:{},migrated:{}};for(let component of components){let componentInfo=utils.inManifestData(component);if(componentInfo){if(componentInfo.metadata){let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let componentName=componentMetadata.legacyTag?componentMetadata.legacyTag:componentMetadata.legacyClass;let componentCopy=component.cloneNode(true);let revertMig=false;let logs=[];if((global.configData.forceMigration.includes(componentName)||!utils.hasAttributesToIgnore(dom,component,componentMetadata,"",modelCode))&&!utils.hasExpressionAttributes(component,componentMetadata.legacyTag,componentMetadata.importantAttributes)){if(componentMetadata.migrateTagByAttribute){logs.push(utils["migrateTagByAttribute"](component,componentMetadata["migrateTagByAttribute"]))}else if(componentMetadata.legacyClass){logs.push(utils["migrateClassToTag"](component,componentMetadata.legacyClass,componentMetadata.corePackTag))}else if(componentMetadata.corePackTag){logs.push(utils["migrateTag"](component,componentMetadata.legacyTag,componentMetadata.corePackTag))}else{utils.checkFileUpdate();logs.push(logging.logTagProcessed(componentMetadata.legacyTag))}for(let key in componentMetadata){if(typeof utils[key]=="function"&&key!=="migrateTagByAttribute"&&key!=="migrateImports"&&key!=="migrateOptions"){if(key==="migrateDescendants"){let child=utils[key](dom,component,componentMetadata,modelCode,fileComponentsInfo);logs=logs.concat(child.logs);modelCode=child.mCode;for(let key of Object.keys(child.count.migrated)){if(!fileComponentsInfo.migrated[key]){fileComponentsInfo.migrated[key]=child.count.migrated[key]}else{fileComponentsInfo.migrated[key]+=child.count.migrated[key]}}for(let key of Object.keys(child.count.skipped)){if(!fileComponentsInfo.skipped[key]){fileComponentsInfo.skipped[key]=child.count.skipped[key]}else{fileComponentsInfo.skipped[key]+=child.count.skipped[key]}}}else{let newLogs=utils[key](component,componentMetadata[key],dom);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}}}else if(key==="migrateOptions"){let info=utils.migrateOptions(component,componentMetadata[key],modelCode,fileComponentsInfo.migrated[componentMetadata.legacyTag]?fileComponentsInfo.migrated[componentMetadata.legacyTag]:0,componentMetadata.legacyTag);if(!modelCode&&info){logging.logMapperRequest(componentMetadata.legacyTag);revertMig=true}else if(info){if(info.revert){revertMig=true}else{modelCode=info.mCode;logs=logs.concat(info.newLogs)}}}}if(componentMetadata.migrateImports&&!componentMetadata.migrateImports.from){if(modelCode){modelCode=astUtils.migrateImportsModel(modelCode,componentMetadata.migrateImports)}else{logging.logMapperRequest(componentName);revertMig=true}}if(utils.hasExpressionAttributes(component,componentMetadata.legacyTag,componentMetadata.importantAttributes)||revertMig){DomUtils.replaceElement(component,componentCopy);global.migrationMetrics.components-=1;if(!fileComponentsInfo.skipped[componentName]){fileComponentsInfo.skipped[componentName]=1}else{fileComponentsInfo.skipped[componentName]+=1}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.migrated[componentName]){fileComponentsInfo.migrated[componentName]=1}else{fileComponentsInfo.migrated[componentName]+=1}}for(let log of logs){global.jaf.log.msg(log)}}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.skipped[component.name]){fileComponentsInfo.skipped[component.name]=1}else{fileComponentsInfo.skipped[component.name]+=1}}}}else{if(componentInfo.dataDriven){utils.checkFileUpdate();logging.logIgnoreDataDriven(component.name)}if(!fileComponentsInfo.skipped[component.name]){fileComponentsInfo.skipped[component.name]=1}else{fileComponentsInfo.skipped[component.name]+=1}}}}if(Object.keys(fileComponentsInfo.migrated).length>0||Object.keys(fileComponentsInfo.skipped).length>0){allComponentsInfo.push(fileComponentsInfo)}if(!Object.keys(fileComponentsInfo.migrated).length&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return{code:render(dom,{decodeEntities:false}),compInfo:allComponentsInfo,"modelCode":modelCode}}function migrateTSX(code,allComponentsInfo){let ast=astUtils.generateAST(code);let childrenImports=[];let newVariables=[];let importAdded=false;let iniFileCount=global.migrationMetrics.files;let fileComponentsInfo={path:global.filePath,skipped:{},migrated:{}};if(!errorInFile){traverse(ast,{pre:function(node){if(node.type==="JSXElement"&&node.openingElement.name){let componentInfo=astUtils.inManifestData(node);if(componentInfo){let componentName=componentInfo.componentName?componentInfo.componentName:componentInfo.componentClass;if(componentInfo.metadata){let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let copyNode=JSON.parse(JSON.stringify(node));let revertMig=false;if((global.configData.forceMigration.includes(componentName)||!astUtils.hasAttributesToIgnore(node,componentMetadata,ast))&&!astUtils.hasExpressionAttributes(node.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)){let logs=[];if(componentMetadata.migrateTagByAttribute){logs.push(astUtils["migrateTagByAttribute"](node,componentMetadata["migrateTagByAttribute"]))}else if(componentMetadata.legacyClass){logs.push(astUtils["migrateClassToTag"](node,componentMetadata.legacyClass,componentMetadata.corePackTag))}else if(componentMetadata.corePackTag){logs.push(astUtils["migrateTag"](node,componentMetadata.legacyTag,componentMetadata.corePackTag))}else{astUtils.checkFileUpdate();logs.push(logging.logTagProcessed(componentMetadata.legacyTag))}for(let key in componentMetadata){if(typeof astUtils[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){if(key==="migrateDescendants"){let child=astUtils[key](node,componentMetadata,code,ast,childrenImports,[],fileComponentsInfo,newVariables);childrenImports=child.imports;logs=logs.concat(child.logs);fileComponentsInfo.migrated=child.migrated}else if(key==="migrateOptions"){let info=astUtils[key](node,componentMetadata,fileComponentsInfo.migrated[componentMetadata.legacyTag]?fileComponentsInfo.migrated[componentMetadata.legacyTag]:0,ast);if(info.newVariable){logs=logs.concat(info.newLogs);newVariables.push(info.newVariable)}else if(info.newLogs===true){revertMig=true}}else{let newLogs=astUtils[key](node,componentMetadata[key],code,ast);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}}}}if(astUtils.hasExpressionAttributes(node.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)||revertMig){node.openingElement=copyNode.openingElement;node.closingElement=copyNode.closingElement;node.children=copyNode.children;global.migrationMetrics.components-=1;if(!fileComponentsInfo.skipped[node.openingElement.name.name]){fileComponentsInfo.skipped[node.openingElement.name.name]=1}else{fileComponentsInfo.skipped[node.openingElement.name.name]+=1}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.migrated[componentName]){fileComponentsInfo.migrated[componentName]=1}else{fileComponentsInfo.migrated[componentName]+=1}}for(let log of logs){global.jaf.log.msg(log)}}}else{if(componentMetadata.corePackTag){if(!fileComponentsInfo.skipped[node.openingElement.name.name]){fileComponentsInfo.skipped[node.openingElement.name.name]=1}else{fileComponentsInfo.skipped[node.openingElement.name.name]+=1}}}}else{if(componentInfo.dataDriven){astUtils.checkFileUpdate();logging.logIgnoreDataDriven(componentName)}if(!fileComponentsInfo.skipped[node.openingElement.name.name]){fileComponentsInfo.skipped[node.openingElement.name.name]=1}else{fileComponentsInfo.skipped[node.openingElement.name.name]+=1}}}}}});for(let newVar of newVariables){astUtils.appendVariable(newVar.name,newVar.value,ast)}code=astUtils.generateCode(ast);if(childrenImports){for(let metadata of childrenImports){astUtils.migrateImports(ast,metadata,code)}}code=astUtils.generateCode(ast);for(let obj of global.manifestData){let newImports=[];if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateImports){newImports=astUtils.migrateImports(ast,componentMetadata,code);if(!newImports||newImports.length>0){importAdded=true}if(newImports){for(let i of newImports){astUtils.appendImport(i.name,i.index,ast)}}}}}if(Object.keys(fileComponentsInfo.migrated).length>0||Object.keys(fileComponentsInfo.skipped).length>0){allComponentsInfo.push(fileComponentsInfo)}if(!Object.keys(fileComponentsInfo.migrated).length&&!importAdded&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return{code:astUtils.generateCode(ast),compInfo:allComponentsInfo}}}function migrateTest(code){if(!errorInFile){let imports=[];let ast=testUtils.generateAST(code);let importIndex;let corePackImport;for(let obj of global.manifestData){if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(!Array.isArray(componentMetadata.corePackTag)){let globalInstances=[];let instances=[...globalInstances];traverse(ast,{pre:function(node){if(componentMetadata.migrateTest&&(node.type==="VariableDeclarator"&&node.id.typeAnnotation&&node.id.typeAnnotation.typeAnnotation.typeName&&node.id.typeAnnotation.typeAnnotation.typeName.name===componentMetadata.migrateTest.type.from||node.type==="MemberExpression"&&node.object&&node.object.name===componentMetadata.migrateTest.type.from)){globalInstances=testUtils.migrateType(node,componentMetadata.migrateTest.type,globalInstances)}else if(node.type==="CallExpression"&&(node.callee.name&&node.callee.name==="it"||node.callee.object&&node.callee.object.name==="it")||node.type==="FunctionDeclaration"||node.type==="ClassMethod"||node.type==="ClassProperty"&&node.value&&node.value.body){let n=node;switch(node.type){case"CallExpression":n=node.arguments[1];break;case"ClassProperty":n=node.value;break}let body=n.body.body;instances=[...globalInstances];if(componentMetadata.migrateTest){testUtils.hasMethodToIgnore(body,componentMetadata.migrateTest,instances);instances=testUtils.migrateLocator(body,componentMetadata.migrateTest.locator,instances);for(let key of global.testMigration){if(componentMetadata[key]){testUtils[key](body,componentMetadata[key],instances,componentMetadata.migrateTest.type.to)}}}testUtils.migrateCssLoc(body,componentMetadata)}else if(componentMetadata.migrateTest&&node.type==="CallExpression"&&node.callee.name&&node.callee.name==="before"){instances=testUtils.migrateLocator(node.arguments[0].body.body,componentMetadata.migrateTest.locator,instances)}else if(componentMetadata.migrateTest&&node.type==="ImportDeclaration"){if(node.source.value==="@oracle/oraclejet-webdriver/elements"){importIndex=importIndex?importIndex:ast.program.body.indexOf(node);imports=testUtils.migrateImports(node,componentMetadata.migrateTest,imports)}else if(node.source.value==="@oracle/oraclejet-core-pack/webdriver"){corePackImport=node}}else if(componentMetadata.migrateTest&&node.type==="TSTypeReference"&&node.typeName.name===componentMetadata.migrateTest.type.from){node.typeName.name=componentMetadata.migrateTest.type.to;astUtils.checkFileUpdate();logging.logTypeMigration(componentMetadata.migrateTest.type.from,componentMetadata.migrateTest.type.to)}}})}}}code=testUtils.generateCode(ast);for(let obj of global.manifestData){if(obj.metadata){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateTest){let type=componentMetadata.migrateTest.type.to;let locator=componentMetadata.migrateTest.locator.to;if(code.includes(type)&&!imports.includes(type)){imports.push(type)}else if(code.includes(locator)&&!imports.includes(locator)){imports.push(locator)}}}}if(imports.length>0){testUtils.appendImports(ast,importIndex,imports,corePackImport)}code=testUtils.generateCode(ast)}return code}exports.migrateHTML=migrateHTML;exports.migrateTSX=migrateTSX;exports.migrateTest=migrateTest;
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require("path");const fs=require("fs");const fileSets={};function getConfigData(sourcePath){try{if(!fs.existsSync(sourcePath)){return}let text=fs.readFileSync(sourcePath,{encoding:"utf8",flag:"r"});return JSON.parse(text)}catch(error){console.log("Error: "+error.stack);process.exit(0)}}function scanForFiles(startPath,include){let{testFilesExtension,excludeFolders,fileTypes,excludeFiles,includeFiles,includeFolders}=global.configData;if(testFilesExtension){fileTypes=[testFilesExtension]}if(!includeFolders.length){include=true}const regex=new RegExp(`.(${fileTypes.map(i=>"."+i).join("|")})$`,"i");try{if(!fs.existsSync(startPath)){return}let files=fs.readdirSync(startPath);for(let i=0;i<files.length;i++){let filepath=path.join(startPath,files[i]);let stat=fs.lstatSync(filepath);let filename=
|
|
6
|
+
const path=require("path");const fs=require("fs");const fileSets={};function getConfigData(sourcePath){try{if(!fs.existsSync(sourcePath)){return}let text=fs.readFileSync(sourcePath,{encoding:"utf8",flag:"r"});return JSON.parse(text)}catch(error){console.log("Error: "+error.stack);process.exit(0)}}function scanForFiles(startPath,include){let{testFilesExtension,excludeFolders,fileTypes,excludeFiles,includeFiles,includeFolders}=global.configData;if(testFilesExtension){fileTypes=[testFilesExtension]}if(!includeFolders.length){include=true}const regex=new RegExp(`.(${fileTypes.map(i=>"."+i).join("|")})$`,"i");try{if(!fs.existsSync(startPath)){return}let files=fs.readdirSync(startPath);for(let i=0;i<files.length;i++){let filepath=path.join(startPath,files[i]);let stat=fs.lstatSync(filepath);let filename=files[i];if(stat.isDirectory()){if(includeFolders.length&&(includeFolders.includes(filepath)||includeFolders.includes(filename))||!includeFolders.length&&!excludeFolders.includes(filepath)&&!excludeFolders.includes(filename)){scanForFiles(filepath,true)}else if(!excludeFolders.length||!excludeFolders.includes(filepath)&&!excludeFolders.includes(filename)){scanForFiles(filepath,include)}}else{if(include&&(!excludeFiles.length&&(includeFiles.includes(filepath)||includeFiles.includes(filename))||!includeFiles.length&&!excludeFiles.includes(filepath)&&!excludeFiles.includes(filename))){let info=regex.exec(filepath);if(info&&info["index"]){if(fileSets[info[1]]){fileSets[info[1]].push(filepath)}else{fileSets[info[1]]=[filepath]}}}}}return fileSets}catch(error){console.log("Error: "+error.stack);process.exit(0)}}exports.scanForFiles=scanForFiles;exports.getConfigData=getConfigData;
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const{parseDocument,DomUtils}=require("htmlparser2");const render=require("dom-serializer").default;const logging=require("../utilities/logging");const self=require("./htmlUtils");function checkFileUpdate(){if(!global.fileIsUpdated){global.fileIsUpdated=true;global.migrationMetrics.files+=1;logging.logFilePath(global.filePath);return true}return false}function _getLabelFromDOMNode(node,slotName,cnodes=[],label=""){if(node&&node.children&&!!node.children.length){for(let child of node.children){if(child.type&&child.type=="text"){if(/\S/.test(child.data)){if(label){if(/[\[{].*?[\]}]/g.test(label)){if(/[\[{].*?[\]}]/g.test(child.data.trim())){label=`${label.substring(0,label.length-2)}() + ${child.data.trim().substring(2,child.data.length-2)}()]]`}else{label=`${label.substring(0,label.length-2)}() + ' ${child.data.trim()}']]`}}else{if(/[\[{].*?[\]}]/g.test(child.data.trim())){label=`[['${label} ' + ${child.data.trim().substring(2,child.data.length-2)}()]]`}else{label+=" "+child.data.trim()}}}else{label=child.data.trim()}cnodes.push(child)}}else if(child.type&&child.type=="tag"&&child.name.toUpperCase()=="OJ-BIND-TEXT"&&(!slotName&&!child.attribs.slot||slotName&&child.attribs.slot===slotName)){if(label){if(/[\[{].*?[\]}]/g.test(label)){if(/[\[{].*?[\]}]/g.test(child.attribs.value)){label=`${label.substring(0,label.length-2)}() + ${child.attribs.value.substring(2,child.attribs.value.length-2)}()]]`}else{label=`${label.substring(0,label.length-2)}() + ' ${child.attribs.value}']]`}}else{if(/[\[{].*?[\]}]/g.test(child.attribs.value)){label=`[['${label} ' + ${child.attribs.value.substring(2,child.attribs.value.length-2)}()]]`}else{label+=" "+child.attribs.value}}}else{label=child.attribs.value}cnodes.push(child)}else if(child.children&&!!child.children.length){if(child.attribs.slot===slotName){label=_getLabelFromDOMNode(child,slotName,cnodes,label);var regex=new RegExp("^[^\\dA-Za-z]*$");for(let c of child.children){if(c.type==="text"&®ex.test(c.data)){cnodes.push(c)}}cnodes.push(child)}}}}if(cnodes.length>0){for(let node of cnodes){DomUtils.removeElement(node)}}return label}function _findDescendant(component,tagName,slotName){if(component.children){for(let child of component.children){if(child.name===tagName){if(!slotName||child.attribs.slot&&child.attribs.slot===slotName){return child}}else if(child.children){const descendant=_findDescendant(child,tagName);if(descendant){return descendant}}}}return false}function getDom(text=""){return parseDocument(text,{withStartIndices:true,withEndIndices:true})}function _transferAttribute(fromTag,toTag,attribute,value,joined){if(fromTag.attribs[attribute]||joined&&fromTag.attribs[joined]){toTag.attribs[attribute]=value;delete fromTag.attribs[attribute]?fromTag.attribs[attribute]:fromTag.attribs[joined]}}function _hasAttributesToIgnoreHelper(dom,component,rule,key,parent,corePackTag){if(rule.missPeerTag){const peerRule=rule.missPeerTag;for(let tag of peerRule.tag){for(let attrSet of peerRule.matchValues){const peer=_findPeer(dom,component,tag,attrSet.ownAttribute,attrSet.peerAttribute);if(peer&&(!peerRule.attribute||!_findAttribute(peer,peerRule.attribute))&&(!peerRule.missSlot||_findAttribute(peer,"slot",peerRule.missSlot))){return false}}}return true};if(rule.missDescendant){const descRule=rule.missDescendant;for(let tag of descRule.tag){const desc=_findDescendant(component,tag,descRule.missSlot);if(desc&&(!descRule.attribute||!_findAttribute(desc,descRule.attribute))){return false}}return true};if(!rule.descendant&&component.attribs){if(rule.missAttribute){for(let key in rule.missAttribute){if(_findAttribute(component,key,rule.missAttribute[key])){return false}}if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,rule.missAttribute,"",parent,true)}return true}if(rule.attribute&&!rule.typeDefined){let attr=_findAttribute(component,rule.attribute);if(attr){rule.attribute=attr.attribute;if(rule.allowedValues&&!rule.allowedValues.includes(component.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(component.attribs[rule.attribute])||!rule.allowedValues&&!rule.prohibitedValues){if(corePackTag){checkFileUpdate();let value=(rule.allowedValues||rule.prohibitedValues)&&component.attribs[rule.attribute]?component.attribs[rule.attribute]:"";logging.logIgnoreComponent(component.name,rule.attribute,value,parent)}return true}}}else if(component.attribs[key]&&component.attribs[key]===rule[key]){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,key,rule[key],parent)}return true}}if(component.children){for(let j=0;j<component.children.length;j++){const child=component.children[j];if(child.type==="tag"){if(rule.descendant){if(child.name===rule.descendant){if(rule.attribute){const attr=_findAttribute(child,rule.attribute);if(attr){rule.attribute=attr.attribute;if(rule.allowedValues&&!rule.allowedValues.includes(child.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(child.attribs[rule.attribute])||!rule.prohibitedValues&&!rule.allowedValues){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,rule.attribute,child.attribs[rule.attribute],parent)}return true}return false}else{return false}}else if(rule.slotName&&child.attribs["slot"]&&child.attribs["slot"]===rule.slotName){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",child.attribs[rule.attribute],parent)}return true}else if(rule.missSlot){if(!child.attribs["slot"]||child.attribs["slot"]!==rule.missSlot){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",rule.missSlot,parent,true)}return true}else if(child.attribs["slot"]&&child.attribs["slot"]===rule.missSlot){return false}}if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(rule.descendant,"","",parent)}return true}else if(_hasAttributesToIgnoreHelper(dom,child,rule,key,parent,corePackTag)){return true}}if(!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(dom,child,rule,key,parent,corePackTag)){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,key,rule[key])}return true}}}}}function _toCamelCase(attribute){let camelCaseName=attribute.split("-");for(let i in camelCaseName){if(i>0){camelCaseName[i]=camelCaseName[i][0].toUpperCase()+camelCaseName[i].slice(1)}}camelCaseName=camelCaseName.join("");return camelCaseName}function _findAttribute(component,name,value=""){if(name){const joined=name.split("-").join("");if(DomUtils.hasAttrib(component,name)&&(!value||value===component.attribs[name])){return{attribute:name,attrValue:component.attribs[name]}}else if(DomUtils.hasAttrib(component,joined)&&(!value||value===component.attribs[joined])){return{attribute:joined,format:"camel",attrValue:component.attribs[joined]}}else if(DomUtils.hasAttrib(component,`:${name}`)&&(!value||value===component.attribs[`:${name}`])){return{attribute:`:${name}`,format:"colon",attrValue:component.attribs[`:${name}`]}}else if(DomUtils.hasAttrib(component,`:${joined}`)&&(!value||value===component.attribs[`:${joined}`])){return{attribute:`:${joined}`,format:"colonCamel",attrValue:component.attribs[`:${joined}`]}}}return false}function _findPeer(dom,component,peerTag,componentAttr,peerAttr){const attributeValue=_findAttribute(component,componentAttr).attrValue;if(attributeValue){const peer=DomUtils.findOne(elem=>elem.name===peerTag&&_findAttribute(elem,peerAttr,attributeValue),dom.children);return peer}}function hasAttributesToIgnore(dom,component,metadata,parent=""){const ignoreRuleData=metadata.ruleSetToIgnore;if(ignoreRuleData){for(let i=0;i<ignoreRuleData.length;i++){rule=ignoreRuleData[i];let arr=Object.keys(rule);let key=arr[0];if(!rule.type){if(rule.descendant){parent=component.name}if(_hasAttributesToIgnoreHelper(dom,component,rule,key,parent,metadata.corePackTag)){return true}}}}return false}function hasExpressionAttributes(component,componentName,importantAttributes){const excludedAttributes=global.configData.excludeAttributeExpressions[componentName];const regex=new RegExp(`((\\{\\{)|(\\[\\[)).*((\\}\\})|(\\]\\]))`);if(global.jaf.options.dryRunMode&&importantAttributes){for(let attribute of importantAttributes){if(component.attribs[`:${attribute}`]){attribute=`:${attribute}`}if(regex.test(component.attribs[attribute])){if(checkFileUpdate()){logging.logAttributeExpression(componentName,attribute,component.attribs[attribute])}}}}if(excludedAttributes&&excludedAttributes.length){for(let i=0;i<excludedAttributes.length;i++){if(component.attribs[`:${excludedAttributes[i]}`]){excludedAttributes[i]=`:${excludedAttributes[i]}`}if(regex.test(component.attribs[excludedAttributes[i]])){checkFileUpdate();logging.logExcludeAttributeExpression(componentName,excludedAttributes[i],component.attribs[excludedAttributes[i]]);return true}}}return false}function commentSlotContent(component,data){const slotValue=data.slot;for(let child of component.children){if(child.name&&child.attribs.slot==slotValue){const cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);checkFileUpdate();return[logging.logCommentSlotContent(component.name,slotValue,child.name)]}};}function slotContentToAttribute(component,data,dom){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){const descendant=_findDescendant(component,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){const descendant=_findDescendant(component,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){component=descendant}else{continue}}if(obj.toPeer||obj.fromPeer){const peer=_findPeer(dom,component,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peer){if(obj.toPeer){toNode=peer}else{component=peer}}else{continue}}if(!Object.keys(component.attribs).includes(obj.attribute)){component.attribs[obj.attribute]=_getLabelFromDOMNode(component,data.slotNameFrom);if(!component.attribs[obj.attribute]){delete component.attribs[obj.attribute]}else{checkFileUpdate();logs.push(logging.logSlotContentToAttribute(component.name,obj.attribute,component.attribs[obj.attribute]));if(toNode){_transferAttribute(component,toNode,obj.attribute,component.attribs[obj.attribute]);logs.push(logging.logAttributeTransfer(component.name,toNode.name,obj.attribute,toNode.attribs[obj.attribute]))}return logs}}}}function migrateTag(component,legacyComponentName,coreComponentName,isChild){component.name=coreComponentName;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(legacyComponentName,coreComponentName,isChild)}function migrateTagByAttribute(component,data,isChild){for(const tagSet of data){if(tagSet.attribute){const attribute=_findAttribute(component,tagSet.attribute,tagSet.attributeValue);if(attribute){component.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tagSet.fromTag,tagSet.toTag,isChild)}}else{component.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tagSet.fromTag,tagSet.toTag)}}};function classNameToAttribute(component,data){let logs=[];data.forEach(obj=>{const from=obj.className;const to=obj.attributeValue;const attribute=obj.attribute;if(component.attribs.class){classNames=component.attribs.class.split(" ");index=classNames.indexOf(from);if(index!=-1&&attribute){classNames.splice(index,1);if(classNames.length==0)delete component.attribs.class;else component.attribs.class=classNames.join(" ");component.attribs[attribute]=to;checkFileUpdate();logs.push(logging.logClassNameToAttribute(from,attribute,to))}}});return logs}function migrateAttributes(component,data,dom){let toNode;let logs=[];for(const attributeSet in data){let camelFromAttribute="";let camelToAttribute="";let tagExists=true;let obj=data[attributeSet];if(obj.fromDescendant||obj.fromPeer||obj.toDescendant||obj.toPeer){tagExists=false;if(obj.fromDescendant||obj.toDescendant){const descendant=_findDescendant(component,obj.fromDescendant?obj.fromDescendant:obj.toDescendant,obj.slotName);if(component.children&&descendant){tagExists=true;if(obj.fromDescendant){toNode=component;component=descendant}else{toNode=descendant}}else{continue}}else{const peerTag=_findPeer(dom,component,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peerTag){tagExists=true;if(obj.fromPeer){toNode=component;component=peerTag}else{toNode=peerTag}}else{continue}}}if(tagExists){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=_findAttribute(component,obj.depAttribute)}const hasFromAttribute=_findAttribute(component,obj.fromAttribute,obj.fromValue);let fromAttribute=obj.fromAttribute;if(hasFromAttribute){fromAttribute=hasFromAttribute.attribute}let toAttribute=obj.toAttribute;if(hasFromAttribute.format){if(toAttribute){if(hasFromAttribute.format==="camel"){toAttribute=toAttribute.split("-").join("")}else if(hasFromAttribute.format==="colonCamel"){toAttribute=`:${toAttribute.split("-").join("")}`}else{toAttribute=`:${toAttribute}`}}}const hasToAttribute=_findAttribute(component,toAttribute);if(!(obj.fromAttribute===obj.toAttribute&&obj.fromValue===obj.toValue)){if(hasDepAttribute&&hasFromAttribute&&toAttribute&&(!hasToAttribute||fromAttribute===toAttribute)){if(obj.toValue){switch(hasFromAttribute.format){case"camel":camelFromAttribute=_toCamelCase(obj.fromAttribute);camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelFromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}component.attribs[camelToAttribute?camelToAttribute:toAttribute]=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeMigration(camelFromAttribute?camelFromAttribute:fromAttribute,obj.fromValue,camelToAttribute?camelToAttribute:toAttribute,obj.toValue))}else{let fromValue=obj.fromValue?obj.fromValue:component.attribs[fromAttribute];switch(hasFromAttribute.format){case"camel":camelFromAttribute=_toCamelCase(obj.fromAttribute);camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelFromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}if(obj.fromValue){component.attribs[camelToAttribute?camelToAttribute:toAttribute]=""}else{component.attribs[camelToAttribute?camelToAttribute:toAttribute]=component.attribs[fromAttribute]}checkFileUpdate();logs.push(logging.logAttributeMigration(camelFromAttribute?camelFromAttribute:fromAttribute,fromValue,camelToAttribute?camelToAttribute:toAttribute))}if(fromAttribute!==toAttribute){delete component.attribs[fromAttribute]}}else if(hasDepAttribute&&hasFromAttribute&&!toAttribute){delete component.attribs[fromAttribute];switch(hasFromAttribute.format){case"camel":fromAttribute=_toCamelCase(obj.fromAttribute);break;case"colonCamel":fromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;break}checkFileUpdate();logs.push(logging.logAttributeDeprecation(fromAttribute,obj.fromValue))}else if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){if(toNode){toNode.attribs[obj.toAttribute]=obj.toValue}else{component.attribs[obj.toAttribute]=obj.toValue}checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue,toNode?toNode.name:""))}}if(toNode&&hasFromAttribute){switch(hasFromAttribute.format){case"camel":camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}checkFileUpdate();_transferAttribute(component,toNode,camelToAttribute?camelToAttribute:toAttribute,component.attribs[camelToAttribute?camelToAttribute:toAttribute],toAttribute);const toValue=toNode.attribs[camelToAttribute?camelToAttribute:toAttribute];logs.push(logging.logAttributeTransfer(component.name,toNode.name,camelToAttribute?camelToAttribute:toAttribute,toValue));if(obj.fromDescendant||obj.fromPeer){component=toNode}}}}return logs}function handleSpecialCase(code,componentName,data){let obj;let regex;if(data[1]){obj=data[1];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString)}obj=data[0];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString);return code}function _migrateDescendantsHelper(dom,children,componentMetadata,parent,migratedComp,logs=[]){for(let child of children){if(child.name===componentMetadata.legacyTag){if(!hasAttributesToIgnore(dom,child,componentMetadata,parent)&&!hasExpressionAttributes(child,componentMetadata.legacyTag,componentMetadata.importantAttributes)){if(componentMetadata["migrateTagByAttribute"]){logs.push(migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true))}else{logs.push(migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true))}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){logs=logs.concat(self[key](child,componentMetadata[key]))}}if(!migratedComp[componentMetadata.legacyTag]){migratedComp[componentMetadata.legacyTag]=1}else{migratedComp[componentMetadata.legacyTag]+=1}}}else{if(child.children){returnValue=_migrateDescendantsHelper(dom,child.children,componentMetadata,parent,migratedComp);logs=logs.concat(returnValue.logs);migratedComp=returnValue.migrated}}}return{logs:logs,migrated:migratedComp}}function migrateDescendants(dom,component,metadata,logs=[]){let migratedComp={};const data=metadata.migrateDescendants;let returnValue=false;for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(component.children){returnValue=_migrateDescendantsHelper(dom,component.children,componentMetadata,metadata.legacyTag,migratedComp);if(returnValue){logs=logs.concat(returnValue.logs)}}}return{logs:logs,migrated:returnValue.migrated}}function removeComponent(component){DomUtils.removeElement(component);return logging.logComponentRemoved(component.name)}function replaceComponent(fromNode,data){for(let obj of data){let descendant=_findDescendant(fromNode,obj.descendant);if(descendant){DomUtils.replaceElement(fromNode,descendant);return logging.logComponentReplacement(fromNode.name,descendant.name)}}}exports.getDom=getDom;exports.checkFileUpdate=checkFileUpdate;exports.hasAttributesToIgnore=hasAttributesToIgnore;exports.hasExpressionAttributes=hasExpressionAttributes;exports.slotContentToAttribute=slotContentToAttribute;exports.commentSlotContent=commentSlotContent;exports.migrateTag=migrateTag;exports.classNameToAttribute=classNameToAttribute;exports.handleSpecialCase=handleSpecialCase;exports.migrateAttributes=migrateAttributes;exports.migrateTagByAttribute=migrateTagByAttribute;exports.migrateDescendants=migrateDescendants;exports.replaceComponent=replaceComponent;exports.removeComponent=removeComponent;
|
|
6
|
+
const{parseDocument,DomUtils}=require("htmlparser2");const render=require("dom-serializer").default;const logging=require("../utilities/logging");const self=require("./htmlUtils");const astUtils=require("./astUtils");function inManifestData(component){for(let obj of global.manifestData){if(obj.componentName&&obj.componentName===component.name){return obj}else if(obj.componentClass){if(component.attribs["class"]&&component.attribs["class"].includes(obj.componentClass)){return obj}}}return false}function checkFileUpdate(){if(!global.fileIsUpdated){global.fileIsUpdated=true;global.migrationMetrics.files+=1;logging.logFilePath(global.filePath);return true}return false}function _getLabelFromDOMNodeHelper(child,slotName,cnodes=[],label=""){const expRegex=/[\[{].*?[\]}]/g;if(child.type&&child.type=="text"){if(/\S/.test(child.data)){if(label){if(expRegex.test(label)){if(expRegex.test(child.data.trim())){label=label.endsWith("()]]")?`${label.substring(0,label.length-2)} + ${child.data.trim().substring(2,child.data.length-2)}()]]`:`${label.substring(0,label.length-2)}() + ${child.data.trim().substring(2,child.data.length-2)}()]]`}else{label=label.endsWith("()]]")?`${label.substring(0,label.length-2)} + ' ${child.data.trim()}']]`:`${label.substring(0,label.length-2)}() + ' ${child.data.trim()}']]`}}else{if(expRegex.test(child.data.trim())){label=`[['${label} ' + ${child.data.trim().substring(2,child.data.length-2)}()]]`}else{label+=" "+child.data.trim()}}}else{label=child.data.trim()}cnodes.push(child)}}else if(child.type&&child.type=="tag"&&child.name.toUpperCase()=="OJ-BIND-TEXT"&&(!slotName&&!child.attribs.slot||slotName&&child.attribs.slot===slotName)){if(label){if(expRegex.test(label)){if(expRegex.test(child.attribs.value)){label=label.endsWith("()]]")?`${label.substring(0,label.length-2)}() + ${child.attribs.value.substring(2,child.attribs.value.length-2)}()]]`:`${label.substring(0,label.length-2)} + ${child.attribs.value.substring(2,child.attribs.value.length-2)}()]]`}else{label=label.endsWith("()]]")?`${label.substring(0,label.length-2)} + ' ${child.attribs.value}']]`:`${label.substring(0,label.length-2)}() + ' ${child.attribs.value}']]`}}else{if(expRegex.test(child.attribs.value)){label=`[['${label} ' + ${child.attribs.value.substring(2,child.attribs.value.length-2)}()]]`}else{label+=" "+child.attribs.value}}}else{label=child.attribs.value}cnodes.push(child)}else if(child.children&&!!child.children.length){if(child.attribs.slot===slotName||!slotName&&!child.attribs.slot){var regex=new RegExp("^[^\\dA-Za-z]*$");for(let c of child.children){label=_getLabelFromDOMNodeHelper(c,slotName,cnodes,label);if(c.type==="text"&®ex.test(c.data)){cnodes.push(c)}}cnodes.push(child)}}return label}function _getLabelFromDOMNode(node,slotName,label=""){if(node&&node.children&&!!node.children.length){let cnodes=[];for(let child of node.children){label=_getLabelFromDOMNodeHelper(child,slotName,cnodes,label)}if(cnodes.length>0){for(let node of cnodes){DomUtils.removeElement(node)}}}return label}function _findDescendant(component,tagName,slotName){if(component.children){for(let child of component.children){if(child.name===tagName){if(!slotName||child.attribs.slot&&child.attribs.slot===slotName){return child}}else if(child.children){const descendant=_findDescendant(child,tagName);if(descendant){return descendant}}}}return false}function getDom(text=""){return parseDocument(text,{withStartIndices:true,withEndIndices:true})}function _transferAttribute(fromTag,toTag,attribute,value,joined){if(fromTag.attribs[attribute]||joined&&fromTag.attribs[joined]){toTag.attribs[attribute]=value;delete fromTag.attribs[attribute]?fromTag.attribs[attribute]:fromTag.attribs[joined]}}function _hasAttributesToIgnoreHelper(dom,component,rule,key,parent,corePackTag,modelCode){if(rule.missPeerTag){const peerRule=rule.missPeerTag;for(let tagAttrSet of peerRule.tagAttributes){let tag=tagAttrSet.name;for(let attrSet of peerRule.matchValues){const peer=_findPeer(dom,component,tag,attrSet.ownAttribute,attrSet.peerAttribute);if(peer){let migratable=true;if(tagAttrSet.attribute){for(let set of tagAttrSet.attribute){migratable=_hasAttributesToIgnoreHelper(dom,peer,{"missAttribute":set});if(!migratable){break}}}if(tagAttrSet.missSlot&&migratable){migratable=_findAttribute(peer,"slot",peerRule.missSlot)?true:false}if(tagAttrSet.mapper&&migratable){migratable=modelCode?true:false}if(tagAttrSet.descendant&&migratable){migratable=!_hasAttributesToIgnoreHelper(dom,peer,tagAttrSet.descendant)}if(migratable){return false}}}}return true};if(rule.missDescendant){const descRule=rule.missDescendant;for(let tagAttrSet of descRule.tagAttributes){let tag=tagAttrSet.name;const desc=_findDescendant(component,tag,tagAttrSet.missSlot);if(desc){let migratable=true;if(tagAttrSet.attribute){for(let set of tagAttrSet.attribute){migratable=_hasAttributesToIgnoreHelper(dom,desc,{"missAttribute":set});if(!migratable){break}}}if(tagAttrSet.mapper&&migratable){migratable=modelCode?true:false}if(tagAttrSet.descendant&&migratable){migratable=!_hasAttributesToIgnoreHelper(dom,desc,tagAttrSet.descendant)}if(migratable){return false}}}return true};if(!rule.descendant&&component.attribs){if(rule.missAttribute){for(let key in rule.missAttribute){if(_findAttribute(component,key,rule.missAttribute[key])){return false}}if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,rule.missAttribute,"",parent,true)}return true}if(rule.attribute&&!rule.typeDefined){let attr=_findAttribute(component,rule.attribute);if(attr){rule.attribute=attr.attribute;if(rule.allowedValues&&!rule.allowedValues.includes(component.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(component.attribs[rule.attribute])||!rule.allowedValues&&!rule.prohibitedValues){if(corePackTag){checkFileUpdate();let value=(rule.allowedValues||rule.prohibitedValues)&&component.attribs[rule.attribute]?component.attribs[rule.attribute]:"";logging.logIgnoreComponent(component.name,rule.attribute,value,parent)}return true}}}else if(component.attribs[key]&&component.attribs[key]===rule[key]){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,key,rule[key],parent)}return true}}if(component.children){for(let j=0;j<component.children.length;j++){const child=component.children[j];if(child.type==="tag"){if(rule.descendant){if(child.name===rule.descendant){if(rule.attribute){const attr=_findAttribute(child,rule.attribute);if(attr){rule.attribute=attr.attribute;if(rule.allowedValues&&!rule.allowedValues.includes(child.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(child.attribs[rule.attribute])||!rule.prohibitedValues&&!rule.allowedValues){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,rule.attribute,child.attribs[rule.attribute],parent)}return true}}}else if(rule.slotName&&child.attribs["slot"]&&child.attribs["slot"]===rule.slotName){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",child.attribs[rule.attribute],parent)}return true}else if(rule.missSlot){if(!child.attribs["slot"]||child.attribs["slot"]!==rule.missSlot){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",rule.missSlot,parent,true)}return true}else if(child.attribs["slot"]&&child.attribs["slot"]===rule.missSlot){return false}}else{if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(rule.descendant,"","",parent)}return true}}else if(_hasAttributesToIgnoreHelper(dom,child,rule,key,parent,corePackTag)){return true}}if(!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(dom,child,rule,key,parent,corePackTag)){if(corePackTag){checkFileUpdate();logging.logIgnoreComponent(component.name,key,rule[key])}return true}}}}}function _toCamelCase(attribute){let camelCaseName=attribute.split("-");for(let i in camelCaseName){if(i>0){camelCaseName[i]=camelCaseName[i][0].toUpperCase()+camelCaseName[i].slice(1)}}camelCaseName=camelCaseName.join("");return camelCaseName}function _findAttribute(component,name,value=""){if(name){const joined=name.split("-").join("");if(DomUtils.hasAttrib(component,name)&&(!value||value===component.attribs[name])){return{attribute:name,attrValue:component.attribs[name]}}else if(DomUtils.hasAttrib(component,joined)&&(!value||value===component.attribs[joined])){return{attribute:joined,format:"camel",attrValue:component.attribs[joined]}}else if(DomUtils.hasAttrib(component,`:${name}`)&&(!value||value===component.attribs[`:${name}`])){return{attribute:`:${name}`,format:"colon",attrValue:component.attribs[`:${name}`]}}else if(DomUtils.hasAttrib(component,`:${joined}`)&&(!value||value===component.attribs[`:${joined}`])){return{attribute:`:${joined}`,format:"colonCamel",attrValue:component.attribs[`:${joined}`]}}}return false}function _findPeer(dom,component,peerTag,componentAttr,peerAttr){const attributeValue=_findAttribute(component,componentAttr).attrValue;if(attributeValue){const peer=DomUtils.findOne(elem=>elem.name===peerTag&&_findAttribute(elem,peerAttr,attributeValue),dom.children);return peer}}function hasAttributesToIgnore(dom,component,metadata,parent="",modelCode){const ignoreRuleData=metadata.ruleSetToIgnore;if(ignoreRuleData){for(let i=0;i<ignoreRuleData.length;i++){rule=ignoreRuleData[i];let arr=Object.keys(rule);let key=arr[0];if(!rule.type){if(rule.descendant){parent=component.name}if(_hasAttributesToIgnoreHelper(dom,component,rule,key,parent,metadata.corePackTag,modelCode)){return true}}}}return false}function hasExpressionAttributes(component,componentName,importantAttributes){const excludedAttributes=global.configData.excludeAttributeExpressions[componentName];const regex=new RegExp(`((\\{\\{)|(\\[\\[)).*((\\}\\})|(\\]\\]))`);if(global.jaf.options.dryRunMode&&importantAttributes){for(let attribute of importantAttributes){if(component.attribs[`:${attribute}`]){attribute=`:${attribute}`}if(regex.test(component.attribs[attribute])){if(checkFileUpdate()){logging.logAttributeExpression(componentName,attribute,component.attribs[attribute])}}}}if(excludedAttributes&&excludedAttributes.length){for(let i=0;i<excludedAttributes.length;i++){if(component.attribs[`:${excludedAttributes[i]}`]){excludedAttributes[i]=`:${excludedAttributes[i]}`}if(regex.test(component.attribs[excludedAttributes[i]])){checkFileUpdate();logging.logExcludeAttributeExpression(componentName,excludedAttributes[i],component.attribs[excludedAttributes[i]]);return true}}}return false}function commentSlotContent(component,data){const slotValue=data.slot;for(let child of component.children){if(child.name&&child.attribs.slot==slotValue){const cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);checkFileUpdate();return[logging.logCommentSlotContent(component.name,slotValue,child.name)]}};}function slotContentToAttribute(component,data,dom){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){const descendant=_findDescendant(component,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){const descendant=_findDescendant(component,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){component=descendant}else{continue}}if(obj.toPeer||obj.fromPeer){const peer=_findPeer(dom,component,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peer){if(obj.toPeer){toNode=peer}else{component=peer}}else{continue}}if(!Object.keys(component.attribs).includes(obj.attribute)){component.attribs[obj.attribute]=_getLabelFromDOMNode(component,data.slotNameFrom);if(!component.attribs[obj.attribute]){delete component.attribs[obj.attribute]}else{checkFileUpdate();logs.push(logging.logSlotContentToAttribute(component.name,obj.attribute,component.attribs[obj.attribute]));if(toNode){_transferAttribute(component,toNode,obj.attribute,component.attribs[obj.attribute]);logs.push(logging.logAttributeTransfer(component.name,toNode.name,obj.attribute,toNode.attribs[obj.attribute]))}return logs}}}}function migrateTag(component,legacyComponentName,coreComponentName,isDescendant){component.name=coreComponentName;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(legacyComponentName,coreComponentName,isDescendant)}function migrateClassToTag(component,legacyClassName,coreComponentName,isDescendant){const fromTag=component.name;component.name=coreComponentName;classNames=component.attribs.class.split(" ");index=classNames.indexOf(legacyClassName);classNames.splice(index,1);if(classNames.length===0){delete component.attribs.class}else{component.attribs.class=classNames.join(" ")}checkFileUpdate();global.migrationMetrics.components+=1;return logging.logClassToTagMigration(fromTag,legacyClassName,coreComponentName,isDescendant)}function migrateTagByAttribute(component,data,isDescendant){for(const tagSet of data){if(tagSet.attribute){const attribute=_findAttribute(component,tagSet.attribute,tagSet.attributeValue);if(attribute){component.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tagSet.fromTag,tagSet.toTag,isDescendant)}}else{component.name=tagSet.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tagSet.fromTag,tagSet.toTag)}}};function classNameToAttribute(component,data){let logs=[];data.forEach(obj=>{const from=obj.className;const to=obj.attributeValue;const attribute=obj.attribute;if(component.attribs.class){classNames=component.attribs.class.split(" ");if(typeof obj.className==="string"&&classNames.includes(obj.className)){index=classNames.indexOf(from);classNames.splice(index,1);component.attribs[attribute]=to;checkFileUpdate();logs.push(logging.logClassNameToAttribute(from,attribute,to))}else if(typeof obj.className==="object"&&from.every(c=>classNames.includes(c))){obj.className.forEach(cl=>{index=classNames.indexOf(cl);classNames.splice(index,1)});component.attribs[attribute]=to;checkFileUpdate();logs.push(logging.logClassNameToAttribute(from,attribute,to))}if(classNames.length==0)delete component.attribs.class;else component.attribs.class=classNames.join(" ")}});return logs}function migrateAttributes(component,data,dom){let toNode;let logs=[];for(const attributeSet in data){let camelFromAttribute="";let camelToAttribute="";let tagExists=true;let obj=data[attributeSet];if(obj.fromDescendant||obj.fromPeer||obj.toDescendant||obj.toPeer){tagExists=false;if(obj.fromDescendant||obj.toDescendant){const descendant=_findDescendant(component,obj.fromDescendant?obj.fromDescendant:obj.toDescendant,obj.slotName);if(component.children&&descendant){tagExists=true;if(obj.fromDescendant){toNode=component;component=descendant}else{toNode=descendant}}else{continue}}else{const peerTag=_findPeer(dom,component,obj.toPeer?obj.toPeer:obj.fromPeer,obj.ownAttribute,obj.peerAttribute);if(peerTag){tagExists=true;if(obj.fromPeer){toNode=component;component=peerTag}else{toNode=peerTag}}else{continue}}}if(tagExists){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=_findAttribute(component,obj.depAttribute)}const hasFromAttribute=_findAttribute(component,obj.fromAttribute,obj.fromValue);let fromAttribute=obj.fromAttribute;if(hasFromAttribute){fromAttribute=hasFromAttribute.attribute}let toAttribute=obj.toAttribute;if(hasFromAttribute.format){if(toAttribute){if(hasFromAttribute.format==="camel"){toAttribute=toAttribute.split("-").join("")}else if(hasFromAttribute.format==="colonCamel"){toAttribute=`:${toAttribute.split("-").join("")}`}else{toAttribute=`:${toAttribute}`}}}const hasToAttribute=_findAttribute(component,toAttribute);if(!(obj.fromAttribute===obj.toAttribute&&obj.fromValue===obj.toValue)){if(hasDepAttribute&&hasFromAttribute&&toAttribute&&(!hasToAttribute||fromAttribute===toAttribute)){if(obj.toValue){switch(hasFromAttribute.format){case"camel":camelFromAttribute=_toCamelCase(obj.fromAttribute);camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelFromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}component.attribs[camelToAttribute?camelToAttribute:toAttribute]=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeMigration(camelFromAttribute?camelFromAttribute:fromAttribute,obj.fromValue,camelToAttribute?camelToAttribute:toAttribute,obj.toValue))}else{let fromValue=obj.fromValue?obj.fromValue:component.attribs[fromAttribute];switch(hasFromAttribute.format){case"camel":camelFromAttribute=_toCamelCase(obj.fromAttribute);camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelFromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}if(obj.fromValue){component.attribs[camelToAttribute?camelToAttribute:toAttribute]=""}else{component.attribs[camelToAttribute?camelToAttribute:toAttribute]=component.attribs[fromAttribute]}checkFileUpdate();logs.push(logging.logAttributeMigration(camelFromAttribute?camelFromAttribute:fromAttribute,fromValue,camelToAttribute?camelToAttribute:toAttribute))}if(fromAttribute!==toAttribute){delete component.attribs[fromAttribute]}}else if(hasDepAttribute&&hasFromAttribute&&!toAttribute){delete component.attribs[fromAttribute];switch(hasFromAttribute.format){case"camel":fromAttribute=_toCamelCase(obj.fromAttribute);break;case"colonCamel":fromAttribute=`:${_toCamelCase(obj.fromAttribute)}`;break}checkFileUpdate();logs.push(logging.logAttributeDeprecation(fromAttribute,obj.fromValue))}else if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){if(toNode){toNode.attribs[obj.toAttribute]=obj.toValue}else{component.attribs[obj.toAttribute]=obj.toValue}checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue,toNode?toNode.name:""))}}if(toNode&&hasFromAttribute){switch(hasFromAttribute.format){case"camel":camelToAttribute=_toCamelCase(obj.toAttribute);break;case"colonCamel":camelToAttribute=`:${_toCamelCase(obj.toAttribute)}`;break}checkFileUpdate();_transferAttribute(component,toNode,camelToAttribute?camelToAttribute:toAttribute,component.attribs[camelToAttribute?camelToAttribute:toAttribute],toAttribute);const toValue=toNode.attribs[camelToAttribute?camelToAttribute:toAttribute];logs.push(logging.logAttributeTransfer(component.name,toNode.name,camelToAttribute?camelToAttribute:toAttribute,toValue));if(obj.fromDescendant||obj.fromPeer){component=toNode}}}}return logs}function handleSpecialCase(code,componentName,data){let obj;let regex;if(data[1]){obj=data[1];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString)}obj=data[0];regex=new RegExp(obj.fromString.split(" ").join("\\s*"),"igm");code=code.replace(regex,obj.toString);return code}function _migrateDescendantsHelper(dom,children,componentMetadata,parent,compCount,modelCode,fileMigratedCount,revertMig,logs=[]){let descendants=[];for(let child of children){let newLogs=[];if(child.name===componentMetadata.legacyTag&&!revertMig){let componentCopy=child.cloneNode(true);descendants.push({original:child,copy:componentCopy});if(!hasAttributesToIgnore(dom,child,componentMetadata,parent)&&!hasExpressionAttributes(child,componentMetadata.legacyTag,componentMetadata.importantAttributes)){if(componentMetadata["migrateTagByAttribute"]){newLogs.push(migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true))}else{newLogs.push(migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true))}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"&&key!="migrateOptions"){newLogs=newLogs.concat(self[key](child,componentMetadata[key]))}else if(key==="migrateOptions"){let info=migrateOptions(child,componentMetadata[key],modelCode,fileMigratedCount,componentMetadata.legacyTag);if(!modelCode&&info){logging.logMapperRequest(componentMetadata.legacyTag);revertMig=true}else if(info){if(info.revert){revertMig=true}else{modelCode=info.mCode;newLogs=newLogs.concat(info.newLogs)}}}}if(!compCount.migrated[componentMetadata.legacyTag]){compCount.migrated[componentMetadata.legacyTag]=1}else{compCount.migrated[componentMetadata.legacyTag]+=1}if(revertMig){for(let obj of descendants){DomUtils.replaceElement(obj.original,obj.copy);global.migrationMetrics.components-=1;compCount.migrated[componentMetadata.legacyTag]-=1;if(compCount.migrated[componentMetadata.legacyTag]===0){delete compCount.migrated[componentMetadata.legacyTag]}if(compCount.skipped[componentMetadata.legacyTag]){compCount.skipped[componentMetadata.legacyTag]+=1}else{compCount.skipped[componentMetadata.legacyTag]=1}}}}}else{if(child.name===componentMetadata.legacyTag&&revertMig){if(compCount.skipped[componentMetadata.legacyTag]){compCount.skipped[componentMetadata.legacyTag]+=1}else{compCount.skipped[componentMetadata.legacyTag]=1}}else if(child.children){returnValue=_migrateDescendantsHelper(dom,child.children,componentMetadata,parent,compCount);newLogs=newLogs.concat(returnValue.logs);compCount=returnValue.count;revertMig=returnValue.revert}}if(!revertMig){logs=logs.concat(newLogs)}}return{logs:logs,count:compCount,mCode:modelCode,revert:revertMig}}function migrateDescendants(dom,component,metadata,modelCode,fileComponentsInfo,logs=[]){let compCount={migrated:{},skipped:{}};const data=metadata.migrateDescendants;let returnValue=false;let revertMig;for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");let fileMigratedCount=fileComponentsInfo.migrated[componentMetadata.legacyTag]?fileComponentsInfo.migrated[componentMetadata.legacyTag]:0;if(component.children){returnValue=_migrateDescendantsHelper(dom,component.children,componentMetadata,metadata.legacyTag,compCount,modelCode,fileMigratedCount,revertMig);if(returnValue){logs=logs.concat(returnValue.logs);modelCode=returnValue.mCode;revertMig=returnValue.revert;compCount=returnValue.count}}}return{logs:logs,count:compCount,mCode:modelCode}}function removeNode(component){DomUtils.removeElement(component);return logging.logComponentRemoved(component.name)}function replaceComponent(fromNode,data){for(let obj of data){let descendant=_findDescendant(fromNode,obj.descendant);if(descendant){DomUtils.replaceElement(fromNode,descendant);return logging.logComponentReplacement(fromNode.name,descendant.name)}}}function migrateOptions(component,data,modelCode,compCount,legacyTag){if(modelCode){if(!_findAttribute(component,data.toAttribute)&&(_findDescendant(component,"oj-option")||_findDescendant(component,"template"))){let optionsInfo=[];let tag=legacyTag.slice(3);tag=tag[0].toUpperCase()+tag.slice(1);let varName=`optionsMig${tag}${compCount}`;let template;for(let child of component.children){if(child.name==="oj-option"){for(let ignoreAttr of data.ignoreAttribute){if(child.attribs[ignoreAttr]){logging.logIgnoreComponent(child.name,ignoreAttr,"",legacyTag);return{revert:true}}}child.attribs.label=_getLabelFromDOMNode(child,"");if(child.children){for(let c of child.children){if(c.name==="span"||c.name==="div"){if(c.attribs.slot&&c.attribs.class){child.attribs[c.attribs.slot]={"class":c.attribs.class}}}else if(c.name==="oj-avatar"){if(c.attribs.slot){if(c.attribs.src&&c.attribs.role){child.attribs[c.attribs.slot]={"type":c.attribs.role,"src":c.attribs.src}}else{child.attribs[c.attribs.slot]={"class":c.attribs.class}}}}}}optionsInfo.push(child.attribs);DomUtils.removeElement(child)}else if(child.name==="oj-bind-for-each"){template=child.attribs.data.slice(2,child.attribs.data.length-2);let optionComp=_findDescendant(child,"oj-option");for(let ignoreAttr of data.ignoreAttribute){if(optionComp.attribs[ignoreAttr]){logging.logIgnoreComponent(optionComp.name,ignoreAttr,"",legacyTag);return{revert:true}}}optionComp.attribs.label=_getLabelFromDOMNode(optionComp,"");if(optionComp.children){for(let c of optionComp.children){if(c.name==="span"||c.name==="div"){if(c.attribs.slot&&c.attribs.class){optionComp.attribs[c.attribs.slot]={"class":c.attribs.class}}}else if(c.name==="oj-avatar"){if(c.attribs.slot){if(c.attribs.src&&c.attribs.role){optionComp.attribs[c.attribs.slot]={"type":c.attribs.role,"src":c.attribs.src}}else{optionComp.attribs[c.attribs.slot]={"class":c.attribs.class}}}}}}optionsInfo.push(optionComp.attribs);DomUtils.removeElement(child)}}let varValue=optionsInfo;let info=astUtils.migrateOptionsModel(data,varName,varValue,modelCode,template);if(info){if(info.emptyModel){logging.logIgnoreComponent(legacyTag,"","","","To migrate data driven component, model file provided needs a class where a new variable can be created");return{revert:true}}else{varName=info.varName;let code=info.code;let logs=info.logs;component.attribs[data.toAttribute]=`[[${varName}]]`;return{"mCode":code,"newLogs":logs}}}else{return false}}else{return false}}if(!component.attribs[data.toAttribute]&&(_findDescendant(component,"oj-option")||_findDescendant(component,"template"))){return{"mCode":modelCode,"newLogs":[]}}return false}exports.getDom=getDom;exports.inManifestData=inManifestData;exports.checkFileUpdate=checkFileUpdate;exports.hasAttributesToIgnore=hasAttributesToIgnore;exports.hasExpressionAttributes=hasExpressionAttributes;exports.slotContentToAttribute=slotContentToAttribute;exports.commentSlotContent=commentSlotContent;exports.migrateTag=migrateTag;exports.migrateClassToTag=migrateClassToTag;exports.classNameToAttribute=classNameToAttribute;exports.handleSpecialCase=handleSpecialCase;exports.migrateAttributes=migrateAttributes;exports.migrateTagByAttribute=migrateTagByAttribute;exports.migrateDescendants=migrateDescendants;exports.replaceComponent=replaceComponent;exports.removeNode=removeNode;exports.migrateOptions=migrateOptions;
|