@oracle/oraclejet-audit 16.1.4 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corePackMigrator/cli.js +1 -1
- package/corePackMigrator/corePackMigrator.js +2 -2
- package/corePackMigrator/metadata/actionCardMetadata.json +10 -0
- package/corePackMigrator/metadata/avatarMetadata.json +11 -1
- package/corePackMigrator/metadata/bindIfMetadata.json +4 -0
- package/corePackMigrator/metadata/buttonMetadata.json +65 -49
- package/corePackMigrator/metadata/chartMetadata.json +53 -0
- package/corePackMigrator/metadata/collapsibleMetadata.json +27 -12
- package/corePackMigrator/metadata/conveyorBeltMetadata.json +34 -0
- package/corePackMigrator/metadata/datePickerMetadata.json +43 -0
- package/corePackMigrator/metadata/drawerLayoutMetadata.json +18 -0
- package/corePackMigrator/metadata/drawerPopupMetadata.json +27 -14
- package/corePackMigrator/metadata/filePickerMetadata.json +20 -7
- package/corePackMigrator/metadata/formLayoutMetadata.json +11 -1
- package/corePackMigrator/metadata/highlightTextMetadata.json +10 -0
- package/corePackMigrator/metadata/inputDateMetadata.json +110 -0
- package/corePackMigrator/metadata/inputNumberMetadata.json +107 -75
- package/corePackMigrator/metadata/inputPasswordMetadata.json +111 -75
- package/corePackMigrator/metadata/inputTextMetadata.json +118 -81
- package/corePackMigrator/metadata/labelValueMetadata.json +245 -0
- package/corePackMigrator/metadata/legendItemMetadata.json +11 -1
- package/corePackMigrator/metadata/legendMetadata.json +59 -49
- package/corePackMigrator/metadata/listItemLayoutMetadata.json +11 -1
- package/corePackMigrator/metadata/listviewMetadata.json +104 -63
- package/corePackMigrator/metadata/messageBannerMetadata.json +10 -0
- package/corePackMigrator/metadata/messagesMetadata.json +11 -1
- package/corePackMigrator/metadata/progressBarMetadata.json +11 -1
- package/corePackMigrator/metadata/progressCircleMetadata.json +10 -0
- package/corePackMigrator/metadata/radiosetMetadata.json +11 -1
- package/corePackMigrator/metadata/ratingGaugeMetadata.json +113 -87
- package/corePackMigrator/metadata/selectManyMetadata.json +72 -42
- package/corePackMigrator/metadata/selectSingleMetadata.json +61 -46
- package/corePackMigrator/metadata/selectorMetadata.json +1 -1
- package/corePackMigrator/metadata/statusMeterGaugeMetadata.json +1 -1
- package/corePackMigrator/metadata/tagCloudMetadata.json +10 -0
- package/corePackMigrator/metadata/textAreaMetadata.json +88 -46
- 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 +137 -36
- package/corePackMigrator/resource/testUtils.js +6 -0
- package/corePackMigrator/templates/componentMetaData.json +118 -14
- package/corePackMigrator/templates/migrationConfig.json +4 -0
- package/corePackMigrator/utilities/deltaWebElementAPIs.js +6 -0
- package/corePackMigrator/utilities/logging.js +1 -1
- package/jaf-amd.js +1 -1
- package/lib/AstJson.js +1 -1
- package/lib/Components.js +1 -1
- package/lib/Config.js +1 -1
- package/lib/ConfigEx.js +6 -0
- package/lib/ConfigLib.js +1 -1
- package/lib/MetaLib.js +1 -1
- package/lib/OjCPack.js +1 -1
- package/lib/RegTypes.js +1 -1
- package/lib/RulePack.js +1 -1
- package/lib/RuleSet.js +1 -1
- package/lib/Rules.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/migrator.js +1 -1
- package/lib/ns.js +1 -1
- package/libext/expparser.js +1 -1
- package/meta/16.1.0/jetauditmeta.js +1 -1
- package/meta/17.0.0/jetauditmeta.js +9 -0
- package/meta/metaverlist.json +1 -1
- package/package.json +3 -3
- package/profiles/best-practice.json +97 -78
- package/profiles/redwood-strict.json +22 -14
- package/rulepacks/csp/csp-json-unsafe-expr.js +1 -1
- package/rulepacks/jetwc/jetwc-bootstrap.js +1 -1
- package/rulepacks/jetwc/jetwc-css-scoping.js +1 -1
- package/rulepacks/jetwc/jetwc-displayname.js +1 -1
- package/rulepacks/jetwc/jetwc-jet-version.js +1 -1
- package/rulepacks/jetwc/jetwc-markdown-link.js +1 -1
- package/rulepacks/jetwc/jetwc-namespace.js +1 -1
- package/rulepacks/jetwc/jetwc-nls-languages.js +1 -1
- package/rulepacks/jetwc/jetwc-property-nesting.js +1 -1
- package/rulepacks/jetwc/jetwc-property-translatable.js +1 -1
- package/rulepacks/jetwc/jetwc-require-paths.js +1 -1
- package/rulepacks/jetwc/jetwc-reserved-property.js +1 -1
- package/rulepacks/jetwc/jetwc-schema.js +1 -1
- package/rulepacks/jetwc/jetwc-standard-files.js +1 -1
- package/rulepacks/jetwc/jetwc-vb-category.js +1 -1
- package/rulepacks/jetwc/rules.json +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-auditComponentCacheManager.js +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-commonListenerImpls.js +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +1 -1
- package/rulepacks/jetwc-lib/jetwcutils-tsxUtils.js +1 -1
- package/rulepacks/jetwco/jetwco-bootstrap.js +1 -1
- package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +1 -1
- package/rulepacks/jetwco/jetwco-component-api-changes.js +1 -1
- package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +1 -1
- package/rulepacks/jetwco/jetwco-license-info.js +1 -1
- package/rulepacks/jetwco/jetwco-prerelease-cdn.js +1 -1
- package/rulepacks/jetwco/jetwco-validate-applied-audits.js +1 -1
- package/rulepacks/jetwco/rules.json +1 -1
- package/rules/jet/helpers/cssHelper.js +1 -1
- package/rules/jet/helpers/has-attrib-value.js +6 -0
- package/rules/jet/helpers/tsx/has-prop-value.js +6 -0
- package/rules/jet/msgid.json +1 -1
- package/rules/jet/oj-acc-button-label.js +6 -0
- package/rules/jet/oj-css-style-bp-display.js +1 -1
- package/rules/jet/oj-html-attr-expr-writeback.js +1 -1
- package/rules/jet/oj-html-bindif-test.js +1 -1
- package/rules/jet/oj-html-binding-as-slot-child.js +1 -1
- package/rules/jet/oj-html-bp-button-xs-chroming.js +6 -0
- package/rules/jet/oj-html-bp-title-to-tooltip.js +6 -0
- package/rules/jet/oj-html-button-size-chroming.js +6 -0
- package/rules/jet/oj-html-dlg-title.js +1 -1
- package/rules/jet/oj-html-form-bindif.js +1 -1
- package/rules/jet/oj-html-ko-comment.js +1 -1
- package/rules/jet/oj-html-ko-databind.js +1 -1
- package/rules/jet/oj-html-ojattr-value.js +1 -1
- package/rules/jet/oj-html-ojtag-ns.js +1 -1
- package/rules/jet/oj-html-redwood-clear-icon.js +6 -0
- package/rules/jet/oj-html-slot-default.js +1 -1
- package/rules/jet/oj-html-slot-pref-content.js +1 -1
- package/rules/jet/oj-html-style-abs-units.js +1 -1
- package/rules/jet/oj-html-style-bp-color.js +1 -1
- package/rules/jet/oj-html-style-bp-display.js +1 -1
- package/rules/jet/oj-html-style-bp-font-family.js +1 -1
- package/rules/jet/oj-html-style-bp-font.js +1 -1
- package/rules/jet/oj-html-style-bp-margin-padding.js +6 -0
- package/rules/jet/oj-html-wctag-maintenance.js +1 -1
- package/rules/jet/oj-tsx-acc-button-label.js +6 -0
- package/rules/jet/oj-tsx-bp-button-xs-chroming.js +6 -0
- package/rules/jet/oj-tsx-bp-title-to-tooltip.js +6 -0
- package/rules/jet/oj-tsx-button-size-chroming.js +6 -0
- package/rules/jet/oj-tsx-dlg-title.js +1 -1
- package/rules/jet/oj-tsx-form-bindif.js +1 -1
- package/rules/jet/oj-tsx-ojtag-ns.js +1 -1
- package/rules/jet/oj-tsx-redwood-clear-icon.js +6 -0
- package/rules/jet/oj-tsx-slot-default.js +6 -0
- package/rules/jet/oj-tsx-slot-pref-content.js +1 -1
- package/rules/jet/oj-tsx-style-abs-units.js +6 -0
- package/rules/jet/oj-tsx-style-bp-margin-padding.js +6 -0
- package/rules/jet/oj-tsx-wctag-maintenance.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 +3 -0
|
@@ -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 _checkFileUpdate(){if(!global.fileIsUpdated){global.fileIsUpdated=true;global.migrationMetrics.files+=1;logging.logFilePath(global.filePath);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 there's jsx/tsx code in js/ts`);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){let node;if(!value.expression){node={type:"StringLiteral",value:`${value}`}}else{let 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,line,ast){const importNode={type:"JSXText",value:`import "${value}";\n`};ast.program.body.splice(line,0,importNode)}function _appendImportToRequire(toImport,node,parent){let 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 _findChild(node,childTag){for(let child of node.children){if(child.type==="JSXElement"&&child.openingElement.name.name===childTag){return child}else if(child.children){return _findChild(child,childTag)}}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,label){if(node.type==="JSXElement"){return`{ /* ${_generateSpecCode(node)} */ }`}return`${label.expression?`{ /* ${label.expression} */ }`:`{ /* ${label} */ }`}`}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 _getLabelFromASTDOMNode(astnode,code){let label="";for(let currentNode of astnode.children){if(currentNode.type=="JSXText"){if(/\S/.test(currentNode.value)){label=currentNode.value.trim()}}else if(currentNode.type=="JSXExpressionContainer"){if(currentNode.expression&¤tNode.expression.type!="JSXEmptyExpression"){expression=_getText(code,currentNode.loc);label={expression:expression}}}else if(currentNode.type=="JSXElement"&¤tNode.openingElement.name.name.toUpperCase()=="OJ-BIND-TEXT"){currentNode.openingElement.attributes.forEach(attr=>{if(attr.name.name=="value")label=attr.value.value})}else if(currentNode.children){label=_getLabelFromASTDOMNode(currentNode,code)}}return label}function _getLabelFromLegacyComponent(astnode,slotName,code){for(let child of astnode.children){switch(child.type){case"JSXText":if(/\S/.test(child.value)){return{label:child.value.trim(),cnode:child}}break;case"JSXExpressionContainer":if(child.expression&&child.expression.type!="JSXEmptyExpression"){expression=_getText(code,child.loc);return{label:{expression:expression},cnode:child}}break;case"JSXElement":let slotValue;switch(child.openingElement.name.name.toUpperCase()){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){let label=_getLabelFromASTDOMNode(child,code);return{label:label,cnode:child}}break}break}}}function hasAttributesToIgnore(node,ignoreRuleData){if(node.openingElement){let component=node.openingElement;if(ignoreRuleData){for(let obj of ignoreRuleData){let arr=Object.keys(obj);let key=arr[0];if(!obj.descendant&&component.attributes.length){for(let i=0;i<component.attributes.length;i++){let attribute=component.attributes[i];if(obj.attribute&&obj.attribute===attribute.name.name){if(obj.allowedValues&&!obj.allowedValues.includes(attribute.value.value)||obj.prohibitedValues&&obj.prohibitedValues.includes(attribute.value.value)||!obj.allowedValues&&!obj.prohibitedValues){_checkFileUpdate();logging.logIgnoreComponent(component.name.name,obj.attribute);return true}}if(attribute.name.name===key&&attribute.value.value===obj[key]){_checkFileUpdate();logging.logIgnoreComponent(component.name.name,key,obj[key]);return true}}}if(node.children&&!obj.attribute){for(let j=0;j<node.children.length;j++){let child=node.children[j];if(child.type==="JSXElement"){if(obj.descendant&&child.openingElement.name.name===obj.descendant){_checkFileUpdate();logging.logIgnoreComponent(component.name.name,obj.descendant);return true}if(child.attributes&&hasAttributesToIgnore(child,ignoreRuleData)){_checkFileUpdate();logging.logIgnoreComponent(component.name.name,key,obj[key]);return true}}}}}return false}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(component.name.name,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(component.name.name,exAtt,expression);return true}}}}return false}function commentSlotContent(node,data){node.children.forEach(child=>{if(child.openingElement&&child.openingElement.attributes){child.openingElement.attributes.forEach(attribute=>{if(attribute.name.name=="slot"&&attribute.value.value==data.slot){let value=_commentJSX(child);index=node.children.indexOf(child);node.children[index]=generateAST(_generateSpecCode({type:"JSXText",value:`${value}`}));_checkFileUpdate();logging.logCommentSlotContent(node.openingElement.name.name,data.slot)}})}});return node}function slotContentToAttribute(node,data,code){if(!node.openingElement.attributes.map(att=>att.name.name).includes(data.attribute)){const component=node.openingElement;const legacyButtonLabel=_getLabelFromLegacyComponent(node,data.slotName,code);if(legacyButtonLabel){let{label,cnode}=legacyButtonLabel;if(label){cnode.value=_commentJSX(cnode,label);cnode.type="JSXText";_appendAttribute(data.attribute,label,component);_checkFileUpdate();logging.logSlotContentToAttribute(node.openingElement.name.name,data.attribute,label.expression?label.expression:label)}}return node}}function classNameToAttribute(node,data){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();logging.logClassNameToAttribute(obj.className,obj.attribute,obj.attributeValue)}break}}}return node}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();logging.logTagMigration(legacyComponentName,coreComponentName,isChild);global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===legacyComponentName){node.closingElement.name.name=coreComponentName}return node}function migrateTagByAttribute(node,data,isChild){for(const tagSet of data){if(tagSet.attribute){for(let attribute of node.openingElement.attributes){if(attribute.name.name===tagSet.attribute&&attribute.value.value===tagSet.attributeValue){node.openingElement.name.name=tagSet.toTag;_checkFileUpdate();logging.logTagMigration(tagSet.fromTag,tagSet.toTag);global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return node}}}else{node.openingElement.name.name=tagSet.toTag;_checkFileUpdate();logging.logTagMigration(tagSet.fromTag,tagSet.toTag,isChild);global.migrationMetrics.components+=1;if(node.closingElement&&node.closingElement.name.name===tagSet.fromTag){node.closingElement.name.name=tagSet.toTag}return node}}return node}function migrateImports(ast,importData,code,ruleSetToIgnore,corePackTag){let newImports=[];if(ruleSetToIgnore&&ruleSetToIgnore.length>0){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++){if(!_hasImport(ast.program.body,importData.to[i],newImports)){newImports.push({name:importData.to[i],line:node.loc.start.line});_checkFileUpdate();logging.logImportAppend(importData.from,importData.to[i])}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&node.expression.callee.name=="require"){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){let parent=fromImportLoc.parent?fromImportLoc.parent:false;for(let i=0;i<importData.to.length;i++){if(!_hasImportInRequire(node.expression.arguments,importData.to[i])){_appendImportToRequire(importData.to[i],node,parent);_checkFileUpdate();logging.logImportAppend(importData.from,importData.to[i])}}}}}})}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)){newImports.push({name:importData.to,line:node.loc.start.line});_checkFileUpdate();logging.logImportAppend(importData.from,importData.to)}else if(node.type=="ExpressionStatement"&&node.expression.callee&&node.expression.callee.name=="require"){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc&&!_hasImportInRequire(node.expression.arguments,importData.to)){let parent=fromImportLoc.parent?fromImportLoc.parent:false;_appendImportToRequire(importData.to,node,parent);_checkFileUpdate();logging.logImportAppend(importData.from,importData.to)}}}})}}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){if(!_hasImport(ast.program.body,importData.to[0],newImports)){node.source.value=importData.to[0];_checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0])}for(let i=1;i<importData.to.length;i++){if(!_hasImport(ast.program.body,importData.to[i],newImports)){newImports.push({name:importData.to[i],line:node.loc.start.line});_checkFileUpdate();logging.logImportAppend(importData.from,importData.to[i])}}}else if(node.type=="ExpressionStatement"&&node.expression.callee&&node.expression.callee.name=="require"){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){let parent=fromImportLoc.parent?fromImportLoc.parent:false;if(!_hasImportInRequire(node.expression.arguments,importData.to[0])){fromImportLoc.child.value=importData.to[0];_checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0])}for(let i=1;i<importData.to.length;i++){if(!_hasImportInRequire(node.expression.arguments,importData.to[i])){_appendImportToRequire(importData.to[i],node,parent);_checkFileUpdate();logging.logImportAppend(importData.from,importData.to[i])}}}}}})}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)}else if(node.type=="ExpressionStatement"&&node.expression.callee&&node.expression.callee.name=="require"&&!_hasImportInRequire(node.expression.arguments,importData.to)){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){fromImportLoc.child.value=importData.to;_checkFileUpdate();logging.logImportUpdate(importData.from,importData.to)}}}})}}if(code.includes(corePackTag)&&(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=>{newImports.push({name:toImport,line:0});_checkFileUpdate();logging.logMissingImport(corePackTag,toImport)})}else{newImports.push({name:importData.to,line:0});_checkFileUpdate();logging.logMissingImport(corePackTag,importData.to)}}return newImports}function migrateAttributes(node,data,code){if(data&&data.length>0){for(const attributeSet in data){let fromChildInTag=true;let component=node.openingElement;let attObj=data[attributeSet];if(attObj.fromChild){fromChildInTag=false;if(node.children){let child=_findChild(node,attObj.fromChild);if(node.children&&child){fromChildInTag=true;component=child.openingElement}}}if(fromChildInTag){let hasDepAttribute=true;if(attObj.depAttribute){hasDepAttribute=component.attributes.map(att=>att.name.name).includes(attObj.depAttribute)}const hasToAttribute=component.attributes.map(att=>att.name.name).includes(attObj.toAttribute);component.attributes.forEach(attribute=>{const hasFromAttribute=attObj.fromValue?attribute.name.name===attObj.fromAttribute&&attribute.value.value===attObj.fromValue:attribute.name.name===attObj.fromAttribute;if(hasDepAttribute&&hasFromAttribute&&attObj.toAttribute){if(attObj.toValue){attribute.name.name=attObj.toAttribute;attribute.value.value=attObj.toValue;_checkFileUpdate();logging.logAttributeMigration(attObj.fromAttribute,attObj.fromValue,attObj.toAttribute,attObj.toValue)}else{const attValue=attribute.value.value||{expression:_getText(code,attribute.value.loc)};if(attObj.fromValue){attribute.name.name=attObj.toAttribute;attribute.value.value="";_checkFileUpdate();logging.logAttributeMigration(attObj.fromAttribute,attValue.expression||attValue,attObj.toAttribute,attObj.toValue)}else{attribute.name.name=attObj.toAttribute;attribute.value.value=attValue.expression||attValue;_checkFileUpdate();logging.logAttributeMigration(attObj.fromAttribute,attValue.expression||attValue,attObj.toAttribute,attValue.expression||attValue)}}}else if(hasDepAttribute&&hasFromAttribute&&!attObj.toAttribute){index=component.attributes.indexOf(attribute);component.attributes.splice(index,1);_checkFileUpdate();logging.logAttributeDeprecation(attObj.fromAttribute,attObj.fromValue)}if(attObj.fromChild&&hasFromAttribute){index=component.attributes.indexOf(attribute);_appendAttribute(attribute.name.name,attribute.value.value,node.openingElement);component.attributes.splice(index,1);logging.logAttributeTransfer(component.name.name,node.openingElement.name.name,attribute.name.name,attribute.value.value)}});if(hasDepAttribute&&!attObj.fromAttribute&&attObj.toAttribute&&!hasToAttribute){_appendAttribute(attObj.toAttribute,attObj.toValue,component);_checkFileUpdate();logging.logAttributeAddition(attObj.toAttribute,attObj.toValue)}}}return node}}function migrateChildren(node,data,code,ast,newImports=[]){for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(node.children){for(let child of node.children){if(child.type==="JSXElement"&&child.openingElement.name.name===componentMetadata.legacyTag){if(componentMetadata["migrateTagByAttribute"]){migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true)}else{migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true)}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){if(key==="migrateChildren"){newImports=newImports.concat(self[key](child,componentMetadata[key],code,ast,newImports))}else{self[key](child,componentMetadata[key],code)}}}code=generateCode(ast);if(componentMetadata["migrateImports"]){newImports=newImports.concat(migrateImports(ast,componentMetadata["migrateImports"],code,componentMetadata.ruleSetToIgnore,componentMetadata.corePackTag))}}else{newImports=migrateChildren(child,data,code,ast,newImports)}}}}return newImports}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.migrateChildren=migrateChildren;
|
|
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 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){let node;if(!value.expression){node={type:"StringLiteral",value:`${value}`}}else{let 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){let 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"?`{ /* ${node.value} */ }`:`{ /* ${_generateSpecCode(node)} */ }`}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(astnode,slotName,code,labelVal="",cnodesArr=[]){for(let child of astnode.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){let result=_getLabelFromLegacyComponent(child,slotName,code,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 _hasAttributesToIgnoreHelper(node,rule,key,parent){let keys;if(rule.missAttribute){keys=Object.keys(rule.missAttribute)}if(!rule.descendant&&node.openingElement.attributes.length){for(let i=0;i<node.openingElement.attributes.length;i++){let 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])&&attribute.value.value){return false}}else{if(rule.attribute&&rule.attribute===attribute.name.name){if(rule.allowedValues&&!rule.allowedValues.includes(attribute.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attribute.value.value)||!rule.allowedValues&&!rule.prohibitedValues){checkFileUpdate();let value=rule.allowedValues||rule.prohibitedValues?attribute.value.value:"";logging.logIgnoreComponent(node.openingElement.name.name,rule.attribute,value,parent);return true}}if(attribute.name.name===key&&attribute.value.value===rule[key]){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key],parent);return true}}}if(rule.missAttribute){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&&child.openingElement.name.name===rule.descendant){if(rule.attribute||rule.slotName||rule.missSlot){for(let attr of child.openingElement.attributes){if(rule.attribute&&attr.name.name===rule.attribute){if(rule.allowedValues&&!rule.allowedValues.includes(attr.value.value)||rule.prohibitedValues&&rule.prohibitedValues.includes(attr.value.value)||!rule.prohibitedValues&&!rule.allowedValues){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,rule.attribute,attr.value.value,node.openingElement.name.name);return true}return false}else if(attr.name.name==="slot"){if(rule.slotName&&rule.slotName===attr.value.value){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",attr.value.value,node.openingElement.name.name);return true}else if(rule.missSlot&&attr.value.value===rule.missSlot){return false}}}if(rule.missSlot){checkFileUpdate();logging.logIgnoreComponent(child.openingElement.name.name,"slot",rule.missSlot,node.openingElement.name.name,true);return true}}else{checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,rule.descendant);return true}}if(child.openingElement.attributes&&!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(child,rule,key,parent)){checkFileUpdate();logging.logIgnoreComponent(node.openingElement.name.name,key,rule[key]);return true}}}}}function hasAttributesToIgnore(node,ignoreRuleData,parent=""){if(node.openingElement){if(ignoreRuleData){for(let rule of ignoreRuleData){let arr=Object.keys(rule);let key=arr[0];if(_hasAttributesToIgnoreHelper(node,rule,key,parent)){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(component.name.name,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(component.name.name,exAtt,expression);return true}}}}return false}function commentSlotContent(node,data){node.children.forEach(child=>{if(child.openingElement&&child.openingElement.attributes){child.openingElement.attributes.forEach(attribute=>{if(attribute.name.name=="slot"&&attribute.value.value==data.slot){let 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){_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.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{let descendant=_findDescendant(child,tagName,slotName?slotName:"");if(descendant){return descendant}}}}return false}function slotContentToAttribute(node,data,code){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){let descendant=_findDescendant(node,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){let descendant=_findDescendant(node,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){node=descendant}else{continue}}if(!node.openingElement.attributes.map(att=>att.name.name).includes(obj.attribute)){const component=node.openingElement;const legacyButtonLabel=_getLabelFromLegacyComponent(node,obj.slotName,code);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){for(let attribute of node.openingElement.attributes){if(attribute.name.name===tagSet.attribute&&attribute.value.value===tagSet.attributeValue){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,importData,code,ruleSetToIgnore,corePackTag,newImports=[]){let importIndex;if(ruleSetToIgnore&&ruleSetToIgnore.length>0){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++){if(!_hasImport(ast.program.body,importData.to[i],newImports)){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")){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){let parent=fromImportLoc.parent?fromImportLoc.parent:false;for(let i=0;i<importData.to.length;i++){if(!_hasImportInRequire(node.expression.arguments,importData.to[i])){_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")){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc&&!_hasImportInRequire(node.expression.arguments,importData.to)){let 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){if(!_hasImport(ast.program.body,importData.to[0],newImports)){node.source.value=importData.to[0];checkFileUpdate();logging.logImportUpdate(importData.from,importData.to[0])}for(let i=1;i<importData.to.length;i++){if(!_hasImport(ast.program.body,importData.to[i],newImports)){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")){let fromImportLoc=_hasImportInRequire(node.expression.arguments,importData.from);if(fromImportLoc){let parent=fromImportLoc.parent?fromImportLoc.parent:false;if(!_hasImportInRequire(node.expression.arguments,importData.to[0])){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++){if(!_hasImportInRequire(node.expression.arguments,importData.to[i])){_appendImportToRequire(importData.to[i],node,parent);checkFileUpdate();logging.logImportAppend(importData.to[i],importData.from)}}}}}})}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)){let 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){if(code.includes(tag)&&(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=>{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 if(code.includes(corePackTag)&&(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=>{newImports.push({name:toImport,index:0});checkFileUpdate();logging.logMissingImport(corePackTag,toImport)})}else{newImports.push({name:importData.to,index:0});checkFileUpdate();logging.logMissingImport(corePackTag,importData.to)}}return newImports}function migrateAttributes(node,data,code){let logs=[];for(const attributeSet in data){let toNode;let descInTag=true;let component=node.openingElement;let obj=data[attributeSet];if(obj.fromDescendant){descInTag=false;if(node.children){descendant=_findDescendant(node,obj.fromDescendant,obj.slotName?obj.slotName:"");if(descendant){descInTag=true;component=descendant.openingElement}else{continue}}}if(obj.toDescendant){descInTag=false;if(node.children){descendant=_findDescendant(node,obj.toDescendant,obj.slotName?obj.slotName:"");if(descendant){descInTag=true;toNode=descendant.openingElement}}}if(descInTag){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=component.attributes.map(att=>att.name.name).includes(obj.depAttribute)}const hasToAttribute=component.attributes.map(att=>att.name.name).includes(obj.toAttribute);component.attributes.forEach(attribute=>{const hasFromAttribute=obj.fromValue?attribute.name.name===obj.fromAttribute&&attribute.value.value===obj.fromValue:attribute.name.name===obj.fromAttribute;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,attValue.expression||attValue))}}}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(obj.fromDescendant&&hasFromAttribute){_transferAttribute(component,node.openingElement,attribute.name.name,attribute.value.value);logs.push(logging.logAttributeTransfer(component.name.name,node.openingElement.name.name,attribute.name.name,attribute.value.value))}if(obj.toDescendant&&hasFromAttribute){_transferAttribute(component,toNode,attribute.name.name,attribute.value.value);logs.push(logging.logAttributeTransfer(component.name.name,toNode.name.name,attribute.name.name,attribute.value.value))}});if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){_appendAttribute(obj.toAttribute,obj.toValue,component);checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue))}}}return logs}function _migrateDescendantsHelper(children,componentMetadata,ast,code,newImports,childrenLogs,parent){for(let child of children){if(child.type==="JSXElement"&&child.openingElement.name.name===componentMetadata.legacyTag){if(!hasAttributesToIgnore(child,componentMetadata.ruleSetToIgnore,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);if(newLogs&&newLogs.length>0){childrenLogs=childrenLogs.concat(newLogs)}}}}code=generateCode(ast);if(componentMetadata["migrateImports"]){newImports=migrateImports(ast,componentMetadata["migrateImports"],code,componentMetadata.ruleSetToIgnore,componentMetadata.corePackTag,newImports)}}else{return false}}else{if(child.children){let childInfo=_migrateDescendantsHelper(child.children,componentMetadata,ast,code,newImports,childrenLogs,parent);if(childInfo){newImports=childInfo.imports;childrenLogs=childInfo.logs}else{return false}}}}return{imports:newImports,logs:childrenLogs}}function migrateDescendants(node,metadata,code,ast,newImports=[],childrenLogs=[]){let 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);newImports=returnValue.imports;if(!returnValue){return false}}}return returnValue}function replaceComponent(fromNode,data){let tag=fromNode.openingElement.name.name;for(let obj of data){let 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.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;
|
|
@@ -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 traverse=require("ast-traverse");const render=require("dom-serializer").default;function _inManifestData(tag){for(let obj of global.manifestData){if(obj.componentName===tag){return obj}}return false}function migrateHTML(code){let dom=utils.getDom(code);let components=DomUtils.findAll(elem=>_inManifestData(elem.name),dom.children);for(let component of components){let componentInfo=_inManifestData(component.name);let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let componentName=componentMetadata.legacyTag;if((global.configData.forceMigration.includes(componentName)||!utils.hasAttributesToIgnore(component,componentMetadata.ruleSetToIgnore))&&!utils.hasExpressionAttributes(component,componentMetadata.importantAttributes)){if(componentMetadata
|
|
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 _inManifestData(tag){for(let obj of global.manifestData){if(obj.componentName===tag){return obj}}return false}function migrateHTML(code){let dom=utils.getDom(code);let components=DomUtils.findAll(elem=>_inManifestData(elem.name),dom.children);let migratedComp=0;let iniFileCount=global.migrationMetrics.files;for(let component of components){let componentInfo=_inManifestData(component.name);if(componentInfo){if(componentInfo.dataDriven){utils.checkFileUpdate();logging.logIgnoreDataDriven(component.name)}else{let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let componentName=componentMetadata.legacyTag;let componentCopy=component;let ignoredDescendant=false;let logs=[];if((global.configData.forceMigration.includes(componentName)||!utils.hasAttributesToIgnore(component,componentMetadata.ruleSetToIgnore))&&!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 childrenLogs=utils[key](component,componentMetadata);if(childrenLogs){logs=logs.concat(childrenLogs)}else{ignoredDescendant=true}}else{let newLogs=utils[key](component,componentMetadata[key]);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}}}}if(utils.hasExpressionAttributes(component,componentMetadata.legacyTag,componentMetadata.importantAttributes)||ignoredDescendant){component=componentCopy;global.migrationMetrics.components-=1}else{if(componentMetadata.corePackTag){migratedComp+=1}if(logs.length>1||componentMetadata.corePackTag){for(let log of logs){global.jaf.log.msg(log)}}else{logging.logIgnoreComponent(component.name)}}}}}}if(migratedComp===0&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return render(dom,{decodeEntities:false})}function migrateTSX(code){let ast=astUtils.generateAST(code);let childrenImports=[];let migratedComp=0;let importAdded=false;let iniFileCount=global.migrationMetrics.files;if(!errorInFile){traverse(ast,{pre:function(node){if(node.type==="JSXElement"){let componentInfo=_inManifestData(node.openingElement.name.name);if(componentInfo){let componentName=componentInfo.componentName;if(componentInfo.dataDriven){astUtils.checkFileUpdate();logging.logIgnoreDataDriven(componentName)}else{let componentMetadata=require("../metadata/"+componentInfo.metadata+".json");let copyNode=JSON.parse(JSON.stringify(node));let ignoredDescendant=false;if((global.configData.forceMigration.includes(componentName)||!astUtils.hasAttributesToIgnore(node,componentMetadata.ruleSetToIgnore))&&!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;if(child.logs){logs=logs.concat(child.logs)}}else{ignoredDescendant=true}}else{let newLogs=astUtils[key](node,componentMetadata[key]);if(newLogs&&newLogs.length>0){logs=logs.concat(newLogs)}}}}if(astUtils.hasExpressionAttributes(node.openingElement,componentMetadata.legacyTag,code,componentMetadata.importantAttributes)||ignoredDescendant){node.openingElement=copyNode.openingElement;node.closingElement=copyNode.closingElement;node.children=copyNode.children;global.migrationMetrics.components-=1}else{if(componentMetadata.corePackTag){migratedComp+=1}if(logs.length>1||componentMetadata.corePackTag){for(let log of logs){global.jaf.log.msg(log)}}else{logging.logIgnoreComponent(node.openingElement.name.name)}}}}}}}});if(childrenImports){for(let i of childrenImports){astUtils.appendImport(i.name,i.index,ast)}}code=astUtils.generateCode(ast);for(let obj of global.manifestData){let newImports=[];if(!obj.dataDriven){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateImports){let importData=componentMetadata.migrateImports;newImports=astUtils.migrateImports(ast,importData,code,componentMetadata.ruleSetToIgnore,componentMetadata.corePackTag);if(!newImports||newImports.length>0){importAdded=true}if(newImports){for(let i of newImports){astUtils.appendImport(i.name,i.index,ast)}}}}}if(migratedComp===0&&!importAdded&&global.migrationMetrics.files>0){global.migrationMetrics.files=iniFileCount}return astUtils.generateCode(ast)}}function migrateTest(code){if(!errorInFile){let imports=[];let cancelImport=false;let ast=testUtils.generateAST(code);let importIndex;for(let obj of global.manifestData){let componentMetadata=require("../metadata/"+obj.metadata+".json");if(componentMetadata.migrateTest){let globalInstances=[];let instances=[...globalInstances];traverse(ast,{pre:function(node){if(node.type==="VariableDeclarator"&&node.id.typeAnnotation&&node.id.typeAnnotation.typeAnnotation.typeName&&node.id.typeAnnotation.typeAnnotation.typeName.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.type==="FunctionDeclaration"){let n=node.type==="CallExpression"?node.arguments[1]:node;let body=n.body.body;instances=[...globalInstances];testUtils.hasMethodToIgnore(body,componentMetadata.migrateTest,instances);instances=testUtils.migrateLocator(body,componentMetadata.migrateTest.locator,instances);testUtils.migrateCssLoc(body,componentMetadata);for(let key of global.testMigration){if(componentMetadata[key]){testUtils[key](body,componentMetadata[key],instances,componentMetadata.migrateTest.type.to)}}}else if(node.type==="CallExpression"&&node.callee.name&&node.callee.name==="before"){instances=testUtils.migrateLocator(node.arguments[0].body.body,componentMetadata.migrateTest.locator,instances)}else if(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"){cancelImport=true}}else if(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)}}})}}if(imports.length>0&&!cancelImport){testUtils.appendImports(ast,importIndex,imports)}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){let{excludeFolders,fileTypes,excludeFiles,includeFiles,includeFolders}=global.configData;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=filepath.split("/").pop();if(stat.isDirectory()){if(includeFolders.length&&(includeFolders.includes(filepath)||includeFolders.includes(filename))||!includeFolders.length&&!excludeFolders.includes(filepath)&&!excludeFolders.includes(filename)){scanForFiles(filepath)}}else{if(!excludeFiles.length&&includeFiles.includes(filepath)||!includeFiles.length&&!excludeFiles.includes(filepath)){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;
|
|
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=filepath.split("/").pop();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(include){scanForFiles(filepath,include)}else if(!excludeFolders.length||!excludeFolders.includes(filepath)){scanForFiles(filepath,false)}}}else{if(include&&(!excludeFiles.length&&includeFiles.includes(filepath)||!includeFiles.length&&!excludeFiles.includes(filepath))){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){let label;let cnode;if(node&&node.children&&!!node.children.length){for(let child of node.children){if(child.type&&child.type=="text"){if(/\S/.test(child.data)){label=child.data.trim();cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);break}}else if(child.type&&child.type=="tag"&&child.name.toUpperCase()=="OJ-BIND-TEXT"&&(!slotName&&!child.attribs.slot||slotName&&child.attribs.slot===slotName)){label=child.attribs.value;cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);break}else if(child.children&&!!child.children.length){label=_getLabelFromDOMNode(child,slotName)}}}return label}function _findChild(component,childTag){for(let child of component.children){if(child.name===childTag){return child}else if(child.children){return _findChild(child,childTag)}}return false}function getDom(text=""){return parseDocument(text,{withStartIndices:true,withEndIndices:true})}function hasAttributesToIgnore(component,ignoreRuleData){if(ignoreRuleData){for(let i=0;i<ignoreRuleData.length;i++){obj=ignoreRuleData[i];let arr=Object.keys(obj);let key=arr[0];if(!obj.descendant&&component.attribs){if(obj.attribute&&component.attribs[obj.attribute]){if(obj.allowedValues&&!obj.allowedValues.includes(component.attribs[obj.attribute])||obj.prohibitedValues&&obj.prohibitedValues.includes(attribute.value.value)||!obj.allowedValues&&!obj.prohibitedValues){_checkFileUpdate();logging.logIgnoreComponent(component.name,obj.attribute);return true}}else if(component.attribs[key]&&component.attribs[key]===obj[key]){_checkFileUpdate();logging.logIgnoreComponent(component.name,key,obj[key]);return true}}if(component.children&&!obj.attribute){for(let j=0;j<component.children.length;j++){const child=component.children[j];if(child.type==="tag"){if(obj.descendant&&child.name===obj.descendant){_checkFileUpdate();logging.logIgnoreComponent(component.name,obj.descendant);return true}if(hasAttributesToIgnore(child,ignoreRuleData)){_checkFileUpdate();logging.logIgnoreComponent(component.name,key,obj[key]);return true}}}}}return false}return false}function hasExpressionAttributes(component,importantAttributes){const excludedAttributes=global.configData.excludeAttributeExpressions[component.name];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(component.name,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(component.name,excludedAttributes[i],component.attribs[excludedAttributes[i]]);return true}}}return false}function commentSlotContent(component,data){let slotValue=data.slot;component.children.forEach(child=>{if(child.name&&child.attribs.slot==slotValue){let cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);_checkFileUpdate();logging.logCommentSlotContent(component.name,slotValue,child.name)}})}function slotContentToAttribute(component,data){if(!Object.keys(component.attribs).includes(data.attribute)){component.attribs[data.attribute]=_getLabelFromDOMNode(component,data.slotName);if(!component.attribs[data.attribute]){delete component.attribs[data.attribute]}else{_checkFileUpdate();logging.logSlotContentToAttribute(component.name,data.attribute,component.attribs[data.attribute])}}}function migrateTag(component,legacyComponentName,coreComponentName,isChild){component.name=coreComponentName;_checkFileUpdate();logging.logTagMigration(legacyComponentName,coreComponentName,isChild);global.migrationMetrics.components+=1}function migrateTagByAttribute(component,data,isChild){for(const tagSet in data){tag=data[tagSet];if(tag.attribute){hasAttAndVal=tag.attributeValue===DomUtils.getAttributeValue(component,tag.attribute);if(hasAttAndVal){component.name=tag.toTag;_checkFileUpdate();logging.logTagMigration(tag.fromTag,tag.toTag,isChild);global.migrationMetrics.components+=1;break}}else{component.name=tag.toTag;_checkFileUpdate();logging.logTagMigration(tag.fromTag,tag.toTag);global.migrationMetrics.components+=1}}}function classNameToAttribute(component,data){data.forEach(obj=>{let from=obj.className;let to=obj.attributeValue;let 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();logging.logClassNameToAttribute(from,attribute,to)}}})}function migrateAttributes(component,data){let parent;for(const attributeName in data){let fromChildInTag=true;let obj=data[attributeName];if(obj.fromChild){fromChildInTag=false;child=_findChild(component,obj.fromChild);if(component.children&&child){fromChildInTag=true;parent=component;component=child}}if(fromChildInTag){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=DomUtils.hasAttrib(component,obj.depAttribute)}const hasFromAttribute=obj.fromValue?obj.fromValue===DomUtils.getAttributeValue(component,obj.fromAttribute):DomUtils.hasAttrib(component,obj.fromAttribute);const hasToAttribute=DomUtils.hasAttrib(component,obj.toAttribute);if(hasDepAttribute&&hasFromAttribute&&obj.toAttribute){if(obj.toValue){component.attribs[obj.toAttribute]=obj.toValue;_checkFileUpdate();logging.logAttributeMigration(obj.fromAttribute,obj.fromValue,obj.toAttribute,obj.toValue)}else{let fromValue=obj.fromValue?obj.fromValue:component.attribs[obj.fromAttribute];if(obj.fromValue){component.attribs[obj.toAttribute]=""}else{component.attribs[obj.toAttribute]=component.attribs[obj.fromAttribute]}_checkFileUpdate();logging.logAttributeMigration(obj.fromAttribute,fromValue,obj.toAttribute,component.attribs[obj.toAttribute])}if(obj.fromAttribute!==obj.toAttribute){delete component.attribs[obj.fromAttribute]}}else if(hasDepAttribute&&hasFromAttribute&&!obj.toAttribute){delete component.attribs[obj.fromAttribute];_checkFileUpdate();logging.logAttributeDeprecation(obj.fromAttribute,obj.fromValue)}else if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){component.attribs[obj.toAttribute]=obj.toValue;_checkFileUpdate();logging.logAttributeAddition(obj.toAttribute,obj.toValue)}if(obj.fromChild&&hasFromAttribute&&parent){let value=component.attribs[obj.toAttribute];parent.attribs[obj.toAttribute]=value;delete component.attribs[obj.toAttribute];logging.logAttributeTransfer(component.name,parent.name,obj.toAttribute,value)}}}}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 migrateChildren(component,data){for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(component.children){for(let child of component.children){if(child.name===componentMetadata.legacyTag){if(componentMetadata["migrateTagByAttribute"]){migrateTagByAttribute(child,componentMetadata["migrateTagByAttribute"],true)}else{migrateTag(child,componentMetadata.legacyTag,componentMetadata.corePackTag,true)}for(let key in componentMetadata){if(typeof self[key]=="function"&&key!="migrateTagByAttribute"&&key!="migrateImports"){self[key](child,componentMetadata[key])}}}else{migrateChildren(child,data)}}}}}exports.getDom=getDom;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.migrateChildren=migrateChildren;
|
|
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()}if(node.name==="span"||node.name==="div"){cnodes.push(child)}else{DomUtils.removeElement(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}if(node.name==="span"||node.name==="div"){cnodes.push(child)}else{DomUtils.removeElement(child)}}else if(child.children&&!!child.children.length){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)}}if(cnodes.length>0){for(let node of cnodes){DomUtils.removeElement(node)}if(child.children.length===0){DomUtils.removeElement(child)}}}}}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){let 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){if(fromTag.attribs[attribute]){toTag.attribs[attribute]=value;delete fromTag.attribs[attribute]}}function _hasAttributesToIgnoreHelper(component,rule,key,parent){if(!rule.descendant&&component.attribs){if(rule.missAttribute){for(let key in rule.missAttribute){if(component.attribs[key]&&(rule.missAttribute[key]===""||component.attribs[key]===rule.missAttribute[key])){return false}}checkFileUpdate();logging.logIgnoreComponent(component.name,rule.missAttribute,"",parent,true);return true}if(rule.attribute&&component.attribs[rule.attribute]){if(rule.allowedValues&&!rule.allowedValues.includes(component.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(component.attribs[rule.attribute])||!rule.allowedValues&&!rule.prohibitedValues){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]){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&&child.name===rule.descendant){if(rule.attribute){if(child.attribs[rule.attribute]){if(rule.allowedValues&&!rule.allowedValues.includes(child.attribs[rule.attribute])||rule.prohibitedValues&&rule.prohibitedValues.includes(child.attribs[rule.attribute])||!rule.prohibitedValues&&!rule.allowedValues){checkFileUpdate();logging.logIgnoreComponent(child.name,rule.attribute,child.attribs[rule.attribute],component.name);return true}return false}else{return false}}else if(rule.slotName&&child.attribs["slot"]&&child.attribs["slot"]===rule.slotName){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",child.attribs[rule.attribute],component.name);return true}else if(rule.missSlot){if(!child.attribs["slot"]||child.attribs["slot"]!==rule.missSlot){checkFileUpdate();logging.logIgnoreComponent(child.name,"slot",rule.missSlot,child.name,true);return true}else if(child.attribs["slot"]&&child.attribs["slot"]===rule.missSlot){return false}}checkFileUpdate();logging.logIgnoreComponent(component.name,rule.descendant);return true}if(!rule.attribute&&!rule.missAttribute&&_hasAttributesToIgnoreHelper(child,rule,key,parent)){checkFileUpdate();logging.logIgnoreComponent(component.name,key,rule[key]);return true}}}}}function hasAttributesToIgnore(component,ignoreRuleData,parent=""){if(ignoreRuleData){for(let i=0;i<ignoreRuleData.length;i++){rule=ignoreRuleData[i];let arr=Object.keys(rule);let key=arr[0];if(_hasAttributesToIgnoreHelper(component,rule,key,parent)){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){let slotValue=data.slot;component.children.forEach(child=>{if(child.name&&child.attribs.slot==slotValue){let cnode=getDom("<!-- "+render(child,{decodeEntities:false})+" -->");DomUtils.replaceElement(child,cnode);checkFileUpdate();return[logging.logCommentSlotContent(component.name,slotValue,child.name)]}})}function slotContentToAttribute(component,data){let logs=[];for(let obj of data){let toNode;if(obj.toDescendant){let descendant=_findDescendant(component,obj.toDescendant,obj.slotNameTo?obj.slotNameTo:"");if(descendant){toNode=descendant}else{continue}}if(obj.fromDescendant){let descendant=_findDescendant(component,obj.fromDescendant,obj.slotNameFrom?obj.slotNameFrom:"");if(descendant){component=descendant}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 in data){tag=data[tagSet];if(tag.attribute){hasAttAndVal=tag.attributeValue===DomUtils.getAttributeValue(component,tag.attribute);if(hasAttAndVal){component.name=tag.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tag.fromTag,tag.toTag,isChild)}}else{component.name=tag.toTag;checkFileUpdate();global.migrationMetrics.components+=1;return logging.logTagMigration(tag.fromTag,tag.toTag)}}}function classNameToAttribute(component,data){let logs=[];data.forEach(obj=>{let from=obj.className;let to=obj.attributeValue;let 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){let parent;let logs=[];for(const attributeSet in data){let descInTag=true;let obj=data[attributeSet];if(obj.fromDescendant){descInTag=false;descendant=_findDescendant(component,obj.fromDescendant);if(component.children&&descendant){descInTag=true;parent=component;component=descendant}else{continue}}if(obj.toDescendant){descInTag=false;if(component.children){descendant=_findDescendant(component,obj.toDescendant,obj.slotName?obj.slotName:"");if(descendant){descInTag=true;toNode=descendant}}}if(descInTag){let hasDepAttribute=true;if(obj.depAttribute){hasDepAttribute=DomUtils.hasAttrib(component,obj.depAttribute)}const hasFromAttribute=obj.fromValue?obj.fromValue===DomUtils.getAttributeValue(component,obj.fromAttribute):DomUtils.hasAttrib(component,obj.fromAttribute);const hasToAttribute=DomUtils.hasAttrib(component,obj.toAttribute);if(hasDepAttribute&&hasFromAttribute&&obj.toAttribute&&(!hasToAttribute||obj.fromAttribute===obj.toAttribute)){if(obj.toValue){component.attribs[obj.toAttribute]=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,obj.fromValue,obj.toAttribute,obj.toValue))}else{let fromValue=obj.fromValue?obj.fromValue:component.attribs[obj.fromAttribute];if(obj.fromValue){component.attribs[obj.toAttribute]=""}else{component.attribs[obj.toAttribute]=component.attribs[obj.fromAttribute]}checkFileUpdate();logs.push(logging.logAttributeMigration(obj.fromAttribute,fromValue,obj.toAttribute,component.attribs[obj.toAttribute]))}if(obj.fromAttribute!==obj.toAttribute){delete component.attribs[obj.fromAttribute]}}else if(hasDepAttribute&&hasFromAttribute&&!obj.toAttribute){delete component.attribs[obj.fromAttribute];checkFileUpdate();logs.push(logging.logAttributeDeprecation(obj.fromAttribute,obj.fromValue))}else if(hasDepAttribute&&!obj.fromAttribute&&obj.toAttribute&&!hasToAttribute){component.attribs[obj.toAttribute]=obj.toValue;checkFileUpdate();logs.push(logging.logAttributeAddition(obj.toAttribute,obj.toValue))}if(obj.fromDescendant&&hasFromAttribute&&parent){_transferAttribute(component,parent,obj.toAttribute,component.attribs[obj.toAttribute]);logs.push(logging.logAttributeTransfer(component.name,parent.name,obj.toAttribute,component.attribs[obj.toAttribute]))}if(obj.toDescendant&&hasFromAttribute){_transferAttribute(component,toNode,obj.toAttribute,component.attribs[obj.toAttribute]);logs.push(logging.logAttributeTransfer(component.name,toNode.name,obj.toAttribute,toNode.attribs[obj.toAttribute]))}}}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(children,componentMetadata,logs,parent){for(let child of children){if(child.name===componentMetadata.legacyTag){if(!hasAttributesToIgnore(child,componentMetadata.ruleSetToIgnore,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]))}}}else{return false}}else{if(child.children){logs=_migrateDescendantsHelper(child.children,componentMetadata,logs,parent);if(!logs){return false}}}}return logs}function migrateDescendants(component,metadata,logs=[]){let data=metadata.migrateDescendants;let returnValue=false;for(let metaName of data){let componentMetadata=require("../metadata/"+metaName+".json");if(component.children){returnValue=_migrateDescendantsHelper(component.children,componentMetadata,logs,metadata.legacyTag);if(!returnValue){return false}}}return returnValue}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;
|
|
@@ -1,117 +1,218 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
+
"JetVersion": "16.0.0",
|
|
3
4
|
"componentName": "oj-action-card",
|
|
4
5
|
"metadata": "actionCardMetadata",
|
|
5
6
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojActionCard.html#migration-section"
|
|
6
7
|
},
|
|
7
8
|
{
|
|
9
|
+
"JetVersion": "16.0.0",
|
|
10
|
+
"componentName": "oj-avatar",
|
|
11
|
+
"metadata": "avatarMetadata",
|
|
12
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojAvatar.html#migration-section"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"JetVersion": "16.0.0",
|
|
8
16
|
"componentName": "oj-button",
|
|
9
17
|
"metadata": "buttonMetadata",
|
|
10
18
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojButton.html#migration-section"
|
|
11
19
|
},
|
|
12
20
|
{
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.
|
|
21
|
+
"JetVersion": "17.0.0",
|
|
22
|
+
"componentName": "oj-buttonset-many",
|
|
23
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojButtonsetMany.html#migration-section",
|
|
24
|
+
"dataDriven": "true"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"JetVersion": "17.0.0",
|
|
28
|
+
"componentName": "oj-buttonset-one",
|
|
29
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojButtonsetOne.html#migration-section",
|
|
30
|
+
"dataDriven": "true"
|
|
16
31
|
},
|
|
17
32
|
{
|
|
33
|
+
"JetVersion": "16.0.0",
|
|
34
|
+
"componentName": "oj-chart",
|
|
35
|
+
"metadata": "chartMetadata",
|
|
36
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojChart.html#migration-section"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"JetVersion": "16.0.0",
|
|
40
|
+
"componentName": "oj-checkboxset",
|
|
41
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojCheckboxset.html#migration-section",
|
|
42
|
+
"dataDriven": "true"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"JetVersion": "16.0.0",
|
|
18
46
|
"componentName": "oj-collapsible",
|
|
19
47
|
"metadata": "collapsibleMetadata",
|
|
20
48
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojCollapsible.html#migration-section"
|
|
21
49
|
},
|
|
22
50
|
{
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
51
|
+
"JetVersion": "17.0.0",
|
|
52
|
+
"componentName": "oj-conveyor-belt",
|
|
53
|
+
"metadata": "conveyorBeltMetadata",
|
|
54
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojConveyorBelt.html#migration-section"
|
|
26
55
|
},
|
|
27
56
|
{
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
57
|
+
"JetVersion": "17.0.0",
|
|
58
|
+
"componentName": "oj-date-picker",
|
|
59
|
+
"metadata": "datePickerMetadata",
|
|
60
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojDatePicker.html#migration-section"
|
|
31
61
|
},
|
|
32
62
|
{
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
63
|
+
"JetVersion": "17.0.0",
|
|
64
|
+
"componentName": "oj-drawer-layout",
|
|
65
|
+
"metadata": "drawerLayoutMetadata",
|
|
66
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojDrawerLayout.html#migration-section"
|
|
36
67
|
},
|
|
37
68
|
{
|
|
69
|
+
"JetVersion": "16.0.0",
|
|
70
|
+
"componentName": "oj-drawer-popup",
|
|
71
|
+
"metadata": "drawerPopupMetadata",
|
|
72
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojDrawerPopup.html#migration-section"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"JetVersion": "16.0.0",
|
|
38
76
|
"componentName": "oj-file-picker",
|
|
39
77
|
"metadata": "filePickerMetadata",
|
|
40
78
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojFilePicker.html#migration-section"
|
|
41
79
|
},
|
|
42
80
|
{
|
|
81
|
+
"JetVersion": "16.0.0",
|
|
43
82
|
"componentName": "oj-highlight-text",
|
|
44
83
|
"metadata": "highlightTextMetadata",
|
|
45
84
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojHighlightText.html#migration-section"
|
|
46
85
|
},
|
|
47
86
|
{
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
{
|
|
53
|
-
"componentName": "oj-progress-circle",
|
|
54
|
-
"metadata": "progressCircleMetadata",
|
|
55
|
-
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojProgressCircle.html#migration-section"
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"componentName": "oj-progress-bar",
|
|
59
|
-
"metadata": "progressBarMetadata",
|
|
60
|
-
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojProgressBar.html#migration-section"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"componentName": "oj-rating-gauge",
|
|
64
|
-
"metadata": "ratingGaugeMetadata",
|
|
65
|
-
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojRatingGauge.html#migration-section"
|
|
87
|
+
"JetVersion": "5.1.0",
|
|
88
|
+
"componentName": "oj-label-value",
|
|
89
|
+
"metadata": "labelValueMetadata",
|
|
90
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojLabelValue.html"
|
|
66
91
|
},
|
|
67
92
|
{
|
|
93
|
+
"JetVersion": "16.0.0",
|
|
68
94
|
"componentName": "oj-input-number",
|
|
69
95
|
"metadata": "inputNumberMetadata",
|
|
70
96
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojInputNumber.html#migration-section"
|
|
71
97
|
},
|
|
72
98
|
{
|
|
99
|
+
"JetVersion": "16.0.0",
|
|
73
100
|
"componentName": "oj-input-password",
|
|
74
101
|
"metadata": "inputPasswordMetadata",
|
|
75
102
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojInputPassword.html#migration-section"
|
|
76
103
|
},
|
|
77
104
|
{
|
|
105
|
+
"JetVersion": "16.0.0",
|
|
78
106
|
"componentName": "oj-input-text",
|
|
79
107
|
"metadata": "inputTextMetadata",
|
|
80
108
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojInputText.html#migration-section"
|
|
81
109
|
},
|
|
82
110
|
{
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
111
|
+
"JetVersion": "17.0.0",
|
|
112
|
+
"componentName": "oj-input-date",
|
|
113
|
+
"metadata": "inputDateMetadata",
|
|
114
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojInputDate.html#migration-section"
|
|
86
115
|
},
|
|
87
116
|
{
|
|
117
|
+
"JetVersion": "16.0.0",
|
|
118
|
+
"componentName": "oj-legend",
|
|
119
|
+
"metadata": "legendMetadata",
|
|
120
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojLegend.html#migration-section"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"JetVersion": "16.0.0",
|
|
124
|
+
"componentName": "oj-list-item-layout",
|
|
125
|
+
"metadata": "listItemLayoutMetadata",
|
|
126
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojListItemLayout.html#migration-section"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"JetVersion": "16.0.0",
|
|
88
130
|
"componentName": "oj-list-view",
|
|
89
131
|
"metadata": "listViewMetadata",
|
|
90
132
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojListView.html#migration-section"
|
|
91
133
|
},
|
|
92
134
|
{
|
|
135
|
+
"JetVersion": "16.0.0",
|
|
136
|
+
"componentName": "oj-menu-button",
|
|
137
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojMenuButton.html#migration-section",
|
|
138
|
+
"dataDriven": "true"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"JetVersion": "16.0.0",
|
|
142
|
+
"componentName": "oj-menu-select-many",
|
|
143
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojMenuSelectMany.html#migration-section",
|
|
144
|
+
"dataDriven": "true"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"JetVersion": "16.0.0",
|
|
148
|
+
"componentName": "oj-messages",
|
|
149
|
+
"metadata": "messagesMetadata",
|
|
150
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojMessages.html#migration-section"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"JetVersion": "16.0.0",
|
|
154
|
+
"componentName": "oj-message-banner",
|
|
155
|
+
"metadata": "messageBannerMetadata",
|
|
156
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojMessageBanner.html#migration-section"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"JetVersion": "16.0.0",
|
|
160
|
+
"componentName": "oj-progress-circle",
|
|
161
|
+
"metadata": "progressCircleMetadata",
|
|
162
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojProgressCircle.html#migration-section"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"JetVersion": "16.0.0",
|
|
166
|
+
"componentName": "oj-progress-bar",
|
|
167
|
+
"metadata": "progressBarMetadata",
|
|
168
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojProgressBar.html#migration-section"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"JetVersion": "16.0.0",
|
|
172
|
+
"componentName": "oj-rating-gauge",
|
|
173
|
+
"metadata": "ratingGaugeMetadata",
|
|
174
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojRatingGauge.html#migration-section"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"JetVersion": "16.0.0",
|
|
178
|
+
"componentName": "oj-radioset",
|
|
179
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojRadioset.html#migration-section",
|
|
180
|
+
"dataDriven": "true"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"JetVersion": "16.0.0",
|
|
93
184
|
"componentName": "oj-select-single",
|
|
94
185
|
"metadata": "selectSingleMetadata",
|
|
95
186
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojSelectSingle.html#migration-section"
|
|
96
187
|
},
|
|
97
188
|
{
|
|
189
|
+
"JetVersion": "16.0.0",
|
|
98
190
|
"componentName": "oj-select-many",
|
|
99
191
|
"metadata": "selectManyMetadata",
|
|
100
192
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojSelectMany.html#migration-section"
|
|
101
193
|
},
|
|
102
194
|
{
|
|
195
|
+
"JetVersion": "16.0.0",
|
|
103
196
|
"componentName": "oj-selector",
|
|
104
197
|
"metadata": "selectorMetadata",
|
|
105
198
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojSelector.html#migration-section"
|
|
106
199
|
},
|
|
107
200
|
{
|
|
201
|
+
"JetVersion": "16.0.0",
|
|
108
202
|
"componentName": "oj-status-meter-gauge",
|
|
109
203
|
"metadata": "statusMeterGaugeMetadata",
|
|
110
204
|
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojStatusMeterGauge.html#migration-section"
|
|
111
205
|
},
|
|
112
206
|
{
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.
|
|
207
|
+
"JetVersion": "17.0.0",
|
|
208
|
+
"componentName": "oj-tab-bar",
|
|
209
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojTabBar.html#migration-section",
|
|
210
|
+
"dataDriven": "true"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"JetVersion": "16.0.0",
|
|
214
|
+
"componentName": "oj-text-area",
|
|
215
|
+
"metadata": "textAreaMetadata",
|
|
216
|
+
"migrationApiLink": "https://jet.oraclecorp.com/trunk/jsdocs/oj.ojTextArea.html#migration-section"
|
|
116
217
|
}
|
|
117
218
|
]
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2024, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const traverse=require("ast-traverse");const logging=require("../utilities/logging");const generate=require("@babel/generator").default;const{parse}=require("@babel/parser");const astUtils=require("./astUtils");function generateAST(code){return parse(code,{sourceType:"unambiguous",plugins:global.plugins})}function generateCode(ast){return generate(ast,{retainLines:false}).code}function appendImports(ast,index,imports){let importMsg="import { ";for(let i in imports){if(i==0){importMsg+=imports[i]}else{importMsg+=", ";importMsg+=imports[i]}}importMsg+=" } from '@oracle/oraclejet-core-pack/webdriver';";let importNode={type:"JSXText",value:importMsg};ast.program.body.splice(index,0,importNode);astUtils._checkFileUpdate();logging.logImportAppend(importMsg)}function hasMethodToIgnore(nodes,data,instances){if(data.ruleSetToIgnore){let result=false;let ruleSetToIgnore=data.ruleSetToIgnore;let type=data.type;let locator=data.locator;for(let method of ruleSetToIgnore){for(let n of nodes){if(n.type==="VariableDeclaration"){for(let d of n.declarations){if(d.init&&d.init.argument&&d.init.argument.callee.name===locator.from){instances.push(d.id.name)}}}traverse(n,{pre:function(node){if(node.type==="MemberExpression"&&node.property.name===method){result=true;logging.logMethodDeprecation(method,type.to)}}})}}return result}}function classNameToAttribute(nodes,data,instances){let classInstances=[];for(let obj of data){for(let n of nodes){traverse(n,{pre:function(node){if(node.type==="CallExpression"){if(node.callee.object&&instances.includes(node.callee.object.name)&&node.callee.property.name==="getAttribute"&&node.arguments[0].value==="class"){if(n.type==="VariableDeclaration"){let addInstance=true;for(let instance of classInstances){if(instance.name===n.declarations[0].id.name){instance.parentIndex=nodes.indexOf(n);addInstance=false}}if(addInstance){classInstances.push({name:n.declarations[0].id.name,parentIndex:nodes.indexOf(n)})}}else if(n.type==="ExpressionStatement"&&n.expression.type==="AssignmentExpression"){for(let i in classInstances){if(classInstances[i].name===n.expression.left.name){classInstances[i].parentIndex=nodes.indexOf(n)}}}else if(n.type==="ExpressionStatement"&&n.expression.callee){if(n.expression.callee.object.object.callee.name==="expect"&&n.expression.arguments[0].type==="StringLiteral"&&n.expression.arguments[0].value===obj.className){node.arguments[0].value=obj.attribute;n.expression.arguments[0].value=obj.attributeValue;logging.logTestAttributeMigration("class",obj.attribute,obj.className,obj.attributeValue);astUtils._checkFileUpdate()}}}else if(classInstances.length>0&&node.callee.name==="expect"&&n.expression.arguments[0].type==="StringLiteral"&&n.expression.arguments[0].value===obj.className){for(let instance of classInstances){if(node.arguments[0].name===instance.name){if(nodes[instance.parentIndex].type==="VariableDeclaration"){nodes[instance.parentIndex].declarations[0].init.argument.arguments[0].value=obj.attribute}else{nodes[instance.parentIndex].expression.right.argument.arguments[0].value=obj.attribute}n.expression.arguments[0].value=obj.attributeValue;logging.logTestAttributeMigration("class",obj.attribute,obj.className,obj.attributeValue);astUtils._checkFileUpdate();break}}}}}})}}}function migrateAttributes(nodes,data,instances,webElement){for(let obj of data){let attInstances=[];for(let n of nodes){traverse(n,{pre:function(node){if(node.type==="CallExpression"){if(node.callee.object&&instances.includes(node.callee.object.name)&&node.callee.property.name==="getAttribute"&&node.arguments[0].value===obj.fromAttribute){if(n.type==="VariableDeclaration"){if(!obj.toAttribute){logging.logTestAttributeDeprecation(obj.fromAttribute,obj.fromValue,webElement)}else{if(!obj.fromValue){node.arguments[0].value=obj.toAttribute;astUtils._checkFileUpdate();logging.logTestAttributeMigration(obj.fromAttribute,obj.toAttribute,obj.fromValue,obj.toValue)}else{let addInstance=true;for(let i in attInstances){if(attInstances[i].name===n.declarations[0].id.name){attInstances[i].parentIndex=nodes.indexOf(n);addInstance=false}}if(addInstance){attInstances.push({name:n.declarations[0].id.name,parentIndex:nodes.indexOf(n)})}}}}else if(n.type==="ExpressionStatement"&&n.expression.type==="AssignmentExpression"){if(!obj.toAttribute){logging.logTestAttributeDeprecation(obj.fromAttribute,obj.fromValue,webElement)}else{if(!obj.toValue){n.expression.right.argument.arguments[0].value=obj.toAttribute;astUtils._checkFileUpdate();logging.logTestAttributeMigration(obj.fromAttribute,obj.toAttribute,obj.fromValue,obj.toValue)}else{for(let i in attInstances){if(attInstances[i].name===n.expression.left.name){attInstances[i].parentIndex=nodes.indexOf(n)}}}}}else if(n.type==="ExpressionStatement"&&n.expression.callee&&n.expression.callee.object.object.callee.name==="expect"){if(!obj.toAttribute){astUtils._checkFileUpdate();logging.logTestAttributeDeprecation(obj.fromAttribute,obj.fromValue,webElement)}else if(obj.fromValue&&n.expression.arguments[0].value===obj.fromValue||!obj.fromValue){node.arguments[0].value=obj.toAttribute;if(obj.fromValue){n.expression.arguments[0].value=obj.toValue?obj.toValue:n.expression.arguments[0].value}astUtils._checkFileUpdate();logging.logTestAttributeMigration(obj.fromAttribute,obj.toAttribute,obj.fromValue,obj.toValue)}}}else if(attInstances.length>0&&node.callee.name==="expect"){for(let instance of attInstances){if(node.arguments[0].name===instance.name){if(obj.fromValue&&n.expression.arguments[0].value===obj.fromValue){n.expression.arguments[0].value=obj.toValue;if(obj.fromAttribute!=obj.toAttribute){nodes[instance.parentIndex].declarations[0].init.argument.arguments[0].value=obj.toAttribute}astUtils._checkFileUpdate();logging.logTestAttributeMigration(obj.fromAttribute,obj.toAttribute,obj.fromValue,obj.toValue)}}}}}}})}}}function migrateLocator(nodes,data,instances){for(let node of nodes){if(node.type==="VariableDeclaration"){for(let d of node.declarations){if(d.init&&d.init.argument&&d.init.argument.callee.name===data.from){instances.push(d.id.name);d.init.argument.callee.name=data.to;let variable=d.id.name;astUtils._checkFileUpdate();logging.logLocatorMigration(data.from,data.to,variable)}}}else if(node.type==="ExpressionStatement"&&node.expression.type==="AssignmentExpression"&&node.expression.right.argument){if(node.expression.right.argument.callee.name===data.from){node.expression.right.argument.callee.name=data.to}}}return instances}function migrateCssLoc(nodes,componentMetadata){for(let n of nodes){traverse(n,{pre:function(node){if(node.type==="CallExpression"&&node.callee.object&&node.callee.object.name==="By"&&(node.callee.property.name==="css"||node.callee.property.name==="tagName")){for(let arg of node.arguments){let newVal=searchAndReplace(arg.value,componentMetadata.legacyTag,componentMetadata.corePackTag);if(newVal){arg.value=newVal;astUtils._checkFileUpdate();logging.logCssLocMigration(componentMetadata.legacyTag,componentMetadata.corePackTag)}}}}})}}function migrateType(node,data,globalInstances){globalInstances.push(node.id.name);node.id.typeAnnotation.typeAnnotation.typeName.name=data.to;astUtils._checkFileUpdate();logging.logTypeMigration(data.from,data.to);return globalInstances}function migrateImports(node,data,imports){for(let spec of node.specifiers){if(spec.imported.name===data.locator.from){imports.push(data.locator.to)}else if(spec.imported.name===data.type.from){imports.push(data.type.to)}}return imports}function searchAndReplace(code,from,to){from=from.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");regex=new RegExp("\\b"+from+"\\b(?![\\w-])","g");if(regex.test(code)){return code.replace(regex,to)}else{return false}}exports.generateAST=generateAST;exports.generateCode=generateCode;exports.migrateType=migrateType;exports.migrateLocator=migrateLocator;exports.migrateCssLoc=migrateCssLoc;exports.migrateImports=migrateImports;exports.appendImports=appendImports;exports.migrateAttributes=migrateAttributes;exports.hasMethodToIgnore=hasMethodToIgnore;exports.classNameToAttribute=classNameToAttribute;
|