@oracle/oraclejet-audit 10.1.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (759) hide show
  1. package/LICENSE.md +1 -1
  2. package/jaf-amd.js +12 -4
  3. package/jaf.js +6 -1
  4. package/jafapi.js +6 -1
  5. package/lib/AST.js +6 -1
  6. package/lib/AST_Ts.js +6 -1
  7. package/lib/AstJson.js +6 -1
  8. package/lib/AstMd.js +6 -0
  9. package/lib/AstNodeTypes.js +6 -1
  10. package/lib/Comments.js +6 -1
  11. package/lib/ComponentSvcs.js +5 -0
  12. package/lib/Components.js +6 -1
  13. package/lib/Config.js +6 -1
  14. package/lib/ConfigLib.js +6 -1
  15. package/lib/CssLib.js +5 -0
  16. package/lib/CssUtils.js +5 -0
  17. package/lib/DomUtils.js +6 -1
  18. package/lib/FileIndex.js +5 -0
  19. package/lib/FileSet.js +5 -0
  20. package/lib/FsUtils.js +6 -1
  21. package/lib/Histo.js +6 -0
  22. package/lib/HtmlTree.js +6 -1
  23. package/lib/HtmlUtils.js +5 -0
  24. package/lib/Issue.js +6 -1
  25. package/lib/JafEvents.js +5 -0
  26. package/lib/JafLib.js +6 -1
  27. package/lib/Json.js +6 -0
  28. package/lib/JsonLoader.js +6 -1
  29. package/lib/Md.js +6 -0
  30. package/lib/MetaLib.js +6 -1
  31. package/lib/NetUtils.js +5 -0
  32. package/lib/NodeTypes.js +5 -0
  33. package/lib/Parser.js +6 -1
  34. package/lib/RegTypes.js +6 -1
  35. package/lib/Registry.js +6 -1
  36. package/lib/Reporter.js +6 -1
  37. package/lib/RuleContext.js +5 -0
  38. package/lib/RulePack.js +5 -0
  39. package/lib/RuleSet.js +6 -1
  40. package/lib/Rules.js +6 -1
  41. package/lib/Scope.js +6 -1
  42. package/lib/SemVer.js +5 -0
  43. package/lib/Server.js +5 -0
  44. package/lib/SevLib.js +5 -0
  45. package/lib/Severity.js +6 -1
  46. package/lib/Stats.js +6 -0
  47. package/lib/Ts.js +6 -1
  48. package/lib/Utils.js +6 -1
  49. package/lib/Watch.js +5 -0
  50. package/lib/Writer.js +5 -0
  51. package/lib/ZipUtils.js +5 -0
  52. package/lib/api.js +6 -0
  53. package/lib/builtinpacks.js +6 -0
  54. package/lib/cliStats.js +6 -0
  55. package/lib/clone.js +6 -1
  56. package/lib/cmdline.js +6 -1
  57. package/lib/colors.js +6 -1
  58. package/lib/defaults.js +6 -0
  59. package/lib/deflist.js +6 -0
  60. package/lib/dislist.js +6 -0
  61. package/lib/exportRules.js +6 -0
  62. package/lib/extends.js +6 -0
  63. package/lib/filetypes.js +6 -0
  64. package/lib/grouplist.js +6 -0
  65. package/lib/groups.js +6 -0
  66. package/lib/help.js +6 -1
  67. package/lib/jetver.js +6 -1
  68. package/lib/macros.js +6 -0
  69. package/lib/manual.js +6 -1
  70. package/lib/metaLoader.js +5 -0
  71. package/lib/metahist.js +5 -0
  72. package/lib/msgidLoader.js +6 -1
  73. package/lib/ns.js +6 -1
  74. package/lib/nslist.js +5 -0
  75. package/lib/outFormat.js +6 -0
  76. package/lib/outfile.js +5 -0
  77. package/lib/ruleLoader.js +5 -0
  78. package/lib/scaffold.js +6 -1
  79. package/lib/scaffoldRule.js +6 -1
  80. package/lib/schema.js +6 -1
  81. package/lib/scopewalker.js +6 -0
  82. package/lib/spinner.js +6 -1
  83. package/lib/spinnernoop.js +5 -0
  84. package/lib/tabs.js +5 -0
  85. package/libext/expparser.js +6 -1
  86. package/meta/11.0.0/jetauditmeta.js +9 -0
  87. package/meta/11.1.0/jetauditmeta.js +9 -0
  88. package/meta/12.0.0/jetauditmeta.js +9 -0
  89. package/meta/metaverlist.json +1 -1
  90. package/package.json +72 -69
  91. package/rulepacks/csp/csp-html-script-unsafe-inline.js +5 -0
  92. package/rulepacks/csp/csp-html-style-unsafe-inline.js +5 -0
  93. package/rulepacks/csp/csp-html-unsafe-expr.js +5 -0
  94. package/rulepacks/csp/csp-js-script-unsafe-eval.js +6 -1
  95. package/rulepacks/csp/csp-js-style-unsafe-inline.js +5 -0
  96. package/rulepacks/csp/csp-ts-script-unsafe-eval.js +6 -0
  97. package/rulepacks/csp/csp-ts-style-unsafe-inline.js +6 -0
  98. package/rulepacks/csp/msgid.json +6 -1
  99. package/rulepacks/csp/rules.json +6 -1
  100. package/rulepacks/jetwc/jetwc-absolute-jetversion.js +6 -1
  101. package/rulepacks/jetwc/jetwc-aria-redefinition.js +6 -1
  102. package/rulepacks/jetwc/jetwc-bootstrap.js +6 -1
  103. package/rulepacks/jetwc/jetwc-compjson-bp-ar.js +6 -1
  104. package/rulepacks/jetwc/jetwc-compjson-bp-obj.js +6 -1
  105. package/rulepacks/jetwc/jetwc-component-dependencies.js +6 -1
  106. package/rulepacks/jetwc/jetwc-component-displayname.js +6 -1
  107. package/rulepacks/jetwc/jetwc-component-foldername.js +6 -1
  108. package/rulepacks/jetwc/jetwc-component-location.js +6 -1
  109. package/rulepacks/jetwc/jetwc-component-type.js +6 -1
  110. package/rulepacks/jetwc/jetwc-css-oj-complete.js +6 -0
  111. package/rulepacks/jetwc/jetwc-data-property-prefix.js +6 -1
  112. package/rulepacks/jetwc/jetwc-deprecated-lifecycle.js +6 -1
  113. package/rulepacks/jetwc/jetwc-disabled-property.js +6 -1
  114. package/rulepacks/jetwc/jetwc-displayname.js +6 -1
  115. package/rulepacks/jetwc/jetwc-dynamic-slot-context.js +6 -1
  116. package/rulepacks/jetwc/jetwc-dynamic-slots-naming.js +6 -1
  117. package/rulepacks/jetwc/jetwc-event-displayname.js +6 -1
  118. package/rulepacks/jetwc/jetwc-events.js +6 -1
  119. package/rulepacks/jetwc/jetwc-jet-version.js +6 -1
  120. package/rulepacks/jetwc/jetwc-loader-file.js +6 -1
  121. package/rulepacks/jetwc/jetwc-markdown-link.js +6 -0
  122. package/rulepacks/jetwc/jetwc-method-displayname.js +6 -1
  123. package/rulepacks/jetwc/jetwc-methods.js +6 -1
  124. package/rulepacks/jetwc/jetwc-namespace.js +6 -1
  125. package/rulepacks/jetwc/jetwc-nested-defaults.js +6 -1
  126. package/rulepacks/jetwc/jetwc-nls-languages.js +6 -1
  127. package/rulepacks/jetwc/jetwc-nls-root.js +6 -1
  128. package/rulepacks/jetwc/jetwc-oj-register.js +6 -1
  129. package/rulepacks/jetwc/jetwc-ojcss.js +6 -1
  130. package/rulepacks/jetwc/jetwc-pack-children.js +6 -1
  131. package/rulepacks/jetwc/jetwc-packable-components.js +6 -1
  132. package/rulepacks/jetwc/jetwc-prerelease-dependencies.js +6 -1
  133. package/rulepacks/jetwc/jetwc-prerelease-pattern.js +6 -1
  134. package/rulepacks/jetwc/jetwc-prerelease-version.js +6 -1
  135. package/rulepacks/jetwc/jetwc-property-changed.js +6 -1
  136. package/rulepacks/jetwc/jetwc-property-displayname.js +6 -1
  137. package/rulepacks/jetwc/jetwc-property-nesting.js +6 -1
  138. package/rulepacks/jetwc/jetwc-public-modules.js +6 -1
  139. package/rulepacks/jetwc/jetwc-register-css.js +6 -1
  140. package/rulepacks/jetwc/jetwc-register-with-promises.js +6 -1
  141. package/rulepacks/jetwc/jetwc-require-paths.js +6 -1
  142. package/rulepacks/jetwc/jetwc-required-subproperty.js +6 -0
  143. package/rulepacks/jetwc/jetwc-reserved-property.js +6 -1
  144. package/rulepacks/jetwc/jetwc-schema.js +6 -1
  145. package/rulepacks/jetwc/jetwc-semantic-version.js +6 -1
  146. package/rulepacks/jetwc/jetwc-slot-displayname.js +6 -1
  147. package/rulepacks/jetwc/jetwc-slots.js +6 -1
  148. package/rulepacks/jetwc/jetwc-standard-files.js +6 -1
  149. package/rulepacks/jetwc/jetwc-subproperty-writeback.js +6 -0
  150. package/rulepacks/jetwc/jetwc-template-slots.js +6 -1
  151. package/rulepacks/jetwc/jetwc-unused-events.js +6 -1
  152. package/rulepacks/jetwc/jetwc-unused-slots.js +6 -1
  153. package/rulepacks/jetwc/jetwc-vb-category.js +6 -1
  154. package/rulepacks/jetwc/jetwc-vb-icon.js +6 -1
  155. package/rulepacks/jetwc/jetwc-vcomponent-jetversion.js +6 -0
  156. package/rulepacks/jetwc/jetwc-vcomponent-loader.js +6 -0
  157. package/rulepacks/jetwc/jetwc-vcomponent-version.js +6 -0
  158. package/rulepacks/jetwc/jetwc-version-openrange.js +6 -1
  159. package/rulepacks/jetwc/jetwc-writeback-required.js +6 -1
  160. package/rulepacks/jetwc/msgid.json +6 -0
  161. package/rulepacks/jetwc/rules.json +6 -1
  162. package/rulepacks/jetwc-lib/jetwcutils-auditComponentCacheManager.js +6 -0
  163. package/rulepacks/jetwc-lib/jetwcutils-commonListenerImpls.js +6 -0
  164. package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +6 -0
  165. package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +6 -0
  166. package/rulepacks/jetwc-lib/jetwcutils-preCompiler.js +6 -0
  167. package/rulepacks/jetwc-lib/jetwcutils-tsxUtils.js +6 -0
  168. package/rulepacks/jetwco/jetwco-bootstrap.js +6 -1
  169. package/rulepacks/jetwco/jetwco-cacc-auditConstraints.js +6 -0
  170. package/rulepacks/jetwco/jetwco-cacc-dependencies.js +6 -0
  171. package/rulepacks/jetwco/jetwco-cacc-dynamicSlots.js +6 -0
  172. package/rulepacks/jetwco/jetwco-cacc-eventBubbles.js +6 -0
  173. package/rulepacks/jetwco/jetwco-cacc-eventCancelable.js +6 -0
  174. package/rulepacks/jetwco/jetwco-cacc-eventPayload.js +6 -0
  175. package/rulepacks/jetwco/jetwco-cacc-events.js +6 -0
  176. package/rulepacks/jetwco/jetwco-cacc-helpers.js +6 -0
  177. package/rulepacks/jetwco/jetwco-cacc-jetVer.js +6 -0
  178. package/rulepacks/jetwco/jetwco-cacc-methodParamTypes.js +6 -0
  179. package/rulepacks/jetwco/jetwco-cacc-methodParams.js +6 -0
  180. package/rulepacks/jetwco/jetwco-cacc-methodReturnType.js +6 -0
  181. package/rulepacks/jetwco/jetwco-cacc-methods.js +6 -0
  182. package/rulepacks/jetwco/jetwco-cacc-packBundle.js +6 -0
  183. package/rulepacks/jetwco/jetwco-cacc-packBundleContent.js +6 -0
  184. package/rulepacks/jetwco/jetwco-cacc-packContent.js +6 -0
  185. package/rulepacks/jetwco/jetwco-cacc-properties.js +6 -0
  186. package/rulepacks/jetwco/jetwco-cacc-propertyDefault.js +6 -0
  187. package/rulepacks/jetwco/jetwco-cacc-propertyEnumeration.js +6 -0
  188. package/rulepacks/jetwco/jetwco-cacc-propertyReadOnly.js +6 -0
  189. package/rulepacks/jetwco/jetwco-cacc-propertyRequired.js +6 -0
  190. package/rulepacks/jetwco/jetwco-cacc-propertyType.js +6 -0
  191. package/rulepacks/jetwco/jetwco-cacc-propertyWriteback.js +6 -0
  192. package/rulepacks/jetwco/jetwco-cacc-publicModules.js +6 -0
  193. package/rulepacks/jetwco/jetwco-cacc-slotDataVariable.js +6 -0
  194. package/rulepacks/jetwco/jetwco-cacc-slotDataVariableType.js +6 -0
  195. package/rulepacks/jetwco/jetwco-cacc-slots.js +6 -0
  196. package/rulepacks/jetwco/jetwco-cacc-styleClasses.js +6 -0
  197. package/rulepacks/jetwco/jetwco-cacc-styleVariables.js +6 -0
  198. package/rulepacks/jetwco/jetwco-compjson-ns-reg.js +6 -1
  199. package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +6 -0
  200. package/rulepacks/jetwco/jetwco-component-api-changes.js +6 -1
  201. package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +6 -0
  202. package/rulepacks/jetwco/jetwco-component-cdn.js +6 -1
  203. package/rulepacks/jetwco/jetwco-description-standards.js +6 -0
  204. package/rulepacks/jetwco/jetwco-displayname-standards.js +6 -0
  205. package/rulepacks/jetwco/jetwco-exchange-version-check.js +6 -1
  206. package/rulepacks/jetwco/jetwco-license-info.js +6 -1
  207. package/rulepacks/jetwco/jetwco-prerelease-cdn.js +6 -1
  208. package/rulepacks/jetwco/jetwco-thirdparty-ba.js +6 -1
  209. package/rulepacks/jetwco/msgid.json +6 -0
  210. package/rulepacks/jetwco/rules.json +6 -1
  211. package/rulepacks/spoc/msgid.json +5 -0
  212. package/rulepacks/spoc/rules.json +5 -0
  213. package/rulepacks/spoc/spoc-dom-manip-inv-tag.js +5 -0
  214. package/rulepacks/spoc/spoc-dom-manip-tag-pos.js +5 -0
  215. package/rulepacks/spoc/spoc-dom-manip.js +5 -0
  216. package/{tests/rules/oj-js-diagnose/js_FAIL_1.js → rulepacks/wdt/msgid.json} +3 -9
  217. package/rulepacks/wdt/rules.json +6 -0
  218. package/rulepacks/wdt/wd-driver-sleep.js +6 -0
  219. package/rulepacks/wdt/wd-xpath.js +6 -0
  220. package/rules/jaf/jaf-css-diagnose.js +5 -0
  221. package/rules/jaf/jaf-html-diagnose.js +5 -0
  222. package/rules/jaf/jaf-init-schema.js +5 -0
  223. package/rules/jaf/jaf-js-diagnose.js +5 -0
  224. package/rules/jaf/jaf-ts-diagnose.js +6 -0
  225. package/rules/jaf/msgid.json +6 -1
  226. package/rules/jaf/rules.json +6 -1
  227. package/rules/jet/helpers/acc-aria-label.js +6 -1
  228. package/rules/jet/helpers/bp-checkPropType.js +5 -0
  229. package/rules/jet/helpers/cssHelper.js +6 -1
  230. package/rules/jet/helpers/extractStylesFromClass.js +6 -1
  231. package/rules/jet/helpers/has-slot-name.js +6 -1
  232. package/rules/jet/helpers/has-slot.js +5 -0
  233. package/rules/jet/helpers/json-prop-pos.js +5 -0
  234. package/rules/jet/helpers/json-propname-pos.js +5 -0
  235. package/rules/jet/helpers/style-selector.js +6 -1
  236. package/rules/jet/helpers/valid-attr.js +5 -0
  237. package/rules/jet/helpers/vartrack.js +5 -0
  238. package/rules/jet/jet-css-ojselector.js +5 -0
  239. package/rules/jet/msgid.json +6 -1
  240. package/rules/jet/oj-acc-aria-labelledby.js +5 -0
  241. package/rules/jet/oj-acc-aria-prop.js +6 -1
  242. package/rules/jet/oj-acc-avatar-aria-role.js +6 -1
  243. package/rules/jet/oj-acc-combobox-aria-label.js +6 -1
  244. package/rules/jet/oj-acc-film-strip-aria-label.js +6 -1
  245. package/rules/jet/oj-acc-input-aria-label.js +6 -1
  246. package/rules/jet/oj-acc-select-aria-label.js +6 -1
  247. package/rules/jet/oj-cca-compjson-bp-ar.js +5 -0
  248. package/rules/jet/oj-cca-compjson-bp-dsplyname.js +5 -0
  249. package/rules/jet/oj-cca-compjson-bp-jetver.js +5 -0
  250. package/rules/jet/oj-cca-compjson-bp-obj.js +5 -0
  251. package/rules/jet/oj-cca-compjson-ns-reg.js +5 -0
  252. package/rules/jet/oj-css-bp-border-color.js +5 -0
  253. package/rules/jet/oj-css-bp-dir-flow.js +6 -1
  254. package/rules/jet/oj-css-bp-float.js +5 -0
  255. package/rules/jet/oj-css-bp-textalign.js +5 -0
  256. package/rules/jet/oj-css-style-abs-units.js +6 -1
  257. package/rules/jet/oj-css-style-bp-color.js +5 -0
  258. package/rules/jet/oj-css-style-bp-display.js +6 -1
  259. package/rules/jet/oj-css-style-bp-font-family.js +6 -1
  260. package/rules/jet/oj-css-style-bp-font.js +5 -0
  261. package/rules/jet/oj-css-style-deprecated.js +6 -1
  262. package/rules/jet/oj-css-style-override.js +6 -1
  263. package/rules/jet/oj-css-var-override.js +5 -0
  264. package/rules/jet/oj-form-maxcols.js +6 -1
  265. package/rules/jet/oj-html-5-attr-obs.js +5 -0
  266. package/rules/jet/oj-html-5-tag-obs.js +5 -0
  267. package/rules/jet/oj-html-alta-deprecated.js +6 -0
  268. package/rules/jet/oj-html-attr-$unique.js +5 -0
  269. package/rules/jet/oj-html-attr-2def.js +5 -0
  270. package/rules/jet/oj-html-attr-json.js +6 -1
  271. package/rules/jet/oj-html-attr-prefix-expr.js +6 -1
  272. package/rules/jet/oj-html-attr-prefix-ro.js +5 -0
  273. package/rules/jet/oj-html-attr-req.js +5 -0
  274. package/rules/jet/oj-html-bindforeach-data.js +6 -1
  275. package/rules/jet/oj-html-bindif-test.js +6 -1
  276. package/rules/jet/oj-html-binding-attr.js +6 -1
  277. package/rules/jet/oj-html-cca-count.js +5 -0
  278. package/rules/jet/oj-html-cca-tagname.js +6 -1
  279. package/rules/jet/oj-html-cdn.js +5 -0
  280. package/rules/jet/oj-html-combo-converter.js +5 -0
  281. package/rules/jet/oj-html-cspexpr.js +6 -1
  282. package/rules/jet/oj-html-databind-all.js +5 -0
  283. package/rules/jet/oj-html-dlg-title.js +6 -1
  284. package/rules/jet/oj-html-file-pick-accept.js +6 -1
  285. package/rules/jet/oj-html-form-bindif.js +6 -1
  286. package/rules/jet/oj-html-form-layout-maxcols.js +6 -1
  287. package/rules/jet/oj-html-form-noflex.js +5 -0
  288. package/rules/jet/oj-html-input-isodate.js +6 -0
  289. package/rules/jet/oj-html-invalid-doctype.js +6 -1
  290. package/rules/jet/oj-html-jq-databind.js +6 -1
  291. package/rules/jet/oj-html-ko-comment.js +5 -0
  292. package/rules/jet/oj-html-ko-databind.js +6 -1
  293. package/rules/jet/oj-html-label-for-prefix.js +5 -0
  294. package/rules/jet/oj-html-missing-doctype.js +6 -1
  295. package/rules/jet/oj-html-msgs-cat-text.js +6 -0
  296. package/rules/jet/oj-html-no-style-tag.js +6 -0
  297. package/rules/jet/oj-html-notag-style.js +6 -0
  298. package/rules/jet/oj-html-oj-lib.js +5 -0
  299. package/rules/jet/oj-html-ojattr-520.js +6 -1
  300. package/rules/jet/oj-html-ojattr-deprecated.js +6 -1
  301. package/rules/jet/oj-html-ojattr-enum-deprecated.js +6 -1
  302. package/rules/jet/oj-html-ojattr-evt-syntax.js +6 -1
  303. package/rules/jet/oj-html-ojattr-value.js +6 -1
  304. package/rules/jet/oj-html-ojattr.js +6 -1
  305. package/rules/jet/oj-html-ojevent.js +6 -1
  306. package/rules/jet/oj-html-ojslot.js +6 -1
  307. package/rules/jet/oj-html-ojstyle.js +5 -0
  308. package/rules/jet/oj-html-ojtag-datacmd.js +6 -1
  309. package/rules/jet/oj-html-ojtag-datactx.js +5 -0
  310. package/rules/jet/oj-html-ojtag-deprecated.js +6 -1
  311. package/rules/jet/oj-html-ojtag-globattr-noprefix.js +6 -1
  312. package/rules/jet/oj-html-ojtag-id.js +5 -0
  313. package/rules/jet/oj-html-ojtag-nonglobattr-prefix.js +6 -1
  314. package/rules/jet/oj-html-ojtag-ns.js +5 -0
  315. package/rules/jet/oj-html-picker-attrs.js +6 -0
  316. package/rules/jet/oj-html-redwood-cssnovars.js +6 -0
  317. package/rules/jet/oj-html-redwood-cssvars.js +6 -0
  318. package/rules/jet/oj-html-self-close.js +5 -0
  319. package/rules/jet/oj-html-slot-item-minmax.js +6 -0
  320. package/rules/jet/oj-html-slot-name.js +6 -1
  321. package/rules/jet/oj-html-slot-pref-content.js +6 -0
  322. package/rules/jet/oj-html-style-abs-units.js +5 -0
  323. package/rules/jet/oj-html-style-bp-color.js +5 -0
  324. package/rules/jet/oj-html-style-bp-display.js +6 -1
  325. package/rules/jet/oj-html-style-bp-font-family.js +5 -0
  326. package/rules/jet/oj-html-style-bp-font.js +5 -0
  327. package/rules/jet/oj-html-style-deprecated.js +6 -1
  328. package/rules/jet/oj-html-style.js +6 -1
  329. package/rules/jet/oj-html-stylesel.js +6 -1
  330. package/rules/jet/oj-html-tag-attr-noprefix.js +6 -1
  331. package/rules/jet/oj-html-template-index.js +6 -1
  332. package/rules/jet/oj-html-unsup-theme.js +6 -1
  333. package/rules/jet/oj-html-wctag-$props.js +6 -1
  334. package/rules/jet/oj-html-wctag-arialabelledby.js +5 -0
  335. package/rules/jet/oj-html-wctag-for.js +5 -0
  336. package/rules/jet/oj-html-wctag-id.js +6 -1
  337. package/rules/jet/oj-html-wctag-nested.js +6 -0
  338. package/rules/jet/oj-html-wctag-packprivate.js +6 -0
  339. package/rules/jet/oj-js-comp-attr-deprecated.js +6 -1
  340. package/rules/jet/oj-js-comp-meth-deprecated.js +6 -1
  341. package/rules/jet/oj-js-no-ext-final.js +5 -0
  342. package/rules/jet/oj-js-noconsole.js +5 -0
  343. package/rules/jet/oj-js-ojcomp-deprecated.js +6 -1
  344. package/rules/jet/oj-js-ojcomp-exist.js +5 -0
  345. package/rules/jet/oj-js-ojcomp-new.js +5 -0
  346. package/rules/jet/oj-js-poly-promise.js +6 -1
  347. package/rules/jet/oj-js-var-undef.js +5 -0
  348. package/rules/jet/oj-json-syntax.js +5 -0
  349. package/rules/jet/oj-ts-comp-attr-deprecated.js +6 -1
  350. package/rules/jet/oj-ts-comp-meth-deprecated.js +6 -1
  351. package/rules/jet/oj-ts-no-ext-final.js +6 -0
  352. package/rules/jet/oj-ts-noconsole.js +6 -1
  353. package/rules/jet/oj-ts-ojcomp-deprecated.js +6 -1
  354. package/rules/jet/oj-ts-ojcomp-exist.js +6 -1
  355. package/rules/jet/oj-ts-ojcomp-new.js +6 -1
  356. package/rules/jet/oj-ts-poly-promise.js +6 -1
  357. package/rules/jet/rules.json +6 -1
  358. package/schema/component-schema.json +125 -2
  359. package/src/JafCore.js +6 -1
  360. package/types/index.d.ts +175 -37
  361. package/lib/stats.js +0 -1
  362. package/rulepacks/jetwc-lib/component-audit-utils.js +0 -1
  363. package/rules/exch/helpers/json-prop-pos.js +0 -1
  364. package/rules/exch/msgid.json +0 -1
  365. package/rules/exch/oj-cca-comp-zip-content-composite.js +0 -1
  366. package/rules/exch/oj-cca-comp-zip-content-pack.js +0 -1
  367. package/rules/exch/oj-cca-comp-zip-expand.js +0 -1
  368. package/rules/exch/oj-cca-compjson-evnames.js +0 -1
  369. package/rules/exch/oj-cca-compjson-file.js +0 -1
  370. package/rules/exch/oj-cca-compjson-prefix.js +0 -1
  371. package/rules/exch/oj-cca-compjson-prop-compdeps.js +0 -1
  372. package/rules/exch/oj-cca-compjson-prop-deps.js +0 -1
  373. package/rules/exch/oj-cca-compjson-prop-jetver.js +0 -1
  374. package/rules/exch/oj-cca-compjson-prop-obs.js +0 -1
  375. package/rules/exch/oj-cca-compjson-prop-type.js +0 -1
  376. package/rules/exch/oj-cca-compjson-prop-types.js +0 -1
  377. package/rules/exch/oj-cca-compjson-prop-undef.js +0 -1
  378. package/rules/exch/oj-cca-compjson-prop-version.js +0 -1
  379. package/rules/exch/oj-cca-compjson-schema.js +0 -1
  380. package/rules/exch/oj-cca-zip-compjson.js +0 -1
  381. package/rules/exch/rules.json +0 -1
  382. package/rules/jet/oj-css-bp-bgcolor.js +0 -1
  383. package/tests/components/attr-req-test/component.json +0 -1
  384. package/tests/components/demo-analog-clock/component.json +0 -1
  385. package/tests/components/demo-analog-clock/demo-analog-clock-viewModel.js +0 -1
  386. package/tests/components/demo-analog-clock/extension/demo/js/viewModels/demo.js +0 -1
  387. package/tests/components/demo-analog-clock/loader.js +0 -1
  388. package/tests/components/demo-card/component.json +0 -1
  389. package/tests/components/demo-chart-orientation-control/component.json +0 -1
  390. package/tests/components/demo-chart-stack-control/component.json +0 -1
  391. package/tests/components/made-up/component.json +0 -1
  392. package/tests/components/oj-made-up/component.json +0 -1
  393. package/tests/components/sp-activity-item/component.json +0 -1
  394. package/tests/config/config_base.json +0 -1
  395. package/tests/golden/10.0.0/golden_base.json +0 -1
  396. package/tests/golden/8.1.0/golden_base.json +0 -1
  397. package/tests/golden/9.0.0/golden_base.json +0 -1
  398. package/tests/rulepacks/hooks/hook-rpext.js +0 -1
  399. package/tests/rulepacks/hooks/hook-start-close-rulepack.js +0 -1
  400. package/tests/rulepacks/hooks/rule-rpext.js +0 -1
  401. package/tests/rulepacks/hooks/rules.json +0 -1
  402. package/tests/rulepacks/tags/proc_directive.js +0 -1
  403. package/tests/rulepacks/tags/rules.json +0 -1
  404. package/tests/rulepacks/tags/tag-count-setup.js +0 -1
  405. package/tests/rulepacks/tags/tag-count.js +0 -1
  406. package/tests/rules/bugs/JET-4770_PASS_1.html +0 -9
  407. package/tests/rules/comments/com_FAIL_1.js +0 -57
  408. package/tests/rules/comments/com_FAIL_2.js +0 -96
  409. package/tests/rules/comments/com_PASS_1.js +0 -42
  410. package/tests/rules/comments/com_PASS_2.js +0 -63
  411. package/tests/rules/comments/com_PASS_3.js +0 -40
  412. package/tests/rules/comments/com_PASS_4.js +0 -36
  413. package/tests/rules/comments/com_PASS_5.js +0 -19
  414. package/tests/rules/csp/html-script-unsafe-inline/FAIL_1.html +0 -11
  415. package/tests/rules/csp/html-script-unsafe-inline/FAIL_2.html +0 -8
  416. package/tests/rules/csp/html-script-unsafe-inline/PASS_1.html +0 -8
  417. package/tests/rules/csp/html-script-unsafe-inline/PASS_2.html +0 -8
  418. package/tests/rules/csp/html-script-unsafe-inline/PASS_3.html +0 -8
  419. package/tests/rules/csp/html-style-unsafe-inline/FAIL_1.html +0 -11
  420. package/tests/rules/csp/html-style-unsafe-inline/PASS_1.html +0 -11
  421. package/tests/rules/csp/html-unsafe-expr/FAIL_1.html +0 -14
  422. package/tests/rules/csp/html-unsafe-expr/PASS_1.html +0 -23
  423. package/tests/rules/csp/js-script-unsafe-eval/FAIL_1.js +0 -17
  424. package/tests/rules/csp/js-script-unsafe-eval/FAIL_2.js +0 -40
  425. package/tests/rules/csp/js-script-unsafe-eval/FAIL_3.js +0 -22
  426. package/tests/rules/csp/js-script-unsafe-eval/PASS_1.js +0 -20
  427. package/tests/rules/csp/js-script-unsafe-eval/PASS_2.js +0 -44
  428. package/tests/rules/csp/js-script-unsafe-eval/PASS_3.js +0 -16
  429. package/tests/rules/csp/js-style-unsafe-inline/FAIL_1.js +0 -25
  430. package/tests/rules/csp/js-style-unsafe-inline/PASS.js +0 -22
  431. package/tests/rules/demo/noself_FAIL_1.js +0 -101
  432. package/tests/rules/import/import_FAIL_1.js +0 -11
  433. package/tests/rules/import/import_PASS_1.js +0 -10
  434. package/tests/rules/jet-composites/demo-buttonset-enum/component.json +0 -57
  435. package/tests/rules/jet-composites/demo-buttonset-enum/loader.js +0 -19
  436. package/tests/rules/jet-composites/demo-buttonset-enum/view.html +0 -48
  437. package/tests/rules/jet-composites/demo-card/component.json +0 -28
  438. package/tests/rules/jet-composites/demo-card/loader.js +0 -16
  439. package/tests/rules/jet-composites/demo-card/view.html +0 -30
  440. package/tests/rules/jet-composites/demo-card/viewModel.js +0 -46
  441. package/tests/rules/jet-composites/demo-card/view_PASS_1.html +0 -21
  442. package/tests/rules/jet-composites/demo-contact-form/component.json +0 -23
  443. package/tests/rules/jet-composites/demo-contact-form/loader.js +0 -16
  444. package/tests/rules/jet-composites/demo-contact-form/view.html +0 -9
  445. package/tests/rules/jet-composites/demo-grocery-list/component.json +0 -18
  446. package/tests/rules/jet-composites/demo-grocery-list/loader.js +0 -19
  447. package/tests/rules/jet-composites/demo-grocery-list/view.html +0 -22
  448. package/tests/rules/jet-composites/demo-grocery-list/viewModel.js +0 -48
  449. package/tests/rules/jet-composites/dummy-component-1/component.json +0 -82
  450. package/tests/rules/jet-composites/dummy-component-2/component.json +0 -72
  451. package/tests/rules/jet-composites/foo-my-cca/component.json +0 -14
  452. package/tests/rules/jet-composites/foo-unsup-theme/component.json +0 -29
  453. package/tests/rules/jet-composites/header/component.json +0 -12
  454. package/tests/rules/jet-composites/oj-cgbu-omc/attribute-selection/component.json +0 -154
  455. package/tests/rules/jet-composites/oj-cgbu-omc/component.json +0 -11
  456. package/tests/rules/jet-composites/oj-cgbu-omc/reference/component.json +0 -185
  457. package/tests/rules/jet-composites/oj-cgbu-omc/wctag_props_FAIL_1.html +0 -34
  458. package/tests/rules/jet-composites/oj-enum-depr/component.json +0 -69
  459. package/tests/rules/jet-composites/oj-html-wctag-id/id_FAIL_1.html +0 -10
  460. package/tests/rules/jet-composites/oj-html-wctag-id/id_PASS_1.html +0 -6
  461. package/tests/rules/misc/oj.js +0 -12
  462. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_FAIL_1.html +0 -23
  463. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_FAIL_2.html +0 -22
  464. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_1.html +0 -23
  465. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_2.html +0 -22
  466. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_3.html +0 -22
  467. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_4.html +0 -22
  468. package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_5.html +0 -22
  469. package/tests/rules/oj-acc-aria-prop/aria_prop_FAIL_1.html +0 -22
  470. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_FAIL_1.html +0 -20
  471. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_1.html +0 -23
  472. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_2.html +0 -24
  473. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_3.html +0 -21
  474. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_4.html +0 -22
  475. package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_5.html +0 -22
  476. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_FAIL_1.html +0 -20
  477. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_FAIL_2.html +0 -21
  478. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_PASS_1.html +0 -20
  479. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_FAIL_1.html +0 -21
  480. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_FAIL_2.html +0 -22
  481. package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_PASS_1.html +0 -22
  482. package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_FAIL_1.html +0 -18
  483. package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_FAIL_2.html +0 -18
  484. package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_1.html +0 -18
  485. package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_2.html +0 -19
  486. package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_3.html +0 -22
  487. package/tests/rules/oj-acc-input-aria-label/oj_input_date_FAIL_1.html +0 -21
  488. package/tests/rules/oj-acc-input-aria-label/oj_input_date_FAIL_2.html +0 -22
  489. package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_1.html +0 -16
  490. package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_2.html +0 -17
  491. package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_3.html +0 -26
  492. package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_FAIL_1.html +0 -19
  493. package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_FAIL_2.html +0 -20
  494. package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_PASS_1.html +0 -19
  495. package/tests/rules/oj-acc-input-aria-label/oj_input_number_FAIL_1.html +0 -17
  496. package/tests/rules/oj-acc-input-aria-label/oj_input_number_FAIL_2.html +0 -18
  497. package/tests/rules/oj-acc-input-aria-label/oj_input_number_PASS_1.html +0 -17
  498. package/tests/rules/oj-acc-input-aria-label/oj_input_password_FAIL_1.html +0 -17
  499. package/tests/rules/oj-acc-input-aria-label/oj_input_password_FAIL_2.html +0 -17
  500. package/tests/rules/oj-acc-input-aria-label/oj_input_password_PASS_1.html +0 -17
  501. package/tests/rules/oj-acc-input-aria-label/oj_input_text_3_PASS_1.html +0 -20
  502. package/tests/rules/oj-acc-input-aria-label/oj_input_text_FAIL_1.html +0 -20
  503. package/tests/rules/oj-acc-input-aria-label/oj_input_text_FAIL_2.html +0 -21
  504. package/tests/rules/oj-acc-input-aria-label/oj_input_text_PASS_2.html +0 -62
  505. package/tests/rules/oj-acc-input-aria-label/oj_input_text_nolabel_PASS_2.html +0 -17
  506. package/tests/rules/oj-acc-input-aria-label/oj_input_time_FAIL_1.html +0 -19
  507. package/tests/rules/oj-acc-input-aria-label/oj_input_time_FAIL_2.html +0 -20
  508. package/tests/rules/oj-acc-input-aria-label/oj_input_time_PASS_1.html +0 -19
  509. package/tests/rules/oj-acc-select-aria-label/aria_selectmany_FAIL_1.html +0 -19
  510. package/tests/rules/oj-acc-select-aria-label/aria_selectmany_FAIL_2.html +0 -20
  511. package/tests/rules/oj-acc-select-aria-label/aria_selectmany_PASS_1.html +0 -19
  512. package/tests/rules/oj-acc-select-aria-label/aria_selectone_FAIL_1.html +0 -20
  513. package/tests/rules/oj-acc-select-aria-label/aria_selectone_FAIL_2.html +0 -21
  514. package/tests/rules/oj-cca-comp-zip/zip_FAIL_1.zip +0 -1
  515. package/tests/rules/oj-cca-comp-zip/zip_FAIL_2.zip +0 -0
  516. package/tests/rules/oj-cca-comp-zip/zip_FAIL_3.zip +0 -0
  517. package/tests/rules/oj-cca-comp-zip/zip_FAIL_4.zip +0 -0
  518. package/tests/rules/oj-cca-comp-zip/zip_FAIL_5.zip +0 -0
  519. package/tests/rules/oj-cca-comp-zip/zip_FAIL_6.zip +0 -0
  520. package/tests/rules/oj-cca-comp-zip/zip_FAIL_7.zip +0 -0
  521. package/tests/rules/oj-cca-comp-zip/zip_FAIL_8.zip +0 -0
  522. package/tests/rules/oj-cca-comp-zip/zip_PASS_1.zip +0 -0
  523. package/tests/rules/oj-cca-ns-reg/oj-cca-ns-FAIL_1/component.json +0 -19
  524. package/tests/rules/oj-cca-ns-reg/oj-cca-ns-PASS_1/component.json +0 -19
  525. package/tests/rules/oj-cgbu-omc_tests/html_ojevent_FAIL_1.html +0 -15
  526. package/tests/rules/oj-cgbu-omc_tests/html_ojevent_PASS_1.html +0 -17
  527. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_1/component.json +0 -16
  528. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_10/component.json +0 -103
  529. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_11/component.json +0 -24
  530. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_12/component.json +0 -17
  531. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_13/component.json +0 -17
  532. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_14/component.json +0 -40
  533. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_15/component.json +0 -24
  534. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_16/component.json +0 -44
  535. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_17/component.json +0 -8
  536. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_18/component.json +0 -8
  537. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_19/component.json +0 -8
  538. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_2/component.json +0 -15
  539. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_20/component.json +0 -18
  540. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_21/component.json +0 -16
  541. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_22/component.json +0 -19
  542. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_3/component.json +0 -15
  543. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_4/component.json +0 -16
  544. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_5/component.json +0 -16
  545. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_6/component.json +0 -18
  546. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_7/component.json +0 -15
  547. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_8/component.json +0 -15
  548. package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_9/component.json +0 -52
  549. package/tests/rules/oj-compjson-syntax/ojcomp-PASS_1/component.json +0 -17
  550. package/tests/rules/oj-compjson-syntax/ojcomp-PASS_2/component.json +0 -88
  551. package/tests/rules/oj-compjson-syntax/ojcomp-PASS_3/component.json +0 -19
  552. package/tests/rules/oj-css-bp-dir-flow/dirflow_FAIL_1.html +0 -22
  553. package/tests/rules/oj-css-bp-dir-flow/dirflow_FAIL_2.html +0 -22
  554. package/tests/rules/oj-css-diagnose/css_FAIL_1.html +0 -14
  555. package/tests/rules/oj-css-diagnose/css_PASS_1.html +0 -14
  556. package/tests/rules/oj-css-var-override/varovr_FAIL_1.html +0 -8
  557. package/tests/rules/oj-html-5-attr-depr/attrdepr_FAIL_1.html +0 -16
  558. package/tests/rules/oj-html-5-attr-depr/attrdepr_PASS_1.html +0 -16
  559. package/tests/rules/oj-html-5-tag-depr/tagdepr_FAIL_1.html +0 -9
  560. package/tests/rules/oj-html-attr/attr_FAIL_1.html +0 -27
  561. package/tests/rules/oj-html-attr-$unique/attr_$unique1_FAIL_1.html +0 -19
  562. package/tests/rules/oj-html-attr-$unique/attr_$unique_FAIL_2.html +0 -25
  563. package/tests/rules/oj-html-attr-2def/attr2def_FAIL_1.html +0 -10
  564. package/tests/rules/oj-html-attr-2def/attr2def_PASS_1.html +0 -10
  565. package/tests/rules/oj-html-attr-json/attr-json_FAIL_1.html +0 -20
  566. package/tests/rules/oj-html-attr-json/attr-json_FAIL_2.html +0 -20
  567. package/tests/rules/oj-html-attr-json/attr-json_FAIL_3.html +0 -20
  568. package/tests/rules/oj-html-attr-json/attr-json_PASS_1.html +0 -20
  569. package/tests/rules/oj-html-attr-json/attr-json_PASS_2.html +0 -20
  570. package/tests/rules/oj-html-attr-json/attr-json_PASS_3.html +0 -8
  571. package/tests/rules/oj-html-attr-prefix-expr/attrprefixexpr_FAIL_1.html +0 -10
  572. package/tests/rules/oj-html-attr-prefix-expr/attrprefixexpr_PASS_1.html +0 -10
  573. package/tests/rules/oj-html-attr-prefix-ro/attrprefixro_FAIL_1.html +0 -10
  574. package/tests/rules/oj-html-attr-prefix-ro/attrprefixro_PASS_1.html +0 -10
  575. package/tests/rules/oj-html-attr-req/attrreq_FAIL_1.html +0 -17
  576. package/tests/rules/oj-html-attr-req/attrreq_FAIL_2.html +0 -13
  577. package/tests/rules/oj-html-attr-req/attrreq_FAIL_3.html +0 -8
  578. package/tests/rules/oj-html-attr-req/attrreq_FAIL_4.html +0 -13
  579. package/tests/rules/oj-html-attr-req/attrreq_FAIL_5.html +0 -17
  580. package/tests/rules/oj-html-attr-req/attrreq_PASS_1.html +0 -24
  581. package/tests/rules/oj-html-attr-req/attrreq_PASS_2.html +0 -24
  582. package/tests/rules/oj-html-attr-req/attrreq_PASS_3.html +0 -10
  583. package/tests/rules/oj-html-attr-req/attrreq_PASS_4.html +0 -11
  584. package/tests/rules/oj-html-bindforeach-data/bindforeach_data_FAIL_1.html +0 -19
  585. package/tests/rules/oj-html-bindforeach-data/bindforeach_data_PASS_1.html +0 -10
  586. package/tests/rules/oj-html-bindif-test/bindif_test_FAIL_1.html +0 -22
  587. package/tests/rules/oj-html-bindif-test/bindif_test_PASS_1.html +0 -11
  588. package/tests/rules/oj-html-binding-attr/binding-foreach_FAIL_2.html +0 -28
  589. package/tests/rules/oj-html-binding-attr/binding-if_FAIL_1.html +0 -23
  590. package/tests/rules/oj-html-binding-attr/binding-if_PASS_1.html +0 -23
  591. package/tests/rules/oj-html-cca-count/cca-count_FAIL_1.html +0 -119
  592. package/tests/rules/oj-html-cca-tagname/ccatag_FAIL_1.html +0 -7
  593. package/tests/rules/oj-html-cca-tagname/ccatag_PASS_1.html +0 -7
  594. package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_1.html +0 -8
  595. package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_2.html +0 -8
  596. package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_3.html +0 -8
  597. package/tests/rules/oj-html-cca-tagname/tag_ns_PASS_1.html +0 -10
  598. package/tests/rules/oj-html-cdn/html_cdn_FAIL_1.html +0 -18
  599. package/tests/rules/oj-html-cspexpr/cspexpr_FAIL_1.html +0 -14
  600. package/tests/rules/oj-html-cspexpr/cspexpr_FAIL_2.html +0 -10
  601. package/tests/rules/oj-html-cspexpr/cspexpr_PASS_1.html +0 -23
  602. package/tests/rules/oj-html-cspexpr/cspexpr_PASS_2.html +0 -10
  603. package/tests/rules/oj-html-cspexpr/cspexpr_PASS_3.html +0 -13
  604. package/tests/rules/oj-html-dlg-title/dlgtitle_FAIL_1.html +0 -12
  605. package/tests/rules/oj-html-dlg-title/dlgtitle_PASS_1.html +0 -12
  606. package/tests/rules/oj-html-form-noflex/noflex_FAIL_1.html +0 -10
  607. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_1.html +0 -20
  608. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_2.html +0 -13
  609. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_3.html +0 -16
  610. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_4.html +0 -13
  611. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_1.html +0 -6
  612. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_2.html +0 -7
  613. package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_3.html +0 -7
  614. package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_1.html +0 -37
  615. package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_2.html +0 -34
  616. package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_3.html +0 -27
  617. package/tests/rules/oj-html-jq-databind/jq-databind_PASS_1.html +0 -30
  618. package/tests/rules/oj-html-ko-comment/ko-comment_FAIL_1.html +0 -47
  619. package/tests/rules/oj-html-ko-comment/ko-comment_FAIL_2.html +0 -36
  620. package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_1.html +0 -24
  621. package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_2.html +0 -36
  622. package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_3.html +0 -29
  623. package/tests/rules/oj-html-label-for-prefix/for_FAIL_1.html +0 -8
  624. package/tests/rules/oj-html-label-for-prefix/for_PASS_1.html +0 -8
  625. package/tests/rules/oj-html-missing-doctype/doctype_missing_FAIL_1.html +0 -12
  626. package/tests/rules/oj-html-missing-doctype/doctype_missing_FAIL_2.html +0 -11
  627. package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_1.html +0 -14
  628. package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_2.html +0 -5
  629. package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_3.html +0 -12
  630. package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_5.html +0 -6
  631. package/tests/rules/oj-html-nonvoid-close/close_FAIL_1.html +0 -28
  632. package/tests/rules/oj-html-nonvoid-close/close_FAIL_2.html +0 -14
  633. package/tests/rules/oj-html-nonvoid-close/close_FAIL_3.html +0 -13
  634. package/tests/rules/oj-html-nonvoid-close/close_FAIL_5.html +0 -28
  635. package/tests/rules/oj-html-nonvoid-close/close_FAIL_6.html +0 -28
  636. package/tests/rules/oj-html-nonvoid-close/close_PASS_1.html +0 -7
  637. package/tests/rules/oj-html-oj-lib/oj_lib_FAIL_1.html +0 -15
  638. package/tests/rules/oj-html-ojattr/ojattr_PASS_1.html +0 -8
  639. package/tests/rules/oj-html-ojattr/ojattr_PASS_2.html +0 -10
  640. package/tests/rules/oj-html-ojattr/ojattr_PASS_3.html +0 -7
  641. package/tests/rules/oj-html-ojattr/ojattr_PASS_4.html +0 -7
  642. package/tests/rules/oj-html-ojattr-deprecated/ojattr-dep_FAIL1.html +0 -156
  643. package/tests/rules/oj-html-ojattr-enum-deprecated/enum_FAIL_1.html +0 -19
  644. package/tests/rules/oj-html-ojattr-enum-deprecated/enum_FAIL_2.html +0 -20
  645. package/tests/rules/oj-html-ojattr-enum-deprecated/enum_PASS_1.html +0 -25
  646. package/tests/rules/oj-html-ojattr-evt-syntax/evt-attr-syntax_FAIL_1.html +0 -6
  647. package/tests/rules/oj-html-ojattr-evt-syntax/evt-attr-syntax_PASS_1.html +0 -6
  648. package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_1.html +0 -26
  649. package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_2.html +0 -26
  650. package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_3.html +0 -8
  651. package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_4.html +0 -8
  652. package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_5.html +0 -8
  653. package/tests/rules/oj-html-ojattr-value/attr-value_PASS_1.html +0 -26
  654. package/tests/rules/oj-html-ojattr-value/attr-value_PASS_2.html +0 -8
  655. package/tests/rules/oj-html-ojattr-value/attr-value_PASS_3.html +0 -7
  656. package/tests/rules/oj-html-ojattr-value/attr-value_PASS_6.html +0 -7
  657. package/tests/rules/oj-html-ojattr-value/attr-value_PASS_7.html +0 -10
  658. package/tests/rules/oj-html-ojattr-value/attr_value_PASS_4.html +0 -7
  659. package/tests/rules/oj-html-ojattr-value/attr_value_PASS_5.html +0 -9
  660. package/tests/rules/oj-html-ojslot/ojslot_FAIL_1.html +0 -11
  661. package/tests/rules/oj-html-ojslot/ojslot_PASS_1.html +0 -12
  662. package/tests/rules/oj-html-ojstyle/style_FAIL_1.html +0 -103
  663. package/tests/rules/oj-html-ojstyle/style_PASS_2.html +0 -7
  664. package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_1.html +0 -10
  665. package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_2.html +0 -18
  666. package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_3.html +0 -10
  667. package/tests/rules/oj-html-ojtag-datacmd/datacmd_PASS_1.html +0 -28
  668. package/tests/rules/oj-html-ojtag-datacmd/datacmd_PASS_2.html +0 -15
  669. package/tests/rules/oj-html-ojtag-datactx/datactx_FAIL_1.html +0 -14
  670. package/tests/rules/oj-html-ojtag-datactx/datactx_PASS_1.html +0 -14
  671. package/tests/rules/oj-html-ojtag-globattr-noprefix/globattr-noprefix_FAIL_1.html +0 -36
  672. package/tests/rules/oj-html-ojtag-nonglobattr-prefix/nonglobattr-prefix_FAIL_1.html +0 -26
  673. package/tests/rules/oj-html-slot-name/slot_name.FAIL_1.html +0 -24
  674. package/tests/rules/oj-html-slot-name/slot_name.FAIL_2.html +0 -46
  675. package/tests/rules/oj-html-slot-name/slot_name.FAIL_3.html +0 -10
  676. package/tests/rules/oj-html-slot-name/slot_name.PASS_1.html +0 -24
  677. package/tests/rules/oj-html-slot-name/slot_name.PASS_2.html +0 -39
  678. package/tests/rules/oj-html-slot-name/slot_name.PASS_3.html +0 -10
  679. package/tests/rules/oj-html-slot-name/slot_name_PASS_4.html +0 -16
  680. package/tests/rules/oj-html-slot-name/slot_name_PASS_5.html +0 -11
  681. package/tests/rules/oj-html-slot-name/slot_name_PASS_6.html +0 -14
  682. package/tests/rules/oj-html-slot-name/slot_name_PASS_7.html +0 -10
  683. package/tests/rules/oj-html-style/style_FAIL_1.html +0 -7
  684. package/tests/rules/oj-html-style/style_PASS_1.html +0 -12
  685. package/tests/rules/oj-html-style/style_PASS_2.html +0 -7
  686. package/tests/rules/oj-html-style-bp-color/color-FAIL_1.html +0 -17
  687. package/tests/rules/oj-html-style-bp-color/color-FAIL_2.html +0 -15
  688. package/tests/rules/oj-html-style-bp-color/color-FAIL_3.html +0 -7
  689. package/tests/rules/oj-html-style-bp-color/color-PASS_1.html +0 -7
  690. package/tests/rules/oj-html-style-bp-font-family/fam_FAIL_1.html +0 -23
  691. package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_FAIL_1.html +0 -15
  692. package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_FAIL_2.html +0 -9
  693. package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_PASS_1.html +0 -9
  694. package/tests/rules/oj-html-unsup-theme/unsup_FAIL_1.html +0 -8
  695. package/tests/rules/oj-html-wctag-for/for_FAIL_1.html +0 -8
  696. package/tests/rules/oj-html-wctag-for/for_PASS_1.html +0 -8
  697. package/tests/rules/oj-js-comp-attr-deprecated/attr-del_FAIL_1.js +0 -20
  698. package/tests/rules/oj-js-comp-attr-deprecated/attr-dep_FAIL_1.js +0 -20
  699. package/tests/rules/oj-js-comp-meth-deprecated/meth-del_FAIL_1.js +0 -20
  700. package/tests/rules/oj-js-comp-meth-deprecated/meth-dep_FAIL_1.js +0 -20
  701. package/tests/rules/oj-js-define-promise/def-prom_FAIL_1.js +0 -16
  702. package/tests/rules/oj-js-define-promise/def-prom_FAIL_2.js +0 -16
  703. package/tests/rules/oj-js-diagnose/es6_PASS_1.js +0 -24
  704. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_1.js +0 -30
  705. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_2.js +0 -23
  706. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_3.js +0 -22
  707. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_4.js +0 -20
  708. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_5.js +0 -24
  709. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_6.js +0 -30
  710. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_7.js +0 -15
  711. package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_8.js +0 -16
  712. package/tests/rules/oj-js-no-ext-final/noextfinal_PASS_1.js +0 -17
  713. package/tests/rules/oj-js-no-ext-final/noextfinal_PASS_2.js +0 -17
  714. package/tests/rules/oj-js-noconsole/nocons_FAIL_1.js +0 -11
  715. package/tests/rules/oj-js-ojcomp-deprecated/jscomp_FAIL_1.js +0 -27
  716. package/tests/rules/oj-json-syntax/json_FAIL_1.json +0 -8
  717. package/tests/rules/oj-json-syntax/json_FAIL_2.json +0 -12
  718. package/tests/rules/oj-json-syntax/json_PASS_1.json +0 -25
  719. package/tests/rules/oj-json-syntax/json_PASS_2.json +0 -12
  720. package/tests/rules/oj-json-syntax/json_PASS_3.json +0 -14
  721. package/tests/rules/ojcompjson/attrreq_FAIL_1/component.json +0 -69
  722. package/tests/rules/pack-compjson/audit-pack/component-1/component-1-view.html +0 -6
  723. package/tests/rules/pack-compjson/audit-pack/component-1/component-1-viewModel.js +0 -56
  724. package/tests/rules/pack-compjson/audit-pack/component-1/component.json +0 -13
  725. package/tests/rules/pack-compjson/audit-pack/component-1/loader.js +0 -20
  726. package/tests/rules/pack-compjson/audit-pack/component-1/resources/nls/component-1-strings.js +0 -18
  727. package/tests/rules/pack-compjson/audit-pack/component-2/component-2-view.html +0 -5
  728. package/tests/rules/pack-compjson/audit-pack/component-2/component-2-viewModel.js +0 -56
  729. package/tests/rules/pack-compjson/audit-pack/component-2/component.json +0 -13
  730. package/tests/rules/pack-compjson/audit-pack/component-2/loader.js +0 -20
  731. package/tests/rules/pack-compjson/audit-pack/component-2/resources/nls/component-1-strings.js +0 -18
  732. package/tests/rules/pack-compjson/audit-pack/component.json +0 -12
  733. package/tests/rules/pack-compjson/audit-singleton-1/audit-singleton-1-view.html +0 -5
  734. package/tests/rules/pack-compjson/audit-singleton-1/audit-singleton-1-viewModel.js +0 -56
  735. package/tests/rules/pack-compjson/audit-singleton-1/component.json +0 -20
  736. package/tests/rules/pack-compjson/audit-singleton-1/loader.js +0 -20
  737. package/tests/rules/pack-compjson/audit-singleton-1/resources/nls/audit-singleton-1-strings.js +0 -18
  738. package/tests/rules/pack-compjson/audit-singleton-2/audit-singleton-2-view.html +0 -8
  739. package/tests/rules/pack-compjson/audit-singleton-2/audit-singleton-2-viewModel.js +0 -56
  740. package/tests/rules/pack-compjson/audit-singleton-2/component.json +0 -15
  741. package/tests/rules/pack-compjson/audit-singleton-2/loader.js +0 -20
  742. package/tests/rules/pack-compjson/audit-singleton-2/resources/nls/audit-singleton-2-strings.js +0 -18
  743. package/tests/rules/parse-html/proc_instr.html +0 -9
  744. package/tests/rules/spoc-dom-manip/dom-manip_FAIL_1.js +0 -113
  745. package/tests/rules/spoc-dom-manip/dom-manip_FAIL_2.js +0 -151
  746. package/tests/rules/spoc-dom-manip/dom-manip_PASS_1.js +0 -149
  747. package/tests/rules/spoc-dom-manip/dom-manip_PASS_2.js +0 -147
  748. package/tests/rules/spoc-dom-manip/dom-manip_PASS_3.js +0 -147
  749. package/tests/rules/spoc-dom-manip/dom-manip_PASS_4.js +0 -20
  750. package/tests/rules/spoc-dom-manip/dom-manip_PASS_5.js +0 -246
  751. package/tests/rules/tab-tests/tab-test_FAIL_1.html +0 -37
  752. package/tests/rules/tab-tests/tab-test_FAIL_2.html +0 -8
  753. package/tests/rules/webcomptests/jet-composites/oj-html-wctag-$props/prop_PASS_1.html +0 -8
  754. package/tests/rules/webcomptests/jet-composites/oj-html-wctag-$props/prop_PASS_2.html +0 -8
  755. package/tests/rules/webcomptests/jet-composites/oj-html-wctag-for/for_FAIL_1.html +0 -8
  756. package/tests/rules/webcomptests/jet-composites/oj-html-wctag-for/for_PASS_1.html +0 -8
  757. package/tests/src/JetTest.js +0 -1
  758. package/tests/src/server.js +0 -1
  759. package/tests/test.js +0 -1
@@ -1 +1,6 @@
1
- const path=require("path");const Utils=require("../jetwc-lib/component-audit-utils");const ruleDef=function(){};ruleDef.prototype.getName=function(){return"jetwc-unused-slots"};ruleDef.prototype.getShortDescription=function(){return"Verify that all declared slots are actually used"};ruleDef.prototype.getDescription=function(){return"This rule checks that any slots declared in the metadata are then actually used via an oj-bind-* in the associated html"};ruleDef.prototype.register=function(context){return{ojtag:this._flagSlotUse,closedownRP:this._doAudit}};ruleDef.prototype._flagSlotUse=function(context){if(context.tag==="oj-bind-template-slot"||context.tag==="oj-bind-slot"){const slotName=context.tagNode.attribs.name?context.tagNode.attribs.name:"__default__";if(slotName&&!Utils.isExpressionString(slotName)){const componentName=Utils.matchComponentPath(context,path.dirname(context.filepath));if(componentName){this._markSlotUsed(context,componentName,slotName)}}}};ruleDef.prototype._doAudit=function(context){const slotUsage=context.rulePack.getExtension().slotUsage;if(slotUsage){slotUsage.forEach(function(value,key){if(!value){const idParts=key.split(":");const componentName=idParts[0];const slotName=idParts[1];if(!Utils.shouldIgnoreCheck(context,"jetwc-unused-slots",componentName,"slots",slotName)){const issue=new context.Issue(`Slot '${slotName?slotName:"default"}' for component ${componentName} does not appear to be bound to the UI`,"0099");context.reporter.addIssue(issue,context,"info")}}})}};ruleDef.prototype._markSlotUsed=function(context,componentName,slotName){let slotUsage=context.rulePack.getExtension().slotUsage;const slotKey=`${componentName}:${slotName}`;if(!slotUsage){slotUsage=new Map;context.rulePack.getExtension().slotUsage=slotUsage}if(!slotUsage.has(slotKey)){const slotComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(slotComponentDef.hasOwnProperty("slots")){Object.keys(slotComponentDef.slots).forEach(slot=>{slotUsage.set(`${componentName}:${slot?slot:"__default__"}`,false)})}}if(slotUsage.has(slotKey)){slotUsage.set(slotKey,true)}};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require("path");const Utils=require("../jetwc-lib/jetwcutils-componentAuditUtils");const ruleDef=function(){};ruleDef.prototype.getName=function(){return"jetwc-unused-slots"};ruleDef.prototype.getShortDescription=function(){return"Verify that all declared slots are actually used"};ruleDef.prototype.getDescription=function(){return"This rule checks that any slots declared in the metadata are then actually used via an oj-bind-* in the associated html"};ruleDef.prototype.register=function(context){return{"<oj-bind-template-slot>":this._flagSlotUse,"<oj-bind-slot>":this._flagSlotUse,closedownRP:this._doAudit}};ruleDef.prototype._flagSlotUse=function(context){const slotName=context.tagNode.attribs.name?context.tagNode.attribs.name:"__default__";if(slotName&&!context.utils.DomUtils.isExpression(slotName)){const componentName=Utils.matchComponentPath(context,path.dirname(context.filepath));if(componentName){this._markSlotUsed(context,componentName,slotName)}}};ruleDef.prototype._doAudit=function(context){if(context.rulePack.getExtension()){const slotUsage=context.rulePack.getExtension().slotUsage;if(slotUsage){slotUsage.forEach(function(value,key){if(!value){const idParts=key.split(":");const componentName=idParts[0];const slotName=idParts[1];if(!Utils.shouldIgnoreCheck(context,"jetwc-unused-slots",componentName,"slots",slotName)){const issue=new context.Issue(`Slot '${slotName?slotName:"default"}' for component ${componentName} does not appear to be bound to the UI`);context.reporter.addIssue(issue,context)}}})}}};ruleDef.prototype._markSlotUsed=function(context,componentName,slotName){let slotUsage=context.rulePack.getExtension().slotUsage;const slotKey=`${componentName}:${slotName}`;if(!slotUsage){slotUsage=new Map;context.rulePack.getExtension().slotUsage=slotUsage}if(!slotUsage.has(slotKey)){const slotComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(slotComponentDef.hasOwnProperty("slots")){Object.keys(slotComponentDef.slots).forEach(slot=>{slotUsage.set(`${componentName}:${slot?slot:"__default__"}`,false)})}}if(slotUsage.has(slotKey)){slotUsage.set(slotKey,true)}};module.exports=ruleDef;
@@ -1 +1,6 @@
1
- const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-category'};ruleDef.prototype.getShortDescription=function(){return'Verify the category specified '};ruleDef.prototype.getDescription=function(){return'This rule is configured with your preferred Visual Builder component palette category'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){let issue;const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);const ruleOptions=context.rulePack.getRuleOptions();if(ruleOptions.categories&&ruleOptions.categories.length>0){switch(componentType){case'composite':case'vbcs-pattern':if(meta.extension&&meta.extension.catalog&&meta.extension.catalog.category){if(ruleOptions.categories.filter(cat=>cat===meta.extension.catalog.category).length===0){issue=new context.Issue(`Component ${fullName} (${componentType}) has an unexpected palette category set of '${meta.extension.catalog.category}'`,'0031');context.reporter.addIssue(issue,context,'minor')}}else{issue=new context.Issue(`Component ${fullName} (${componentType}) does not have a palette category set`,'0030');context.reporter.addIssue(issue,context,'minor')}break;default:break;}}}};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-category'};ruleDef.prototype.getShortDescription=function(){return'Verify the category specified '};ruleDef.prototype.getDescription=function(){return'This rule is configured with your preferred Visual Builder component palette category'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);let category;if(meta.extension&&meta.extension.catalog){category=meta.extension.catalog.category}this._checkCategory(context,fullName,componentType,category)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let category;if(componentInfo.extension&&componentInfo.extension.catalog){category=componentInfo.extension.catalog.category}this._checkCategory(context,componentInfo.fullName,componentInfo.type,category,true)}};ruleDef.prototype._checkCategory=function(context,fullName,componentType,category,isVComponent){let issue;const ruleOptions=context.rulePack.getRuleOptions();if(ruleOptions.categories&&ruleOptions.categories.length>0){switch(componentType){case'composite':case'vbcs-pattern':if(category){if(ruleOptions.categories.filter(cat=>cat===category).length===0){issue=new context.Issue(`Component ${fullName} (${isVComponent?'vcomponent':componentType}) has an unexpected palette category set of '${category}'`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}}else{issue=new context.Issue(`Component ${fullName} (${isVComponent?'vcomponent':componentType}) does not have a palette category set`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}break;default:break;}}};module.exports=ruleDef;
@@ -1 +1,6 @@
1
- const path=require('path');const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-icon'};ruleDef.prototype.getShortDescription=function(){return'Verify components have icons for Visual Builder'};ruleDef.prototype.getDescription=function(){return'This rule checks that the correct icon variants are supplied for the visual builder component palette'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){let issue;let inRedwood=context.utils.jafLib.getConfig().getTheme().toLowerCase()==='redwood';const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);switch(componentType){case'composite':case'vbcs-pattern':case'vbcs-action':if(!meta.icon){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned`,'0054');context.reporter.addIssue(issue,context,'info')}else{if(!meta.icon.iconPath){issue=new context.Issue(`Component ${fullName} does not have a base Visual Builder icon assigned via iconPath`,'0055');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'iconPath',meta.icon.iconPath,fullName)}if(inRedwood){if(meta.icon.hoverIconPath){this._checkIconLocationAndFormat(context,'hoverIconPath',meta.icon.hoverIconPath,fullName)}if(meta.icon.iconPath&&meta.icon.hoverIconPath&&meta.icon.iconPath!==meta.icon.hoverIconPath){issue=new context.Issue(`Component ${fullName} should use the same icon for the base and hover state in the Visual Builder Redwood component palette`,'0095');context.reporter.addIssue(issue,context,'info')}}else{if(!meta.icon.hoverIconPath){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned for hover (hoverIconPath)`,'0056');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'hoverIconPath',meta.icon.hoverIconPath,fullName)}if(meta.icon.iconPath&&meta.icon.hoverIconPath&&meta.icon.iconPath===meta.icon.hoverIconPath){issue=new context.Issue(`Component ${fullName} uses identical icons for the base and hover state in the Visual Builder component palette`,'0057');context.reporter.addIssue(issue,context,'info')}}}break;case'vbcs-template':if(!meta.icon||!meta.icon.iconPath){issue=new context.Issue(`Template ${fullName} does not have a Visual Builder icon assigned`,'0061');context.reporter.addIssue(issue,context,'info')}break;}}};ruleDef.prototype._checkIconLocationAndFormat=function(context,use,iconFile,componentName){const pathSegs=iconFile.split('/');if(pathSegs[0]!=='extension'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should be located under the /extension folder`,'0058');context.reporter.addIssue(issue,context,'info')}if(path.extname(iconFile).toLowerCase()!=='.svg'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should ideally be in SVG format`,'0059');context.reporter.addIssue(issue,context,'info')}if(context.rulePack.getExtension().allComponents.has(componentName)){const componentRoot=context.rulePack.getExtension().allComponents.get(componentName).rootFolder;if(!context.utils.fsUtils.fileExists(path.join(componentRoot,iconFile))){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} does not exist or is outside of the component distribution`,'0060');context.reporter.addIssue(issue,context,'major')}}};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-icon'};ruleDef.prototype.getShortDescription=function(){return'Verify components have icons for Visual Builder'};ruleDef.prototype.getDescription=function(){return'This rule checks that the correct icon variants are supplied for the visual builder component palette'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);this._checkIcon(context,fullName,componentType,meta.icon)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._checkIcon(context,componentInfo.fullName,componentInfo.type,componentInfo.icon)}};ruleDef.prototype._checkIcon=function(context,fullName,componentType,iconDef){let issue;const inRedwood=context.utils.jafLib.getConfig().getTheme().toLowerCase()==='redwood';switch(componentType){case'composite':case'vbcs-pattern':case'vbcs-action':if(!iconDef){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'info')}else{if(!iconDef.iconPath){issue=new context.Issue(`Component ${fullName} does not have a base Visual Builder icon assigned via iconPath`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'iconPath',iconDef.iconPath,fullName)}if(inRedwood){if(iconDef.hoverIconPath){this._checkIconLocationAndFormat(context,'hoverIconPath',iconDef.hoverIconPath,fullName)}if(iconDef.iconPath&&iconDef.hoverIconPath&&iconDef.iconPath!==iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} should use the same icon for the base and hover state in the Visual Builder Redwood component palette`);issue.setMsgKey(context.ruleName+'_9');context.reporter.addIssue(issue,context,'info')}}else{if(!iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned for hover (hoverIconPath)`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'hoverIconPath',iconDef.hoverIconPath,fullName)}if(iconDef.iconPath&&iconDef.hoverIconPath&&iconDef.iconPath===iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} uses identical icons for the base and hover state in the Visual Builder component palette`);issue.setMsgKey(context.ruleName+'_4');context.reporter.addIssue(issue,context,'info')}}}break;case'vbcs-template':if(!iconDef||!iconDef.iconPath){issue=new context.Issue(`Template ${fullName} does not have a Visual Builder icon assigned`);issue.setMsgKey(context.ruleName+'_8');context.reporter.addIssue(issue,context,'info')}break;}};ruleDef.prototype._checkIconLocationAndFormat=function(context,use,iconFile,componentName){const pathSegs=iconFile.split('/');if(pathSegs[0]!=='extension'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should be located under the /extension folder`);issue.setMsgKey(context.ruleName+'_5');context.reporter.addIssue(issue,context,'info')}if(path.extname(iconFile).toLowerCase()!=='.svg'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should ideally be in SVG format`);issue.setMsgKey(context.ruleName+'_6');context.reporter.addIssue(issue,context,'info')}if(context.rulePack.getExtension().allComponents.has(componentName)){const componentRoot=context.rulePack.getExtension().allComponents.get(componentName).rootFolder;if(!context.utils.fsUtils.fileExists(path.join(componentRoot,iconFile))){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} does not exist or is outside of the component distribution`);issue.setMsgKey(context.ruleName+'_7');context.reporter.addIssue(issue,context)}}};module.exports=ruleDef;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-jetversion'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent .tsx file includes the supported JET version'};ruleDef.prototype.getDescription=function(){return'This rule checks that a vcomponent either directly, or indirectly provides the jetVersion metadata needed to indicate the support range'};ruleDef.prototype.register=function(context){return{startaudit:this._checkForApplicability,Program:this._doVComponentAudit}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let checkVersion=componentInfo.jetVersion;if(!context.utils.semVerUtils.isValidRange(checkVersion)){if(componentInfo.inferredJetVersion){issue=new context.Issue(`Component ${componentInfo.fullName} inherits a JET version dependency from its pack that is using an invalid format (${checkVersion})`)}else{issue=new context.Issue(`Component ${componentInfo.fullName} defines a JET version dependency using an invalid format (${checkVersion})`)}issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}else{if(componentInfo.inferredJetVersion){issue=new context.Issue(`Component ${componentInfo.fullName} is using an inferred / defaulted JET version range`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'info')}}}};module.exports=ruleDef;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const{nodeModuleNameResolver}=require('typescript');const{nextTick}=require('process');let NT;const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-loader'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent has the required loader'};ruleDef.prototype.getDescription=function(){return'This rule checks that a VComponent is correctly matched with a loader.ts and that the class being exported matches the VComponent implementation'};ruleDef.prototype.register=function(context){NT=context.tsNodeTypes;return{startaudit:this._checkForApplicability,[NT.EXPORT_NAMED_DECL]:this._matchLoaderToComponents,closedownRP:this._checkForMissingLoaders}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._matchLoaderToComponents=function(context){if(context.filepath.endsWith('/loader.ts')){const loaderRoot=Utils.toNativePath(context.filepath.substring(0,context.filepath.lastIndexOf('/')));let issue;if(context.node.exportKind==='value'&&context.node.source&&context.node.source.type===NT.LITERAL){const relativeSource=Utils.toNativePath(context.node.source.value);const absoluteSource=Utils.toJAFPath(path.join(loaderRoot,`${relativeSource}.tsx`));const componentInfo=TsxUtils.matchToVComponentImpl(context,absoluteSource);if(componentInfo){componentInfo.viewModel.loaderMatch=true;const exportedClass=componentInfo.viewModel.className;if(exportedClass&&context.node.specifiers){context.node.specifiers.forEach(specifier=>{if(specifier.exported.type===NT.IDENTIFIER&&specifier.exported.name===exportedClass){componentInfo.viewModel.loaderCorrectExport=true}})}if(exportedClass&&!componentInfo.viewModel.loaderCorrectExport){const issue=new context.Issue(`The loader for component ${componentInfo.fullName} does not re-export the expected class name of ${exportedClass}`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'blocker')}}}}};ruleDef.prototype._checkForMissingLoaders=function(context){const allVComponents=[...context.rulePack.getExtension().allComponents].map(pair=>pair[1]).filter(componentInfo=>componentInfo.vcomponent&&!componentInfo.viewModel.loaderMatch);allVComponents.forEach(componentInfo=>{const issue=new context.Issue(`Component ${componentInfo.fullName} does not have a matching loader.ts. All VComponents must be re-exported by a loader.`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)})};module.exports=ruleDef;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-version'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent .tsx file defines a version number for the component'};ruleDef.prototype.getDescription=function(){return'This rule checks that a vcomponent either directly, or indirectly provides the version metadata needed for managing dependencies'};ruleDef.prototype.register=function(context){return{startaudit:this._checkForApplicability,Program:this._doVComponentAudit}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);let issue;if(componentInfo){if(componentInfo.version){if(!context.utils.semVerUtils.isValid(componentInfo.version)){if(componentInfo.pack&&componentInfo.inferredVersion){issue=new context.Issue(`Component ${componentInfo.fullName} inherits an invalid version number format (${componentInfo.version}) from its pack definition`)}else{issue=new context.Issue(`Component ${componentInfo.fullName} defines a version number using an invalid format (${componentInfo.version})`)}issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}else if(componentInfo.pack&&componentInfo.inferredVersion){issue=new context.Issue(`Component ${componentInfo.fullName} is inheriting a version number from its pack`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context,'info')}}else{issue=new context.Issue(`Component ${componentInfo?componentInfo.fullName:context.filepath.split('/').reverse()[0]} does not define a version number`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}}};module.exports=ruleDef;
@@ -1 +1,6 @@
1
- const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-version-openrange'};ruleDef.prototype.getShortDescription=function(){return'Verify that any version ranges for dependencies have an upper bound'};ruleDef.prototype.getDescription=function(){return'This rule checks that the component is not promising to support all future JET versions or unknown future versions of dependent components'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){let issue;const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);if(this._hasNoUpper(context,meta.jetVersion)){issue=new context.Issue(`Component ${fullName} specifies a JET Range that has no upper limit '${meta.jetVersion}'`,'0048');context.reporter.addIssue(issue,context,'major')}if(meta.dependencies){const deps=Object.keys(meta.dependencies);deps.forEach(dependency=>{const checkVersion=meta.dependencies[dependency];if(this._hasNoUpper(context,checkVersion)){issue=new context.Issue(`Component ${fullName} specifies a dependency range for ${dependency} that has no upper limit '${checkVersion}'`,'0049');context.reporter.addIssue(issue,context,'major')}})}}};ruleDef.prototype._hasNoUpper=function(auditContext,rangeString){let noUpper=false;if(rangeString){if(!auditContext.utils.semVerUtils.isValid(rangeString)&&auditContext.utils.semVerUtils.isValidRange(rangeString)){noUpper=auditContext.utils.semVerUtils.satisfiesRange('99999.0.0',rangeString)}}return noUpper};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-version-openrange'};ruleDef.prototype.getShortDescription=function(){return'Verify that any version ranges for dependencies have an upper bound'};ruleDef.prototype.getDescription=function(){return'This rule checks that the component is not promising to support all future JET versions or unknown future versions of dependent components'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){let issue;const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);this._verifyJetVersion(context,fullName,meta.jetVersion);if(meta.dependencies){const deps=Object.keys(meta.dependencies);deps.forEach(dependency=>{const checkVersion=meta.dependencies[dependency];this._verifyDependencyVersion(context,fullName,dependency,checkVersion)})}}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._verifyJetVersion(context,componentInfo.fullName,componentInfo.jetVersion);if(componentInfo.dependencies){componentInfo.dependencies.forEach(dependency=>{this._verifyDependencyVersion(context,componentInfo.fullName,dependency.name,dependency.range)})}}};ruleDef.prototype._hasNoUpper=function(auditContext,rangeString){let noUpper=false;if(rangeString){if(!auditContext.utils.semVerUtils.isValid(rangeString)&&auditContext.utils.semVerUtils.isValidRange(rangeString)){noUpper=auditContext.utils.semVerUtils.satisfiesRange('99999.0.0',rangeString)}}return noUpper};ruleDef.prototype._verifyJetVersion=function(auditContext,fullName,jetVersion){if(this._hasNoUpper(auditContext,jetVersion)){issue=new auditContext.Issue(`Component ${fullName} specifies a JET Range that has no upper limit '${jetVersion}'`);issue.setMsgKey(auditContext.ruleName+'_1');auditContext.reporter.addIssue(issue,auditContext)}};ruleDef.prototype._verifyDependencyVersion=function(auditContext,fullName,dependency,checkVersion){if(this._hasNoUpper(auditContext,checkVersion)){issue=new auditContext.Issue(`Component ${fullName} specifies a dependency range for ${dependency} that has no upper limit '${checkVersion}'`);issue.setMsgKey(auditContext.ruleName+'_2');auditContext.reporter.addIssue(issue,auditContext)}};module.exports=ruleDef;
@@ -1 +1,6 @@
1
- const path=require('path');const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-writeback-required'};ruleDef.prototype.getShortDescription=function(){return'Verifies that properties are marked with writeback if needed'};ruleDef.prototype.getDescription=function(){return'This rule attempts to match up calls to the setProperty() api with the properties being addressed and then verifies that they are set to writeback:true'};ruleDef.prototype.register=function(context){return{CallExpression:this._doAuditOnSetProperty,AssignmentExpression:this._doAuditOnPropertyAssignment,attrexpr:this._doAuditOnPropertyHTMLRef}};ruleDef.prototype._doAuditOnSetProperty=function(context,node){let issue;const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.callee.property&&node.callee.property.type==='Identifier'&&node.callee.property.name==='setProperty'){let isStyle=false;if(node.callee.object&&node.callee.object.property&&node.callee.object.property.type==='Identifier'&&node.callee.object.property.name==='style'){isStyle=true}if(!isStyle&&node.arguments&&node.arguments.length===2){if(node.arguments[0].type='Literal'&&node.arguments[0].value){let potentialProperty=node.arguments[0].value;if(potentialProperty.includes('.')){potentialProperty=potentialProperty.split('.')[0]}const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(potentialProperty)){if(!componentInfo.properties[potentialProperty].hasOwnProperty('writeback')||!componentInfo.properties[potentialProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' makes a call to setProperty() for the property ${potentialProperty} but this is not marked as writeback in the metadata`,'0080');context.reporter.addIssue(issue,context,'blocker')}}else{this._reportUndclProp(context,withinComponent,potentialProperty)}}}}};ruleDef.prototype._doAuditOnPropertyAssignment=function(context,node){let issue;const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.left.type==='MemberExpression'&&node.left.object.type==='MemberExpression'&&node.left.object.property.name==='properties'){const setProperty=this._isContextProperties(node);if(setProperty){const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(setProperty)){if(!componentInfo.properties[setProperty].hasOwnProperty('writeback')||!componentInfo.properties[setProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns a value to the property ${setProperty} but this is not marked as writeback in the metadata`,'0081');context.reporter.addIssue(issue,context,'major')}}else{this._reportUndclProp(context,withinComponent,setProperty)}}}};ruleDef.prototype._doAuditOnPropertyHTMLRef=function(context,attribName,attribValue,rawAttribValue){let issue;const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent){const parser=/^(?:\{\{\$props\.|\{\{\$properties\.)(.*)(?:\}\})$/;if(attribValue.match(parser)){const expressionParts=attribValue.split(parser);const checkProperty=expressionParts[1];const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(checkProperty)){if(!componentInfo.properties[checkProperty].hasOwnProperty('writeback')||!componentInfo.properties[checkProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns the property '${checkProperty}' using a read-write binding to the <${context.tag}> attribute '${attribName}', however, the property is not marked as writeback in the metadata`,'0082');context.reporter.addIssue(issue,context,'major')}}else{this._reportUndclProp(context,withinComponent,checkProperty)}}}};ruleDef.prototype._reportUndclProp=function(context,component,property){issue=new context.Issue(`Component '${component}' makes a call to setProperty() for an undeclared property ${property}`,'0083');context.reporter.addIssue(issue,context,'blocker')};ruleDef.prototype._isContextProperties=function(node){let assignedProperty;let assignmentChain=Utils.decomposeAssignment(node);const assignmentRoot=assignmentChain.pop();const assignmentSecondary=assignmentChain.pop();if(assignmentRoot==='this'||assignmentRoot==='<parameter>'&&assignmentSecondary==='context'){assignedProperty=assignmentChain[0]}return assignedProperty};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-writeback-required'};ruleDef.prototype.getShortDescription=function(){return'Verifies that properties are marked with writeback if needed'};ruleDef.prototype.getDescription=function(){return'This rule attempts to match up calls to the setProperty() api, or direct assignments to this.properties, with the properties being addressed and then verifies that they are set to writeback:true. (The properties object should not be used as a private cache for component state)'};ruleDef.prototype.register=function(context){return{CallExpression:this._doAuditOnSetProperty,AssignmentExpression:this._doAuditOnPropertyAssignment,attrexpr:this._doAuditOnPropertyHTMLRef}};ruleDef.prototype._doAuditOnSetProperty=function(context,node){let issue;const NT=context.utils.AstUtils.getNodeTypes();const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.callee.property&&node.callee.property.type===NT.IDENTIFIER&&node.callee.property.name==='setProperty'){let isStyle=false;if(node.callee.object&&node.callee.object.property&&node.callee.object.property.type===NT.IDENTIFIER&&node.callee.object.property.name==='style'){isStyle=true}let compRef=false;if(node.callee.object&&node.callee.object.object&&node.callee.object.property&&node.callee.object.property.type===NT.IDENTIFIER){if(node.callee.object.object.type===NT.THIS_EXPR||node.callee.object.object.type===NT.IDENTIFIER&&node.callee.object.object.name==='self'){compRef=true}}if(!isStyle&&compRef&&node.arguments&&node.arguments.length===2){if(node.arguments[0].type=NT.LITERAL&&node.arguments[0].value){let potentialProperty=node.arguments[0].value;if(potentialProperty.includes('.')){potentialProperty=potentialProperty.split('.')[0]}const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(potentialProperty)){if(!componentInfo.properties[potentialProperty].hasOwnProperty('writeback')||!componentInfo.properties[potentialProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' makes a call to setProperty() for the property ${potentialProperty} but this is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'blocker')}}else{this._reportUndclProp(context,withinComponent,potentialProperty)}}}}};ruleDef.prototype._doAuditOnPropertyAssignment=function(context,node){let issue;const NT=context.utils.AstUtils.getNodeTypes();const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.left.type===NT.MEMBER_EXPR&&node.left.object.type===NT.MEMBER_EXPR&&node.left.object.property.name==='properties'){const setProperty=this._isContextProperties(context,node);if(setProperty){const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(setProperty)){if(!componentInfo.properties[setProperty].hasOwnProperty('writeback')||!componentInfo.properties[setProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns a value to the property ${setProperty} but this is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}}else{this._reportUndclProp(context,withinComponent,setProperty)}}}};ruleDef.prototype._doAuditOnPropertyHTMLRef=function(context,attribName,attribValue,rawAttribValue){let issue;const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent){const parser=/^(?:\{\{\$props\.|\{\{\$properties\.)(.*)(?:\}\})$/;if(attribValue.match(parser)){const expressionParts=attribValue.split(parser);const checkProperty=expressionParts[1];const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(checkProperty)){if(!componentInfo.properties[checkProperty].hasOwnProperty('writeback')||!componentInfo.properties[checkProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns the property '${checkProperty}' using a read-write binding to the <${context.tag}> attribute '${attribName}', however, the property is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context)}}else{this._reportUndclProp(context,withinComponent,checkProperty)}}}};ruleDef.prototype._reportUndclProp=function(context,component,property){issue=new context.Issue(`Component '${component}' makes a call to setProperty() or cached context.properties for an undeclared property ${property}`);issue.setMsgKey(context.ruleName+'_4');context.reporter.addIssue(issue,context,'blocker')};ruleDef.prototype._isContextProperties=function(context,node){let assignedProperty;let assignmentChain=Utils.decomposeAssignment(context,node);const assignmentRoot=assignmentChain.pop();const assignmentSecondary=assignmentChain.pop();if(assignmentRoot==='this'||assignmentRoot==='<parameter>'&&assignmentSecondary==='context'){assignedProperty=assignmentChain[0]}return assignedProperty};module.exports=ruleDef;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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
+ {"jetwc-component-foldername":"0010","jetwc-component-location_1":"0011","jetwc-component-location_2":"0012","jetwc-pack-children_1":"0013","jetwc-pack-children_2":"0014","jetwc-pack-children_3":"0015","jetwc-pack-children_4":"0016","jetwc-packable-components_1":"0017","jetwc-packable-components_2":"0018","jetwc-packable-components_3":"0019","jetwc-component-dependencies_1":"0021","jetwc-component-dependencies_2":"0022","jetwc-component-dependencies_3":"0023","jetwc-component-dependencies_4":"0024","jetwc-component-dependencies_5":"0025","jetwc-prerelease-version":"0026","jetwc-prerelease-dependencies":"0027","jetwc-namespace":"0029","jetwc-vb-category_1":"0030","jetwc-vb-category_2":"0031","jetwc-jet-version_1":"0033","jetwc-jet-version_2":"0034","jetwc-absolute-jetversion":"0035","jetwc-semantic-version":"0040","jetwc-standard-files":"0041","jetwc-loader-file_1":"0044","jetwc-loader-file_2":"0045","jetwc-loader-file_3":"0046","jetwc-loader-file_4":"0047","jetwc-version-openrange_1":"0048","jetwc-version-openrange_2":"0049","jetwc-displayname_1":"0050","jetwc-displayname_2":"0051","jetwc-nls-root":"0052","jetwc-require-paths":"0053","jetwc-vb-icon_1":"0054","jetwc-vb-icon_2":"0055","jetwc-vb-icon_3":"0056","jetwc-vb-icon_4":"0057","jetwc-vb-icon_5":"0058","jetwc-vb-icon_6":"0059","jetwc-vb-icon_7":"0060","jetwc-vb-icon_8":"0061","jetwc-template-slots_1":"0062","jetwc-template-slots_2":"0063","jetwc-template-slots_3":"0064","jetwc-template-slots_4":"0065","jetwc-template-slots_5":"0066","jetwc-slots_1":"0067","jetwc-slots_2":"0068","jetwc-events_1":"0069","jetwc-events_2":"0070","jetwc-property-nesting":"0071","jetwc-nls-languages_1":"0072","jetwc-nls-languages_2":"0073","jetwc-nls-languages_3":"0074","jetwc-nls-languages_4":"0075","jetwc-event-displayname":"0076","jetwc-methods_1":"0077","jetwc-methods_2":"0078","jetwc-property-changed":"0079","jetwc-writeback-required_1":"0080","jetwc-writeback-required_2":"0081","jetwc-writeback-required_3":"0082","jetwc-writeback-required_4":"0083","jetwc-oj-register":"0084","jetwc-register-with-promises":"0085","jetwc-register-css":"0086","jetwc-deprecated-lifecycle":"0087","jetwc-aria-redefinition":"0088","jetwc-public-modules_1":"0089","jetwc-public-modules_2":"0090","jetwc-disabled-property":"0091","jetwc-reserved-property":"0092","jetwc-prerelease-pattern":"0093","jetwc-ojcss":"0094","jetwc-vb-icon_9":"0095","jetwc-component-location_3":"0096","jetwc-dynamic-slot-context":"0097","jetwc-dynamic-slots-naming":"0098","jetwc-unused-slots":"0099","jetwc-unused-events":"0100","jetwc-compjson-bp-obj":"0101","jetwc-compjson-bp-ar":"0102","jetwc-method-displayname":"0103","jetwc-slot-displayname":"0104","jetwc-component-displayname":"0105","jetwc-property-displayname":"0106","jetwc-data-property-prefix":"0107","jetwc-schema":"0108","jetwc-component-type":"0109","jetwc-subproperty-writeback":"0111","jetwc-nested-defaults":"0112","jetwc-required-subproperty":"0113","jetwc-vcomponent-jetversion_1":"0120","jetwc-vcomponent-jetversion_2":"0121","jetwc-vcomponent-version_1":"0130","jetwc-vcomponent-version_2":"0131","jetwc-vcomponent-version_3":"0132","jetwc-vcomponent-loader_1":"0140","jetwc-vcomponent-loader_2":"0141","jetwc-markdown-link_1":"0150","jetwc-markdown-link_2":"0151","jetwc-css-oj-complete":"0160"}
@@ -1 +1,6 @@
1
- {"title":"Extended Audit Rules for JET Custom Component Authors","prefix":"JETWC","version":"1.6.1","rules":{"jetwc-bootstrap":{"group":"jetwc-do-not-disable","enabled":true,"severity":"info","debug":false,"diagnosticFile":"jetwc-diagnostics","componentRoot":"jet-composites","auditBuildOutput":false},"jetwc-component-foldername":{"group":"jetwc-structure","severity":"blocker"},"jetwc-component-location":{"group":"jetwc-structure","severity":"blocker"},"jetwc-pack-children":{"group":"jetwc-dependencies","severity":"blocker"},"jetwc-packable-components":{"group":"jetwc-structure","severity":"blocker"},"jetwc-component-dependencies":{"group":"jetwc-dependencies","severity":"blocker"},"jetwc-prerelease-version":{"group":"jetwc-pre-release","severity":"info"},"jetwc-prerelease-dependencies":{"group":"jetwc-pre-release","severity":"info"},"jetwc-namespace":{"group":"jetwc-api","enabled":false,"namespaces":[],"severity":"blocker"},"jetwc-vb-category":{"group":"jetwc-vb","enabled":false,"categories":[],"severity":"minor"},"jetwc-jet-version":{"group":"jetwc-pre-release","enabled":false,"versionMatch":"upperLimit","severity":"blocker"},"jetwc-absolute-jetversion":{"group":"jetwc-dependencies","enabled":true,"severity":"minor"},"jetwc-semantic-version":{"group":"jetwc-dependencies","severity":"blocker"},"jetwc-standard-files":{"group":"jetwc-structure","enabled":true,"files":["README.md","CHANGELOG.md"],"severity":"info"},"jetwc-loader-file":{"group":["jetwc-structure","jet-js"],"enabled":true,"severity":"critical"},"jetwc-version-openrange":{"group":"jetwc-dependencies","severity":"major"},"jetwc-displayname":{"group":"jetwc-vb","enabled":true,"limits":{"component":{"length":30,"words":4},"property":{"length":30,"words":4},"event":{"length":30,"words":4},"template":{"length":40,"words":8}},"severity":"info"},"jetwc-nls-root":{"group":"jetwc-nls","enabled":true,"severity":"info"},"jetwc-require-paths":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","standardPaths":["require","exports","ojs","knockout","hammerjs","persist","jquery","vb"]},"jetwc-vb-icon":{"group":"jetwc-vb","enabled":true,"severity":"major"},"jetwc-template-slots":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-slots":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-events":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-property-nesting":{"group":"jetwc-api","enabled":true,"depth":3,"severity":"minor"},"jetwc-nls-languages":{"group":"jetwc-nls","enabled":false,"locales":[],"strict":false,"severity":"major"},"jetwc-event-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info"},"jetwc-nested-defaults":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-methods":{"group":"jetwc-api","enabled":true,"severity":"blocker"},"jetwc-property-changed":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-writeback-required":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-oj-register":{"group":"jetwc-deprecations","enabled":true,"severity":"minor"},"jetwc-register-with-promises":{"group":"jetwc-deprecations","enabled":true,"severity":"minor"},"jetwc-register-css":{"group":"jetwc-deprecations","enabled":true,"severity":"minor"},"jetwc-deprecated-lifecycle":{"group":"jetwc-deprecations","enabled":true,"severity":"major"},"jetwc-aria-redefinition":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-public-modules":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-disabled-property":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-reserved-property":{"group":"jetwc-api","enabled":true,"severity":"major","reserved":["slot","key","ref","children"]},"jetwc-prerelease-pattern":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-ojcss":{"group":"jetwc-theming","enabled":true,"severity":"minor"},"jetwc-dynamic-slot-context":{"group":"jetwc-api","enabled":true,"severity":"major"},"jetwc-dynamic-slots-naming":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-unused-slots":{"group":"jetwc-api","enabled":true,"severity":"info"},"jetwc-unused-events":{"group":"jetwc-api","enabled":true,"severity":"info"},"jetwc-compjson-bp-obj":{"group":"jetwc-api","enabled":true,"severity":"info"},"jetwc-compjson-bp-ar":{"group":"jetwc-api","enabled":true,"severity":"info"},"jetwc-component-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info"},"jetwc-method-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info"},"jetwc-property-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info"},"jetwc-slot-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info"},"jetwc-data-property-prefix":{"group":"jetwc-api","enabled":true,"severity":"minor"},"jetwc-schema":{"group":"jetwc-api","enabled":true,"severity":"blocker"},"jetwc-component-type":{"group":"jetwc-api","enabled":true,"severity":"info"}}}
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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
+ {"title":"Extended Audit Rules for JET Custom Component Authors","prefix":"JETWC","version":"1.17.0","rules":{"jetwc-bootstrap":{"group":"jetwc-do-not-disable","enabled":true,"severity":"info","debug":false,"diagnosticFile":"jetwc-diagnostics","componentRoot":"jet-composites","auditBuildOutput":false,"testMode":false,"$required":true,"filetype":["tsx"]},"jetwc-component-foldername":{"group":"jetwc-structure","severity":"blocker","filetype":["json","tsx"]},"jetwc-component-location":{"group":"jetwc-structure","severity":"blocker","filetype":["json","tsx"]},"jetwc-pack-children":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json"]},"jetwc-packable-components":{"group":"jetwc-structure","severity":"blocker","filetype":["json"]},"jetwc-component-dependencies":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json","tsx"]},"jetwc-prerelease-version":{"group":"jetwc-pre-release","severity":"info","filetype":["json","tsx"]},"jetwc-prerelease-dependencies":{"group":"jetwc-pre-release","severity":"info","filetype":["json","tsx"]},"jetwc-namespace":{"group":"jetwc-api","enabled":false,"namespaces":[],"severity":"blocker","filetype":["json","tsx"]},"jetwc-vb-category":{"group":"jetwc-vb","enabled":false,"categories":[],"severity":"minor","filetype":["json","tsx"]},"jetwc-jet-version":{"group":"jetwc-pre-release","enabled":false,"versionMatch":"upperLimit","severity":"blocker","filetype":["json","tsx"]},"jetwc-absolute-jetversion":{"group":"jetwc-dependencies","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-semantic-version":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json","tsx"]},"jetwc-standard-files":{"group":"jetwc-structure","enabled":true,"files":["README.md","CHANGELOG.md"],"severity":"info","filetype":["json","tsx"]},"jetwc-loader-file":{"group":["jetwc-structure","jet-js"],"enabled":true,"severity":"critical","filetype":["json","js","ts","tsx"]},"jetwc-version-openrange":{"group":"jetwc-dependencies","severity":"major","filetype":["json","tsx"]},"jetwc-displayname":{"group":"jetwc-vb","enabled":true,"limits":{"component":{"length":30,"words":4},"property":{"length":30,"words":4},"event":{"length":30,"words":4},"slot":{"length":30,"words":4},"template":{"length":40,"words":8}},"severity":"info","filetype":["json","tsx"]},"jetwc-nls-root":{"group":"jetwc-nls","enabled":true,"severity":"info","filetype":["js","ts","tsx"]},"jetwc-require-paths":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","standardPaths":["require","exports","ojs","knockout","hammerjs","persist","jquery","vb","preact"],"filetype":["js","ts","tsx"]},"jetwc-vb-icon":{"group":"jetwc-vb","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwc-template-slots":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html","tsx"]},"jetwc-slots":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html","tsx"]},"jetwc-events":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts","tsx"]},"jetwc-property-nesting":{"group":"jetwc-api","enabled":true,"depth":3,"severity":"minor","filetype":["json","tsx"]},"jetwc-nls-languages":{"group":"jetwc-nls","enabled":false,"locales":[],"strict":false,"severity":"major","filetype":["js","ts"]},"jetwc-event-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-nested-defaults":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwc-methods":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-property-changed":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-writeback-required":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-oj-register":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-register-with-promises":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-register-css":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-deprecated-lifecycle":{"group":"jetwc-deprecations","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-aria-redefinition":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-public-modules":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json"]},"jetwc-disabled-property":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-reserved-property":{"group":"jetwc-api","enabled":true,"severity":"major","reserved":["slot","key","ref","children"],"filetype":["json","tsx"]},"jetwc-prerelease-pattern":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-ojcss":{"group":"jetwc-theming","enabled":true,"severity":"minor","filetype":["js","ts","tsx"]},"jetwc-dynamic-slot-context":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json"]},"jetwc-dynamic-slots-naming":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-unused-slots":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["html"]},"jetwc-unused-events":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["js","ts"]},"jetwc-compjson-bp-obj":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-compjson-bp-ar":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-component-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-method-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-property-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-slot-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-data-property-prefix":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-schema":{"group":"jetwc-api","enabled":true,"severity":"blocker","filetype":["json"]},"jetwc-component-type":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json"]},"jetwc-subproperty-writeback":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html"]},"jetwc-required-subproperty":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-vcomponent-jetversion":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","filetype":["tsx"]},"jetwc-vcomponent-version":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","filetype":["tsx"]},"jetwc-vcomponent-loader":{"group":"jetwc-structure","enabled":true,"severity":"blocker","filetype":["ts"]},"jetwc-markdown-link":{"group":"jetwc-doc","enabled":true,"severity":"minor","filetype":["md"]},"jetwc-css-oj-complete":{"group":"jetwc-css","enabled":true,"severity":"major","filetype":["css"]}}}
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const NetUtils=require('../../lib/NetUtils');const AuditComponentCacheManager=function(context,ruleName,exchangeURL){const msg=context.utils.msgLib;this.cacheFolder=`jaftmp@-${context.rulePack.getPrefix()}`;this.fsUtils=context.utils.fsUtils;this.exchangeURL=exchangeURL;this.ruleName=ruleName;this._ensureLocalCache();this.baselineOpts=context.rulePack.getRuleOption('baseline',ruleName);if(this.baselineOpts&&Object.entries(this.baselineOpts).length>0){this.baselineIndexFileName=path.join(this.cacheFolder,`${this._getObjectHashSignature(this.baselineOpts)}.json`)}else{this.baselineIndexFileName=null}};AuditComponentCacheManager.prototype.isBaselineIndexAvailable=function(){return this.baselineIndexFileName!==null};AuditComponentCacheManager.prototype.getBaselineOpts=function(){return this.baselineOpts};AuditComponentCacheManager.prototype.readComponentCacheIndexFile=function(){if(this.baselineIndexFileName){if(this.fsUtils.fileExistsSync(this.baselineIndexFileName)){return this.fsUtils.readJsonSync(this.baselineIndexFileName)}else{return{}}}else{return}};AuditComponentCacheManager.prototype.writeComponentCacheIndexFile=function(index){if(this.baselineIndexFileName){this.fsUtils.writeJsonSync(index,this.baselineIndexFileName)}};AuditComponentCacheManager.prototype.removeLocalCache=function(){if(this.fsUtils.pathExistsSync(this.cacheFolder)){this.fsUtils.deleteFolderSync(this.cacheFolder,true)}};AuditComponentCacheManager.prototype.generateComponentCachePath=function(component,componentVersion){const mungedVersion=componentVersion.replace(/\./g,'-');return path.join(this.cacheFolder,`${component}@${mungedVersion}-component.json`)};AuditComponentCacheManager.prototype.existsInComponentCache=function(component,componentVersion){const cacheFile=this.generateComponentCachePath(component,componentVersion);return this.fsUtils.fileExistsSync(cacheFile)};AuditComponentCacheManager.prototype.writeToComponentCache=function(component,componentVersion,metadata){if(metadata){const cacheFile=this.generateComponentCachePath(component,componentVersion);this.fsUtils.writeJsonSync(metadata,cacheFile)}};AuditComponentCacheManager.prototype.readFromComponentCache=function(component,componentVersion){const cacheFile=this.generateComponentCachePath(component,componentVersion);return this.fsUtils.readJsonSync(cacheFile)};AuditComponentCacheManager.prototype.getComponentMetadata=function(component,componentVersion){if(this.existsInComponentCache(component,componentVersion)){return this.readFromComponentCache(component,componentVersion)}else{try{const netUtils=new NetUtils;const getResp=netUtils.loadUrl(`${this.exchangeURL}components/${component}/versions/${componentVersion}`);if(getResp.statusCode=200&&getResp.body){const cachedDef=JSON.parse(getResp.body).component;this.writeToComponentCache(component,componentVersion,cachedDef);return cachedDef}else{this.msg.error(`The exchange component ${component}@${componentVersion} needed by the rule ${this.ruleName} cannot be retrieved, ensure it is public`)}}catch(e){this.msg.error(`Unable to read component ${component}@${componentVersion} for rule ${this.ruleName}:\n${JSON.stringify(e)}`)};}return};AuditComponentCacheManager.prototype._ensureLocalCache=function(){if(!this.fsUtils.pathExistsSync(this.cacheFolder)){this.fsUtils.createFolderSync(this.cacheFolder)}};AuditComponentCacheManager.prototype._getObjectHashSignature=function(sourceObject){const sourceAsStringArray=Array.from(JSON.stringify(sourceObject));return sourceAsStringArray.reduce((hash,c)=>Math.imul(31,hash)+c.charCodeAt(0)|0,0)};module.exports=AuditComponentCacheManager;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 NetUtils=require('../../lib/NetUtils');const EXCHANGE_URL_OPTION='exchangeURL';function checkForExchangeConfiguration(auditContext){const{msgLib}=auditContext.utils;let exchangeURL;if(auditContext.rulePack.getRuleOptions()){exchangeURL=auditContext.rulePack.getRuleOptions()[EXCHANGE_URL_OPTION]}if((!exchangeURL||exchangeURL.length===0)&&auditContext.rulePack.getExtension()){exchangeURL=auditContext.rulePack.getExtension()[EXCHANGE_URL_OPTION]}if(exchangeURL&&exchangeURL.length>0){exchangeURL=exchangeURL.endsWith('/')?exchangeURL:`${exchangeURL}/`;const netUtils=new NetUtils;const statusResp=netUtils.loadUrl(`${exchangeURL}status`);if(statusResp.statusCode===200){return exchangeURL}else{msgLib.error(`The supplied ${EXCHANGE_URL_OPTION} value '${this.exchangeURL}' for the rule ${auditContext.ruleName} does not appear to be valid, the rule will be disabled`);auditContext.rulePack.disableRule();return}}else{msgLib.error(`The ${EXCHANGE_URL_OPTION} configuration option has not been defined for rule ${auditContext.ruleName}, the rule will be disabled`);auditContext.rulePack.disableRule();return}}module.exports={checkForExchangeConfiguration};
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const Utils=function(){this.rootPoint=this.toJAFPath(path.resolve('.')).length+1;this.isWindows=path.sep!=='/';this.noJSWarnDone=false};Utils.prototype.getKeyPathInfoForRulepack=function(context,auditBase){const paths={isBuiltOutput:false,componentRootFolder:null,exchangeCacheFolder:null,generalSourceRoot:'src',jsSource:null,tsSource:null,base:null};let jetConfig=context.ojetConfig;if(!jetConfig&&auditBase){const remoteConfig=path.join(auditBase,'oraclejetconfig.json');if(context.utils.fsUtils.pathExistsSync(remoteConfig)){jetConfig=context.utils.fsUtils.readJsonSync(remoteConfig)}}let jsDir='js';let tsDir='ts';paths.isBuiltOutput=context.rulePack.getRuleOptions().auditBuildOutput;paths.base=path.resolve(auditBase);if(jetConfig){jsDir=jetConfig.paths.source.javascript||'js';tsDir=jetConfig.paths.source.typescript||'ts';paths.exchangeCacheFolder=jetConfig.paths.source.exchangeComponents||'jet_components';paths.componentRootFolder=jetConfig.paths.source.components||'jet-composites';if(!paths.isBuiltOutput){paths.generalSourceRoot=jetConfig.paths.source.common||'src'}else{paths.generalSourceRoot=jetConfig.paths.staging.web||'web'}}paths.jsSource=this.toJAFPath(path.join(paths.generalSourceRoot,jsDir));if(!paths.isBuiltOutput){paths.tsSource=this.toJAFPath(path.join(paths.generalSourceRoot,tsDir))}return paths};Utils.prototype.matchComponentPath=function(context,checkPathBase,recursion){let checkPath=this.toJAFPath(checkPathBase);let componentMatch;if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allAuditableFilePaths')){if(context.rulePack.getExtension().allAuditableFilePaths.has(checkPath)){const x=context.rulePack.getExtension().allAuditableFilePaths;componentMatch=context.rulePack.getExtension().allAuditableFilePaths.get(checkPath)}else if(checkPath.includes(context.rulePack.getExtension().componentHome)){if(context.rulePack.getExtension().auditableComponentPaths.has(checkPath)){componentMatch=context.rulePack.getExtension().auditableComponentPaths.get(checkPath)}else{const parentPath=path.resolve(checkPathBase,'..'+path.sep);componentMatch=this.matchComponentPath(context,parentPath,true)}if(!recursion){context.rulePack.getExtension().allAuditableFilePaths.set(checkPath,componentMatch)}}else{context.rulePack.getExtension().allAuditableFilePaths.set(checkPath)}}else{this.reportMissingBootstrapInfo(context,'allAuditableFilePaths')}return componentMatch};Utils.prototype.reportMissingBootstrapInfo=function(context,checkTopic){const msg=context.utils.msgLib;const extnContext=context.rulePack.getExtension();if(!extnContext||!extnContext.bootStrap){const bootstrapRule=context.rulePack.getPrefix().toLowerCase()+'-bootstrap';if(context.rulePack.isRuleDisabled(bootstrapRule)){msg.error(`You must enable the ${bootstrapRule} rule to run in order to carry out a full component set audit`)}else{msg.error(`Apparent bootstrap error, no information cached for ${checkTopic}`)}context.rulePack.setExtension({...extnContext,bootStrap:true})}};Utils.prototype.componentInfo=function(context,componentName){if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allComponents')){return context.rulePack.getExtension().allComponents.get(componentName)}else{this.reportMissingBootstrapInfo(context,'allComponents')}return};Utils.prototype.getComponentFullName=function(metadata){return metadata.pack?`${metadata.pack}-${metadata.name}`:metadata.name};Utils.prototype.getComponentType=function(metadata){return metadata.type?metadata.type:'composite'};Utils.prototype.flattenComponentProperties=function(metaDef,valueAttribute,parentPath){let flattenedProps=[];if(metaDef.hasOwnProperty('properties')){const propArray=Object.keys(metaDef.properties);propArray.forEach(propertyName=>{let key;if(!parentPath){key=propertyName}else{key=parentPath+'.'+propertyName}flattenedProps.push({key:key,value:metaDef.properties[propertyName][valueAttribute]});const subPropsArray=this.flattenComponentProperties(metaDef.properties[propertyName],valueAttribute,key);flattenedProps=flattenedProps.concat(subPropsArray)})}return flattenedProps};Utils.prototype.setupFileMethodMapping=function(context,node){const NT=context.utils.AstUtils.getNodeTypes();const fileName=context.filepath;const withinComponent=this.matchComponentPath(context,path.dirname(fileName));if(withinComponent){if(node.parent&&node.parent.type===NT.ASSIGNMENT_EXPR&&node.parent.operator==='='){if(node.parent.left&&node.parent.left.property&&node.parent.left.property.type==NT.IDENTIFIER&&node.parent.left.property.name){const methodDef={name:node.parent.left.property.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}else if(node.parent&&node.parent.type===NT.METH_DEF&&node.parent.kind==='method'){if(node.parent.key&&node.parent.key.name){const methodDef={name:node.parent.key.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}else if(node.parent&&node.parent.type===NT.CLASS_PROP){if(node.parent.key&&node.parent.key.name){const methodDef={name:node.parent.key.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}}};Utils.prototype.setupFileMethodMappingFromMethodDefintion=function(context,node){const NT=context.utils.AstUtils.getNodeTypes();const fileName=context.filepath;const withinComponent=this.matchComponentPath(context,path.dirname(fileName));if(withinComponent){const methodDef={parameters:0};if(node.key&&node.key.type===NT.IDENTIFIER){methodDef.name=node.key.name;if(node.value&&node.value.type===NT.FUNC_EXPR&&node.value.params){methodDef.parameters=node.value.params.length}}if(methodDef.name){this.cacheFileMethod(context,fileName,methodDef)}}};Utils.prototype.cacheFileMethod=function(context,filePath,methodDef){if(!context.rulePack.getExtension().allDefinedFileMethods){context.rulePack.getExtension().allDefinedFileMethods=new Map}if(!context.rulePack.getExtension().allDefinedFileMethods.has(filePath)){context.rulePack.getExtension().allDefinedFileMethods.set(filePath,{methods:new Map})}if(!context.rulePack.getExtension().allDefinedFileMethods.get(filePath).methods.has(methodDef.name)){context.rulePack.getExtension().allDefinedFileMethods.get(filePath).methods.set(methodDef.name,methodDef)}};Utils.prototype.deriveViewModels=function(context,node){const fileName=context.filepath;if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allComponents')){const withinComponent=this.matchComponentPath(context,path.dirname(fileName));const componentInfo=context.rulePack.getExtension().allComponents.get(withinComponent);if(withinComponent&&componentInfo&&componentInfo.type==='composite'&&!componentInfo.viewModel.resolved){const targetLoaderExt=componentInfo.language==='tsx'?'.ts':`.${componentInfo.language}`;if(path.basename(fileName,targetLoaderExt)==='loader'){switch(componentInfo.language){case'js':case'ts':const registerInfo=this.getLoaderRegisterInfo(context,node);if(registerInfo){const vmRelativeFilePath=this._mapVMToImpl(context,node,registerInfo.viewModel,componentInfo.language==='ts');if(vmRelativeFilePath){const fullVMPath=this._expandPathInContext(context,withinComponent,vmRelativeFilePath);if(fullVMPath){componentInfo.viewModel={path:this.toJAFPath(path.resolve('.',`${fullVMPath}.${componentInfo.language}`)),resolved:true,skip:false}}}}break;case'tsx':break;}}}}else{this.reportMissingBootstrapInfo(context,'allComponents')}};Utils.prototype.getLoaderRegisterInfo=function(context,node){const msg=context.utils.msgLib;const NT=context.utils.AstUtils.getNodeTypes();let registerInfo;if(node.callee.type=NT.MEMBER_EXPR&&node.callee.object&&node.arguments&&node.arguments.length>0){let isRegister=false;let oldStyle=false;switch(node.callee.object.type){case NT.IDENTIFIER:if(node.callee.object.name==='Composite'){isRegister=this._astPropertyIdentifierName(context,node.callee,'register')}break;case NT.MEMBER_EXPR:if(node.callee.property&&node.callee.property.type===NT.IDENTIFIER&&node.callee.property.name==='register'){if(this._astPropertyIdentifierName(context,node.callee.object,'Composite')){isRegister=node.callee.object.object&&node.callee.object.object.type===NT.IDENTIFIER&&node.callee.object.object.name==='oj';if(isRegister){oldStyle=true}}}break;}if(isRegister){registerInfo={oldStyle:oldStyle};const tagArg=node.arguments[0];const def=node.arguments[1];registerInfo.tag=tagArg.type===NT.LITERAL?tagArg.value:'?';if(def.type===NT.OBJ_EXPR){vmProp=def.properties.filter(prop=>prop.key.name==='viewModel');if(vmProp.length===1){switch(vmProp[0].value.type){case NT.IDENTIFIER:registerInfo.viewModel=vmProp[0].value.name;break;case NT.OBJ_EXPR:if(vmProp[0].value.properties&&vmProp[0].value.properties[0]&&vmProp[0].value.properties[0].key.name==='inline'){registerInfo.viewModel=vmProp[0].value.properties[0].value.name;registerInfo.usesPromises=true}break;case NT.MEMBER_EXPR:if(vmProp[0].value.property&&vmProp[0].value.property.type===NT.IDENTIFIER){registerInfo.viewModel=vmProp[0].value.object.name;registerInfo.transpiled=true}break;case'TSAsExpression':if(vmProp[0].value.expression&&vmProp[0].value.expression.type===NT.IDENTIFIER){registerInfo.viewModel=vmProp[0].value.expression.name}else if(vmProp[0].value.expression&&vmProp[0].value.expression.type===NT.AS_EXPR){registerInfo.viewModel=vmProp[0].value.expression.expression.name;msg.msg(`WARNING: Component loader file ${context.filepath} attempts to redefine the composite.register viewModel interface`)}break;}}const cssCheck=def.properties.filter(prop=>prop.key.name==='css');if(cssCheck.length>0){registerInfo.registerCSS=true}}}}return registerInfo};Utils.prototype._astPropertyIdentifierName=function(context,node,checkName){const NT=context.utils.AstUtils.getNodeTypes();return node&&node.property&&node.property.type===NT.IDENTIFIER&&node.property.name===checkName};Utils.prototype._mapVMToImpl=function(context,node,vmName,useImports){let vmPathDef;if(vmName){let rootNode=node;if(useImports){vmPathDef=this._getImportPath(context,rootNode,vmName)}else{vmPathDef=this._getDefineStatementPath(context,rootNode,vmName);if(!vmPathDef){vmPathDef=this._mapToRequireAssignment(context,node,vmName)}}}return vmPathDef};Utils.prototype._mapToRequireAssignment=function(context,node,vmName){const NT=context.utils.AstUtils.getNodeTypes();let requirePath;const vmDeclNode=this._locateDeclaration(context,node,vmName);if(vmDeclNode.type===NT.CALL_EXPR&&vmDeclNode.callee.type===NT.IDENTIFIER&&vmDeclNode.callee.name==='require'){if(vmDeclNode.arguments&&vmDeclNode.arguments.length===1&&vmDeclNode.arguments[0].type===NT.LITERAL){requirePath=vmDeclNode.arguments[0].value}}return requirePath};Utils.prototype._getImportPath=function(context,node,importAs){const NT=context.utils.AstUtils.getNodeTypes();const bodyNodeArray=context.utils.AstUtils.getBody();let definePath;for(let i=0;i<bodyNodeArray.length;i++){const testNode=bodyNodeArray[i];switch(testNode.type){case'ImportDeclaration':if(testNode.specifiers&&Array.isArray(testNode.specifiers)&&testNode.specifiers.length===1&&(testNode.specifiers[0].type===NT.IMPORT_DEF_SPECIFIER||testNode.specifiers[0].type===NT.IMPORT_SPECIFIER)&&testNode.specifiers[0].local&&testNode.specifiers[0].local.name===importAs){definePath=testNode.source.value}break;case'TSImportEqualsDeclaration':if(testNode.id&&testNode.id.type===NT.IDENTIFIER&&testNode.id.name===importAs&&testNode.moduleReference&&testNode.moduleReference.type===NT.EXTERN_MOD_REF&&testNode.moduleReference.expression&&testNode.moduleReference.expression.type===NT.LITERAL){definePath=testNode.moduleReference.expression.value}break;}if(definePath){;break}}return definePath};Utils.prototype._getDefineStatementPath=function(context,node,defineParam){const NT=context.utils.AstUtils.getNodeTypes();let checkNode=node.parent;let definePath;while(checkNode){if(checkNode.type===NT.CALL_EXPR&&checkNode.callee.name==='define'){definePath=context.utils.AstUtils.parseDefine(checkNode)[defineParam]}checkNode=checkNode.parent}return definePath};Utils.prototype._expandPathInContext=function(context,componentName,requirePath){let targetPath=requirePath;const parsePluginParts=requirePath.split('!');if(parsePluginParts.length>1){targetPath=parsePluginParts[1]}let pathParts=targetPath.split('/');const decodeRoot=pathParts[0];if(decodeRoot==='.'){pathParts[0]=this.rootPathForComponent(context,componentName)}else{const remotePart=this.rootPathForComponent(context,decodeRoot);if(!remotePart){pathParts=[]}else{pathParts[0]=remotePart}}return pathParts.join('/')};Utils.prototype.rootPathForComponent=function(context,componentName){if(context.rulePack.getExtension().allComponents.has(componentName)){return context.rulePack.getExtension().allComponents.get(componentName).rootFolder}};Utils.prototype.getVMMethodsForLocalComposite=function(context,component){let vmMethods;const msg=context.utils.msgLib;const opts=context.rulePack.getRuleOptions();if(component.local&&component.type==='composite'){if(!component.viewModel.skip){if(!component.viewModel.resolved&&!component.viewModel.warned){if(!opts.testMode){msg.msg(`Warning: unable to derive the correct viewModel implementation for component ${component.fullName}, either your audit run does not include .js/.ts files, or you may need to set 'extension.audit.jetwc.viewModel' in the metadata to provide a hint`)}component.viewModel.warned=true}else{const rpState=context.rulePack.getExtension();if(rpState.allDefinedFileMethods&&rpState.allDefinedFileMethods.size>0){const vmMethodDef=rpState.allDefinedFileMethods.get(component.viewModel.path);if(vmMethodDef){vmMethods=vmMethodDef.methods}}else{if(!this.noJSWarnDone){msg.msg('Error: No JavaScript / TypeScript files have been processed. You need to ensure that your audit fileset includes .js, .ts, html and .json files to enable all audits in this rule-set. Use the ojaf --dryrun command to determine what files are covered by the audit');this.noJSWarnDone=true}}}}}return vmMethods};Utils.prototype.decomposeAssignment=function(auditContext,assignmentNode){const NT=auditContext.utils.AstUtils.getNodeTypes();const breakdown=[];this._walkAssignmentNodes(auditContext,assignmentNode.left,breakdown);if(!breakdown.includes('this')){const parentAssignment=breakdown[breakdown.length-1];const initialAssignmentNode=this._locateDeclaration(auditContext,assignmentNode,parentAssignment);if(initialAssignmentNode){if(initialAssignmentNode==='<parameter>'){breakdown.push('<parameter>')}else if(initialAssignmentNode.type===NT.THIS_EXPR){breakdown.push('this')}else if(initialAssignmentNode.type===NT.IDENTIFIER){breakdown.push(initialAssignmentNode.name);const indirectAssignmentNode=this._locateDeclaration(auditContext,assignmentNode,initialAssignmentNode.name);if(indirectAssignmentNode==='<parameter>'){breakdown.push('<parameter>')}else if(indirectAssignmentNode.type===NT.THIS_EXPR){breakdown.push('this')}}}}return breakdown};Utils.prototype._walkAssignmentNodes=function(context,node,accumulator){const NT=context.utils.AstUtils.getNodeTypes();switch(node.type){case NT.MEMBER_EXPR:accumulator.push(node.property.name);if(node.object){this._walkAssignmentNodes(context,node.object,accumulator)}break;case NT.IDENTIFIER:accumulator.push(node.name);break;case NT.THIS_EXPR:accumulator.push('this');break;}};Utils.prototype._locateDeclaration=function(context,node,searchVariable){const NT=context.utils.AstUtils.getNodeTypes();let initialAssignment;let workingNode=node;while(!initialAssignment){if(workingNode.body&&workingNode.body.length>0){workingNode.body.forEach(bodyNode=>{if(bodyNode.type===NT.VAR_DECLARATION){bodyNode.declarations.forEach(declNode=>{if(declNode.id.type===NT.IDENTIFIER&&declNode.id.name===searchVariable){initialAssignment=declNode.init}})}})}else if(workingNode.params&&workingNode.params.length>0){workingNode.params.forEach(paramNode=>{if(paramNode.name===searchVariable){initialAssignment='<parameter>'}})}if(!workingNode.parent){break}else{workingNode=workingNode.parent}}return initialAssignment};Utils.prototype.extractComponentInfoFromJSONFile=function(auditContext,componentFolder,fileName,isLocal,fromPrecompile){const msg=auditContext.utils.msgLib;let componentInfo={};const mdFile=`${componentFolder}/${fileName}`;const compMetadata=auditContext.utils.fsUtils.readJsonSync(mdFile);if(compMetadata!==null){componentInfo.name=compMetadata.name;componentInfo.pack=compMetadata.pack;if(fromPrecompile&&compMetadata.pack){if(compMetadata.name.startsWith(`${compMetadata.pack}-`)){componentInfo.name=compMetadata.name.substring(compMetadata.pack.length+1)}}componentInfo.fullName=componentInfo.pack?`${componentInfo.pack}-${componentInfo.name}`:componentInfo.name;componentInfo.displayName=compMetadata.displayName;componentInfo.description=compMetadata.description;componentInfo.version=compMetadata.version;componentInfo.jetVersion=compMetadata.jetVersion;componentInfo.extension=compMetadata.extension;if(compMetadata.icon){componentInfo.icon=compMetadata.icon}componentInfo.type=compMetadata.type?compMetadata.type:'composite';componentInfo.local=isLocal;componentInfo.rootFolder=this.toJAFPath(componentFolder);componentInfo.requirePaths=new Set;switch(componentInfo.type){case'reference':if(compMetadata.extension&&compMetadata.extension.oracle&&compMetadata.extension.oracle.businessApprovals){componentInfo.ba=compMetadata.extension.oracle.businessApprovals}if(compMetadata.paths&&compMetadata.paths.name){componentInfo.requirePaths.add(compMetadata.paths.name)}else{const extractPathSegments=compMetadata.package.split('/');if(extractPathSegments.length>1){componentInfo.requirePaths.add(extractPathSegments[1])}else{componentInfo.requirePaths.add(extractPathSegments[0])}}break;case'composite':if(compMetadata.slots){componentInfo.slots=compMetadata.slots}if(compMetadata.properties){componentInfo.properties=compMetadata.properties}if(compMetadata.events){componentInfo.events=compMetadata.events}if(compMetadata.methods&&Object.keys(compMetadata.methods).length>0){componentInfo.methods=compMetadata.methods}componentInfo.viewModel={resolved:false};if(compMetadata&&compMetadata.extension&&compMetadata.extension.audit&&compMetadata.extension.audit.jetwc&&compMetadata.extension.audit.jetwc.hasOwnProperty('viewModel')){const overrideVM=compMetadata.extension.audit.jetwc.viewModel;if(overrideVM){componentInfo.viewModel={path:this.toJAFPath(path.resolve('.',componentInfo.rootFolder,overrideVM)),resolved:true,skip:false}}else{componentInfo.viewModel={skip:true}}}case'resource':componentInfo.requirePaths.add('.');if(compMetadata.pack){componentInfo.requirePaths.add(`${componentInfo.pack}/${componentInfo.name}`)}else{componentInfo.requirePaths.add(componentInfo.name)}if(compMetadata.dependencies){componentInfo.dependencies=[];Object.keys(compMetadata.dependencies).forEach(depname=>{componentInfo.dependencies.push({name:depname,range:compMetadata.dependencies[depname]})})}break;}return componentInfo}else{msg.error(`Invalid JSON in component metadata ${mdFile}, component ignored`)}return};Utils.prototype.diagnosticReplacer=function(key,value){if(value instanceof Map){return Array.from(value).map(([vKey,vValue])=>{return{[vKey]:vValue?vValue:''}})}if(value instanceof Set){return Array.from(value)}return value};Utils.prototype.toJAFPath=function(sourcePath){if(this.isWindows){return sourcePath.replace(/\\\\|\\/g,'/')}return sourcePath};Utils.prototype.toNativePath=function(sourcePath){if(this.isWindows){return sourcePath.replace(/\//g,'\\')}return sourcePath};Utils.prototype.getDirectoryName=function(filePath){return path.dirname(filePath)};Utils.prototype.shouldIgnoreCheck=function(context,auditName,componentName,scope,target){let ignore=false;const checkComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(checkComponentDef){let targetDef;if(scope&&checkComponentDef[scope]){if(target.includes('.')&&scope==='properties'){targetDef=this.getPropertyAttributeFromPath(context,componentName,target)}else{targetDef=checkComponentDef[scope][target==='__default__'?'':target]}}else{targetDef=checkComponentDef}if(targetDef&&targetDef.extension&&targetDef.extension.hasOwnProperty('audit')&&targetDef.extension.audit.hasOwnProperty('ignore')){const ignoreArray=targetDef.extension.audit.ignore;ignore=ignoreArray.includes(auditName)}}return ignore};Utils.prototype.getPropertyAttributeFromPath=function(context,componentName,targetPath,attribute){const checkComponentDef=context.rulePack.getExtension().allComponents.get(componentName);let targetDef;if(checkComponentDef&&checkComponentDef.properties){if(targetPath.includes('.')){const propPath=targetPath.split('.');targetDef=checkComponentDef.properties[propPath[0]];for(let i=1;i<propPath.length;i++){targetDef=targetDef.properties[propPath[i]]}}else{targetDef=checkComponentDef.properties[targetPath]}}if(attribute){return targetDef[attribute]}else{return targetDef}};Utils.prototype.detectComponentSourceType=function(context,componentPathRoot,isVComponent){let componentImplType;if(isVComponent){componentImplType='tsx'}else{const{fsUtils}=context.utils;if(fsUtils.fileExistsSync(`${componentPathRoot}/loader.js`)){componentImplType='js'}else if(fsUtils.fileExistsSync(path.join(componentPathRoot,'loader.ts'))){componentImplType='ts'}else{const pathSegs=componentPathRoot.toLowerCase().split('/');if(pathSegs.includes('js')){componentImplType='js'}else{componentImplType='ts'}}}return componentImplType};Utils.prototype.safeSetExtension=function(context,extnValue){let existingContext=context.rulePack.getExtension();if(!existingContext){existingContext={}}const newContext={...existingContext,...extnValue};context.rulePack.setExtension(newContext)};Utils.prototype.disableRulePack=function(context){const rulesInPack=context.rulePack.getEnabledRuleList();rulesInPack.forEach(rule=>{context.rulePack.disableRule(rule)})};module.exports=new Utils;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const Utils=require('./jetwcutils-componentAuditUtils');const tsxUtils=require('./jetwcutils-tsxUtils');const ComponentFinder=function(){this.runOnce=false};ComponentFinder.prototype.findAllComponents=function(auditContext,projectPathInfo,componentRoots,precompileCache){const msg=auditContext.utils.msgLib;let masterComponentList=[];if(!this.runOnce||auditContext.rulePack.getRuleOptions().testMode){if(projectPathInfo.exchangeCacheFolder){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.exchangeCacheFolder),false,false,auditContext,null,null))}if(componentRoots&&componentRoots.length>0){componentRoots.forEach(root=>{let target=root;if(auditContext.utils.fsUtils.getFileTypeSync(target)==='f'){target=path.dirname(root);msg.msg(`Warning: Incorrectly defined "components" array entry in JAF configuration file. Entries should list folders only not explicit file names.\n Bad entry: "${root}"\nAudit will process the "${target}" folder instead.\n`)}masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(target,true,projectPathInfo.isBuiltOutput,auditContext,null,precompileCache))})}else{if(projectPathInfo.componentRootFolder){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.jsSource,projectPathInfo.componentRootFolder),true,projectPathInfo.isBuiltOutput,auditContext,null,precompileCache));if(projectPathInfo.tsSource){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.tsSource,projectPathInfo.componentRootFolder),true,false,auditContext,null,precompileCache))}}}this.runOnce=true;this.masterComponentList=masterComponentList}return this.masterComponentList};ComponentFinder.prototype._discoverComponentsFromRoot=function(rootDir,isLocal,builtOutput,auditContext,parentPack,precompileCache){const msg=auditContext.utils.msgLib;let componentArray=[];if(auditContext.utils.fsUtils.pathExistsSync(rootDir)){const compFileStructure=auditContext.utils.fsUtils.readDir(rootDir);compFileStructure.forEach(l1file=>{let componentInfo;if(!l1file.isFile&&l1file.files.length>0){l1file.files.forEach(l2file=>{if(!builtOutput){if(l2file.isFile&&l2file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name),'component.json',isLocal,false);componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._discoverComponentsFromRoot(Utils.toJAFPath(path.join(rootDir,l1file.name)),isLocal,false,auditContext,componentInfo.name,precompileCache);componentArray=componentArray.concat(packMembers)}}else if(l2file.isFile&&path.extname(l2file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,path.join(rootDir,l1file.name),l2file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}}else{if(!l2file.isFile&&l2file.files.length>0){l2file.files.forEach(l3file=>{if(l3file.isFile&&l3file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name,l2file.name),'component.json',isLocal,false);if(!componentInfo.pack){componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._discoverComponentsFromRoot(Utils.toJAFPath(path.join(rootDir,l1file.name,l2file.name)),isLocal,false,auditContext,componentInfo.name,precompileCache);componentArray=componentArray.concat(packMembers)}}}else if(l3file.isFile&&path.extname(l3file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,path.join(rootDir,l1file.name,l2file.name),l3file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}})}}})}else{if(l1file.isFile&&l1file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,rootDir,'component.json',isLocal,false);if(componentInfo.type!=='pack'||componentInfo.name!==parentPack){componentArray.push(componentInfo)}}else if(l1file.isFile&&path.extname(l1file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,rootDir,l1file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}}})}return componentArray};module.exports=new ComponentFinder;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const os=require('os');const Utils=require('./jetwcutils-componentAuditUtils');const COMPILER_OPTIONS={experimentalDecorators:true,failOnTypeErrors:true,jsx:'react',jsxFactory:'h',module:'commonjs',moduleResolution:'node',noEmitOnError:false,stripInternal:true,target:'es6'};const JAF_TEMP='jaf';const WORKING_ROOT_FOLDER='jetwc-temp';const OUTPUT_FOLDER='precompiled';const JSON_FOLDER='precompiled-json';const PreCompiler=function(){this.workingRootFolder=Utils.toJAFPath(path.join(os.tmpdir(),JAF_TEMP,WORKING_ROOT_FOLDER));this.runOnce=false};PreCompiler.prototype.getPrecompileCacheIfNeeded=function(auditContext,auditBase,tsSource,componentRootFolder){const{msgLib}=auditContext.utils;let precompileCache;if(!this.runOnce||auditContext.rulePack.getRuleOptions().testMode){if(auditContext.rulePack.getRuleOptions().hasOwnProperty('precompileCache')&&auditContext.rulePack.getRuleOptions().testMode){msgLib.info(`Test mode, bypassing Typescript compilation...`);precompileCache=Utils.toJAFPath(path.join(auditBase,auditContext.rulePack.getRuleOptions().precompileCache))}else{let tsConfigPath;if(auditContext.rulePack.getRuleOptions().hasOwnProperty('tsConfig')){tsConfigPath=auditContext.rulePack.getRuleOptions().tsConfig}else{tsConfigPath=path.join(auditBase,'tsconfig.json')}precompileCache=this._transformVComponents(auditContext,tsConfigPath,auditBase,tsSource,componentRootFolder)}this.runOnce=true;this.precompileCache=precompileCache}return this.precompileCache};PreCompiler.prototype._transformVComponents=function(auditContext,tsConfigPath,auditBase,sourceBase,componentBase){const{fsUtils,msgLib}=auditContext.utils;const normalizedTsConfigPath=Utils.toJAFPath(tsConfigPath);const normalizedAuditBase=Utils.toJAFPath(auditBase);const normalizedSourceBase=Utils.toJAFPath(sourceBase);if(fsUtils.fileExistsSync(normalizedTsConfigPath)){const outputFolder=fsUtils.getUniqueFileNameSync('_XXXXXX');const compiledOutputFolder=`${this.workingRootFolder}/js${outputFolder}`;const compiledJSONFolder=`${this.workingRootFolder}/json${outputFolder}`;const allTsConfig=fsUtils.readJsonSync(tsConfigPath,true,error=>msgLib.error(`Typescript configuration file ${tsConfigPath} cannot be read, unable to process VComponents.\nError: ${error}`));if(allTsConfig){msgLib.msg(`builtinJetWcRules: Typescript detected, compiling project...`);allTsConfig.compilerOptions.paths[`${componentBase}/*`]=[`${auditBase}/${sourceBase}/${componentBase}/*`];const sourceBaseRoot=sourceBase.includes('/')?sourceBase.split('/')[0]:sourceBase;Object.entries(allTsConfig.compilerOptions.paths).forEach(([pathKey,pathValues])=>{const remapped=pathValues.map(mappedPath=>{return this._remapPath(mappedPath,sourceBaseRoot,auditBase)});allTsConfig.compilerOptions.paths[pathKey]=remapped});allTsConfig.compilerOptions.typeRoots=allTsConfig.compilerOptions.typeRoots.map(typeroot=>this._remapPath(typeroot,sourceBaseRoot,auditBase));if(allTsConfig.compilerOptions.hasOwnProperty('types')){allTsConfig.compilerOptions.types=allTsConfig.compilerOptions.types.map(type=>this._remapPath(type,sourceBaseRoot,auditBase))}allTsConfig.compilerOptions.rootDir=auditBase;allTsConfig.compilerOptions.outDir=compiledOutputFolder;if(!fsUtils.pathExistsSync(this.workingRootFolder)){fsUtils.createFolderSync(this.workingRootFolder)}else{fsUtils.deleteFolderSync(this.workingRootFolder,false)}msgLib.debug(`builtinJetWcRules: Typescript compiled into ${this.workingRootFolder}`);const customTsc=`${auditBase}/node_modules/@oracle/oraclejet/dist/custom-tsc`;if(fsUtils.pathExistsSync(customTsc)){const CustomTypescriptCompiler=require(customTsc);const readFrom=`${auditBase}/${sourceBase}`;const files=this._discoverCompilableFiles(auditContext,readFrom,readFrom);const compileOptions={files,compilerOptions:allTsConfig.compilerOptions,buildOptions:{debug:false,dtDir:compiledJSONFolder,version:'',jetVersion:'',templatePath:path.join(customTsc,'templates'),tsBuiltDir:compiledOutputFolder,mainEntryFile:'loader.d.ts',typesDir:compiledOutputFolder}};const{errors}=CustomTypescriptCompiler.compile(compileOptions);if(errors.length){msgLib.error('Errors during Typescript pre-compilation of VComponents');errors.forEach(error=>{if(error.hasOwnProperty('message')){msgLib.error(error.message);msgLib.error(error.stack)}else{msgLib.error(error.toString())}})}else{msgLib.info(`builtinJetWcRules: Typescript compilation successful...`);return compiledJSONFolder}}else{msgLib.error('Unable to run VComponent pre-compilation as the required packages are not available. Run "ojet restore" or "npm install" to correct this.')}}}else{msgLib.info(`Typescript configuration file ${tsConfigPath} not found, pre-compilation will be skipped`)}return};PreCompiler.prototype._discoverCompilableFiles=function(auditContext,root,pathPrefix){const{fsUtils,msgLib}=auditContext.utils;const allSources=fsUtils.readDirSync(root);return this._extractCompilables(fsUtils,allSources,'').map(sourceFile=>`${pathPrefix}/${sourceFile}`)};PreCompiler.prototype._extractCompilables=function(fsUtils,sources,folder){return sources.reduce((compilables,candidate)=>{if(candidate.isFile&&(candidate.name.endsWith('.ts')||candidate.name.endsWith('.tsx'))){compilables.push(`${folder}/${candidate.name}`)}else if(candidate.files){compilables=compilables.concat(this._extractCompilables(fsUtils,candidate.files,`${folder}/${candidate.name}`,true))}return compilables},new Array)};PreCompiler.prototype._remapPath=function(definedPath,sourceFolder,auditBase){let newPath=definedPath;const segs=definedPath.split('/');if(segs[0]==='.'){segs.shift()}switch(segs[0]){case'node_modules':case sourceFolder:newPath=`${auditBase}/${segs.join('/')}`;break;}return newPath};module.exports=new PreCompiler;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 Utils=require('./jetwcutils-componentAuditUtils');const path=require('path');const TsxUtils=function(){};TsxUtils.prototype.extractComponentInfoFromTSXFile=function(auditContext,componentFolder,fileName,isLocal,precompileCache){const{msgLib,fsUtils}=auditContext.utils;const packRegEx=/@ojmetadata[\s]*pack[\s]*[\"|'](?<pack>[a-zA-Z\-0-9]*)[\"|']/mg;const versionRegEx=/@ojmetadata[\s]*version[\s]*[\"|'](?<version>[\.0-9\-a-zA-Z]*)[\"|']/mg;const jetVersionRegEx=/@ojmetadata[\s]*jetVersion[\s]*[\"|'](?<version>[\.0-9\-a-zA-Z^~><=]*)[\"|']/mg;const componentClassRexEx=/^[\s]*export[\s]*class[\s]*(?<className>[a-zA-Z\-0-9_]*)[\s]*extends[\s]*(?<superClass>[a-zA-Z\-0-9_]*)/mg;const loaderRegEx=/@ojmetadata[\s]*jetVersion [\"|'](?<version>[\.0-9\-a-zA-Z^~><=]*)[\"|']/mg;let componentInfo={};const tsxFile=path.join(componentFolder,fileName);const fileAsStr=auditContext.utils.fsUtils.readFileSync(tsxFile);const fullName=this.getVComponentElementName(fileAsStr);const componentName=this.getVComponentComponentName(fileAsStr);let fullNameMetadata=false;if(precompileCache){let mdSource=null;if(fullName){msgLib.debug(`Processing tsx and metadata for ${fullName}`);mdSource=`${precompileCache}/${fullName}.json`;if(!fsUtils.fileExistsSync(mdSource)){mdSource=`${precompileCache}/${componentName}.json`;if(!componentName||!fsUtils.fileExistsSync(mdSource)){mdSource=null}}else{fullNameMetadata=true}}if(mdSource!==null){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,precompileCache,`${fullNameMetadata?fullName:componentName}.json`,isLocal,true);componentInfo.rootFolder=Utils.toJAFPath(componentFolder);componentInfo.compiledMetadata=mdSource;componentInfo.vcomponent=true;componentInfo.viewModel={resolved:true,path:Utils.toJAFPath(tsxFile)};if(!componentName){componentInfo.inferredName=true}if(componentInfo.pack){const matchPack=packRegEx.exec(fileAsStr);if(!matchPack||!matchPack.groups.pack){componentInfo.inferredPack=true}}const matchVer=versionRegEx.exec(fileAsStr);if(!matchVer||!matchVer.groups.version){componentInfo.inferredVersion=true}const matchJetVer=jetVersionRegEx.exec(fileAsStr);if(!matchJetVer||!matchJetVer.groups.version){componentInfo.inferredJetVersion=true}let implClass;while((classDef=componentClassRexEx.exec(fileAsStr))!==null){if(classDef.groups.superClass==='Component'){implClass=classDef.groups.className}}if(implClass){componentInfo.viewModel.className=implClass}else{msgLib.info(`WARNING: Unable to determine VComponent class-name for ${fullName}`)}return componentInfo}else{return}}else{if(fullName){msgLib.error(`Unable to audit VComponent ${fullName}, pre-compiled metadata is not available`)}return}};TsxUtils.prototype.getVComponentElementName=function(sourceCode){const elementRegEx=/@customElement\s*\(\s*[\"|'](?<fullName>[a-zA-Z\-0-9]*)[\"|']\s*\)/mg;const matchElement=elementRegEx.exec(sourceCode);if(matchElement&&matchElement.groups&&matchElement.groups.fullName){return matchElement.groups.fullName}else{return}};TsxUtils.prototype.getVComponentComponentName=function(sourceCode){const nameRegEx=/@ojmetadata[\s]*name [\"|'](?<componentName>[a-zA-Z\-0-9]*)[\"|']/mg;const matchElement=nameRegEx.exec(sourceCode);if(matchElement&&matchElement.groups&&matchElement.groups.componentName){return matchElement.groups.componentName}else{return}};TsxUtils.prototype.matchToVComponentImpl=function(auditContext,testFileName){let componentInfo;let fileNameCanonical=Utils.toJAFPath(testFileName);if(fileNameCanonical.endsWith('.tsx')){const componentMatch=Utils.matchComponentPath(auditContext,fileNameCanonical);if(componentMatch){const testPossibleComponentInfo=Utils.componentInfo(auditContext,componentMatch);if(testPossibleComponentInfo.viewModel&&fileNameCanonical===testPossibleComponentInfo.viewModel.path){componentInfo=testPossibleComponentInfo}}}return componentInfo};module.exports=new TsxUtils;
@@ -1 +1,6 @@
1
- const path=require('path');const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-bootstrap'};ruleDef.prototype.getShortDescription=function(){return'Bootstrap processing for the JETWCO rulset'};ruleDef.prototype.getDescription=function(){return'This rule is for internal use by the ruleset and should not be disabled'};ruleDef.prototype.register=function(context){this.componentRoots=context.config.components;this.jetConfig=context.ojetConfig;return{startupRP:this._getAllVisibleComponents,closedownRP:this._reportDiagnostics}};ruleDef.prototype._getAllVisibleComponents=function(context){console.info(`${context.rulePack.getPackInfo().prefix} : ${context.rulePack.getPackInfo().version}`);const auditBuildOutput=context.rulePack.getRuleOptions().auditBuildOutput;const componentRootFolder=context.rulePack.getRuleOptions().componentRoot||'jet-composites';let masterComponentList=[];let jsroot;let tsroot;if(this.jetConfig){let generalSourceRoot;if(!auditBuildOutput){generalSourceRoot=this.jetConfig.paths.source.common||'src';const tssrc=this.jetConfig.paths.source.typescript||'ts';tsroot=Utils.toJAFPath(path.join(generalSourceRoot,tssrc))}else{generalSourceRoot=this.jetConfig.paths.staging.web||'web'}const jssrc=this.jetConfig.paths.source.javascript||'js';jsroot=Utils.toJAFPath(path.join(generalSourceRoot,jssrc));if(this.jetConfig&&this.jetConfig.components){masterComponentList=masterComponentList.concat(this._getComponents('jet_components',false,false,context))}}if(this.componentRoots&&this.componentRoots.length>0){this.componentRoots.forEach(root=>{masterComponentList=masterComponentList.concat(this._getComponents(root,true,auditBuildOutput,context))})}else{if(jsroot){masterComponentList=masterComponentList.concat(this._getComponents(Utils.toJAFPath(path.join(jsroot,componentRootFolder)),true,auditBuildOutput,context))}if(tsroot){masterComponentList=masterComponentList.concat(this._getComponents(Utils.toJAFPath(path.join(tsroot,componentRootFolder)),true,false,context))}}const allComponentsMap=masterComponentList.reduce((wmap,component)=>{if(!auditBuildOutput||auditBuildOutput&&!wmap.has(component.fullName)){wmap.set(component.fullName,component)}return wmap},new Map);const referenceComponents=new Map;const componentPaths=new Map;allComponentsMap.forEach(component=>{if(tsroot){component.language=component.rootFolder.startsWith(tsroot)?'ts':'js'}else{const pathSegs=component.rootFolder.split('/');if(pathSegs.includes('ts')||pathSegs.includes('TS')){component.language='ts'}else{component.language='js'}}switch(component.type){case'reference':referenceComponents.set(component.fullName,component.ba);break;case'composite':case'resource':if(component.local){if(component.dependencies){Object.values(component.dependencies).forEach(dependencyName=>{if(allComponentsMap.has(dependencyName)){const proxyPaths=allComponentsMap.get(dependencyName).requirePaths;proxyPaths.forEach(path=>{component.requirePaths.add(path)})}})}componentPaths.set(component.rootFolder,component.fullName)}break;}});context.rulePack.setExtension({rulepackVersion:context.rulePack.getPackInfo().version,platform:Utils.isWindows?'Windows':'Unix-like',componentHome:`/${componentRootFolder}/`,auditBuildOutput:auditBuildOutput,componentRoots:this.componentRoots,allReferenceComponents:referenceComponents,allComponents:allComponentsMap,auditableComponentPaths:componentPaths,allAuditableFilePaths:new Map})};ruleDef.prototype._getComponents=function(rootDir,isLocal,builtOutput,auditContext){let componentArray=[];if(auditContext.utils.fsUtils.pathExistsSync(rootDir)){const compFileStructure=auditContext.utils.fsUtils.readDir(rootDir);compFileStructure.forEach(l1file=>{let componentInfo;if(!l1file.isFile&&l1file.files.length>0){l1file.files.forEach(l2file=>{if(!builtOutput){if(l2file.isFile&&l2file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name),'component.json',isLocal);componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._getComponents(Utils.toJAFPath(path.join(rootDir,l1file.name)),isLocal,false,auditContext);componentArray=componentArray.concat(packMembers)}}}else{if(!l2file.isFile&&l2file.files.length>0){l2file.files.forEach(l3file=>{if(l3file.isFile&&l3file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name,l2file.name),'component.json',isLocal);if(!componentInfo.pack){componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._getComponents(Utils.toJAFPath(path.join(rootDir,l1file.name,l2file.name)),isLocal,false,auditContext);componentArray=componentArray.concat(packMembers)}}}})}}})}})}return componentArray};ruleDef.prototype._reportDiagnostics=function(context){const opts=context.rulePack.getRuleOptions();if(opts.debug&&opts.diagnosticFile){console.log(`Writing JETWCO diagnostics to ${opts.diagnosticFile}.json`);const dFile=Utils.toJAFPath(path.join(path.resolve('.'),opts.diagnosticFile+'.json'));context.utils.fsUtils.writeJsonSync(context.rulePack.getExtension(),dFile,{spaces:2,replacer:Utils.diagnosticReplacer})}};module.exports=ruleDef;
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const componentFinder=require('../jetwc-lib/jetwcutils-componentFinder');const preCompiler=require('../jetwc-lib/jetwcutils-preCompiler');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-bootstrap'};ruleDef.prototype.getShortDescription=function(){return'Bootstrap processing for the JETWCO rulset'};ruleDef.prototype.getDescription=function(){return'This rule is for internal use by the ruleset and should not be disabled'};ruleDef.prototype.register=function(context){this.componentRoots=context.config.components;this.auditBase=context.config.base;this.typeScriptCompile=context.config.typescript&&context.config.typescript.compile;return{startupRP:this._getAllVisibleComponents,closedownRP:this._reportDiagnostics}};ruleDef.prototype._getAllVisibleComponents=function(context){const{msgLib}=context.utils;msgLib.info(`builtinJetWcOracleRules (${context.rulePack.getPackInfo().prefix}): ${context.rulePack.getPackInfo().version}`);const projectPathInfo=Utils.getKeyPathInfoForRulepack(context,this.auditBase);const componentRootFolder=context.rulePack.getRuleOptions().componentRoot||projectPathInfo.componentRootFolder;const exchangeURL=context.rulePack.getRuleOptions().exchangeURL;let precompileCache;if(this.typeScriptCompile){precompileCache=preCompiler.getPrecompileCacheIfNeeded(context,this.auditBase,projectPathInfo.tsSource,projectPathInfo.componentRootFolder)}const masterComponentList=componentFinder.findAllComponents(context,projectPathInfo,this.componentRoots,precompileCache);if(masterComponentList&&masterComponentList.length>0){const allComponentsMap=masterComponentList.reduce((wmap,component)=>{if(!projectPathInfo.isBuiltOutput||projectPathInfo.isBuiltOutput&&!wmap.has(component.fullName)){wmap.set(component.fullName,component)}return wmap},new Map);const referenceComponents=new Map;const componentPaths=new Map;allComponentsMap.forEach(component=>{component.language=Utils.detectComponentSourceType(context,component.rootFolder);switch(component.type){case'reference':referenceComponents.set(component.fullName,component.ba);break;case'composite':case'resource':if(component.local){if(component.dependencies){Object.values(component.dependencies).forEach(dependencyName=>{if(allComponentsMap.has(dependencyName)){const proxyPaths=allComponentsMap.get(dependencyName).requirePaths;proxyPaths.forEach(path=>{component.requirePaths.add(path)})}})}componentPaths.set(component.rootFolder,component.fullName)}break;}});context.rulePack.setExtension({rulepackVersion:context.rulePack.getPackInfo().version,bootStrap:true,exchangeURL:exchangeURL,platform:Utils.isWindows?'Windows':'Unix-like',precompiled:this.typeScriptCompile,componentHome:`/${componentRootFolder}/`,auditBuildOutput:projectPathInfo.isBuiltOutput,discoveredPaths:projectPathInfo,componentRoots:this.componentRoots,allReferenceComponents:referenceComponents,allComponents:allComponentsMap,auditableComponentPaths:componentPaths,allAuditableFilePaths:new Map})}else{msgLib.error(`No components have been discovered from the JAF configuration for the ${context.rulePack.getPackInfo().prefix} ruleset to process. You will need to configure the "components" array to point at your component root folder`);Utils.disableRulePack(context)}};ruleDef.prototype._reportDiagnostics=function(context){const msg=context.utils.msgLib;const opts=context.rulePack.getRuleOptions();const diagnostics=context.rulePack.getExtension();if(!opts.testMode){let foundVMMapping=0;let candidateLocal=0;if(diagnostics&&diagnostics.allComponents&&diagnostics.allComponents.length>0){diagnostics.allComponents.forEach((component,compName)=>{if(component.local&&component.type==='composite'){candidateLocal++;if(component.viewModel&&component.viewModel.resolved){foundVMMapping++}}});if(foundVMMapping!==candidateLocal){msgLib.error(`Error: Audit was only able to map ${foundVMMapping} out of ${candidateLocal} components to their viewModels. Some audits will be unable to operate.`)}}}if(opts.debug&&opts.diagnosticFile&&diagnostics){msgLib.msg(`Writing JETWCO diagnostics to ${opts.diagnosticFile}.json`);const dFile=Utils.toJAFPath(path.join(path.resolve('.'),opts.diagnosticFile+'.json'));context.utils.fsUtils.writeJsonSync(diagnostics,dFile,{spaces:2,replacer:Utils.diagnosticReplacer})}};module.exports=ruleDef;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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
+ module.exports.NEVER="never";module.exports.LATEST="latest";module.exports.SEMVER="semver";module.exports.PATCH="patch";module.exports.MINOR="minor";module.exports.MAJOR="major";module.exports.MAJOR_DEPRECATED="major+";module.exports.MAJOR_2_DEPRECATED="major2+";module.exports.MAJOR_3_DEPRECATED="major3+";
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorConditions=[];if(['composite','resource','vbcs-pattern'].includes(componentType)){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const diffs=CaccHelpers.dependenciesDiff(metadata.dependencies,compareMetadata.dependencies);if(CaccHelpers.checkConstraintMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Dependencies ${diffs.add.map(dep=>dep.dependency).join(', ')} added to${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMinorMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Dependencies ${diffs.remove.map(dep=>dep.dependency).join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){diffs.mutate.forEach(mutation=>{const mutationVersionDiff=CaccHelpers.semanticDiff(semver,mutation.version,mutation.historicalVersion);switch(mutateConstraint){case VC.NEVER:errorConditions.push(`Dependency ${mutation.dependency} version change in${errorMsgContext}'${mutateConstraint}'`);break;case VC.SEMVER:case VC.PATCH:if(mutationVersionDiff>componentVersionDiff){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;case VC.MINOR:if(componentVersionDiff<3||mutationVersionDiff>componentVersionDiff){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;default:if(componentVersionDiff<4){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;}})}if(errorConditions.length>0){return errorConditions.join('/n')}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 VC=require('./jetwco-cacc-auditConstraints');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorCondition;if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;let flagDiff,errorState;if(metadata.hasOwnProperty('dynamicSlots')){if(!compareMetadata.hasOwnProperty('dynamicSlots')){flagDiff='added to';switch(addConstraint){case VC.NEVER:errorState=true;break;case VC.SEMVER:case VC.PATCH:case VC.MINOR:if(componentVersionDiff<3){errorState=true}break;default:if(componentVersionDiff<4){errorState=true}break;}}}else if(compareMetadata.hasOwnProperty('dynamicSlots')){flagDiff='removed from';let errorState=false;switch(removeConstraint){case VC.NEVER:errorState=true;break;default:if(componentVersionDiff<4){errorState=true}break;}}if(errorState){errorCondition=`dynamicSlots marker ${flagDiff}${errorMsgContext}'${removeConstraint}'`}}return errorCondition};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.events,compareMetadata.events,'bubbles',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Event bubble flag set on ${diffs.add.map(addition=>addition.name).join(', ')} event(s) in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Event bubble flag unset on ${diffs.remove.map(removal=>removal.name).join(', ')} event(s) in${errorMsgContext}'${removeConstraint}'`)}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.events,compareMetadata.events,'cancelable',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Event cancelable flag set on ${diffs.add.map(addition=>addition.name).join(', ')} event(s) in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Event cancelable flag unset on ${diffs.remove.map(removal=>removal.name).join(', ')} event(s) in${errorMsgContext}'${removeConstraint}'`)}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;if(metadata.hasOwnProperty('events')&&compareMetadata.hasOwnProperty('events')){for(const[eventName,eventDef]of Object.entries(metadata.events)){if(compareMetadata.events.hasOwnProperty(eventName)){const diffs=CaccHelpers.apiDiff(eventDef.detail,compareMetadata.events[eventName].detail);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Detail attribute(s) ${diffs.add.map(addition=>addition.name).join(', ')} added to ${eventName} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Detail attribute(s) ${diffs.remove.map(removal=>removal.name).join(', ')} removed from ${eventName} in ${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){diffs.mutate.forEach(mutation=>{const mdType=eventDef.detail[mutation.name].type;const historicalType=compareMetadata.events[eventName].detail[mutation.name].type;if(mdType!==historicalType){if(mutateConstraint===VC.NEVER||componentVersionDiff<4){errorConditions.push(`Detail attribute type change for ${mutation.name} in ${eventName} in${errorMsgContext}'${mutateConstraint}'`)}}})}}}}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){return CaccHelpers.sharedMapAPICallback('events',controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext)};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 VC=require('./jetwco-cacc-auditConstraints');function calcRequiredVersionMatrix(controlProfile){const requiredVersions={patch:false,minor:false,major:false,major2:false,major3:false};for(const[auditCheck,ops]of Object.entries(controlProfile)){for(const[op,opDef]of Object.entries(ops)){if(['add','remove','mutate'].includes(op)){switch(opDef){case VC.SEMVER:requiredVersions.patch=true;requiredVersions.minor=true;requiredVersions.major=true;break;case VC.NEVER:break;case VC.PATCH:requiredVersions.patch=true;break;case VC.MINOR:requiredVersions.minor=true;break;case VC.MAJOR:case VC.MAJOR_DEPRECATED:requiredVersions.major=true;break;case VC.MAJOR_2_DEPRECATED:requiredVersions.major2=true;break;case VC.MAJOR_3_DEPRECATED:requiredVersions.major3=true;break;}}}}return requiredVersions}function dependenciesDiff(compareDependencies,historicalDependencies){const compare=compareDependencies?compareDependencies:{};const historical=historicalDependencies?historicalDependencies:{};const diffs={add:[],remove:[],mutate:[]};for(const[dependency,dependencyVersion]of Object.entries(compare)){if(historical.hasOwnProperty(dependency)){if(dependencyVersion!==historical[dependency]){diffs.mutate.push({dependency:dependency,version:dependencyVersion,historicalVersion:historical[dependency]})}}else{diffs.add.push({dependency:dependency,version:dependencyVersion})}}for(const[dependency,dependencyVersion]of Object.entries(historical)){if(!compare.hasOwnProperty(dependency)){diffs.remove.push({dependency:dependency,version:dependencyVersion})}}return diffs}function apiDiff(compareAPI,historicalAPI){const compare=compareAPI?compareAPI:{};const historical=historicalAPI?historicalAPI:{};const diffs={add:[],remove:[],mutate:[]};for(const[apiName,definition]of Object.entries(compare)){if(historical.hasOwnProperty(apiName)){if(JSON.stringify(definition)!==JSON.stringify(historical[apiName])){diffs.mutate.push({name:apiName,definition:definition,historicalDefinition:historical[apiName]})}}else{diffs.add.push({name:apiName,definition:definition})}}for(const[apiName,definition]of Object.entries(historical)){if(!compare.hasOwnProperty(apiName)){diffs.remove.push({name:apiName,definition:definition})}}return diffs}function mapAttributesDiff(compareMap,historicalMap,attributeKey,isBooleanFlagAttribute){const compare=compareMap?compareMap:{};const historical=historicalMap?historicalMap:{};const diffs={add:[],remove:[],mutate:[]};for(const[entryName,entryDef]of Object.entries(compare)){if(historical.hasOwnProperty(entryName)){const matchingHistoricalDef=historical[entryName];if(entryDef.hasOwnProperty(attributeKey)){if(!matchingHistoricalDef.hasOwnProperty(attributeKey)){if(!isBooleanFlagAttribute){diffs.add.push({name:entryName,value:entryDef[attributeKey]})}else if(entryDef[attributeKey]){diffs.add.push({name:entryName,value:true})}}else if(JSON.stringify(entryDef[attributeKey])!==JSON.stringify(matchingHistoricalDef[attributeKey])){if(!isBooleanFlagAttribute){diffs.mutate.push({name:entryName,value:entryDef[attributeKey],historicalValue:matchingHistoricalDef[attributeKey]})}else{if(entryDef[attributeKey]){diffs.add.push({name:entryName,value:true,historicalValue:false})}else{diffs.remove.push({name:entryName,value:false,historicalValue:true})}}}}else if(matchingHistoricalDef.hasOwnProperty(attributeKey)){if(!isBooleanFlagAttribute){diffs.remove.push({name:entryName,historicalValue:matchingHistoricalDef[attributeKey]})}else if(matchingHistoricalDef[attributeKey]){diffs.remove.push({name:entryName,historicalValue:true})}}}}return diffs}function typeDiff(currentTypeDef,compareTypeDef){const currentStr=currentTypeDef?currentTypeDef:'';const historicalStr=compareTypeDef?compareTypeDef:'';const diffs={add:[],remove:[],mutate:[]};const current=currentStr.split('|').map(type=>type.trim());const historical=historicalStr.split('|').map(type=>type.trim());if(current.length===1&&historical.length===1){if(current[0]!==historical[0]){diffs.mutate.push({type:current[0],historicalType:historical[0]})}}else{current.forEach(checkType=>{if(!historical.includes(checkType)){diffs.add.push({type:checkType})}});historical.forEach(checkType=>{if(!current.includes(checkType)){diffs.remove.push({historicalType:checkType})}})}return diffs}function stringArrayDiff(currentArray,compareArray){const compare=Array.isArray(currentArray)?currentArray:[];const historical=Array.isArray(compareArray)?compareArray:[];const diffs={add:[],remove:[]};compare.forEach(arrayEntry=>{if(!historical.includes(arrayEntry)){diffs.add.push(arrayEntry)}});historical.forEach(arrayEntry=>{if(!compare.includes(arrayEntry)){diffs.remove.push(arrayEntry)}});return diffs}function incrementMajorToMaxSupported(semver,startFrom,supportedRange){let{major:testMajor}=semver.parse(startFrom);let lastSupported=startFrom;while(semver.satisfiesRange(`${++testMajor}.0.0`,supportedRange)){lastSupported=semver.parse(`${testMajor}.0.0`)}return lastSupported}function deriveConstraintMetadata(baseline,constraint){let requiredConstraint=constraint;if(!constraint||constraint===VC.SEMVER){requiredConstraint=VC.LATEST}return baseline[requiredConstraint].metadata}function semanticDiff(semver,firstVersion,secondVersion){let diff=null;const first=tolerantSemverParse(semver,firstVersion);const second=tolerantSemverParse(semver,secondVersion);if(first&&second){if(semver.eq(first.version,second.version)){diff=0}else{const modifier=semver.gte(first.version,second.version)?1:-1;if(first.major!==second.major){diff=4}else if(first.minor!==second.minor){diff=3}else if(first.patch!==second.patch){diff=2}else{diff=1}diff=diff*modifier}}return diff}function tolerantSemverParse(semver,versionString){let parsed=null;if(semver.isValid(versionString)){parsed=semver.parse(versionString)}else if(semver.isValidRange(versionString)){parsed=semver.minVersion(versionString)}return parsed}function isMarkedAsDeprecated(cacheManager,componentName,version,scope,versionMetadata,statusTarget,statusValue){let deprecated=false;let metadata=versionMetadata;if(!metadata){metadata=cacheManager.getComponentMetadata(componentName,version)}if(metadata){let checkScope=castToScope(metadata,scope);if(checkScope&&checkScope.hasOwnProperty('status')){checkScope.status.forEach(statusRecord=>{if(statusRecord.type==='deprecated'){if(!statusTarget&&!statusRecord.target){deprecated=true}else if(statusRecord.target===statusTarget){if(Array.isArray(statusRecord.value)){statusRecord.value.forEach(srv=>{if(srv===statusValue){deprecated=true}})}}}})}}return deprecated}function castToScope(rootObject,scope){if(scope&&Array.isArray(scope)&&scope.length>0){const scopes=scope.slice();let workingObj=rootObject;while(workingObj&&scopes.length>0){let scopeKey=scopes.shift();if(scopeKey.startsWith('[')){if(Array.isArray(workingObj)){let match=scopeKey.slice(1,-1).split(':');workingObj=workingObj.find(row=>row[match[0]]===match[1])}else{return}}else{workingObj=workingObj[scopeKey]}}return workingObj}else{return rootObject}}function getPrintScope(scopeArray){const workingScope=scopeArray.slice(1);const printScope=workingScope.reduce((scopeString,scopeEntry)=>{return`${scopeString}${scopeEntry==='properties'?'.':scopeEntry}`},'');return printScope}function getComponentFullName(metadata){return metadata.pack?metadata.pack+'-'+metadata.name:metadata.name}function getStdErrorContext(componentName,controlRuleName){return` component ${componentName} in contradiction of ${controlRuleName} API change constraint of `}function sharedMapAPICallback(apiName,controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorConditions=[];if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const removeControlMetadata=deriveConstraintMetadata(baselines,removeConstraint);const diffs=apiDiff(metadata[apiName],compareMetadata[apiName]);if(checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`${apiName} ${diffs.add.map(added=>added.name).join(', ')} added to${errorMsgContext}'${addConstraint}'`)}const removeErrors=checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return[apiName,diff.name]});if(removeErrors.length>0){errorConditions.push(`${apiName} ${removeErrors.map(removed=>removed.name).join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}return errorConditions.join('\n')}};function flattenArrayByAttr(arrayOfObjects,keyAttrName){if(Array.isArray(arrayOfObjects)){return arrayOfObjects.map(instance=>instance[keyAttrName])}else{return[]}}function checkConstraintMajor(verbDiffs,constraint,versionDiff){let errorFlag=false;if(verbDiffs&&verbDiffs.length>0){switch(constraint){case VC.NEVER:errorFlag=true;break;default:if(versionDiff<4){errorFlag=true}break;}}return errorFlag}function checkConstraintMajorWithDeprecation(verbDiffs,constraint,versionDiff,cacheManager,componentName,controlMetadata,scopeFn,statusTarget,statusValueFn){let errorDiffs=[];if(verbDiffs&&verbDiffs.length>0){switch(constraint){case VC.NEVER:errorDiffs=verbDiffs;break;case VC.PATCH:case VC.SEMVER:case VC.MINOR:case VC.MAJOR:if(versionDiff<4){errorDiffs=verbDiffs}break;default:if(versionDiff<4||!controlMetadata){errorDiffs=verbDiffs}else{verbDiffs.forEach(diff=>{const diffScope=scopeFn.call(this,diff);let statusValue;if(statusValueFn){statusValue=statusValueFn.call(this,diff)}if(!isMarkedAsDeprecated(cacheManager,componentName,controlMetadata.version,diffScope,controlMetadata,statusTarget,statusValue)){errorDiffs.push(diff)}})}break;}}return errorDiffs}function checkConstraintMinorMajor(verbDiffs,constraint,versionDiff){let errorFlag=false;if(verbDiffs&&verbDiffs.length>0){switch(constraint){case VC.NEVER:errorFlag=true;break;case VC.SEMVER:case VC.PATCH:case VC.MINOR:if(versionDiff<3){errorFlag=true}break;default:if(versionDiff<4){errorFlag=true}break;}}return errorFlag}function checkConstraintMinorMajorWithDeprecation(verbDiffs,constraint,versionDiff,cacheManager,componentName,controlMetadata,scopeFn,statusTarget,statusValueFn){let errorDiffs=[];if(verbDiffs&&verbDiffs.length>0){switch(constraint){case VC.NEVER:errorDiffs=verbDiffs;break;case VC.PATCH:case VC.SEMVER:case VC.MINOR:if(versionDiff<3){errorDiffs=verbDiffs}break;case VC.MAJOR:if(versionDiff<4){errorDiffs=verbDiffs}break;default:if(versionDiff<4||!controlMetadata){errorDiffs=verbDiffs}else{verbDiffs.forEach(diff=>{const diffScope=scopeFn.call(this,diff);let statusValue;if(statusValueFn){statusValue=statusValueFn.call(this,diff)}if(!isMarkedAsDeprecated(cacheManager,componentName,controlMetadata.version,diffScope,controlMetadata,statusTarget,statusValue)){errorDiffs.push(diff)}})}break;}}return errorDiffs}function checkConstraintPatchMajor(verbDiffs,constraint,versionDiff){let errorFlag=false;if(verbDiffs&&verbDiffs.length>0){switch(constraint){case VC.NEVER:errorFlag=true;break;case VC.PATCH:if(versionDiff<2){errorFlag=true}break;case VC.SEMVER:case VC.MINOR:if(versionDiff<3){errorFlag=true}break;default:if(versionDiff<4){errorFlag=true}break;}}return errorFlag}module.exports={calcRequiredVersionMatrix,dependenciesDiff,apiDiff,mapAttributesDiff,typeDiff,stringArrayDiff,incrementMajorToMaxSupported,deriveConstraintMetadata,semanticDiff,tolerantSemverParse,isMarkedAsDeprecated,castToScope,getPrintScope,getComponentFullName,getStdErrorContext,sharedMapAPICallback,flattenArrayByAttr,checkConstraintMajor,checkConstraintMajorWithDeprecation,checkConstraintMinorMajor,checkConstraintMinorMajorWithDeprecation,checkConstraintPatchMajor};
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');const NULL_VERSION='0.0.0';function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorCondition;const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const addControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,addConstraint);const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);const mutateControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,mutateConstraint);const newJetVersionRange=metadata.jetVersion?metadata.jetVersion:NULL_VERSION;const compareJetVersionRange=compareMetadata.jetVersion?compareMetadata.jetVersion:NULL_VERSION;const mutateControlVersion=mutateControlMetadata?mutateControlMetadata.version:NULL_VERSION;if(mutateConstraint===VC.NEVER||compareMetadata.version!==mutateControlVersion){if((newJetVersionRange===NULL_VERSION||compareJetVersionRange===NULL_VERSION)&&newJetVersionRange!==compareJetVersionRange){errorCondition=`JET version range attribute (jetVersion) has been ${newJetVersionRange===NULL_VERSION?'removed from':'added to'} metadata in contradiction of ${controlRuleName} API change constraint of '${mutateConstraint}'`}}if(!errorCondition){const newMin=semver.minVersion(newJetVersionRange);const compareMin=semver.minVersion(compareJetVersionRange);if(newMin.version!==compareMin.version){if(removeConstraint===VC.NEVER||newMin>compareMin&&compareMetadata.version!==removeControlMetadata.version){errorCondition=`Lower bound of JET version range attribute (jetVersion) has been changed in contradiction of ${controlRuleName} API change constraint of '${removeConstraint}'`}}}if(!errorCondition){const newMaxMajor=CaccHelpers.incrementMajorToMaxSupported(semver,semver.minVersion(newJetVersionRange),newJetVersionRange);const compareMaxMajor=CaccHelpers.incrementMajorToMaxSupported(semver,semver.minVersion(compareJetVersionRange),compareJetVersionRange);if(newMaxMajor.major!==compareMaxMajor.major){if(addConstraint===VC.NEVER||compareMetadata.version!==addControlMetadata.version){errorCondition=`Upper bound of JET version range attribute (jetVersion) has been changed in contradiction of ${controlRuleName} API change constraint of '${addConstraint}'`}}}return errorCondition}module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);if(metadata.hasOwnProperty('methods')&&compareMetadata.hasOwnProperty('methods')){for(const[methodName,methodDef]of Object.entries(metadata.methods)){if(compareMetadata.methods.hasOwnProperty(methodName)){if(methodDef.hasOwnProperty('params')){methodDef.params.forEach(paramDef=>{const historicalParamDef=compareMetadata.methods[methodName].params.find(hpd=>hpd.name===paramDef.name);if(historicalParamDef){const diffs=CaccHelpers.typeDiff(paramDef.type,historicalParamDef.type);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Types ${diffs.add.map(addition=>addition.type).join(', ')} added to method parameter ${methodName}.${paramDef.name} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.mutate,mutateConstraint,componentVersionDiff)){errorConditions.push(`Method parameter type mutated for ${methodName} in${errorMsgContext}'${mutateConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['methods',methodName,'params',`[name:${paramDef.name}]`]},'parameterType',diff=>diff.historicalType);if(removeErrors.length>0){errorConditions.push(`Type(s) ${removeErrors.map(d=>d.historicalType).join(', ')} removed for parameter ${methodName}.${paramDef.name} in${errorMsgContext}'${removeConstraint}'`)}}})}}}}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);if(metadata.hasOwnProperty('methods')&&compareMetadata.hasOwnProperty('methods')){for(const[methodName,methodDef]of Object.entries(metadata.methods)){if(compareMetadata.methods.hasOwnProperty(methodName)){const diffs=methodParamsDiff(methodDef.params,compareMetadata.methods[methodName].params);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Method parameters ${diffs.add.join(', ')} added to ${methodName} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.mutate,mutateConstraint,componentVersionDiff)){errorConditions.push(`Method parameters mutated in a breaking fashion for ${methodName} in${errorMsgContext}'${mutateConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['methods',methodName,'params',`[name:${diff}]`]});if(removeErrors.length>0){errorConditions.push(`Method parameters ${removeErrors.join(', ')} removed from ${methodName} in ${errorMsgContext}'${removeConstraint}'`)}}}}if(errorConditions.length>0){return errorConditions.join('\n')}}return};function methodParamsDiff(currentParams,historicalParams){const compare=currentParams?currentParams.map(p=>p.name):[];const historical=historicalParams?historicalParams.map(p=>p.name):[];const diffs={add:[],remove:[],mutate:[]};for(let ci=0;ci<compare.length;ci++){const checkParam=compare[ci];const historicalIndex=historical.indexOf(checkParam);if(ci!==historicalIndex){if(historicalIndex>=0){diffs.mutate.push(checkParam)}else{if(ci>historical.length-1){diffs.add.push(checkParam)}else{diffs.mutate.push(checkParam)}}}}historical.forEach(histParam=>{if(!compare.includes(histParam)){diffs.remove.push(histParam)}});return diffs}function recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,compareScope,addConstraint,removeConstraint,componentVersionDiff,cacheManager){return errorConditions}module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;if(metadata.hasOwnProperty('methods')&&compareMetadata.hasOwnProperty('methods')){for(const[methodName,methodDef]of Object.entries(metadata.methods)){if(compareMetadata.methods.hasOwnProperty(methodName)){const diffs=CaccHelpers.typeDiff(methodDef.return,compareMetadata.methods[methodName].return);if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Method return type amended to include ${diffs.add.map(addition=>addition.type).join(', ')} added to ${methodName} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.mutate,mutateConstraint,componentVersionDiff)){const errorAction=diffs.mutate[0].type?'added':'removed';errorConditions.push(`Method return type ${errorAction} for ${methodName} in${errorMsgContext}'${mutateConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Types ${diffs.remove.join(', ')} removed from return value of method ${methodName} in ${errorMsgContext}'${removeConstraint}'`)}}}if(errorConditions.length>0){return errorConditions.join('\n')}}}return};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){return CaccHelpers.sharedMapAPICallback('methods',controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext)};module.exports=controlCallback;
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2018, 2022, 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 CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='pack'){const errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=bundlesDiff(metadata.bundles,compareMetadata.bundles);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Bundle(s) ${diffs.add.join(', ')} added to${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Bundle(s) ${diffs.remove.join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}if(errorConditions.length>0){return errorConditions.join('\n')}}return};function bundlesDiff(compareBundles,historicalBundles){const compare=compareBundles?compareBundles:{};const historical=historicalBundles?historicalBundles:{};const diffs={add:[],remove:[]};Object.keys(compare).forEach(bundleName=>{if(!historical.hasOwnProperty(bundleName)){diffs.add.push(bundleName)}});Object.keys(historical).forEach(bundleName=>{if(!compare.hasOwnProperty(bundleName)){diffs.remove.push(bundleName)}});return diffs}module.exports=controlCallback;