@oracle/oraclejet-audit 16.1.6 → 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/corePackMigrator/cli.js +1 -1
  2. package/corePackMigrator/corePackMigrator.js +2 -2
  3. package/corePackMigrator/metadata/actionCardMetadata.json +10 -0
  4. package/corePackMigrator/metadata/avatarMetadata.json +11 -1
  5. package/corePackMigrator/metadata/bindIfMetadata.json +4 -0
  6. package/corePackMigrator/metadata/buttonMetadata.json +65 -49
  7. package/corePackMigrator/metadata/chartMetadata.json +53 -0
  8. package/corePackMigrator/metadata/collapsibleMetadata.json +27 -12
  9. package/corePackMigrator/metadata/conveyorBeltMetadata.json +34 -0
  10. package/corePackMigrator/metadata/datePickerMetadata.json +43 -0
  11. package/corePackMigrator/metadata/drawerLayoutMetadata.json +18 -0
  12. package/corePackMigrator/metadata/drawerPopupMetadata.json +27 -14
  13. package/corePackMigrator/metadata/filePickerMetadata.json +20 -7
  14. package/corePackMigrator/metadata/formLayoutMetadata.json +11 -1
  15. package/corePackMigrator/metadata/highlightTextMetadata.json +10 -0
  16. package/corePackMigrator/metadata/inputDateMetadata.json +110 -0
  17. package/corePackMigrator/metadata/inputNumberMetadata.json +107 -75
  18. package/corePackMigrator/metadata/inputPasswordMetadata.json +111 -75
  19. package/corePackMigrator/metadata/inputTextMetadata.json +118 -81
  20. package/corePackMigrator/metadata/labelValueMetadata.json +245 -0
  21. package/corePackMigrator/metadata/legendItemMetadata.json +11 -1
  22. package/corePackMigrator/metadata/legendMetadata.json +59 -49
  23. package/corePackMigrator/metadata/listItemLayoutMetadata.json +11 -1
  24. package/corePackMigrator/metadata/listviewMetadata.json +104 -63
  25. package/corePackMigrator/metadata/messageBannerMetadata.json +10 -0
  26. package/corePackMigrator/metadata/messagesMetadata.json +11 -1
  27. package/corePackMigrator/metadata/progressBarMetadata.json +11 -1
  28. package/corePackMigrator/metadata/progressCircleMetadata.json +10 -0
  29. package/corePackMigrator/metadata/radiosetMetadata.json +11 -1
  30. package/corePackMigrator/metadata/ratingGaugeMetadata.json +113 -87
  31. package/corePackMigrator/metadata/selectManyMetadata.json +72 -42
  32. package/corePackMigrator/metadata/selectSingleMetadata.json +61 -46
  33. package/corePackMigrator/metadata/selectorMetadata.json +1 -1
  34. package/corePackMigrator/metadata/statusMeterGaugeMetadata.json +1 -1
  35. package/corePackMigrator/metadata/tagCloudMetadata.json +10 -0
  36. package/corePackMigrator/metadata/textAreaMetadata.json +88 -46
  37. package/corePackMigrator/resource/astUtils.js +1 -1
  38. package/corePackMigrator/resource/componentMigrator.js +1 -1
  39. package/corePackMigrator/resource/fileScanner.js +1 -1
  40. package/corePackMigrator/resource/htmlUtils.js +1 -1
  41. package/corePackMigrator/resource/manifest.json +137 -36
  42. package/corePackMigrator/resource/testUtils.js +6 -0
  43. package/corePackMigrator/templates/componentMetaData.json +118 -14
  44. package/corePackMigrator/templates/migrationConfig.json +4 -0
  45. package/corePackMigrator/utilities/deltaWebElementAPIs.js +6 -0
  46. package/corePackMigrator/utilities/logging.js +1 -1
  47. package/jaf-amd.js +1 -1
  48. package/lib/AstJson.js +1 -1
  49. package/lib/Components.js +1 -1
  50. package/lib/Config.js +1 -1
  51. package/lib/ConfigEx.js +6 -0
  52. package/lib/ConfigLib.js +1 -1
  53. package/lib/MetaLib.js +1 -1
  54. package/lib/OjCPack.js +1 -1
  55. package/lib/RegTypes.js +1 -1
  56. package/lib/RulePack.js +1 -1
  57. package/lib/RuleSet.js +1 -1
  58. package/lib/Rules.js +1 -1
  59. package/lib/TsxUtils.js +1 -1
  60. package/lib/checkage.js +1 -1
  61. package/lib/defaults.js +1 -1
  62. package/lib/extends.js +1 -1
  63. package/lib/migrator.js +1 -1
  64. package/lib/ns.js +1 -1
  65. package/libext/expparser.js +1 -1
  66. package/meta/16.1.0/jetauditmeta.js +1 -1
  67. package/meta/17.0.0/jetauditmeta.js +9 -0
  68. package/meta/metaverlist.json +1 -1
  69. package/package.json +3 -3
  70. package/profiles/best-practice.json +97 -78
  71. package/profiles/redwood-strict.json +22 -14
  72. package/rulepacks/csp/csp-json-unsafe-expr.js +1 -1
  73. package/rulepacks/jetwc/jetwc-bootstrap.js +1 -1
  74. package/rulepacks/jetwc/jetwc-css-scoping.js +1 -1
  75. package/rulepacks/jetwc/jetwc-displayname.js +1 -1
  76. package/rulepacks/jetwc/jetwc-jet-version.js +1 -1
  77. package/rulepacks/jetwc/jetwc-markdown-link.js +1 -1
  78. package/rulepacks/jetwc/jetwc-namespace.js +1 -1
  79. package/rulepacks/jetwc/jetwc-nls-languages.js +1 -1
  80. package/rulepacks/jetwc/jetwc-property-nesting.js +1 -1
  81. package/rulepacks/jetwc/jetwc-property-translatable.js +1 -1
  82. package/rulepacks/jetwc/jetwc-require-paths.js +1 -1
  83. package/rulepacks/jetwc/jetwc-reserved-property.js +1 -1
  84. package/rulepacks/jetwc/jetwc-schema.js +1 -1
  85. package/rulepacks/jetwc/jetwc-standard-files.js +1 -1
  86. package/rulepacks/jetwc/jetwc-vb-category.js +1 -1
  87. package/rulepacks/jetwc/rules.json +1 -1
  88. package/rulepacks/jetwc-lib/jetwcutils-auditComponentCacheManager.js +1 -1
  89. package/rulepacks/jetwc-lib/jetwcutils-commonListenerImpls.js +1 -1
  90. package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +1 -1
  91. package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +1 -1
  92. package/rulepacks/jetwc-lib/jetwcutils-tsxUtils.js +1 -1
  93. package/rulepacks/jetwco/jetwco-bootstrap.js +1 -1
  94. package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +1 -1
  95. package/rulepacks/jetwco/jetwco-component-api-changes.js +1 -1
  96. package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +1 -1
  97. package/rulepacks/jetwco/jetwco-license-info.js +1 -1
  98. package/rulepacks/jetwco/jetwco-prerelease-cdn.js +1 -1
  99. package/rulepacks/jetwco/jetwco-validate-applied-audits.js +1 -1
  100. package/rulepacks/jetwco/rules.json +1 -1
  101. package/rules/jet/helpers/cssHelper.js +1 -1
  102. package/rules/jet/helpers/has-attrib-value.js +6 -0
  103. package/rules/jet/helpers/tsx/has-prop-value.js +6 -0
  104. package/rules/jet/msgid.json +1 -1
  105. package/rules/jet/oj-acc-button-label.js +6 -0
  106. package/rules/jet/oj-css-style-bp-display.js +1 -1
  107. package/rules/jet/oj-html-attr-expr-writeback.js +1 -1
  108. package/rules/jet/oj-html-bindif-test.js +1 -1
  109. package/rules/jet/oj-html-binding-as-slot-child.js +1 -1
  110. package/rules/jet/oj-html-bp-button-xs-chroming.js +6 -0
  111. package/rules/jet/oj-html-bp-title-to-tooltip.js +6 -0
  112. package/rules/jet/oj-html-button-size-chroming.js +6 -0
  113. package/rules/jet/oj-html-dlg-title.js +1 -1
  114. package/rules/jet/oj-html-form-bindif.js +1 -1
  115. package/rules/jet/oj-html-ko-comment.js +1 -1
  116. package/rules/jet/oj-html-ko-databind.js +1 -1
  117. package/rules/jet/oj-html-ojattr-value.js +1 -1
  118. package/rules/jet/oj-html-ojtag-ns.js +1 -1
  119. package/rules/jet/oj-html-redwood-clear-icon.js +6 -0
  120. package/rules/jet/oj-html-slot-default.js +1 -1
  121. package/rules/jet/oj-html-slot-pref-content.js +1 -1
  122. package/rules/jet/oj-html-style-abs-units.js +1 -1
  123. package/rules/jet/oj-html-style-bp-color.js +1 -1
  124. package/rules/jet/oj-html-style-bp-display.js +1 -1
  125. package/rules/jet/oj-html-style-bp-font-family.js +1 -1
  126. package/rules/jet/oj-html-style-bp-font.js +1 -1
  127. package/rules/jet/oj-html-style-bp-margin-padding.js +6 -0
  128. package/rules/jet/oj-html-wctag-maintenance.js +1 -1
  129. package/rules/jet/oj-tsx-acc-button-label.js +6 -0
  130. package/rules/jet/oj-tsx-bp-button-xs-chroming.js +6 -0
  131. package/rules/jet/oj-tsx-bp-title-to-tooltip.js +6 -0
  132. package/rules/jet/oj-tsx-button-size-chroming.js +6 -0
  133. package/rules/jet/oj-tsx-dlg-title.js +1 -1
  134. package/rules/jet/oj-tsx-form-bindif.js +1 -1
  135. package/rules/jet/oj-tsx-ojtag-ns.js +1 -1
  136. package/rules/jet/oj-tsx-redwood-clear-icon.js +6 -0
  137. package/rules/jet/oj-tsx-slot-default.js +6 -0
  138. package/rules/jet/oj-tsx-slot-pref-content.js +1 -1
  139. package/rules/jet/oj-tsx-style-abs-units.js +6 -0
  140. package/rules/jet/oj-tsx-style-bp-margin-padding.js +6 -0
  141. package/rules/jet/oj-tsx-wctag-maintenance.js +1 -1
  142. package/rules/jet/rules.json +1 -1
  143. package/schema/component-schema.json +1 -1
  144. package/src/JafCore.js +1 -1
  145. 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{LENGTH_PROP_SET}=require("./helpers/cssHelper");const RULENAME="oj-html-style-abs-units";const DESCRIPTION="In general it is preferable to use relative length units in place of absolute units. "+"Specifically, 'rem' units are recommended because they proportionately adjust to the root "+"font size. 'rem' can be used for anything that takes a length unit - e.g. font-size, line-height, "+"width, height, padding, margin, etc. However, there are cases where absolute units are "+"required. This project is configured to allow absolute units in selector names that include "+"one of the following terms: 'image, and 'picture'.";const SHORT_DESCRIPTION="In general it is preferable to use relative length units in place of absolute units.";const ABS_UNITS=["px","cm","mm","in","pt","pc","all"];const COLON=":";const ALL="all";const NUMBER="number";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._checkRuleOptions(regCtx)){return false}return{"style":this._onStyle}}_onStyle(ruleCtx,attr,value){var prop,val,unit,s,x,i;this._CssUtils=ruleCtx.utils.CssUtils;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(COLON);if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trimStart();if(!LENGTH_PROP_SET.has(prop)){continue}{unit=_hasAbsUnits(val);if(unit){this._prop(ruleCtx,prop,val,unit)}}}}}_prop(ruleCtx,prop,val,unit){var m,qty,s,i;m=val.match(/[0-9]+(px|cm|mm|in|pt|pc)/g);if(m&&m.length){for(i=0;i<m.length;i++){s=m[i];unit=s.substring(s.length-2);qty=s.substring(0,s.length-unit.length);qty=parseInt(qty);if(!this._okThreshold(unit,qty)||qty===0){this._emitIssue(ruleCtx,prop,m[i],unit,qty)}}}else if(_isExpr(val)){this._emitIssue2(ruleCtx,prop,val,unit)}}_emitIssue(ruleCtx,prop,val,unit,qty){var issue,unit;if(qty){issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: replace absolute unit '${unit}' with a relative unit (e.g. 'rem' or '%')`)}else{issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: remove '${unit}' for zero quantity`);issue.setMsgKey(RULENAME+"_1");issue.setSeverity("minor")}if(issue){this._reportIssue(ruleCtx,issue)}}_emitIssue2(ruleCtx,prop,val,unit){var issue;issue=new ruleCtx.Issue(`style '${prop}' expression '${val}' generates a '${unit}' length - best practices: convert to a relative unit (e.g. 'rem' or '%')`);issue.setMsgKey(RULENAME+"_2");this._reportIssue(ruleCtx,issue)}_reportIssue(ruleCtx,issue){var pos;pos=ruleCtx.utils.DomUtils.getAttrPosition(ruleCtx.data,ruleCtx.tagNode,"style");issue.setPosition(pos.row,pos.col,pos.start,pos.end);ruleCtx.reporter.addIssue(issue,ruleCtx)}_okThreshold(unit,qty){var th;if(!this._unitOpts||typeof qty!==NUMBER){return true}th=this._unitOpts[unit];if(th===undefined){th=this._unitOpts[ALL]}return th?Math.abs(qty)<=th:true}_checkRuleOptions(regCtx){var units,unit,th,b,customOpts;if(customOpts=regCtx.ruleOpts.customOpts){if(units=customOpts.absunits){if(!regCtx.utils.utils.isObject(units)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' is not an object`);this._fail=true;return false}for(unit in units){if(!ABS_UNITS.includes(unit)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' value '${unit}' is not absolute`);b=true;continue}if(units.hasOwnProperty(unit)){th=units[unit];if(typeof th!==NUMBER){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' threshold '${th}' is not a number`);b=true}}}this._unitOpts=units}}return!b}}function _hasAbsUnits(s){var expr,unit,start,end,i,x;for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit!==ALL&&s.includes(unit)){return unit}}expr=_isExpr(s);if(!expr){return false}for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit===ALL){continue}x=s.indexOf(unit);if(x>=0){end=s[x+1];start=s[x-1].toLowerCase();if(start==="."||start==="+"||start.match(/[a-z]/i)){continue}return unit}}return false};function _isExpr(s){return s.includes("$")};module.exports=Rule;
6
+ const{LENGTH_PROP_SET,LENGTH_MEMBER_PROP_SET}=require("./helpers/cssHelper");const RULENAME="oj-html-style-abs-units";const DESCRIPTION="In general it is preferable to use relative length units in place of absolute units. "+"Specifically, 'rem' units are recommended because they proportionately adjust to the root "+"font size. 'rem' can be used for anything that takes a length unit - e.g. font-size, line-height, "+"width, height, padding, margin, etc. However, there are cases where absolute units are "+"required. This project is configured to allow absolute units in selector names that include "+"one of the following terms: 'image, and 'picture'.";const SHORT_DESCRIPTION="In general it is preferable to use relative length units in place of absolute units.";const ABS_UNITS=["px","cm","mm","in","pt","pc","all"];const COLON=":";const ALL="all";const NUMBER="number";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._checkRuleOptions(regCtx)){return false}return{"style":this._onStyle,"stylemember":this._onStyle}}_onStyle(ruleCtx,attr,value){var prop,i;this._CssUtils=ruleCtx.utils.CssUtils;if(ruleCtx.type==="stylemember"){i=attr.charAt(0)===":"?7:6;prop=attr.substring(i);this._checkPropAndValue(ruleCtx,prop,value,true)}else{let val,s,x;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(COLON);if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trimStart();this._checkPropAndValue(ruleCtx,prop,val,false)}}}}_checkPropAndValue(ruleCtx,prop,value,submember){if(!submember&&LENGTH_PROP_SET.has(prop)||submember&&LENGTH_MEMBER_PROP_SET.has(prop)){let unit;if(unit=_hasAbsUnits(value));{this._prop(ruleCtx,prop,value,unit)}}}_prop(ruleCtx,prop,val,unit){var m,qty,s,i;m=val.match(/[0-9]+(px|cm|mm|in|pt|pc)/g);if(m&&m.length){for(i=0;i<m.length;i++){s=m[i];unit=s.substring(s.length-2);qty=s.substring(0,s.length-unit.length);qty=parseInt(qty);if(!this._okThreshold(unit,qty)||qty===0){this._emitIssue(ruleCtx,prop,m[i],unit,qty)}}}else if(_isExpr(val)){this._emitIssue2(ruleCtx,prop,val,unit)}}_emitIssue(ruleCtx,prop,val,unit,qty){var issue,unit;if(qty){issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: replace absolute unit '${unit}' with a relative unit (e.g. 'rem' or '%')`)}else{issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: remove '${unit}' for zero quantity`);issue.setMsgKey(RULENAME+"_1");issue.setSeverity("minor")}ruleCtx.reporter.addIssue(issue,ruleCtx)}_emitIssue2(ruleCtx,prop,val,unit){var issue;issue=new ruleCtx.Issue(`style '${prop}' expression '${val}' generates a '${unit}' length - best practices: convert to a relative unit (e.g. 'rem' or '%')`);issue.setMsgKey(RULENAME+"_2");ruleCtx.reporter.addIssue(issue,ruleCtx)}_okThreshold(unit,qty){var th;if(!this._unitOpts||typeof qty!==NUMBER){return true}th=this._unitOpts[unit];if(th===undefined){th=this._unitOpts[ALL]}return th?Math.abs(qty)<=th:true}_checkRuleOptions(regCtx){var units,unit,th,b,customOpts;if(customOpts=regCtx.ruleOpts.customOpts){if(units=customOpts.absunits){if(!regCtx.utils.utils.isObject(units)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' is not an object`);this._fail=true;return false}for(unit in units){if(!ABS_UNITS.includes(unit)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' value '${unit}' is not absolute`);b=true;continue}if(units.hasOwnProperty(unit)){th=units[unit];if(typeof th!==NUMBER){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' threshold '${th}' is not a number`);b=true}}}this._unitOpts=units}}return!b}}function _hasAbsUnits(s){var expr,unit,start,end,i,x;for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit!==ALL&&s.includes(unit)){return unit}}expr=_isExpr(s);if(!expr){return false}for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit===ALL){continue}x=s.indexOf(unit);if(x>=0){end=s[x+1];start=s[x-1].toLowerCase();if(start==="."||start==="+"||start.match(/[a-z]/i)){continue}return unit}}return false};function _isExpr(s){return s.includes("$")};module.exports=Rule;
@@ -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 cssHelper=require("./helpers/cssHelper");const RULE_NAME="oj-html-style-bp-color";const SHORT_DESCRIPT="For best practices, CSS color values should not be used - color classes such as 'oj-text-color-primary' are preferred.";const DESCRIPT="For best practices, CSS color values should not be used - color classes such as 'oj-text-color-primary' are preferred."+" See the Colors demo category in the JET cookbook under the Framework "+"<a href='https://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=colors&demo=bgcolors'>Utility CSS</a> category.";function Rule(){this._checkList=null;this._isAccept=false};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return SHORT_DESCRIPT};Rule.prototype.getDescription=function(){return DESCRIPT};Rule.prototype.register=function(regCtx){if(!this._checkAcceptReject(regCtx)){return false}return{"style":this._onStyle}};Rule.prototype._onStyle=function(ruleCtx,attr,value,raw){var prop,val,s,x,i;this._CssUtils=ruleCtx.utils.CssUtils;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trimStart();if(cssHelper.COLOR_PROPS.includes(prop)){if(this._isColorValFound(val)){if(this._okProp(prop)){this._emitIssue(ruleCtx,prop,val)}}}else if(cssHelper.COLOR_PROPS_MULTI.includes(prop)){if(this._okProp(prop)){this._parseMulti(ruleCtx,prop,val)}}}}};Rule.prototype._parseMulti=function(ruleCtx,prop,val){var a,v,i;a=val.split(" ");for(i=0;i<a.length;i++){v=a[i].trim();if(v.charAt(0)==="#"||_isColorFunc(v)||this._CssUtils.isColorName(v)){this._emitIssue(ruleCtx,prop,v)}}};Rule.prototype._emitIssue=function(ruleCtx,prop,val){var issue;issue=new ruleCtx.Issue("CSS color '"+val+"' - best practices: use the utility CSS selectors available (see 'Text', 'Icons', and 'Link' pages)");ruleCtx.reporter.addIssue(issue,ruleCtx)};Rule.prototype._isColorValFound=function(s){var i;s=s.toLowerCase();if(_isColorFunc(s)||this._CssUtils.isColorName(s)){return true}i=s.indexOf("#");if(i>=0){s=s.substring(i);if(/[0-9A-F]{6}/i.test(s)||/[0-9A-F]{3}/i.test(s)){return true}}return false};Rule.prototype._okProp=function(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(this._checkList[i]===prop){return this._isAccept}}return!this._isAccept}return true};Rule.prototype._checkAcceptReject=function(regCtx){var customOpts,accept,reject;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;reject=customOpts.reject;if(accept||reject){if(accept&&reject){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": options 'accept' and 'reject' are mutually exclusive");return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=reject}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": option '"+(accept?"accept":"reject")+"' is not an array");return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=this._checkList[i].trim()}}}return true};function _isColorFunc(s){s=s.toLowerCase();return s.startsWith("rgb")||s.startsWith("hsl")};module.exports=Rule;
6
+ const cssHelper=require("./helpers/cssHelper");const RULE_NAME="oj-html-style-bp-color";const SHORT_DESCRIPT="For best practices, CSS color values should not be used - color classes such as 'oj-text-color-primary' are preferred.";const DESCRIPT="For best practices, CSS color values should not be used - color classes such as 'oj-text-color-primary' are preferred."+" See the Colors demo category in the JET cookbook under the Framework "+"<a href='https://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=colors&demo=bgcolors'>Utility CSS</a> category.";function Rule(){this._checkList=null;this._isAccept=false};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return SHORT_DESCRIPT};Rule.prototype.getDescription=function(){return DESCRIPT};Rule.prototype.register=function(regCtx){if(!this._checkAcceptReject(regCtx)){return false}return{"style":this._onStyle,"stylemember":this._onStyle}};Rule.prototype._onStyle=function(ruleCtx,attr,value){var prop,val,s,x,i;this._CssUtils=ruleCtx.utils.CssUtils;if(ruleCtx.type==="stylemember"){i=attr.charAt(0)===":"?7:6;prop=attr.substring(i);this._checkValue(ruleCtx,prop,value)}else{for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trimStart();this._checkValue(ruleCtx,prop,val)}}}};Rule.prototype._checkValue=function(ruleCtx,prop,value){if(cssHelper.COLOR_PROPS.includes(prop)||cssHelper.COLOR_MEMBERS.includes(prop)){if(this._isColorValFound(value)){if(this._okProp(prop)){this._emitIssue(ruleCtx,prop,value)}}}else if(cssHelper.COLOR_PROPS_MULTI.includes(prop)||cssHelper.COLOR_MEMBERS_MULTI.includes(prop)){if(this._okProp(prop)){this._parseMulti(ruleCtx,prop,value)}}};Rule.prototype._parseMulti=function(ruleCtx,prop,val){var a,v,i;a=val.split(" ");for(i=0;i<a.length;i++){v=a[i].trim();if(v.charAt(0)==="#"||_isColorFunc(v)||this._CssUtils.isColorName(v)){this._emitIssue(ruleCtx,prop,v)}}};Rule.prototype._emitIssue=function(ruleCtx,prop,val){var issue;issue=new ruleCtx.Issue("CSS color '"+val+"' - best practices: use the utility CSS selectors available (see 'Text', 'Icons', and 'Link' pages)");ruleCtx.reporter.addIssue(issue,ruleCtx)};Rule.prototype._isColorValFound=function(s){var i;s=s.toLowerCase();if(_isColorFunc(s)||this._CssUtils.isColorName(s)){return true}i=s.indexOf("#");if(i>=0){s=s.substring(i);if(/[0-9A-F]{6}/i.test(s)||/[0-9A-F]{3}/i.test(s)){return true}}return false};Rule.prototype._okProp=function(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(this._checkList[i]===prop){return this._isAccept}}return!this._isAccept}return true};Rule.prototype._checkAcceptReject=function(regCtx){var customOpts,accept,reject;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;reject=customOpts.reject;if(accept||reject){if(accept&&reject){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": options 'accept' and 'reject' are mutually exclusive");return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=reject}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": option '"+(accept?"accept":"reject")+"' is not an array");return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=this._checkList[i].trim()}}}return true};function _isColorFunc(s){s=s.toLowerCase();return s.startsWith("rgb")||s.startsWith("hsl")};module.exports=Rule;
@@ -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 RULE_NAME="oj-html-style-bp-display";const LONG_DESCRIPT="For best practices, CSS property 'display:none' should not be used. Use of JET <oj-bind-if> is recommended.";const SHORT_DESCRIPT=LONG_DESCRIPT;function getName(){return RULE_NAME};function getShortDescription(){return SHORT_DESCRIPT};function getDescription(){return LONG_DESCRIPT};function register(){return{"style":_onStyle}};function _onStyle(ruleCtx,attr,value,raw){var prop,s,x,i;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();value=s.substring(x+1).trimStart();if(prop==="display"&&value==="none"){_emitIssue(ruleCtx,prop)}}}};function _emitIssue(ruleCtx,prop){var issue;issue=new ruleCtx.Issue("CSS 'display:none' - best practices, use <oj-bind-if>");ruleCtx.reporter.addIssue(issue,ruleCtx)};module.exports={getName,getDescription,getShortDescription,register};
6
+ const RULE_NAME="oj-html-style-bp-display";const LONG_DESCRIPT="For best practices, CSS property 'display:none' should not be used. Use of JET <oj-if> is recommended.";const SHORT_DESCRIPT=LONG_DESCRIPT;const NONE="none";const MSG=" - for best practices use <oj-if>";function getName(){return RULE_NAME};function getShortDescription(){return SHORT_DESCRIPT};function getDescription(){return LONG_DESCRIPT};function register(){return{"style":_onStyle,"stylemember":_onStyle}};function _onStyle(ruleCtx,attr,value){var prop,s,x,i;if(ruleCtx.type==="stylemember"){i=attr.charAt(0)===":"?7:6;if(attr.substring(i)==="display"&&value==="none"){_emitIssue(ruleCtx,true)}}else{if(!ruleCtx.filepath.endsWith("disp_FAIL_1.html"))return;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();value=s.substring(x+1).trimStart();if(prop==="display"&&value===NONE){_emitIssue(ruleCtx)}}}}};function _emitIssue(ruleCtx,submember){var issue,msg;msg=submember?"'style.display=\"none\"":"style=\"display:none\"";issue=new ruleCtx.Issue(msg+MSG);ruleCtx.reporter.addIssue(issue,ruleCtx)};module.exports={getName,getDescription,getShortDescription,register};
@@ -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 RULENAME="oj-html-style-bp-font-family";const DESCRIPT="For best practices, the CSS 'font-family' property should not be used. Use of JET typography classes is recommended.";const SHORT_DESCRIPT=DESCRIPT;const FONT_FAMILY="font-family";class Rule{constructor(){this._checkList=null;this._isAccept=false}getName(){return RULENAME}getDescription(){return DESCRIPT}getShortDescription(){return SHORT_DESCRIPT}register(regCtx){if(!this._checkRuleOverrides(regCtx)){return false}return{"style":this._onStyle}}_onStyle(ruleCtx,attr,value){var prop,val,s,x,i;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trim();if(prop===FONT_FAMILY){if(this._okProp(val)){this._emitIssue(ruleCtx,prop,val)}}}}}_emitIssue(ruleCtx,prop,val){var issue;issue=new ruleCtx.Issue(`<style> '${prop}: ${val}' - best practices: JET Typography classes preferred`);ruleCtx.reporter.addIssue(issue,ruleCtx)}_okProp(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(prop.match(this._checkList[i])){return this._isAccept}}return!this._isAccept}return true}_checkRuleOverrides(regCtx){var customOpts,accept,ignore;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;ignore=customOpts.ignore;if(accept||ignore){if(accept&&ignore){regCtx.utils.msgLib.error(`Rule ${RULENAME} : options 'accept' and 'ignore' are mutually exclusive`);return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=ignore}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error(`Rule ${RULENAME} : option '${accept?"accept":"reject"}' is not an array`);return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=new RegExp(this._checkList[i].trim())}}}return true}}module.exports=Rule;
6
+ const RULENAME="oj-html-style-bp-font-family";const DESCRIPT="For best practices, the CSS 'font-family' property should not be used. Use of JET typography classes is recommended.";const SHORT_DESCRIPT=DESCRIPT;const FONT_FAMILY="font-family";const FONT_FAMILY_MEMBER="fontFamily";class Rule{constructor(){this._checkList=null;this._isAccept=false}getName(){return RULENAME}getDescription(){return DESCRIPT}getShortDescription(){return SHORT_DESCRIPT}register(regCtx){if(!this._checkRuleOverrides(regCtx)){return false}return{"style":this._onStyle,"stylemember":this._onStyle}}_onStyle(ruleCtx,attr,value){var prop,i;if(ruleCtx.type==="stylemember"){i=attr.charAt(0)===":"?7:6;prop=attr.substring(i);this._checkProp(ruleCtx,prop,value,true)}else{let val,s,x;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trim();this._checkProp(ruleCtx,prop,val,false)}}}}_checkProp(ruleCtx,prop,value,submember){if(submember&&prop===FONT_FAMILY_MEMBER||!submember&&prop===FONT_FAMILY){if(this._okProp(value)){this._emitIssue(ruleCtx,prop,value)}}}_emitIssue(ruleCtx,prop,value){var issue=new ruleCtx.Issue(`style '${prop}: ${value}' - best practices: JET Typography classes preferred`);ruleCtx.reporter.addIssue(issue,ruleCtx)}_okProp(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(prop.match(this._checkList[i])){return this._isAccept}}return!this._isAccept}return true}_checkRuleOverrides(regCtx){var customOpts,accept,ignore;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;ignore=customOpts.ignore;if(accept||ignore){if(accept&&ignore){regCtx.utils.msgLib.error(`Rule ${RULENAME} : options 'accept' and 'ignore' are mutually exclusive`);return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=ignore}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error(`Rule ${RULENAME} : option '${accept?"accept":"reject"}' is not an array`);return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=new RegExp(this._checkList[i].trim())}}}return true}}module.exports=Rule;
@@ -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 RULE_NAME="oj-html-style-bp-font";const DESCRIPT="For best practices, CSS 'font-size' and 'font-weight' should not be used. Use of JET typography classes is recommended.";const SHORT_DESCRIPT=DESCRIPT;const FONT_PROPS=["font-size","font-weight"];function Rule(){this._checkList=null;this._isAccept=false};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return SHORT_DESCRIPT};Rule.prototype.getDescription=function(){return DESCRIPT};Rule.prototype.register=function(regCtx){if(!this._checkAcceptReject(regCtx)){return false}return{"style":this._onStyle}};Rule.prototype._onStyle=function(ruleCtx,attr,value,raw){var prop,s,x,i;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();if(FONT_PROPS.includes(prop)){if(this._okProp(prop)){this._emitIssue(ruleCtx,prop)}}}}};Rule.prototype._emitIssue=function(ruleCtx,prop){var issue;issue=new ruleCtx.Issue("CSS '"+prop+"' - best practices: do not set, use the JET Typography classes");ruleCtx.reporter.addIssue(issue,ruleCtx)};Rule.prototype._okProp=function(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(this._checkList[i]===prop){return this._isAccept}}return!this._isAccept}return true};Rule.prototype._checkAcceptReject=function(regCtx){var customOpts,accept,reject;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;reject=customOpts.reject;if(accept||reject){if(accept&&reject){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": options 'accept' and 'reject' are mutually exclusive");return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=reject}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": option '"+(accept?"accept":"reject")+"' is not an array");return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=this._checkList[i].trim()}}}return true};module.exports=Rule;
6
+ const RULE_NAME="oj-html-style-bp-font";const DESCRIPT="For best practices, CSS 'font-size' and 'font-weight' should not be used. Use of JET typography classes is recommended.";const SHORT_DESCRIPT=DESCRIPT;const FONT_PROPS=["font-size","font-weight"];const FONT_PROPS_MEMBERS=["fontSize","fontWeight"];function Rule(){this._checkList=null;this._isAccept=false};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return SHORT_DESCRIPT};Rule.prototype.getDescription=function(){return DESCRIPT};Rule.prototype.register=function(regCtx){if(!this._checkAcceptReject(regCtx)){return false}return{"style":this._onStyle,"stylemember":this._onStyle}};Rule.prototype._onStyle=function(ruleCtx,attr,value,raw){var prop,s,x,i;if(ruleCtx.type==="stylemember"){i=attr.charAt(0)===":"?7:6;prop=attr.substring(i);this._checkPropAndValue(ruleCtx,prop,value,true)}else{let val;for(i=0;i<value.length;i++){s=value[i];x=s.indexOf(":");if(x>=0){prop=s.substring(0,x).trimEnd();val=s.substring(x+1).trimStart();this._checkPropAndValue(ruleCtx,prop,val,false)}}}};Rule.prototype._checkPropAndValue=function(ruleCtx,prop,value,stylemember){if(stylemember&&FONT_PROPS_MEMBERS.includes(prop)||!stylemember&&FONT_PROPS.includes(prop)){if(this._okProp(prop)){this._emitIssue(ruleCtx,prop,stylemember)}}};Rule.prototype._emitIssue=function(ruleCtx,prop,submember){var issue;issue=new ruleCtx.Issue(`style '${prop}' - best practices: use the JET Typography classes`);ruleCtx.reporter.addIssue(issue,ruleCtx)};Rule.prototype._okProp=function(prop){var i;if(this._checkList){for(i=0;i<this._checkList.length;i++){if(this._checkList[i]===prop){return this._isAccept}}return!this._isAccept}return true};Rule.prototype._checkAcceptReject=function(regCtx){var customOpts,accept,reject;if(!(customOpts=regCtx.ruleOpts.customOpts)){return true}accept=customOpts.accept;reject=customOpts.reject;if(accept||reject){if(accept&&reject){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": options 'accept' and 'reject' are mutually exclusive");return false}if(accept){this._checkList=accept;this._isAccept=true}else{this._checkList=reject}if(!Array.isArray(this._checkList)){regCtx.utils.msgLib.error("Rule "+RULE_NAME+": option '"+(accept?"accept":"reject")+"' is not an array");return false}for(let i=0;i<this._checkList.length;i++){if(typeof this._checkList[i]==="string"){this._checkList[i]=this._checkList[i].trim()}}}return true};module.exports=Rule;
@@ -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 RULENAME="oj-html-style-bp-margin-padding";const DESCRIPTION="For best practices, margin/padding classes such as 'oj-sm-margin-4x' and 'oj-sm-padding-4x' are preferred "+"over numeric values. See the "+"<a href='https://jet.oraclecorp.com/trunk/jetCookbook.html?component=spacing&demo=spacingvariants'>Margins & Padding</a> "+"demo category in the JET cookbook under the Framework Utility CSS category.\n"+"Negative values are not supported.\n"+"The currently supported values are 4px - 48px, 0.25rem - 12rem, and 0.25em - 12em.";const SHORT_DESCRIPTION="For best practices, margin classes such as 'oj-sm-margin-4x' and padding classes such as 'oj-sm-padding-4x' are preferred. .";const MARGIN="margin";const PADDING="padding";const MARGIN_BLOCK="margin-block";const PADDING_BLOCK="padding-block";const OJ_SM_MARGIN="oj-sm-margin-";const OJ_SM_PADDING="oj-sm-padding-";const MARGIN_PROPS=[MARGIN,"margin-top","margin-right","margin-bottom","margin-left","marginTop","marginRight","marginBottom","marginLeft","margin-block","margin-block-start","margin-block-end","margin-inline","margin-inline-start","margin-inline-end"];const PADDING_PROPS=[PADDING,"padding-top","padding-right","padding-bottom","padding-left","paddingTop","paddingRight","paddingBottom","paddingLeft","padding-block","padding-block-start","padding-block-end","padding-inline","padding-inline-start","padding-inline-end"];const NON_LENGTH=["auto","initial","inherit"];const PX="px";const MIN_PX=4;const MAX_PX=48;const REM="rem";const MIN_REM=0.25;const MAX_REM=12;const EM="em";const MIN_EM=0.25;const MAX_EM=12;class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(){return{"style":this._onStyle,"stylemember":this._onStyleMember}}_onStyle(ruleCtx,attrib,aVals,rawValue){if(!rawValue||_isExpr(rawValue)){return}this._styleObj=false;let prop,value,x;aVals.forEach(style=>{style=style.replace(/\:\s+/g,":");x=style.indexOf(":");if(x>=0){prop=style.substring(0,x).trimEnd();if(MARGIN_PROPS.includes(prop)||PADDING_PROPS.includes(prop)){value=style.substring(x+1).trim();this._onProp(ruleCtx,prop,value)}}})}_onStyleMember(ruleCtx,attrib,value,rawValue){if(!rawValue||_isExpr(value)){return}if(attrib.charAt(0)===":"){attrib=attrib.substring(1)}let x,prop;if((x=attrib.indexOf("."))>=0){prop=attrib.substring(x+1);this._styleObj=true;this._onProp(ruleCtx,prop,value)}}_onProp(ruleCtx,prop,value){if(NON_LENGTH.includes(value)||value.endsWith("%")){return}let a;a=value.split(" ");if(prop===MARGIN||prop===PADDING){a.forEach(val=>{if(!(val.startsWith(OJ_SM_MARGIN)||val.startsWith(OJ_SM_PADDING))){this._handleProp(ruleCtx,prop,val)}})}else if(prop.startsWith(MARGIN_BLOCK)||prop.startsWith(PADDING_BLOCK)){this._handleBlock(ruleCtx,prop,value)}else{this._handleProp(ruleCtx,prop,value)}}_handleProp(ruleCtx,prop,value){let numVal=parseFloat(value);if(!isNaN(numVal)){if(value.endsWith("px")){this._checkPxRange(ruleCtx,prop,numVal)}else if(value.endsWith("rem")){this._checkRemRange(ruleCtx,prop,numVal)}else if(value.endsWith("em")){this._checkEmRange(ruleCtx,prop,numVal)}else if(""+numVal===value){this._checkNoUnit(ruleCtx,prop,numVal)}}}_handleBlock(ruleCtx,prop,value){var a,val,i;a=value.split(" ");for(i=0;i<a.length;i++){if(val=a[i]){this._handleProp(ruleCtx,prop,val)}}}_checkPxRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,PX,value);return}if(value<MIN_PX||value>MAX_PX){return}this._emitIssue(ruleCtx,1,prop,PX,value)}_checkRemRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,REM,value);return}if(value<MIN_REM||value>MAX_REM){return}this._emitIssue(ruleCtx,1,prop,REM,value)}_checkEmRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,EM,value);return}if(value<MIN_EM||value>MAX_EM){return}this._emitIssue(ruleCtx,1,prop,EM,value)}_checkNoUnit(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,"",value)}if(value>0){this._emitIssue(ruleCtx,3,prop,"",value)}if(value<MIN_PX||value<MIN_REM||value<MIN_EM||value>MAX_PX||value>MIN_REM||value>MIN_EM){return}}_emitIssue(ruleCtx,msgType,prop,unit,value){var issue;if(msgType===1){issue=new ruleCtx.Issue(`style '${prop}' value ${value}${unit} - for best practice margin/padding classes such as oj-sm-margin-* or oj-sm-padding-* are preferred.`)}else if(msgType===2){issue=new ruleCtx.Issue(`style '${prop}' value ${value}${unit} must not be negative.`);issue.setMsgKey(RULENAME+"_1")}else if(msgType===3){issue=new ruleCtx.Issue(`style '${prop}' value ${value} should declare a unit.`);issue.setMsgKey(RULENAME+"_2")}if(issue){ruleCtx.reporter.addIssue(issue,ruleCtx)}}}function _isExpr(s){var c=s.charAt(0);if(c==="\""||c==="'"){s=s.substring(1);s=s.trimLeft()}return s.startsWith("[[")||s.startsWith("{{")};module.exports=Rule;
@@ -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 RULE="oj-html-wctag-maintenance";const DESCRIPTION="A notification that the component is in 'maintenance' status. This indicates "+"that the component is fully supported, but will be deprecated in a future release "+"and has no new features planned for it.";const SHORT_DESCRIPTION="The component is in 'maintenance' status and will be deprecated in a future release.";const MSG="<%c> is in 'maintenance' status%s.%d";const MAINTENANCE="maintenance";class Rule{getName(){return RULE}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._getOverrides(regCtx)){return false}this._metaLib=regCtx.utils.metaLib;return{ojtag:this._onTag}}_onTag(ruleCtx,tag){var stats,status;if(this._isIgnoreFile(ruleCtx.filepath)){return}if((stats=this._metaLib.getTagStatus(tag,MAINTENANCE))&&stats.length){let msg=MSG.replace("%c",tag);status=stats[0];if(status.since){msg=msg.replace("%s",` (since ${status.since})`)}if(status.description){msg=msg.replace("%d",` ${status.description}`);if(!msg.endsWith(".")){msg+="."}}else{msg=msg.replace("%d","")}if(status.value?.length){let repl="<"+status.value.join(">, <")+">";msg+=` Superseded by ${repl}.`}let issue=new ruleCtx.Issue(msg);ruleCtx.reporter.addIssue(issue,ruleCtx)}}_isIgnoreFile(file){if(this._ignoreFiles){for(let i=0;i<this._ignoreFiles.length;i++){if(this._ignoreFiles[i].test(file)){return true}}}return false}_getOverrides(regCtx){var files,custOpts,files;if(!(custOpts=regCtx.ruleOpts.customOpts)){return true}if(!(files=custOpts.files)){return true}if(!Array.isArray(files)){regCtx.utils.msgLib.error(`Rule ${RULE} : config option 'files' is not an array`);return false}let ignoreFiles=[];for(let i=0;i<files.length;i++){if(typeof files[i]==="string"){try{ignoreFiles[i]=new RegExp(files[i].trim())}catch(e){regCtx.utils.msgLib.error(`Config 'ruleMods' ${RULE} 'files' entry [${i}]: ${e.message}`);return false}}}if(ignoreFiles.length){this._ignoreFiles=ignoreFiles}return true}}module.exports=Rule;
6
+ const RULE="oj-html-wctag-maintenance";const DESCRIPTION="A notification that the component is in 'maintenance' status. This indicates "+"that the component is fully supported, but will be deprecated in a future release "+"and has no new features planned for it.";const SHORT_DESCRIPTION="The component is in 'maintenance' status and will be deprecated in a future release.";const MSG="<%c> is in 'maintenance' status%s.%d";const MAINTENANCE="maintenance";class Rule{getName(){return RULE}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._getOverrides(regCtx)){return false}this._metaLib=regCtx.utils.metaLib;return{ojtag:this._onTag}}_onTag(ruleCtx,tag){var stats,status,repl,msgObj;if(this._isIgnoreFile(ruleCtx.filepath)){return}if((stats=this._metaLib.getTagStatus(tag,MAINTENANCE))&&stats.length){let msg=MSG.replace("%c",tag);status=stats[0];if(status.since){msg=msg.replace("%s",` (since ${status.since})`)}if(status.description){msg=msg.replace("%d",` ${status.description}`);if(!msg.endsWith(".")){msg+="."}}else{msg=msg.replace("%d","")}if(status.value?.length){repl="<"+status.value.join(">, <")+">";msg+=` Superseded by ${repl}.`}let issue=new ruleCtx.Issue(msg);msgObj={tag:tag};if(repl){msgObj.supersededBy=status.value}issue.setMsgEx(msgObj);ruleCtx.reporter.addIssue(issue,ruleCtx)}}_isIgnoreFile(file){if(this._ignoreFiles){for(let i=0;i<this._ignoreFiles.length;i++){if(this._ignoreFiles[i].test(file)){return true}}}return false}_getOverrides(regCtx){var files,custOpts,files;if(!(custOpts=regCtx.ruleOpts.customOpts)){return true}if(!(files=custOpts.files)){return true}if(!Array.isArray(files)){regCtx.utils.msgLib.error(`Rule ${RULE} : config option 'files' is not an array`);return false}let ignoreFiles=[];for(let i=0;i<files.length;i++){if(typeof files[i]==="string"){try{ignoreFiles[i]=new RegExp(files[i].trim())}catch(e){regCtx.utils.msgLib.error(`Config 'ruleMods' ${RULE} 'files' entry [${i}]: ${e.message}`);return false}}}if(ignoreFiles.length){this._ignoreFiles=ignoreFiles}return true}}module.exports=Rule;
@@ -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 RULENAME="oj-tsx-acc-button-label";const DESCRIPTION="For button accessibility, the 'label' attribute should be applied to the following button components: "+"<oj-c-button>, <oj-c-menu-button> and <oj-c-split-menu-button>.";const SHORT_DESCRIPTION="Button components should use the 'label' attribute to make them accessible.";const LABEL="label";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;this._metaLib=regCtx.utils.metaLib;return{"Tsx<oj-c-button>":this._onBtn,"Tsx<oj-c-menu-button>":this._onBtn,"Tsx<oj-c-split-menu-button>":this._onBtn,"Tsx<oj-c-toggle-button>":this._onBtn,"startaudit":this._onPreAudit}}_onBtn(ruleCtx,tsxComp){if(!this._tsxUtils.getProperty(tsxComp,LABEL)){if(this._canEmit(ruleCtx,tsxComp.name)){let issue=new ruleCtx.Issue(`<${tsxComp.name}> should use the 'label' attribute to be accessible.`);ruleCtx.reporter.addIssue(issue,ruleCtx)}}}_canEmit(ruleCtx,tag){var req,ret=true,i;if((req=this._metaLib.getRequiredAttrs(tag))&&req.length){for(i=0;i<req.length;i++){if(req[i]===LABEL){ret=!this._isAttrReqRule;break}}}return ret}_onPreAudit(ctx){this._isAttrReqRule=ctx.rulePack.isRuleEnabled("oj-tsx-attr-req")}}module.exports=Rule;
@@ -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 hasProp=require("./helpers/tsx/has-prop-value");const RULENAME="oj-tsx-bp-button-xs-chroming";const DESCRIPTION="For <oj-button> and <oj-c-button> property size=\"xs\" is only supported using "+"ghost chroming and icon display mode. For size=\"xs\":<br>"+"&nbsp; 1) chroming=\"ghost\" is required, and:<br>"+"&nbsp; 2) display=\"icons\" is required.<br>";const SHORT_DESCRIPTION="For <oj-button> and <oj-c-button> property size=\"xs\" is only supported using "+"ghost chroming and icon display mode.<br>";"short description";const XS="xs";const DISPLAY="display";const CHROMING="chroming";const GHOST="ghost";const ICONS="icons";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;return{"Tsx<oj-c-button size=>":this._onBtn,"Tsx<oj-c-menu-button size=>":this._onBtn}}_onBtn(ruleCtx,tsxProp){var size;if(!(size=this._tsxUtils.getPropertyStringValue(tsxProp))){return}if(size===XS){let msgType=0;let tsxComp=tsxProp.parent;if(hasProp(tsxComp,CHROMING,GHOST)){if(hasProp(tsxComp,DISPLAY,ICONS)){return}msgType=2}else{msgType=1}if(msgType){this._emitIssue(ruleCtx,tsxComp.name,msgType)}}}_emitIssue(ruleCtx,tag,msgType){var msg,tag;if(msgType===1){msg=`<${tag} size="xs"> requires chroming="ghost".`}else if(msgType===2){msg=`<${tag} size="xs"> requires 'display="icons".`}if(msg){let issue=new ruleCtx.Issue(msg);let attrPos=ruleCtx.position;issue.setPosition(attrPos.row,attrPos.col,attrPos.start,attrPos.end);ruleCtx.reporter.addIssue(issue,ruleCtx)}}}module.exports=Rule;
@@ -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 RULE_NAME="oj-tsx-bp-title-to-tooltip";const LONG_DESCR="The 'tooltip' property matches the Redwood specification, but 'title' does not. "+"Additionally, there are accessibility issues with 'title' that are solved using 'tooltip'.<br>"+"Action: replace property 'title' with 'tooltip'.";const SHORT_DESCR="Property 'title' does not match the Redwood specifications and should be replaced with 'tooltip'.";function getName(){return RULE_NAME};function getShortDescription(){return SHORT_DESCR};function getDescription(){return LONG_DESCR};function register(){return{"Tsx<oj-c-button title=>":_onTitle,"Tsx<oj-c-menu-button title=>":_onTitle,"Tsx<oj-c-split-menu-button title=>":_onTitle}};function _onTitle(ruleCtx,tsxProp){let msg=`For <${tsxProp.parent.name}> the 'title' property should be replaced with 'tooltip'.`;let issue=new ruleCtx.Issue(msg);ruleCtx.reporter.addIssue(issue,ruleCtx)};module.exports={getName,getDescription,getShortDescription,register};
@@ -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 getParentNodeForSlot=require("./helpers/tsx/has-slot-name");const hasProp=require("./helpers/tsx/has-prop-value");const RULENAME="oj-tsx-button-size-chroming";const DESCRIPTION="The Redwood input designs require the use of small buttons. Please update the "+"button properties in the 'start' or 'end' slot:<br>"+"&nbsp;1) For <oj-button>, use class=\"oj-button-sm\"<br>"+"&nbsp;2) For <oj-c-button>, set size=\"sm\" and chroming=\"ghost\"";const SHORT_DESCRIPTION="Redwood input design spec -small buttons required.";const OJ_INPUT_TEXT="oj-input-text";const OJ_C_INPUT_TEXT="oj-c-input-text";const OJ_BUTTON="oj-button";const OJ_C_BUTTON="oj-c-button";const START="start";const END="end";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;return{"Tsx<oj-button slot=>":this._onBtn,"Tsx<oj-c-button slot=>":this._onBtn}}_onBtn(ruleCtx,tsxProp){var slotName;if(!(slotName=this._tsxUtils.getPropertyStringValue(tsxProp))){return}if(slotName!==START&&slotName!==END){return}let tsxComp,tagName,parentName,node;tsxComp=tsxProp.parent;if(!(node=getParentNodeForSlot(ruleCtx,tsxComp,slotName))){return}parentName=node.name;tagName=tsxComp.name;if(tagName!==OJ_BUTTON&&tagName!==OJ_C_BUTTON||parentName!==OJ_INPUT_TEXT&&parentName!==OJ_C_INPUT_TEXT){return}if(tagName===OJ_BUTTON){if(!hasProp(tsxComp,"class","oj-button-sm")){this._emitIssue(ruleCtx,true)}}else{if(!hasProp(tsxComp,"chroming","ghost")||!hasProp(tsxComp,"size","sm")){this._emitIssue(ruleCtx,false)}}}_emitIssue(ruleCtx,legacy){var msg=legacy?"<oj-button> in the 'start' or 'end' slot should use class=\"oj-button-sm\"":"<oj-c-button> in the 'start' or 'end' slot should use chroming=\"ghost\" and size=\"sm\"";var issue=new ruleCtx.Issue("Redwood input specs: "+msg);if(!legacy){issue.setMsgKey(RULENAME+"_1")}ruleCtx.reporter.addIssue(issue,ruleCtx)}}module.exports=Rule;
@@ -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 RULE_NAME="oj-tsx-dlg-title";const SHORT_DESCR="Check that <oj-dialog> attribute is not specified";const LONG_DESCR="<oj-dialog> : 'title' attribute should not be used - use 'dialog-title' instead.";const MSG="<oj-dialog> attribute 'title' should be replaced with 'dialog-title'";function getName(){return RULE_NAME};function getShortDescription(){return SHORT_DESCR};function getDescription(){return LONG_DESCR};function register(regCtx){return{"Tsx<oj-dialog>":_onDlg}};function _onDlg(ruleCtx,tsxComp){let tsxProp,tsxUtils=ruleCtx.utils.tsxUtils;if(tsxProp=tsxUtils.getProperty(tsxComp,"title")){let issue=new ruleCtx.Issue(MSG);tsxUtils.setIssuePosition(issue,tsxProp);ruleCtx.reporter.addIssue(issue,ruleCtx)}};module.exports={getName,getDescription,getShortDescription,register};
6
+ const RULE_NAME="oj-tsx-dlg-title";const SHORT_DESCR="<oj-dialog> 'title' attribute should be relaced with'dialog-title'";const LONG_DESCR="The <oj-dialog> 'title' attribute should be replaced with 'dialog-title'.";const MSG="<oj-dialog> attribute 'title' should be replaced with 'dialog-title'";function getName(){return RULE_NAME};function getShortDescription(){return SHORT_DESCR};function getDescription(){return LONG_DESCR};function register(){return{"Tsx<oj-dialog title=>":_onDlgTitle}};function _onDlgTitle(ruleCtx,tsxProp){let tsxUtils=ruleCtx.utils.tsxUtils;let issue=new ruleCtx.Issue(MSG);tsxUtils.setIssuePosition(issue,tsxProp);ruleCtx.reporter.addIssue(issue,ruleCtx)};module.exports={getName,getDescription,getShortDescription,register};
@@ -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 RULENAME="oj-tsx-form-bindif";const DESCRIPTION="<oj-form-layout> is meant to have static content only. The use of <oj-bind-for-each> or <oj-bind-if> is not supported";const SHORT_DESCRIPTION="The use of <oj-bind-for-each> or <oj-bind-if> inside <oj-form-layout> is not supported";const OJ_BIND_IF="oj-bind-if";const OJ_BIND_FOR_EACH="oj-bind-for-each";const COLUMN="column";const MAX_COLUMNS="max-columns";const DIRECTION="direction";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(){return{"Tsx<oj-form-layout>":this._onForm}}_onForm(ruleCtx,tsxComp){let tsxUtils=ruleCtx.utils.tsxUtils;let val;if(val=tsxUtils.getPropertyRawValue(tsxComp,DIRECTION,true)){if(val!==COLUMN){let maxcol=tsxUtils.getPropertyRawValue(tsxComp,MAX_COLUMNS,true);if(!maxcol||isNaN(maxcol)||maxcol>1){this._walkDomChildren(ruleCtx,tsxComp)}}}}_emit(ruleCtx,tsxComp){let issue=new ruleCtx.Issue(`<oj-form-layout> is meant to have static content only. The use of <${tsxComp.name}> is not supported`);ruleCtx.utils.tsxUtils.setIssuePosition(issue,tsxComp);ruleCtx.reporter.addIssue(issue,ruleCtx)}_walkDomChildren(ruleCtx,comp){var ch,tsxComp,i,ok=true;;if(ch=comp.children){for(i=0;i<ch.length;i++){tsxComp=ch[i];if(tsxComp.name===OJ_BIND_FOR_EACH){ok=false;this._emit(ruleCtx,tsxComp)}else if(tsxComp.name===OJ_BIND_IF){if(tsxComp.children&&tsxComp.children.length>1){ok=false;this._emit(ruleCtx,tsxComp)}}}}return ok}}module.exports=Rule;
6
+ const RULENAME="oj-tsx-form-bindif";const DESCRIPTION="<oj-form-layout> is meant to have static content only. The use of a 'bind' tag - <oj-bind-for-each>, <oj-bind-if>,"+"or <oj-if> - is not supported.<p>"+"The problem with using a 'bind' tag inside a form layout, is that the layout will not be refreshed if "+"its child DOM changes after instantiation (unless the refresh() method on the layout is called). This can result in the "+"layout not managing multiple columns correctly and is therefore not supported.<p>"+"If the 'bind' tag evaluation is fully resolved and will not change before the form is rendered, there will be no problem. "+"Similarly, if the form has only one column of fields, there is unlikely to be any visible issue. "+"If there is the possibility that the expression used to control the bind-if is going to change, then the solution is to put "+"the <oj-form-layout> inside the 'bind' tag' (i.e. split the form layout into multiple layouts and control each as a unit).";const SHORT_DESCRIPTION="The use of <oj-bind-for-each>, <oj-bind-if>, or <oj-if> inside <oj-form-layout> is not supported";const OJ_IF="oj-if";const OJ_BIND_IF="oj-bind-if";const OJ_BIND_FOR_EACH="oj-bind-for-each";const COLUMN="column";const MAX_COLUMNS="max-columns";const DIRECTION="direction";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(){return{"Tsx<oj-form-layout>":this._onForm}}_onForm(ruleCtx,tsxComp){let tsxUtils=ruleCtx.utils.tsxUtils;let val;if(val=tsxUtils.getPropertyRawValue(tsxComp,DIRECTION,true)){if(val!==COLUMN){let maxcol=tsxUtils.getPropertyRawValue(tsxComp,MAX_COLUMNS,true);if(!maxcol||isNaN(maxcol)||maxcol>1){this._walkDomChildren(ruleCtx,tsxComp)}}}}_emit(ruleCtx,tsxComp){let issue=new ruleCtx.Issue(`<oj-form-layout> is meant to have static content only. The use of <${tsxComp.name}> is not supported`);ruleCtx.utils.tsxUtils.setIssuePosition(issue,tsxComp);ruleCtx.reporter.addIssue(issue,ruleCtx)}_walkDomChildren(ruleCtx,comp){var ch,tsxComp,i,ok=true;;if(ch=comp.children){for(i=0;i<ch.length;i++){let name;tsxComp=ch[i];name=tsxComp.name;if(name===OJ_BIND_FOR_EACH){ok=false;this._emit(ruleCtx,tsxComp)}else if(name===OJ_BIND_IF||name===OJ_IF){if(tsxComp.children&&tsxComp.children.length>1){ok=false;this._emit(ruleCtx,tsxComp)}}}}return ok}}module.exports=Rule;
@@ -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 RULENAME="oj-tsx-ojtag-ns";const LONG="Web component namespaces starting with prefixes 'oj-' or 'ns-' must be registered. A component must not use an un-registered namespace.";const SHORT="Web component namespaces starting with prefixes 'oj-' or 'ns-' must be registered.";class Rule{getName(){return RULENAME}getDescription(){return LONG}getShortDescription(){return SHORT}register(regCtx){this._metaLib=regCtx.utils.metaLib;return{"TsxRenderComponent":this._onTsxRC}}_onTsxRC(ruleCtx,tsxRC){tsxRC.components.forEach(tsxComp=>{this._onTag(ruleCtx,tsxComp);if(tsxComp.children){tsxComp.children.forEach(child=>{this._onTag(ruleCtx,child)})}})}_onTag(ruleCtx,tsxComp){var tagName,a,prefix,msg,i;tagName=tsxComp.name;if(!tagName.includes("-")||tagName.startsWith("demo-")||tagName.startsWith("my-")||tagName==="oj-slot"||tsxComp.ojNS||tagName.charAt(0)===tagName.charAt(0).toUpperCase()){return}if(tagName.startsWith("oj-")||tagName.startsWith("ns-")){if(!ruleCtx.utils.metaLib.isNamespaceTag(tagName)){if(!ruleCtx.utils.metaLib.isJetTag(tagName)){msg=`<${tagName}> : unregistered use of '${tagName.substring(0,2)}' namespace`;this._emitIssue(ruleCtx,tsxComp,msg)}}}else{if(this._nameSpaces){a=tagName.split("-");prefix=a[0]+"-"+a[1];for(i=0;i<this._nameSpaces.length;i++){if(this._nameSpaces[i].startsWith(prefix)){return}}}msg=`'${tagName}' : use of unknown web component namespace`;this._emitIssue(ruleCtx,tsxComp,msg,1)}}_emitIssue(ruleCtx,tsxComp,msg,id){var issue;issue=new ruleCtx.Issue(msg);if(id){issue.setMsgKey(`${RULENAME}_${id}`)}ruleCtx.utils.tsxUtils.setIssuePosition(issue,tsxComp);ruleCtx.reporter.addIssue(issue,ruleCtx)}}module.exports=Rule;
6
+ const RULENAME="oj-tsx-ojtag-ns";const LONG="Web component namespaces prefixed by 'oj-' or 'ns-' must be registered via the Namespace Manager - "+"un-registered namespaces should not be used.\n"+"If a user/external component is flagged, the component is not known to JAF. Review the confguration properties 'components' and 'nameSpaces'.";const SHORT="Web component namespaces starting with prefixes 'oj-' or 'ns-' must be registered.";class Rule{getName(){return RULENAME}getDescription(){return LONG}getShortDescription(){return SHORT}register(regCtx){if(this._nameSpaces=regCtx.config.nameSpaces){if(!this._nameSpaces.length){this._nameSpaces=null}}this._metaLib=regCtx.utils.metaLib;return{"TsxRenderComponent":this._onTsxRC}}_onTsxRC(ruleCtx,tsxRC){tsxRC.components.forEach(tsxComp=>{this._onTag(ruleCtx,tsxComp);if(tsxComp.children){tsxComp.children.forEach(child=>{this._onTag(ruleCtx,child)})}})}_onTag(ruleCtx,tsxComp){var tagName,a,prefix,msg,i;tagName=tsxComp.name;if(!tagName.includes("-")||tagName.startsWith("demo-")||tagName.startsWith("my-")||tagName==="oj-slot"||tsxComp.ojNS||tagName.charAt(0)===tagName.charAt(0).toUpperCase()){return}if(tagName.startsWith("oj-")||tagName.startsWith("ns-")){if(!ruleCtx.utils.metaLib.isNamespaceTag(tagName)){if(!ruleCtx.utils.metaLib.isJetTag(tagName)){msg=`<${tagName}> : unregistered use of '${tagName.substring(0,2)}' web component namespace`;this._emitIssue(ruleCtx,tsxComp,msg)}}return}if(this._nameSpaces){a=tagName.split("-");prefix=a[0]+"-"+a[1];for(i=0;i<this._nameSpaces.length;i++){if(this._nameSpaces[i].startsWith(prefix)){return}}}if(!ruleCtx.utils.metaLib.isComponentTag(tagName)){msg=`'${tagName}' : use of unknown web component namespace`;this._emitIssue(ruleCtx,tsxComp,msg,1)}}_emitIssue(ruleCtx,tsxComp,msg,id){var issue;issue=new ruleCtx.Issue(msg);if(id){issue.setMsgKey(`${RULENAME}_${id}`)}ruleCtx.utils.tsxUtils.setIssuePosition(issue,tsxComp);ruleCtx.reporter.addIssue(issue,ruleCtx)}}module.exports=Rule;
@@ -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 RULENAME="oj-tsx-redwood-clear-icon";const DESCRIPTION="For JET components <oj-input-text>, <oj-c-input-text>, <oj-c-input-password>, "+"and <oj-c-input-sensitive>, the 'clear-icon' attribute value 'always' is not permitted using the "+"'redwood-strict' profile'. "+"According to The UX Figma spec \"Only Typing, Focus, and Selection states can show the Clear button. Other "+"states don't show the Clear button since there is no active value to clear/delete.\" The value 'always' would "+"keep the icon showing at all times, while 'conditional' behaves in the manner above.";const SHORT_DESCRIPTION=DESCRIPTION;const ALWAYS="always";const JSX_SPREAD_ATTRIBUTE="JSXSpreadAttribute";class Rule{constructor(){this._first=true}getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;return{"Tsx<oj-input-text clear-icon=>":this._onAttr,"Tsx<oj-c-input-text> clear-icon=>":this._onAttr,"Tsx<oj-c-input-password clear-icon=>":this._onAttr,"Tsx<oj-c-input-sensitive clear-icon=>":this._onAttr}}_onAttr(ruleCtx,tsxProp){if(this._first){this._first=false;if(ruleCtx.utils.configLib.getExtendsProfileName()!=="redwood-strict"){ruleCtx.utils.msgLib.info(`Rule ${RULENAME} has disabled itself - not redwood-strict profile.`);ruleCtx.rulePack.disableRule(RULENAME);return}}if(tsxProp.node.type===JSX_SPREAD_ATTRIBUTE){return}if(this._tsxUtils.isPropertyString(tsxProp)){if(tsxProp.node.value.value===ALWAYS){let issue=new ruleCtx.Issue(`<${ruleCtx.tag}> : profile 'redwood-strict' does not allow 'clear-icon' to be set to 'always'.`);this._tsxUtils.setIssuePropValuePosition(issue,tsxProp);ruleCtx.reporter.addIssue(issue,ruleCtx)}}}}module.exports=Rule;
@@ -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 RULE_NAME="oj-tsx-slot-default";const DESCRIPT="A child component is defined in a component parent's default slot, but the parent does not support default slots.";const SHORT=DESCRIPT;const SLOT="slot";const TEMPLATE="template";const OJ_DEFER="oj-defer";const OJ_BIND_DASH="oj-bind-";const OJ_IF="oj-if";const OJ_REFRESHER="oj-refresher";const OJ_SWITCHER="oj-switcher";const _isExempt=tag=>{return tag===TEMPLATE||tag===OJ_DEFER||tag.startsWith(OJ_BIND_DASH)||tag===OJ_IF||tag===OJ_REFRESHER||tag===OJ_SWITCHER};function Rule(){};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return SHORT};Rule.prototype.getDescription=function(){return DESCRIPT};Rule.prototype.register=function(regCtx){this._metaLib=regCtx.utils.metaLib;this._tsxUtils=regCtx.utils.tsxUtils;return{"TsxWebComponent":this._onWebComp}};Rule.prototype._onWebComp=function(ruleCtx,tsxComp){var tagName=tsxComp.name;if(_isExempt(tagName)){return}if(!ruleCtx.utils.metaLib.hasTagDefaultSlot(tagName)){this._checkChildren(ruleCtx,tsxComp)}};Rule.prototype._checkChildren=function(ruleCtx,tsxComp){var childs,child,node;if((childs=tsxComp.children)&&childs.length){for(child of childs){node=null;if(!this._hasChildSlotAttrib(child)){if(child.name.startsWith(OJ_BIND_DASH)||child.name===TEMPLATE||child.name===OJ_DEFER){node=this._getFirstActiveChild(child)}else{node=child};if(node){if(this._metaLib.isWCTag(node.name)){this._emitIssue(ruleCtx,tsxComp.name,node)}}}}}};Rule.prototype._emitIssue=function(ruleCtx,tagName,child){let issue=new ruleCtx.Issue(`<${tagName}> does not define a default slot but it contains a child <${child.name}>`);issue.setPosition(null,null,child.startIndex,child.endIndex);ruleCtx.reporter.addIssue(issue,ruleCtx)};Rule.prototype._getFirstActiveChild=function(node){if(node.children&&node.children.length){let child;for(child of node.children){if(this._hasChildSlotAttrib(child)){break}if(child.name.startsWith(OJ_BIND_DASH)||child.name===TEMPLATE||child.name===OJ_DEFER){return this._getFirstActiveChild(child)}return child}}return null};Rule.prototype._hasChildSlotAttrib=function(child){var slotName=this._tsxUtils.getPropertyStringValue(child,SLOT);return typeof slotName==="string"&&slotName.length};module.exports=Rule;
@@ -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 getParentNodeForSlot=require("./helpers/tsx/has-slot-name");const RULE_NAME="oj-tsx-slot-pref-content";const DESCRIPT="When component metadata defines 'preferredContent' for a slot, child elements placed into that slot should "+"implement one or more of the requested interfaces and document that through their 'implements' metadata. "+"This rule applies to components that are directly allocated to a slot, or which are direct children "+"of a template allocated to that slot.";const SHORT=DESCRIPT;const IGNORE_TAG=["oj-defer","html","head","body","script"];const TEMPLATE="template";const OJ_SWITCHER="oj-switcher";const OJ_DEFER="oj-defer";const OJ_BIND="oj-bind";const OJ_TOOLBAR="oj-toolbar";const OJ_LABEL="oj-label";const OJ_BIND_SLOT="oj-bind-slot";const DIV="div";const SPAN="span";const TAG="tag";const SLOT="slot";const _isBindTag=tagName=>{return tagName.startsWith("oj-bind")};const _ignoreTag=tagName=>{return IGNORE_TAG.includes(tagName)||tagName.startsWith("oj-bind")};class Rule{getName(){return RULE_NAME}getDescription(){return DESCRIPT}getShortDescription(){return SHORT}register(regCtx){this._utils=regCtx.utils.utils;this._metaLib=regCtx.utils.metaLib;this._tsxUtils=regCtx.utils.tsxUtils;this._hasJetWCInterfaces=this._metaLib.hasJetWCInterfaces();return{"TsxRenderComponent":this._onTsxRC,"TsxFunction":this._noteFunc}}_noteFunc(ruleCtx,tsxFunc){if(!this._tsxFuncs){this._tsxFuncs={}}this._tsxFuncs[tsxFunc.name]=tsxFunc}_onTsxRC(ruleCtx,tsxRC){tsxRC.components.forEach(tsxComp=>{this._checkComp(ruleCtx,tsxComp)})}_checkComp(ruleCtx,tsxComp){var tagName=tsxComp.name;var isTag;if(!(isTag=this._metaLib.isWCTag(tagName))){if(isTag=this._tsxUtils.isCommonElem(tagName)||tagName==="template"){isTag=!_ignoreTag(tagName)}}if(isTag){this._checkTag(ruleCtx,tsxComp)}if(tsxComp.children){tsxComp.children.forEach(child=>{this._checkComp(ruleCtx,child)})}}_checkTag(ruleCtx,tsxComp){var tsxProp,slotx,slotName="";this._slotDefined=false;if(tsxProp=this._tsxUtils.getProperty(tsxComp,SLOT)){if(this._tsxUtils.isPropertyString(tsxProp)){slotx=this._tsxUtils.getPropertyRawValue(tsxComp,SLOT,true)}}if(slotx||slotx===""){slotName=slotx;this._slotDefined=true}this._onSlot(ruleCtx,tsxComp,SLOT,slotName)}_onSlot(ruleCtx,tsxComp,slotAttr,slotName){var pnode,psc;var slotTag=tsxComp.name;var tsxProp;if(slotName&&tsxComp.name===OJ_BIND_SLOT){return}if(!(pnode=getParentNodeForSlot(ruleCtx,tsxComp,slotName))){return}if(pnode.name===OJ_SWITCHER||!this._metaLib.isWCTag(pnode.name)){return}if(this._metaLib.isJetTag(pnode.name)&&!this._hasJetWCInterfaces){return}psc=this._metaLib.getPreferredSlotContentEx(pnode.name,slotName);if(!(psc&&psc.interfaces)){return}if(slotTag==="oj-vb-fragment"||slotTag==="oj-module"){return}if(slotTag.startsWith(OJ_BIND)||slotTag===OJ_DEFER||slotTag===TEMPLATE||slotTag===DIV){let child;if(!(child=this._getFirstChildTag(tsxComp.children))||!this._isSlotInterfaceSupported(child,psc)){if(slotTag===TEMPLATE){if(tsxProp=this._tsxUtils.getProperty(tsxComp,"render")){let handlerFunc;if(handlerFunc=this._getRenderHandlerFunc(tsxProp)){if(!this._renderHandlerSupportsInterface(tsxProp,handlerFunc,psc)){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,4)}return}}}if(child?.name!==SPAN){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,2)}}return}if(this._tsxUtils.isCommonElem(slotTag)){if(pnode.name!==OJ_TOOLBAR&&slotName!==SPAN){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,3)}return}if(this._metaLib.isWCTag(slotTag)){if(!_isBindTag(slotTag)&&slotTag!==OJ_DEFER&&slotTag!==TEMPLATE){if(!this._isSlotInterfaceSupported(tsxComp,psc)){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,1)}}}}_renderHandlerSupportsInterface(tsxProp,handlerFunc,psc){if(this._tsxFuncs&&handlerFunc){let tsxComp;let tsxFunc=this._tsxFuncs[handlerFunc];if(tsxFunc&&tsxFunc.returns){for(let i=0;i<tsxFunc.returns.length;i++){if(tsxComp=tsxFunc.returns[i].tsxComponent){let retComp=tsxComp.name;if(this._isSlotInterfaceSupported(tsxComp,psc)){return true}}}}}return false}_isSlotInterfaceSupported(tsxComp,psc){var ret,aIfc;if(aIfc=this._metaLib.getInterfaces(tsxComp.name)){for(let ifc of aIfc){if(psc.interfaces.includes(ifc)){ret=true;break}}}return ret}_getRenderHandlerFunc(tsxProp){var func;var value=tsxProp.node.value;if(value.type==="JSXExpressionContainer"){if(value?.expression?.type==="Identifier"){func=value.expression.name}}return func}_emitIssue(ruleCtx,tsxComp,slotName,slotOwner,psci,issueType){var ifc=_list(psci.interfaces,"or");var comp=psci.components?` (e.g. ${_list(psci.components,"or",true)})`:"";var multi=psci.interfaces.length>1;var actualSlot=slotName;var slotName=slotName?`slot '${slotName}'`:"default slot";var tagName=tsxComp.name;var isDefSlot=!slotName;var issue,msg;if(issueType===1){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but does not implement interface${multi?"s":""} ${ifc}${comp}`}else if(issueType===2){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but its first child does not implement interface${multi?"s":""} ${ifc}${comp}`}else if(issueType===3){msg=`${slotName} on <${tagName}> for <${slotOwner}> cannot provide ${multi?"interfaces":"an interface"} of type ${ifc}${comp}`}else if(issueType===4){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but its render attribute does not implement interface${multi?"s":""} ${ifc}${comp}`}else{return}issue=new ruleCtx.Issue(msg);if(issueType===4){issue.setMsgKey(RULE_NAME+"_1")}if(this._slotDefined){let tsxProp=this._tsxUtils.getProperty(tsxComp,SLOT);this._tsxUtils.setIssuePosition(issue,tsxProp)}issue.setMsgEx({slotName:actualSlot,slotElem:tagName.name,slotOwner:slotOwner});ruleCtx.reporter.addIssue(issue,ruleCtx)}_getFirstChildTag(childs){var ret,childs,child;if(childs){for(let i=0;i<childs.length;i++){child=childs[i];if(child.name.startsWith("oj-bind-")||child.name===OJ_DEFER||child.name===TEMPLATE){return this._getFirstChildTag(child.children)}ret=child;break}}return ret}}function _list(a,orand,isComp){var s="";for(let i=0;i<a.length;i++){if(i){if(i===a.length-1){s+=(isComp?">":"'")+" "+orand+" "}else{s+=(isComp?">":"'")+", "}}s+=(isComp?"<":"'")+a[i]}return s?s+=isComp?">":"'":s};module.exports=Rule;
6
+ const getParentNodeForSlot=require("./helpers/tsx/has-slot-name");const RULE_NAME="oj-tsx-slot-pref-content";const DESCRIPT="When component metadata defines 'preferredContent' for a slot, child elements placed into that slot should "+"implement one or more of the requested interfaces and document that through their 'implements' metadata. "+"This rule applies to components that are directly allocated to a slot, or which are direct children "+"of a template allocated to that slot.";const SHORT=DESCRIPT;const IGNORE_TAG=["oj-defer","html","head","body","script"];const FLATTENABLE_TAGS=["div","oj-bind-if","oj-bind-for-each","oj-defer","template","oj-refresher","oj-validation-group","span","p"];const TEMPLATE="template";const OJ_SWITCHER="oj-switcher";const OJ_IF="oj-if";const OJ_DEFER="oj-defer";const OJ_BIND="oj-bind";const OJ_TOOLBAR="oj-toolbar";const OJ_BIND_SLOT="oj-bind-slot";const OJ_MODULE="oj-module";const OJ_VB_FRAGMENT="oj-vb-fragment";const DIV="div";const SPAN="span";const SLOT="slot";const _isBindTag=tagName=>{return tagName.startsWith("oj-bind")};const _ignoreTag=tagName=>{return IGNORE_TAG.includes(tagName)||tagName.startsWith("oj-bind")};const _isExempt=tagName=>{return tagName===OJ_VB_FRAGMENT||tagName===OJ_MODULE};class Rule{getName(){return RULE_NAME}getDescription(){return DESCRIPT}getShortDescription(){return SHORT}register(regCtx){this._utils=regCtx.utils.utils;this._metaLib=regCtx.utils.metaLib;this._tsxUtils=regCtx.utils.tsxUtils;this._hasJetWCInterfaces=this._metaLib.hasJetWCInterfaces();return{"TsxRenderComponent":this._onTsxRC,"TsxFunction":this._noteFunc}}_noteFunc(ruleCtx,tsxFunc){if(!this._tsxFuncs){this._tsxFuncs={}}this._tsxFuncs[tsxFunc.name]=tsxFunc}_onTsxRC(ruleCtx,tsxRC){tsxRC.components.forEach(tsxComp=>{this._checkComp(ruleCtx,tsxComp)})}_checkComp(ruleCtx,tsxComp){var tagName=tsxComp.name;var isTag;if(!(isTag=this._metaLib.isWCTag(tagName))){if(isTag=this._tsxUtils.isCommonElem(tagName)||tagName==="template"){isTag=!_ignoreTag(tagName)}}if(isTag){this._checkTag(ruleCtx,tsxComp)}if(tsxComp.children){tsxComp.children.forEach(child=>{this._checkComp(ruleCtx,child)})}}_checkTag(ruleCtx,tsxComp){var tsxProp,slotx,slotName="";this._slotDefined=false;if(tsxProp=this._tsxUtils.getProperty(tsxComp,SLOT)){if(this._tsxUtils.isPropertyString(tsxProp)){slotx=this._tsxUtils.getPropertyRawValue(tsxComp,SLOT,true)}}if(slotx||slotx===""){slotName=slotx;this._slotDefined=true}this._onSlot(ruleCtx,tsxComp,slotName)}_onSlot(ruleCtx,tsxComp,slotName){var pnode,slotTag=tsxComp.name,psc,tsxProp;if(slotName&&tsxComp.name===OJ_BIND_SLOT){return}if(!(pnode=getParentNodeForSlot(ruleCtx,tsxComp,slotName))){return}if(!this._metaLib.isWCTag(pnode.name)){return}if(this._metaLib.isJetTag(pnode.name)&&!this._hasJetWCInterfaces){return}psc=this._metaLib.getPreferredSlotContentEx(pnode.name,slotName);if(!(psc&&psc.interfaces)){return}if(_isExempt(slotTag)){return}if(slotTag===DIV||slotTag===OJ_IF||slotTag===OJ_SWITCHER||slotTag.startsWith(OJ_BIND)||slotTag===OJ_DEFER||slotTag===TEMPLATE){let childs;if(childs=this._flattenDivChildren(psc,pnode,tsxComp,slotName)){let child;for(let i=0;i<childs.length;i++){child=childs[i];if(!_isExempt(child.name)){if(this._tsxUtils.getProperty(child,SLOT)){continue}if(!this._isSlotInterfaceSupported(child,psc)){this._emitIssue(ruleCtx,child,slotName,pnode.name,psc,1)}}};return}else{if(slotTag===TEMPLATE){if(tsxProp=this._tsxUtils.getProperty(tsxComp,"render")){let handlerFunc;if(handlerFunc=this._getRenderHandlerFunc(tsxProp)){if(!this._renderHandlerSupportsInterface(tsxProp,handlerFunc,psc)){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,4)}return}}}this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,2)}if(slotTag===OJ_SWITCHER||slotTag===OJ_IF){return}}if(this._tsxUtils.isCommonElem(slotTag)){if(pnode.name!==OJ_TOOLBAR&&slotName!==SPAN){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,3)}return}if(this._metaLib.isWCTag(slotTag)){if(!_isBindTag(slotTag)&&slotTag!==OJ_DEFER&&slotTag!==TEMPLATE){if(!this._isSlotInterfaceSupported(tsxComp,psc)){this._emitIssue(ruleCtx,tsxComp,slotName,pnode.name,psc,1)}}}}_renderHandlerSupportsInterface(tsxProp,handlerFunc,psc){if(this._tsxFuncs&&handlerFunc){let tsxComp;let tsxFunc=this._tsxFuncs[handlerFunc];if(tsxFunc&&tsxFunc.returns){for(let i=0;i<tsxFunc.returns.length;i++){if(tsxComp=tsxFunc.returns[i].tsxComponent){let retComp=tsxComp.name;if(this._isSlotInterfaceSupported(tsxComp,psc)){return true}}}}}return false}_isSlotInterfaceSupported(tsxComp,psc){var ret,aIfc;if(aIfc=this._metaLib.getInterfaces(tsxComp.name)){for(let ifc of aIfc){if(psc.interfaces.includes(ifc)){ret=true;break}}}return ret}_getRenderHandlerFunc(tsxProp){var func;var value=tsxProp.node.value;if(value.type==="JSXExpressionContainer"){if(value?.expression?.type==="Identifier"){func=value.expression.name}}return func}_flattenDivChildren(psc,pnode,tagNode,slotName,children){var nodes,node,tagName,i;if((nodes=tagNode.children)&&nodes.length){for(i=0;i<nodes.length;i++){node=nodes[i];if(node.type!=="TsxComponent"){continue}tagName=node.name;if(FLATTENABLE_TAGS.includes(tagName)){if(!this._tsxUtils.isPropertyString(node,SLOT)){children=this._flattenDivChildren(psc,pnode,node,slotName,children)}continue}if(!children){children=[]}children.push(node)}}return children}_emitIssue(ruleCtx,tsxComp,slotName,slotOwner,psci,issueType){var ifc=_list(psci.interfaces,"or");var comp=psci.components?` (e.g. ${_list(psci.components,"or",true)})`:"";var multi=psci.interfaces.length>1;var actualSlot=slotName;var slotName=slotName?`slot '${slotName}'`:"default slot";var tagName=tsxComp.name;var isDefSlot=!slotName;var issue,msg;if(issueType===1){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but does not implement interface${multi?"s":""} ${ifc}${comp}`}else if(issueType===2){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but its first child does not implement interface${multi?"s":""} ${ifc}${comp}`}else if(issueType===3){msg=`${slotName} on <${tagName}> for <${slotOwner}> cannot provide ${multi?"interfaces":"an interface"} of type ${ifc}${comp}`}else if(issueType===4){msg=`<${tagName}> is in${isDefSlot?" the":""} ${slotName} of <${slotOwner}> but its render attribute does not implement interface${multi?"s":""} ${ifc}${comp}`}else{return}issue=new ruleCtx.Issue(msg);if(issueType===4){issue.setMsgKey(RULE_NAME+"_1")}if(this._slotDefined){let tsxProp=this._tsxUtils.getProperty(tsxComp,SLOT);if(tsxProp){this._tsxUtils.setIssuePosition(issue,tsxProp)}}issue.setMsgEx({slotName:actualSlot,slotElem:tagName,slotOwner:slotOwner});ruleCtx.reporter.addIssue(issue,ruleCtx)}_getFirstChildTag(childs){var ret,childs,child;if(childs){for(let i=0;i<childs.length;i++){child=childs[i];if(child.name.startsWith("oj-bind-")||child.name===OJ_DEFER||child.name===TEMPLATE){return this._getFirstChildTag(child.children)}ret=child;break}}return ret}}function _list(a,orand,isComp){var s="";for(let i=0;i<a.length;i++){if(i){if(i===a.length-1){s+=(isComp?">":"'")+" "+orand+" "}else{s+=(isComp?">":"'")+", "}}s+=(isComp?"<":"'")+a[i]}return s?s+=isComp?">":"'":s};module.exports=Rule;
@@ -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{LENGTH_MEMBER_PROP_SET}=require("./helpers/cssHelper");const RULENAME="oj-tsx-style-abs-units";const DESCRIPTION="In general it is preferable to use relative length units in place of absolute units. "+"Specifically, 'rem' units are recommended because they proportionately adjust to the root "+"font size. 'rem' can be used for anything that takes a length unit - e.g. font-size, line-height, "+"width, height, padding, margin, etc. However, there are cases where absolute units are "+"required. This project is configured to allow absolute units in selector names that include "+"one of the following terms: 'image, and 'picture'.";const SHORT_DESCRIPTION="In general it is preferable to use relative length units in place of absolute units.";const ABS_UNITS=["px","cm","mm","in","pt","pc","all"];const COLON=":";const ALL="all";const NUMBER="number";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;if(!this._checkRuleOptions(regCtx)){return false}return{"Tsx<style=>":this._onStyle}}_onStyle(ruleCtx,tsxProp){var prop,values,val,unit;this._CssUtils=ruleCtx.utils.CssUtils;if((values=this._tsxUtils.getPropertyStringValue(tsxProp))!==null){values=_convertToObj(values)}else{values=this._tsxUtils.getExpressionObject(tsxProp)}if(values){let style;for(style in values){if(val=values[style]){if(!LENGTH_MEMBER_PROP_SET.has(style)){continue}{if(unit=_hasAbsUnits(val)){this._prop(ruleCtx,style,val,unit)}}}}}}_prop(ruleCtx,prop,val,unit){var m,qty,s,i;m=val.match(/[0-9]+(px|cm|mm|in|pt|pc)/g);if(m&&m.length){for(i=0;i<m.length;i++){s=m[i];unit=s.substring(s.length-2);qty=s.substring(0,s.length-unit.length);qty=parseInt(qty);if(!this._okThreshold(unit,qty)||qty===0){this._emitIssue(ruleCtx,prop,m[i],unit,qty)}}}else if(_isExpr(val)){this._emitIssue2(ruleCtx,prop,val,unit)}}_emitIssue(ruleCtx,prop,val,unit,qty){var issue,unit;if(qty){issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: replace absolute unit '${unit}' with a relative unit (e.g. 'rem' or '%')`)}else{issue=new ruleCtx.Issue(`style '${prop}' value '${val}' - best practices: remove '${unit}' for zero quantity`);issue.setMsgKey(RULENAME+"_1");issue.setSeverity("minor")}if(issue){this._reportIssue(ruleCtx,issue)}}_emitIssue2(ruleCtx,prop,val,unit){var issue;issue=new ruleCtx.Issue(`style '${prop}' expression '${val}' generates a '${unit}' length - best practices: convert to a relative unit (e.g. 'rem' or '%')`);issue.setMsgKey(RULENAME+"_2");this._reportIssue(ruleCtx,issue)}_reportIssue(ruleCtx,issue){this._tsxUtils.setIssuePosition(issue,ruleCtx.node);ruleCtx.reporter.addIssue(issue,ruleCtx)}_okThreshold(unit,qty){var th;if(!this._unitOpts||typeof qty!==NUMBER){return true}th=this._unitOpts[unit];if(th===undefined){th=this._unitOpts[ALL]}return th?Math.abs(qty)<=th:true}_checkRuleOptions(regCtx){var units,unit,th,b,customOpts;if(customOpts=regCtx.ruleOpts.customOpts){if(units=customOpts.absunits){if(!regCtx.utils.utils.isObject(units)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' is not an object`);this._fail=true;return false}for(unit in units){if(!ABS_UNITS.includes(unit)){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' value '${unit}' is not absolute`);b=true;continue}if(units.hasOwnProperty(unit)){th=units[unit];if(typeof th!==NUMBER){regCtx.utils.msgLib.error(`Rule ${regCtx.ruleName} : option 'absunits' threshold '${th}' is not a number`);b=true}}}this._unitOpts=units}}return!b}}function _convertToObj(s){var a,x,elem,prop,val,n=0,obj={};a=s.split(";");if(a?.length){for(i=0;i<a.length;i++){elem=a[i];if((x=elem.indexOf(COLON))>0){prop=elem.substring(0,x).trimEnd();val=elem.substring(x+1).trimStart();n++;obj[prop]=val}}}return n?obj:null}function _hasAbsUnits(s){var expr,unit,start,end,i,x;for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit!==ALL&&s.includes(unit)){return unit}}expr=_isExpr(s);if(!expr){return false}for(i=0;i<ABS_UNITS.length;i++){unit=ABS_UNITS[i];if(unit===ALL){continue}x=s.indexOf(unit);if(x>=0){end=s[x+1];start=s[x-1].toLowerCase();if(start==="."||start==="+"||start.match(/[a-z]/i)){continue}return unit}}return false};function _isExpr(s){return s.includes("$")};module.exports=Rule;
@@ -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 RULENAME="oj-tsx-style-bp-margin-padding";const DESCRIPTION="For best practices, margin/padding classes such as 'oj-sm-margin-4x' and 'oj-sm-padding-4x' are preferred "+"over numeric values. See the "+"<a href='https://jet.oraclecorp.com/trunk/jetCookbook.html?component=spacing&demo=spacingvariants'>Margins & Padding</a> "+"demo category in the JET cookbook under the Framework Utility CSS category.\n"+"Negative values are not supported.";const SHORT_DESCRIPTION="For best practices, margin classes such as 'oj-sm-margin-4x' and padding classes such as 'oj-sm-padding-4x' are preferred. .";const MARGIN="margin";const PADDING="padding";const MARGIN_BLOCK="margin-block";const PADDING_BLOCK="padding-block";const OJ_SM_MARGIN="oj-sm-margin-";const OJ_SM_PADDING="oj-sm-padding-";const MARGIN_PROPS=[MARGIN,"margin-top","margin-right","margin-bottom","margin-left","marginTop","marginRight","marginBottom","marginLeft","margin-block","margin-block-start","margin-block-end","margin-inline","margin-inline-start","margin-inline-end","marginBlock","marginBlockStart","marginBlockEnd","marginInline","marginInlineStart","marginInlineEnd"];const PADDING_PROPS=[PADDING,"padding-top","padding-right","padding-bottom","padding-left","paddingTop","paddingRight","paddingBottom","paddingLeft","padding-block","padding-block-start","padding-block-end","padding-inline","padding-inline-start","padding-inline-end","paddingBlock","paddingBlockStart","paddingBlockEnd","paddInline","paddingInlineStart","paddingInlineEnd"];const NON_LENGTH=["auto","initial","inherit"];const PX="px";const MIN_PX=4;const MAX_PX=48;const REM="rem";const MIN_REM=0.25;const MAX_REM=12;const EM="em";const MIN_EM=0.25;const MAX_EM=12;const COLON=":";class Rule{getName(){return RULENAME}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){this._tsxUtils=regCtx.utils.tsxUtils;return{"Tsx<style=>":this._onStyle}}_onStyle(ruleCtx,tsxProp){var prop,values;this._CssUtils=ruleCtx.utils.CssUtils;if((values=this._tsxUtils.getPropertyStringValue(tsxProp))!==null){values=_convertToObj(values)}else if(!(values=this._tsxUtils.getExpressionObject(tsxProp))){return}if(values){let style,val;for(style in values){if(val=values[style]){if(MARGIN_PROPS.includes(style)||PADDING_PROPS.includes(style)){this._onProp(ruleCtx,style,val)}}}}}_onProp(ruleCtx,prop,value){if(NON_LENGTH.includes(value)||value.endsWith("%")){return}let a,x;a=value.split(" ");if(prop===MARGIN||prop===PADDING){a.forEach(val=>{if(!(val.startsWith(OJ_SM_MARGIN)||val.startsWith(OJ_SM_PADDING))){this._handleProp(ruleCtx,prop,val)}})}else if(prop.startsWith(MARGIN_BLOCK)||prop.startsWith(PADDING_BLOCK)){this._handleBlock(ruleCtx,prop,value)}else{this._handleProp(ruleCtx,prop,value)}}_handleProp(ruleCtx,prop,value){let numVal=parseFloat(value);if(!isNaN(numVal)){if(value.endsWith("px")){this._checkPxRange(ruleCtx,prop,numVal)}else if(value.endsWith("rem")){this._checkRemRange(ruleCtx,prop,numVal)}else if(value.endsWith("em")){this._checkEmRange(ruleCtx,prop,numVal)}else if(""+numVal===value){this._checkNoUnit(ruleCtx,prop,numVal)}}}_handleBlock(ruleCtx,prop,value){var a,val,i;a=value.split(" ");for(i=0;i<a.length;i++){if(val=a[i]){this._handleProp(ruleCtx,prop,val)}}}_checkPxRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,PX,value);return}if(value<MIN_PX||value>MAX_PX){return}this._emitIssue(ruleCtx,1,prop,PX,value)}_checkRemRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,REM,value);return}if(value<MIN_REM||value>MAX_REM){return}this._emitIssue(ruleCtx,1,prop,REM,value)}_checkEmRange(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,EM,value);return}if(value<MIN_EM||value>MAX_EM){return}this._emitIssue(ruleCtx,1,prop,EM,value)}_checkNoUnit(ruleCtx,prop,value){if(value<0&&(PADDING_PROPS.includes(prop)||MARGIN_PROPS.includes(prop))){this._emitIssue(ruleCtx,2,prop,"",value)}if(value>0){this._emitIssue(ruleCtx,3,prop,"",value)}if(value<MIN_PX||value<MIN_REM||value<MIN_EM||value>MAX_PX||value>MIN_REM||value>MIN_EM){return}}_emitIssue(ruleCtx,msgType,prop,unit,value,min,max){var issue;if(msgType===1){issue=new ruleCtx.Issue(`style '${prop}' value ${value}${unit} - for best practice margin/padding classes such as 'oj-sm-margin-*/oj-sm-padding-*' are preferred.`)}else if(msgType===2){issue=new ruleCtx.Issue(`style '${prop}' value ${value}${unit} must not be negative.`);issue.setMsgKey(RULENAME+"_1")}else if(msgType===3){issue=new ruleCtx.Issue(`style '${prop}' value ${value} should declare a unit.`);issue.setMsgKey(RULENAME+"_2")}if(issue){this._tsxUtils.setIssuePosition(issue,ruleCtx.node);ruleCtx.reporter.addIssue(issue,ruleCtx)}}}function _convertToObj(s){var a,x,elem,prop,val,n=0,obj={};a=s.split(";");if(a?.length){for(i=0;i<a.length;i++){elem=a[i];if((x=elem.indexOf(COLON))>0){prop=elem.substring(0,x).trimEnd();val=elem.substring(x+1).trimStart();n++;obj[prop]=val}}}return n?obj:null}module.exports=Rule;
@@ -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 RULE="oj-tsx-wctag-maintenance";const DESCRIPTION="A notification that the component is in 'maintenance' status. This indicates "+"that the component is fully supported, but will be deprecated in a future release "+"and has no new features planned for it.";const SHORT_DESCRIPTION="The component is in 'maintenance' status and will be deprecated in a future release.";const MSG="<%c> is in 'maintenance' status%s.%d";const MAINTENANCE="maintenance";class Rule{getName(){return RULE}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._getOverrides(regCtx)){return false}this._metaLib=regCtx.utils.metaLib;return{TsxWebComponent:this._onTag}}_onTag(ruleCtx,tsxComp){var stats,status,tagName;if(this._isIgnoreFile(ruleCtx.filepath)){return}tagName=tsxComp.name;if((stats=this._metaLib.getTagStatus(tagName,MAINTENANCE))&&stats.length){let msg=MSG.replace("%c",tagName);;status=stats[0];if(status.since){msg=msg.replace("%s",` (since ${status.since})`)}if(status.description){msg=msg.replace("%d",` ${status.description}`);if(!msg.endsWith(".")){msg+="."}}else{msg=msg.replace("%d","")}if(status.value?.length){let repl="<"+status.value.join(">, <")+">";msg+=` Superseded by ${repl}.`}let issue=new ruleCtx.Issue(msg);ruleCtx.reporter.addIssue(issue,ruleCtx)}}_isIgnoreFile(file){if(this._ignoreFiles){for(let i=0;i<this._ignoreFiles.length;i++){if(this._ignoreFiles[i].test(file)){return true}}}return false}_getOverrides(regCtx){var files,custOpts,files;if(!(custOpts=regCtx.ruleOpts.customOpts)){return true}if(!(files=custOpts.files)){return true}if(!Array.isArray(files)){regCtx.utils.msgLib.error(`Rule ${RULE} : config option 'files' is not an array`);return false}let ignoreFiles=[];for(let i=0;i<files.length;i++){if(typeof files[i]==="string"){try{ignoreFiles[i]=new RegExp(files[i].trim())}catch(e){regCtx.utils.msgLib.error(`Config 'ruleMods' ${RULE} 'files' entry [${i}]: ${e.message}`);return false}}}if(ignoreFiles.length){this._ignoreFiles=ignoreFiles}return true}}module.exports=Rule;
6
+ const RULE="oj-tsx-wctag-maintenance";const DESCRIPTION="A notification that the component is in 'maintenance' status. This indicates "+"that the component is fully supported, but will be deprecated in a future release "+"and has no new features planned for it.";const SHORT_DESCRIPTION="The component is in 'maintenance' status and will be deprecated in a future release.";const MSG="<%c> is in 'maintenance' status%s.%d";const MAINTENANCE="maintenance";class Rule{getName(){return RULE}getDescription(){return DESCRIPTION}getShortDescription(){return SHORT_DESCRIPTION}register(regCtx){if(!this._getOverrides(regCtx)){return false}this._metaLib=regCtx.utils.metaLib;return{TsxWebComponent:this._onTag}}_onTag(ruleCtx,tsxComp){var tagName,stats,status,repl,msgObj;if(this._isIgnoreFile(ruleCtx.filepath)){return}tagName=tsxComp.name;if((stats=this._metaLib.getTagStatus(tagName,MAINTENANCE))&&stats.length){let msg=MSG.replace("%c",tagName);;status=stats[0];if(status.since){msg=msg.replace("%s",` (since ${status.since})`)}if(status.description){msg=msg.replace("%d",` ${status.description}`);if(!msg.endsWith(".")){msg+="."}}else{msg=msg.replace("%d","")}if(status.value?.length){repl="<"+status.value.join(">, <")+">";msg+=` Superseded by ${repl}.`}let issue=new ruleCtx.Issue(msg);msgObj={tag:tagName};if(repl){msgObj.supersededBy=status.value}issue.setMsgEx(msgObj);ruleCtx.reporter.addIssue(issue,ruleCtx)}}_isIgnoreFile(file){if(this._ignoreFiles){for(let i=0;i<this._ignoreFiles.length;i++){if(this._ignoreFiles[i].test(file)){return true}}}return false}_getOverrides(regCtx){var files,custOpts,files;if(!(custOpts=regCtx.ruleOpts.customOpts)){return true}if(!(files=custOpts.files)){return true}if(!Array.isArray(files)){regCtx.utils.msgLib.error(`Rule ${RULE} : config option 'files' is not an array`);return false}let ignoreFiles=[];for(let i=0;i<files.length;i++){if(typeof files[i]==="string"){try{ignoreFiles[i]=new RegExp(files[i].trim())}catch(e){regCtx.utils.msgLib.error(`Config 'ruleMods' ${RULE} 'files' entry [${i}]: ${e.message}`);return false}}}if(ignoreFiles.length){this._ignoreFiles=ignoreFiles}return true}}module.exports=Rule;
@@ -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
- {"title":"JET Built-in Rulepack","version":"4.14.0","prefix":"JET","rules":{"oj-html-cca-tagname":{"severity":"minor","filetype":"html","group":["jet-html"],"status":"production"},"oj-acc-aria-ojselector-labelledby":{"severity":"blocker","filetype":"html","group":["jet-html","jet-aria","jet-acc"],"jetver":">=13.0.0","status":"production","enabled":true},"oj-html-ojtag-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-wctag-maintenance":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=13.0.0","status":"production"},"oj-html-wctag-supersedes":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=13.0.0","status":"production","enabled":false},"oj-html-wctag-anti-pattern":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=15.0.0","amd":false,"status":"production"},"oj-html-prop-anti-pattern":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=15.0.0","amd":false,"status":"production"},"oj-html-ojattr":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=6.0.0","status":"production"},"oj-html-ojattr-520":{"severity":"critical","filetype":"html","group":"jet-html","jetver":"5.2.0","status":"production"},"oj-html-ojattr-value":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-2def":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-prefix-ro":{"severity":"info","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-prefix-expr":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-json":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojattr-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-ojattr-enum-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-5-tag-obs":{"severity":"major","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-5-attr-obs":{"severity":"major","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-ojevent":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-event-focus-blur":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-form-noflex":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-jq-databind":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-databind-all":{"severity":"minor","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-bindif-test":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-bindforeach-data":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojslot":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-name":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-slot-pref-content":{"severity":"minor","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-slot-default":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-item-minmax":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-notag-style":{"severity":"info","filetype":"html","group":"jet-html","status":"beta"},"oj-html-style":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production","enabled":false},"oj-html-stylesel":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production","enabled":false},"oj-html-style-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"jetver":">=9.0.0","status":"production"},"oj-html-ojstyle":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production","enabled":false},"oj-html-style-bp-color":{"severity":"major","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-bp-font":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-bp-font-family":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","customOpts":{"ignore":["inherit","initial"]},"enabled":false},"oj-html-style-bp-display":{"severity":"minor","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-abs-units":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"production","customOpts":{"absunits":{"all":2}},"enabled":false},"oj-html-no-style":{"severity":"major","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-no-style-tag":{"severity":"major","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-pageopts-type":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-binding-attr":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-$unique":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-req":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-dlg-title":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojattr-evt-syntax":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-tag-attr-noprefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-picker-attrs":{"jetver":">=11.0.0","severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-rating-gauge-size":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood","status":"production"},"oj-html-rating-gauge-track-resize":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood","status":"production"},"oj-html-label-for-prefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-binding-as-slot-child":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-globattr-noprefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-nonglobattr-prefix":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-msgs-cat-text":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood"},"oj-html-ojtag-datacmd":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-datactx":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-ns":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-tabbar-edge":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=15.0.0","status":"production"},"oj-html-wctag-id":{"severity":"blocker","filetype":"html","group":"jet-html","status":"deprecated"},"oj-html-wctag-for":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-nested":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-packprivate":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-form-bindif":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-file-pick-accept":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-arialabelledby":{"severity":"blocker","filetype":"html","group":["jet-html","jet-aria","jet-acc"],"status":"production"},"oj-html-wctag-$props":{"severity":"blocker","filetype":"html","amd":false,"group":"jet-html","status":"production"},"oj-html-attr-expr-delims":{"severity":"major","filetype":"html","group":["jet-html"],"status":"production"},"oj-html-attr-expr-writeback":{"severity":"minor","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":true},"oj-html-unsup-theme":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-cca-count":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-redwood-cssvars":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-redwood-cssnovars":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-redwood-bp-endslot":{"severity":"major","filetype":"html","group":["jet-redwood-bp","jet-html"],"theme":"Redwood","jetver":">=10.0.0","status":"production"},"oj-css-bp-dir-flow":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-color":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-font":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-font-family":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","customOpts":{"ignore":["inherit","initial"]},"enabled":false},"oj-css-style-bp-display":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-override":{"severity":"blocker","filetype":["css","html"],"group":["jet-css","jet-override"],"status":"production"},"oj-css-var-override":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-override","jet-bp"],"jetver":">=9.0.0","status":"production","enabled":false},"oj-css-style-deprecated":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-deprecated"],"jetver":">=9.0.0","status":"production"},"oj-css-style-abs-units":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"production","customOpts":{"absunits":{"all":2}},"enabled":false},"oj-css-bp-float":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-css-bp-textalign":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-css-bp-border-color":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-html-invalid-doctype":{"severity":"blocker","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-missing-doctype":{"severity":"blocker","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-oj-lib":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ko-comment":{"severity":"major","filetype":"html","group":"jet-html","status":"beta"},"oj-html-ko-databind":{"severity":"major","filetype":"html","group":"jet-html","status":"beta"},"oj-html-cdn":{"severity":"minor","filetype":"html","group":"jet-html","status":"production","amd":false,"enabled":false},"oj-html-self-close":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-input-isodate":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-dyn-form":{"severity":"blocker","filetype":"html","group":"jet-html","status":"beta","enabled":false,"inservice":false},"oj-form-maxcols":{"severity":"major","filetype":["html","json"],"group":["jet-html","jet-json"],"status":"production"},"oj-html-form-layout-maxcols":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-template-index":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production"},"oj-html-treeview-actionable-content":{"severity":"blocker","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"beta"},"oj-html-alta-deprecated":{"severity":"blocker","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-cca-compjson-bp-obj":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-ar":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-jetver":{"severity":"major","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-dsplyname":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-ns-reg":{"severity":"blocker","filetype":"json","group":"jet-cca","status":"production"},"oj-acc-select-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-combobox-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-input-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-aria-labelledby":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-avatar-aria-role":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-aria-prop":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-film-strip-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-button-onclick":{"severity":"blocker","filetype":"html","group":"jet-acc","status":"production"},"oj-js-ojcomp-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"production","enabled":false},"oj-js-comp-meth-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated","jet-deleted"],"status":"production"},"oj-ts-comp-meth-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated","jet-deleted"],"amd":false,"status":"beta","enabled":false},"oj-js-comp-attr-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated","jet-deleted"],"status":"production"},"oj-ts-comp-attr-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated","jet-deleted"],"amd":false,"status":"beta","enabled":false},"oj-js-numconv-pattern":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-js-var-undef":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production","enabled":false},"oj-js-ojcomp-new":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-new":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"beta","enabled":false},"oj-js-ojcomp-exist":{"severity":"critical","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-exist":{"severity":"critical","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"beta","enabled":false},"oj-js-poly-promise":{"severity":"critical","filetype":["js","html"],"group":["jet-js","jet-html"],"status":"production"},"oj-ts-poly-promise":{"severity":"critical","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"amd":false,"status":"beta"},"oj-js-no-ext-final":{"severity":"info","filetype":["js","html"],"group":["jet-js","jet-html"],"jetver":">=8.0.0","status":"beta"},"oj-ts-no-ext-final":{"severity":"info","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"jetver":">=8.0.0","amd":false,"status":"beta","enabled":false},"oj-js-noconsole":{"severity":"info","filetype":["js","html"],"group":["jet-js","jet-html"],"status":"production"},"oj-ts-noconsole":{"severity":"info","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"amd":false,"status":"beta","enabled":false},"oj-ts-numconv-pattern":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-json-syntax":{"severity":"critical","filetype":"json","group":"jet-json","status":"production"},"oj-tsx-acc-avatar-aria-role":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"amd":false,"status":"production"},"oj-tsx-acc-button-onclick":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-acc"],"amd":false,"status":"production"},"oj-tsx-aria-prop":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"amd":false,"status":"production"},"oj-tsx-aria-ojselector-labelledby":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"jetver":">=13.0.0","amd":false,"status":"production"},"oj-tsx-cca-tagname":{"severity":"minor","filetype":"tsx","group":["jet-tsx"],"amd":false,"status":"production"},"oj-tsx-databind-all":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-dlg-title":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-event":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"beta"},"oj-tsx-form-bindif":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-form-noflex":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-ojattr":{"severity":"critical","filetype":"tsx","group":"jet-tsx","jetver":">=6.0.0","amd":false,"status":"production"},"oj-tsx-ojattr-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-ojattr-enum-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-ojattr-value":{"severity":"critical","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-attr-req":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-ojtag-ns":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-input-isodate":{"severity":"critical","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-pageopts-type":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-picker-attrs":{"jetver":">=11.0.0","severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-popup-sibling":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-prop-inline-definition":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-rating-gauge-size":{"severity":"major","filetype":"tsx","group":"jet-tsx","theme":"Redwood","amd":false,"status":"production"},"oj-tsx-rating-gauge-track-resize":{"severity":"major","filetype":"tsx","group":"jet-tsx","theme":"Redwood","amd":false,"status":"production"},"oj-tsx-ojtag-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-slot-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-slot-pref-content":{"severity":"minor","filetype":"tsx","group":"jet-tsx","jetver":">=10.0.0","amd":false,"status":"production"},"oj-tsx-tabbar-edge":{"severity":"major","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-anti-pattern":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-prop-anti-pattern":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-maintenance":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-nested":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-wctag-packprivate":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-treeview-actionable-content":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","jetver":">=10.0.0","amd":false,"status":"beta"},"oj-tsx-5-tag-obs":{"severity":"major","filetype":"tsx","group":["jet-tsx"],"amd":false,"status":"production"},"oj-tsx-unsup-theme":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"}}}
6
+ {"title":"JET Built-in Rulepack","version":"4.14.0","prefix":"JET","rules":{"oj-html-cca-tagname":{"severity":"minor","filetype":"html","group":["jet-html"],"status":"production"},"oj-acc-aria-ojselector-labelledby":{"severity":"blocker","filetype":"html","group":["jet-html","jet-aria","jet-acc"],"jetver":">=13.0.0","status":"production","enabled":true},"oj-acc-button-label":{"severity":"blocker","filetype":"html","group":["jet-html","jet-acc"],"status":"production"},"oj-html-ojtag-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-wctag-maintenance":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=13.0.0","status":"production"},"oj-html-wctag-supersedes":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=13.0.0","status":"production","enabled":false},"oj-html-wctag-anti-pattern":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=15.0.0","amd":false,"status":"production"},"oj-html-prop-anti-pattern":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=15.0.0","amd":false,"status":"production"},"oj-html-ojattr":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=6.0.0","status":"production"},"oj-html-ojattr-520":{"severity":"critical","filetype":"html","group":"jet-html","jetver":"5.2.0","status":"production"},"oj-html-ojattr-value":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-2def":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-prefix-ro":{"severity":"info","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-prefix-expr":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-json":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojattr-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-ojattr-enum-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-5-tag-obs":{"severity":"major","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-5-attr-obs":{"severity":"major","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-ojevent":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-event-focus-blur":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-form-noflex":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-jq-databind":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-databind-all":{"severity":"minor","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-bindif-test":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-bindforeach-data":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojslot":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-name":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"status":"production"},"oj-html-slot-pref-content":{"severity":"minor","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-slot-default":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-slot-item-minmax":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-notag-style":{"severity":"info","filetype":"html","group":"jet-html","status":"beta"},"oj-html-style":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production","enabled":false},"oj-html-stylesel":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production","enabled":false},"oj-html-style-deprecated":{"severity":"major","filetype":"html","group":["jet-html","jet-deprecated"],"jetver":">=9.0.0","status":"production"},"oj-html-ojstyle":{"severity":"critical","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production","enabled":false},"oj-html-style-bp-color":{"severity":"major","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-bp-font":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-bp-font-family":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","customOpts":{"ignore":["inherit","initial"]},"enabled":false},"oj-html-style-bp-display":{"severity":"minor","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":false},"oj-html-style-bp-margin-padding":{"severity":"major","filetype":"html","group":["jet-html","jet-bp"],"status":"beta"},"oj-html-style-abs-units":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"production","customOpts":{"absunits":{"all":2}},"enabled":false},"oj-html-no-style":{"severity":"major","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-no-style-tag":{"severity":"major","filetype":"html","group":"jet-html","status":"production","enabled":false},"oj-html-pageopts-type":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-binding-attr":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-$unique":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-attr-req":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-dlg-title":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-bp-title-to-tooltip":{"severity":"major","filetype":"html","group":["jet-html","jet-bp"],"status":"production"},"oj-html-ojattr-evt-syntax":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-tag-attr-noprefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-picker-attrs":{"jetver":">=11.0.0","severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-rating-gauge-size":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood","status":"production"},"oj-html-rating-gauge-track-resize":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood","status":"production"},"oj-html-label-for-prefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-binding-as-slot-child":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-globattr-noprefix":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-nonglobattr-prefix":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-msgs-cat-text":{"severity":"major","filetype":"html","group":"jet-html","theme":"Redwood"},"oj-html-ojtag-datacmd":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-datactx":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-ojtag-ns":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-tabbar-edge":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=15.0.0","status":"production"},"oj-html-wctag-id":{"severity":"blocker","filetype":"html","group":"jet-html","status":"deprecated"},"oj-html-wctag-for":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-nested":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-packprivate":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-form-bindif":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-file-pick-accept":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-wctag-arialabelledby":{"severity":"blocker","filetype":"html","group":["jet-html","jet-aria","jet-acc"],"status":"production"},"oj-html-wctag-$props":{"severity":"blocker","filetype":"html","amd":false,"group":"jet-html","status":"production"},"oj-html-attr-expr-delims":{"severity":"major","filetype":"html","group":["jet-html"],"status":"production"},"oj-html-attr-expr-writeback":{"severity":"minor","filetype":"html","group":["jet-html","jet-bp"],"status":"production","enabled":true},"oj-html-unsup-theme":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-cca-count":{"severity":"minor","filetype":"html","group":"jet-html","status":"production"},"oj-html-redwood-cssvars":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-redwood-cssnovars":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-html-redwood-bp-endslot":{"severity":"major","filetype":"html","group":["jet-redwood-bp","jet-html"],"theme":"Redwood","jetver":">=10.0.0","status":"production"},"oj-html-redwood-clear-icon":{"severity":"blocker","filetype":"html","group":["jet-redwood-bp","jet-html"],"theme":"Redwood","jetver":">=17.0.0","status":"beta"},"oj-css-bp-dir-flow":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-color":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-font":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-bp-font-family":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","customOpts":{"ignore":["inherit","initial"]},"enabled":false},"oj-css-style-bp-display":{"severity":"minor","filetype":["css","html"],"group":["jet-css","jet-html","jet-bp"],"status":"production","enabled":false},"oj-css-style-override":{"severity":"blocker","filetype":["css","html"],"group":["jet-css","jet-override"],"status":"production"},"oj-css-var-override":{"severity":"major","filetype":["css","html"],"group":["jet-css","jet-override","jet-bp"],"jetver":">=9.0.0","status":"production","enabled":false},"oj-css-style-deprecated":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-deprecated"],"jetver":">=9.0.0","status":"production"},"oj-css-style-abs-units":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"production","customOpts":{"absunits":{"all":2}},"enabled":false},"oj-css-bp-float":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-css-bp-textalign":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-css-bp-border-color":{"severity":"major","filetype":["css","html"],"group":["jet-html","jet-css","jet-bp"],"jetver":">=9.0.0","status":"beta","enabled":false},"oj-html-invalid-doctype":{"severity":"blocker","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-missing-doctype":{"severity":"blocker","filetype":"html","group":["jet-html","html5"],"status":"production"},"oj-html-oj-lib":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ko-comment":{"severity":"major","filetype":"html","group":"jet-html","status":"production"},"oj-html-ko-databind":{"severity":"major","filetype":"html","group":"jet-html","status":"beta"},"oj-html-cdn":{"severity":"minor","filetype":"html","group":"jet-html","status":"production","amd":false,"enabled":false},"oj-html-self-close":{"severity":"blocker","filetype":"html","group":"jet-html","status":"production"},"oj-html-input-isodate":{"severity":"critical","filetype":"html","group":"jet-html","status":"production"},"oj-html-dyn-form":{"severity":"blocker","filetype":"html","group":"jet-html","status":"beta","enabled":false,"inservice":false},"oj-form-maxcols":{"severity":"major","filetype":["html","json"],"group":["jet-html","jet-json"],"status":"production"},"oj-html-form-layout-maxcols":{"severity":"minor","filetype":"html","group":"jet-html","jetver":"<=12.0.0","status":"production"},"oj-html-button-size-chroming":{"severity":"major","filetype":"html","group":"jet-html","jetver":">=17.0.0","theme":"Redwood","status":"production"},"oj-html-bp-button-xs-chroming":{"severity":"major","filetype":"html","group":["jet-html","jet-bp"],"jetver":">=17.0.0","status":"production"},"oj-html-template-index":{"severity":"info","filetype":"html","group":"jet-html","jetver":">=9.0.0","status":"production"},"oj-html-treeview-actionable-content":{"severity":"blocker","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"beta"},"oj-html-alta-deprecated":{"severity":"blocker","filetype":"html","group":"jet-html","jetver":">=10.0.0","status":"production"},"oj-cca-compjson-bp-obj":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-ar":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-jetver":{"severity":"major","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-bp-dsplyname":{"severity":"info","filetype":"json","group":["jet-cca","jet-bp"],"status":"beta"},"oj-cca-compjson-ns-reg":{"severity":"blocker","filetype":"json","group":"jet-cca","status":"production"},"oj-acc-select-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-combobox-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-input-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-aria-labelledby":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-avatar-aria-role":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-aria-prop":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-film-strip-aria-label":{"severity":"blocker","filetype":"html","group":["jet-aria","jet-acc"],"status":"production"},"oj-acc-button-onclick":{"severity":"blocker","filetype":"html","group":"jet-acc","status":"production"},"oj-js-ojcomp-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"production","enabled":false},"oj-js-comp-meth-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated","jet-deleted"],"status":"production"},"oj-ts-comp-meth-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated","jet-deleted"],"amd":false,"status":"beta","enabled":false},"oj-js-comp-attr-deprecated":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated","jet-deleted"],"status":"production"},"oj-ts-comp-attr-deprecated":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated","jet-deleted"],"amd":false,"status":"beta","enabled":false},"oj-js-numconv-pattern":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-js-var-undef":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production","enabled":false},"oj-js-ojcomp-new":{"severity":"major","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-new":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"beta","enabled":false},"oj-js-ojcomp-exist":{"severity":"critical","filetype":["js","html"],"group":["jet-js","jet-html","jet-deprecated"],"status":"production"},"oj-ts-ojcomp-exist":{"severity":"critical","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"beta","enabled":false},"oj-js-poly-promise":{"severity":"critical","filetype":["js","html"],"group":["jet-js","jet-html"],"status":"production"},"oj-ts-poly-promise":{"severity":"critical","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"amd":false,"status":"beta"},"oj-js-no-ext-final":{"severity":"info","filetype":["js","html"],"group":["jet-js","jet-html"],"jetver":">=8.0.0","status":"beta"},"oj-ts-no-ext-final":{"severity":"info","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"jetver":">=8.0.0","amd":false,"status":"beta","enabled":false},"oj-js-noconsole":{"severity":"info","filetype":["js","html"],"group":["jet-js","jet-html"],"status":"production"},"oj-ts-noconsole":{"severity":"info","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx"],"amd":false,"status":"beta","enabled":false},"oj-ts-numconv-pattern":{"severity":"major","filetype":["ts","tsx"],"group":["jet-ts","jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-json-syntax":{"severity":"critical","filetype":"json","group":"jet-json","status":"production"},"oj-tsx-acc-avatar-aria-role":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"amd":false,"status":"production"},"oj-tsx-acc-button-label":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-acc"],"amd":false,"status":"production"},"oj-tsx-acc-button-onclick":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-acc"],"amd":false,"status":"production"},"oj-tsx-aria-prop":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"amd":false,"status":"production"},"oj-tsx-aria-ojselector-labelledby":{"severity":"blocker","filetype":"tsx","group":["jet-tsx","jet-aria","jet-acc"],"jetver":">=13.0.0","amd":false,"status":"production"},"oj-tsx-bp-button-xs-chroming":{"severity":"major","filetype":"tsx","group":"jet-tsx","jetver":">=17.0.0","amd":false,"status":"production"},"oj-tsx-bp-title-to-tooltip":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-bp"],"amd":false,"status":"production"},"oj-tsx-button-size-chroming":{"severity":"major","filetype":"tsx","group":"jet-tsx","jetver":">=17.0.0","theme":"Redwood","amd":false,"status":"production"},"oj-tsx-cca-tagname":{"severity":"minor","filetype":"tsx","group":["jet-tsx"],"amd":false,"status":"production"},"oj-tsx-databind-all":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-dlg-title":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-event":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"beta"},"oj-tsx-form-bindif":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-form-noflex":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-ojattr":{"severity":"critical","filetype":"tsx","group":"jet-tsx","jetver":">=6.0.0","amd":false,"status":"production"},"oj-tsx-ojattr-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-ojattr-enum-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-ojattr-value":{"severity":"critical","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-attr-req":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-ojtag-ns":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-input-isodate":{"severity":"critical","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-pageopts-type":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-picker-attrs":{"jetver":">=11.0.0","severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-popup-sibling":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-prop-inline-definition":{"severity":"minor","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-rating-gauge-size":{"severity":"major","filetype":"tsx","group":"jet-tsx","theme":"Redwood","amd":false,"status":"production"},"oj-tsx-rating-gauge-track-resize":{"severity":"major","filetype":"tsx","group":"jet-tsx","theme":"Redwood","amd":false,"status":"production"},"oj-tsx-redwood-clear-icon":{"severity":"blocker","filetype":"tsx","group":["jet-redwood-bp","jet-tsx"],"theme":"Redwood","jetver":">=17.0.0","amd":false,"status":"beta"},"oj-tsx-slot-default":{"severity":"major","filetype":"tsx","group":"jet-tsx","amd":false,"status":"alpha","inservice":false},"oj-tsx-style-abs-units":{"severity":"major","filetype":["tsx"],"group":["jet-tsx","jet-bp"],"status":"beta","customOpts":{"absunits":{"all":2}},"amd":false,"enabled":false},"oj-tsx-style-bp-margin-padding":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-bp"],"amd":false,"status":"beta"},"oj-tsx-ojtag-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-slot-deprecated":{"severity":"major","filetype":"tsx","group":["jet-tsx","jet-deprecated"],"amd":false,"status":"production"},"oj-tsx-slot-pref-content":{"severity":"minor","filetype":"tsx","group":"jet-tsx","jetver":">=10.0.0","amd":false,"status":"production"},"oj-tsx-tabbar-edge":{"severity":"major","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-anti-pattern":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-prop-anti-pattern":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-maintenance":{"severity":"info","filetype":"tsx","group":"jet-tsx","jetver":">=15.0.0","amd":false,"status":"production"},"oj-tsx-wctag-nested":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-wctag-packprivate":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"},"oj-tsx-treeview-actionable-content":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","jetver":">=10.0.0","amd":false,"status":"beta"},"oj-tsx-5-tag-obs":{"severity":"major","filetype":"tsx","group":["jet-tsx"],"amd":false,"status":"production"},"oj-tsx-unsup-theme":{"severity":"blocker","filetype":"tsx","group":"jet-tsx","amd":false,"status":"production"}}}