@oracle/oraclejet-audit 11.0.0 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/LICENSE.md +1 -1
  2. package/jaf-amd.js +6 -6
  3. package/jaf.js +2 -2
  4. package/jafapi.js +2 -2
  5. package/lib/AST.js +1 -1
  6. package/lib/AST_Ts.js +2 -2
  7. package/lib/AstJson.js +2 -2
  8. package/lib/AstMd.js +6 -0
  9. package/lib/AstNodeTypes.js +2 -2
  10. package/lib/Comments.js +1 -1
  11. package/lib/ComponentSvcs.js +1 -1
  12. package/lib/Components.js +2 -2
  13. package/lib/Config.js +2 -2
  14. package/lib/ConfigLib.js +2 -2
  15. package/lib/CssLib.js +1 -1
  16. package/lib/CssUtils.js +1 -1
  17. package/lib/DomUtils.js +2 -2
  18. package/lib/FileIndex.js +1 -1
  19. package/lib/FileSet.js +1 -1
  20. package/lib/FsUtils.js +2 -2
  21. package/lib/Histo.js +2 -2
  22. package/lib/HtmlTree.js +2 -2
  23. package/lib/HtmlUtils.js +1 -1
  24. package/lib/Issue.js +2 -2
  25. package/lib/JafEvents.js +1 -1
  26. package/lib/JafLib.js +2 -2
  27. package/lib/Json.js +2 -2
  28. package/lib/JsonLoader.js +2 -2
  29. package/lib/Md.js +6 -0
  30. package/lib/MetaLib.js +2 -2
  31. package/lib/NetUtils.js +1 -1
  32. package/lib/NodeTypes.js +1 -1
  33. package/lib/Parser.js +2 -2
  34. package/lib/RegTypes.js +2 -2
  35. package/lib/Registry.js +2 -2
  36. package/lib/Reporter.js +2 -2
  37. package/lib/RuleContext.js +1 -1
  38. package/lib/RulePack.js +1 -1
  39. package/lib/RuleSet.js +2 -2
  40. package/lib/Rules.js +2 -2
  41. package/lib/Scope.js +2 -2
  42. package/lib/SemVer.js +1 -1
  43. package/lib/Server.js +1 -1
  44. package/lib/SevLib.js +1 -1
  45. package/lib/Severity.js +1 -1
  46. package/lib/Stats.js +1 -1
  47. package/lib/Ts.js +2 -2
  48. package/lib/Utils.js +2 -2
  49. package/lib/Watch.js +1 -1
  50. package/lib/Writer.js +1 -1
  51. package/lib/ZipUtils.js +1 -1
  52. package/lib/api.js +2 -2
  53. package/lib/builtinpacks.js +6 -0
  54. package/lib/cliStats.js +2 -2
  55. package/lib/clone.js +2 -2
  56. package/lib/cmdline.js +2 -2
  57. package/lib/colors.js +2 -2
  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 +1 -1
  62. package/lib/extends.js +2 -2
  63. package/lib/filetypes.js +2 -2
  64. package/lib/grouplist.js +6 -0
  65. package/lib/groups.js +2 -2
  66. package/lib/help.js +2 -2
  67. package/lib/jetver.js +2 -2
  68. package/lib/macros.js +1 -1
  69. package/lib/manual.js +6 -0
  70. package/lib/metaLoader.js +1 -1
  71. package/lib/metahist.js +1 -1
  72. package/lib/msgidLoader.js +1 -1
  73. package/lib/ns.js +2 -2
  74. package/lib/nslist.js +1 -1
  75. package/lib/outFormat.js +1 -1
  76. package/lib/outfile.js +1 -1
  77. package/lib/ruleLoader.js +1 -1
  78. package/lib/scaffold.js +2 -2
  79. package/lib/scaffoldRule.js +2 -2
  80. package/lib/schema.js +2 -2
  81. package/lib/scopewalker.js +2 -2
  82. package/lib/spinner.js +2 -2
  83. package/lib/spinnernoop.js +1 -1
  84. package/lib/tabs.js +1 -1
  85. package/libext/expparser.js +1 -1
  86. package/meta/11.1.0/jetauditmeta.js +9 -0
  87. package/meta/12.0.0/jetauditmeta.js +9 -0
  88. package/meta/metaverlist.json +1 -1
  89. package/package.json +72 -68
  90. package/rulepacks/csp/csp-html-script-unsafe-inline.js +1 -1
  91. package/rulepacks/csp/csp-html-style-unsafe-inline.js +1 -1
  92. package/rulepacks/csp/csp-html-unsafe-expr.js +1 -1
  93. package/rulepacks/csp/csp-js-script-unsafe-eval.js +1 -1
  94. package/rulepacks/csp/csp-js-style-unsafe-inline.js +1 -1
  95. package/rulepacks/csp/csp-ts-script-unsafe-eval.js +1 -1
  96. package/rulepacks/csp/csp-ts-style-unsafe-inline.js +1 -1
  97. package/rulepacks/csp/msgid.json +1 -1
  98. package/rulepacks/csp/rules.json +1 -1
  99. package/rulepacks/jetwc/jetwc-absolute-jetversion.js +2 -2
  100. package/rulepacks/jetwc/jetwc-aria-redefinition.js +2 -2
  101. package/rulepacks/jetwc/jetwc-bootstrap.js +2 -2
  102. package/rulepacks/jetwc/jetwc-compjson-bp-ar.js +2 -2
  103. package/rulepacks/jetwc/jetwc-compjson-bp-obj.js +2 -2
  104. package/rulepacks/jetwc/jetwc-component-dependencies.js +2 -2
  105. package/rulepacks/jetwc/jetwc-component-displayname.js +2 -2
  106. package/rulepacks/jetwc/jetwc-component-foldername.js +2 -2
  107. package/rulepacks/jetwc/jetwc-component-location.js +2 -2
  108. package/rulepacks/jetwc/jetwc-component-type.js +2 -2
  109. package/rulepacks/jetwc/jetwc-css-oj-complete.js +6 -0
  110. package/rulepacks/jetwc/jetwc-data-property-prefix.js +2 -2
  111. package/rulepacks/jetwc/jetwc-deprecated-lifecycle.js +2 -2
  112. package/rulepacks/jetwc/jetwc-disabled-property.js +2 -2
  113. package/rulepacks/jetwc/jetwc-displayname.js +2 -2
  114. package/rulepacks/jetwc/jetwc-dynamic-slot-context.js +2 -2
  115. package/rulepacks/jetwc/jetwc-dynamic-slots-naming.js +2 -2
  116. package/rulepacks/jetwc/jetwc-event-displayname.js +2 -2
  117. package/rulepacks/jetwc/jetwc-events.js +2 -2
  118. package/rulepacks/jetwc/jetwc-jet-version.js +2 -2
  119. package/rulepacks/jetwc/jetwc-loader-file.js +2 -2
  120. package/rulepacks/jetwc/jetwc-markdown-link.js +6 -0
  121. package/rulepacks/jetwc/jetwc-method-displayname.js +2 -2
  122. package/rulepacks/jetwc/jetwc-methods.js +2 -2
  123. package/rulepacks/jetwc/jetwc-namespace.js +2 -2
  124. package/rulepacks/jetwc/jetwc-nested-defaults.js +2 -2
  125. package/rulepacks/jetwc/jetwc-nls-languages.js +2 -2
  126. package/rulepacks/jetwc/jetwc-nls-root.js +2 -2
  127. package/rulepacks/jetwc/jetwc-oj-register.js +2 -2
  128. package/rulepacks/jetwc/jetwc-ojcss.js +2 -2
  129. package/rulepacks/jetwc/jetwc-pack-children.js +2 -2
  130. package/rulepacks/jetwc/jetwc-packable-components.js +2 -2
  131. package/rulepacks/jetwc/jetwc-prerelease-dependencies.js +2 -2
  132. package/rulepacks/jetwc/jetwc-prerelease-pattern.js +2 -2
  133. package/rulepacks/jetwc/jetwc-prerelease-version.js +2 -2
  134. package/rulepacks/jetwc/jetwc-property-changed.js +2 -2
  135. package/rulepacks/jetwc/jetwc-property-displayname.js +2 -2
  136. package/rulepacks/jetwc/jetwc-property-nesting.js +2 -2
  137. package/rulepacks/jetwc/jetwc-public-modules.js +2 -2
  138. package/rulepacks/jetwc/jetwc-register-css.js +2 -2
  139. package/rulepacks/jetwc/jetwc-register-with-promises.js +2 -2
  140. package/rulepacks/jetwc/jetwc-require-paths.js +2 -2
  141. package/rulepacks/jetwc/jetwc-required-subproperty.js +2 -2
  142. package/rulepacks/jetwc/jetwc-reserved-property.js +2 -2
  143. package/rulepacks/jetwc/jetwc-schema.js +2 -2
  144. package/rulepacks/jetwc/jetwc-semantic-version.js +2 -2
  145. package/rulepacks/jetwc/jetwc-slot-displayname.js +2 -2
  146. package/rulepacks/jetwc/jetwc-slots.js +2 -2
  147. package/rulepacks/jetwc/jetwc-standard-files.js +2 -2
  148. package/rulepacks/jetwc/jetwc-subproperty-writeback.js +2 -2
  149. package/rulepacks/jetwc/jetwc-template-slots.js +2 -2
  150. package/rulepacks/jetwc/jetwc-unused-events.js +2 -2
  151. package/rulepacks/jetwc/jetwc-unused-slots.js +2 -2
  152. package/rulepacks/jetwc/jetwc-vb-category.js +2 -2
  153. package/rulepacks/jetwc/jetwc-vb-icon.js +2 -2
  154. package/rulepacks/jetwc/jetwc-vcomponent-jetversion.js +6 -0
  155. package/rulepacks/jetwc/jetwc-vcomponent-loader.js +6 -0
  156. package/rulepacks/jetwc/jetwc-vcomponent-version.js +6 -0
  157. package/rulepacks/jetwc/jetwc-version-openrange.js +2 -2
  158. package/rulepacks/jetwc/jetwc-writeback-required.js +2 -2
  159. package/rulepacks/jetwc/msgid.json +2 -2
  160. package/rulepacks/jetwc/rules.json +2 -2
  161. package/rulepacks/jetwc-lib/jetwcutils-auditComponentCacheManager.js +6 -0
  162. package/rulepacks/jetwc-lib/jetwcutils-commonListenerImpls.js +6 -0
  163. package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +6 -0
  164. package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +6 -0
  165. package/rulepacks/jetwc-lib/jetwcutils-preCompiler.js +6 -0
  166. package/rulepacks/jetwc-lib/jetwcutils-tsxUtils.js +6 -0
  167. package/rulepacks/jetwco/jetwco-bootstrap.js +2 -2
  168. package/rulepacks/jetwco/jetwco-cacc-auditConstraints.js +6 -0
  169. package/rulepacks/jetwco/jetwco-cacc-dependencies.js +6 -0
  170. package/rulepacks/jetwco/jetwco-cacc-dynamicSlots.js +6 -0
  171. package/rulepacks/jetwco/jetwco-cacc-eventBubbles.js +6 -0
  172. package/rulepacks/jetwco/jetwco-cacc-eventCancelable.js +6 -0
  173. package/rulepacks/jetwco/jetwco-cacc-eventPayload.js +6 -0
  174. package/rulepacks/jetwco/jetwco-cacc-events.js +6 -0
  175. package/rulepacks/jetwco/jetwco-cacc-helpers.js +6 -0
  176. package/rulepacks/jetwco/jetwco-cacc-jetVer.js +6 -0
  177. package/rulepacks/jetwco/jetwco-cacc-methodParamTypes.js +6 -0
  178. package/rulepacks/jetwco/jetwco-cacc-methodParams.js +6 -0
  179. package/rulepacks/jetwco/jetwco-cacc-methodReturnType.js +6 -0
  180. package/rulepacks/jetwco/jetwco-cacc-methods.js +6 -0
  181. package/rulepacks/jetwco/jetwco-cacc-packBundle.js +6 -0
  182. package/rulepacks/jetwco/jetwco-cacc-packBundleContent.js +6 -0
  183. package/rulepacks/jetwco/jetwco-cacc-packContent.js +6 -0
  184. package/rulepacks/jetwco/jetwco-cacc-properties.js +6 -0
  185. package/rulepacks/jetwco/jetwco-cacc-propertyDefault.js +6 -0
  186. package/rulepacks/jetwco/jetwco-cacc-propertyEnumeration.js +6 -0
  187. package/rulepacks/jetwco/jetwco-cacc-propertyReadOnly.js +6 -0
  188. package/rulepacks/jetwco/jetwco-cacc-propertyRequired.js +6 -0
  189. package/rulepacks/jetwco/jetwco-cacc-propertyType.js +6 -0
  190. package/rulepacks/jetwco/jetwco-cacc-propertyWriteback.js +6 -0
  191. package/rulepacks/jetwco/jetwco-cacc-publicModules.js +6 -0
  192. package/rulepacks/jetwco/jetwco-cacc-slotDataVariable.js +6 -0
  193. package/rulepacks/jetwco/jetwco-cacc-slotDataVariableType.js +6 -0
  194. package/rulepacks/jetwco/jetwco-cacc-slots.js +6 -0
  195. package/rulepacks/jetwco/jetwco-cacc-styleClasses.js +6 -0
  196. package/rulepacks/jetwco/jetwco-cacc-styleVariables.js +6 -0
  197. package/rulepacks/jetwco/jetwco-compjson-ns-reg.js +2 -2
  198. package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +2 -2
  199. package/rulepacks/jetwco/jetwco-component-api-changes.js +2 -2
  200. package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +6 -0
  201. package/rulepacks/jetwco/jetwco-component-cdn.js +2 -2
  202. package/rulepacks/jetwco/jetwco-description-standards.js +6 -0
  203. package/rulepacks/jetwco/jetwco-displayname-standards.js +6 -0
  204. package/rulepacks/jetwco/jetwco-exchange-version-check.js +2 -2
  205. package/rulepacks/jetwco/jetwco-license-info.js +2 -2
  206. package/rulepacks/jetwco/jetwco-prerelease-cdn.js +2 -2
  207. package/rulepacks/jetwco/jetwco-thirdparty-ba.js +2 -2
  208. package/rulepacks/jetwco/msgid.json +2 -2
  209. package/rulepacks/jetwco/rules.json +2 -2
  210. package/rulepacks/spoc/msgid.json +1 -1
  211. package/rulepacks/spoc/rules.json +1 -1
  212. package/rulepacks/spoc/spoc-dom-manip-inv-tag.js +1 -1
  213. package/rulepacks/spoc/spoc-dom-manip-tag-pos.js +1 -1
  214. package/rulepacks/spoc/spoc-dom-manip.js +1 -1
  215. package/rulepacks/wdt/msgid.json +6 -0
  216. package/rulepacks/wdt/rules.json +6 -0
  217. package/rulepacks/wdt/wd-driver-sleep.js +6 -0
  218. package/rulepacks/wdt/wd-xpath.js +6 -0
  219. package/rules/jaf/jaf-css-diagnose.js +1 -1
  220. package/rules/jaf/jaf-html-diagnose.js +1 -1
  221. package/rules/jaf/jaf-init-schema.js +1 -1
  222. package/rules/jaf/jaf-js-diagnose.js +1 -1
  223. package/rules/jaf/jaf-ts-diagnose.js +1 -1
  224. package/rules/jaf/jaf-ts-walk.js +6 -0
  225. package/rules/jaf/msgid.json +2 -2
  226. package/rules/jaf/rules.json +2 -2
  227. package/rules/jet/helpers/acc-aria-label.js +1 -1
  228. package/rules/jet/helpers/bp-checkPropType.js +1 -1
  229. package/rules/jet/helpers/cssHelper.js +1 -1
  230. package/rules/jet/helpers/extractStylesFromClass.js +1 -1
  231. package/rules/jet/helpers/has-slot-name.js +2 -2
  232. package/rules/jet/helpers/has-slot.js +1 -1
  233. package/rules/jet/helpers/json-prop-pos.js +1 -1
  234. package/rules/jet/helpers/json-propname-pos.js +1 -1
  235. package/rules/jet/helpers/style-selector.js +1 -1
  236. package/rules/jet/helpers/valid-attr.js +1 -1
  237. package/rules/jet/helpers/vartrack.js +1 -1
  238. package/rules/jet/jet-css-ojselector.js +1 -1
  239. package/rules/jet/msgid.json +2 -2
  240. package/rules/jet/oj-acc-aria-labelledby.js +1 -1
  241. package/rules/jet/oj-acc-aria-prop.js +2 -2
  242. package/rules/jet/oj-acc-avatar-aria-role.js +2 -2
  243. package/rules/jet/oj-acc-combobox-aria-label.js +2 -2
  244. package/rules/jet/oj-acc-film-strip-aria-label.js +2 -2
  245. package/rules/jet/oj-acc-input-aria-label.js +2 -2
  246. package/rules/jet/oj-acc-select-aria-label.js +2 -2
  247. package/rules/jet/oj-cca-compjson-bp-ar.js +1 -1
  248. package/rules/jet/oj-cca-compjson-bp-dsplyname.js +1 -1
  249. package/rules/jet/oj-cca-compjson-bp-jetver.js +1 -1
  250. package/rules/jet/oj-cca-compjson-bp-obj.js +1 -1
  251. package/rules/jet/oj-cca-compjson-ns-reg.js +1 -1
  252. package/rules/jet/oj-css-bp-border-color.js +1 -1
  253. package/rules/jet/oj-css-bp-dir-flow.js +1 -1
  254. package/rules/jet/oj-css-bp-float.js +1 -1
  255. package/rules/jet/oj-css-bp-textalign.js +1 -1
  256. package/rules/jet/oj-css-style-abs-units.js +2 -2
  257. package/rules/jet/oj-css-style-bp-color.js +1 -1
  258. package/rules/jet/oj-css-style-bp-display.js +1 -1
  259. package/rules/jet/oj-css-style-bp-font-family.js +1 -1
  260. package/rules/jet/oj-css-style-bp-font.js +1 -1
  261. package/rules/jet/oj-css-style-deprecated.js +1 -1
  262. package/rules/jet/oj-css-style-override.js +2 -2
  263. package/rules/jet/oj-css-var-override.js +1 -1
  264. package/rules/jet/oj-form-maxcols.js +2 -2
  265. package/rules/jet/oj-html-5-attr-obs.js +1 -1
  266. package/rules/jet/oj-html-5-tag-obs.js +1 -1
  267. package/rules/jet/oj-html-alta-deprecated.js +6 -0
  268. package/rules/jet/oj-html-attr-$unique.js +1 -1
  269. package/rules/jet/oj-html-attr-2def.js +1 -1
  270. package/rules/jet/oj-html-attr-json.js +1 -1
  271. package/rules/jet/oj-html-attr-prefix-expr.js +1 -1
  272. package/rules/jet/oj-html-attr-prefix-ro.js +1 -1
  273. package/rules/jet/oj-html-attr-req.js +1 -1
  274. package/rules/jet/oj-html-bindforeach-data.js +2 -2
  275. package/rules/jet/oj-html-bindif-test.js +2 -2
  276. package/rules/jet/oj-html-binding-attr.js +2 -2
  277. package/rules/jet/oj-html-cca-count.js +1 -1
  278. package/rules/jet/oj-html-cca-tagname.js +2 -2
  279. package/rules/jet/oj-html-cdn.js +1 -1
  280. package/rules/jet/oj-html-combo-converter.js +1 -1
  281. package/rules/jet/oj-html-cspexpr.js +1 -1
  282. package/rules/jet/oj-html-databind-all.js +1 -1
  283. package/rules/jet/oj-html-dlg-title.js +2 -2
  284. package/rules/jet/oj-html-file-pick-accept.js +2 -2
  285. package/rules/jet/oj-html-form-bindif.js +1 -1
  286. package/rules/jet/oj-html-form-layout-maxcols.js +2 -2
  287. package/rules/jet/oj-html-form-noflex.js +1 -1
  288. package/rules/jet/oj-html-input-isodate.js +2 -2
  289. package/rules/jet/oj-html-invalid-doctype.js +2 -2
  290. package/rules/jet/oj-html-jq-databind.js +2 -2
  291. package/rules/jet/oj-html-ko-comment.js +1 -1
  292. package/rules/jet/oj-html-ko-databind.js +2 -2
  293. package/rules/jet/oj-html-label-for-prefix.js +1 -1
  294. package/rules/jet/oj-html-missing-doctype.js +1 -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 +1 -1
  299. package/rules/jet/oj-html-ojattr-520.js +1 -1
  300. package/rules/jet/oj-html-ojattr-deprecated.js +2 -2
  301. package/rules/jet/oj-html-ojattr-enum-deprecated.js +2 -2
  302. package/rules/jet/oj-html-ojattr-evt-syntax.js +2 -2
  303. package/rules/jet/oj-html-ojattr-value.js +1 -1
  304. package/rules/jet/oj-html-ojattr.js +2 -2
  305. package/rules/jet/oj-html-ojevent.js +2 -2
  306. package/rules/jet/oj-html-ojslot.js +2 -2
  307. package/rules/jet/oj-html-ojstyle.js +1 -1
  308. package/rules/jet/oj-html-ojtag-datacmd.js +2 -2
  309. package/rules/jet/oj-html-ojtag-datactx.js +1 -1
  310. package/rules/jet/oj-html-ojtag-deprecated.js +2 -2
  311. package/rules/jet/oj-html-ojtag-globattr-noprefix.js +2 -2
  312. package/rules/jet/oj-html-ojtag-id.js +1 -1
  313. package/rules/jet/oj-html-ojtag-nonglobattr-prefix.js +2 -2
  314. package/rules/jet/oj-html-ojtag-ns.js +1 -1
  315. package/rules/jet/oj-html-picker-attrs.js +2 -2
  316. package/rules/jet/oj-html-redwood-cssnovars.js +1 -1
  317. package/rules/jet/oj-html-redwood-cssvars.js +1 -1
  318. package/rules/jet/oj-html-self-close.js +1 -1
  319. package/rules/jet/oj-html-slot-item-minmax.js +1 -1
  320. package/rules/jet/oj-html-slot-name.js +2 -2
  321. package/rules/jet/oj-html-slot-pref-content.js +2 -2
  322. package/rules/jet/oj-html-style-abs-units.js +1 -1
  323. package/rules/jet/oj-html-style-bp-color.js +1 -1
  324. package/rules/jet/oj-html-style-bp-display.js +1 -1
  325. package/rules/jet/oj-html-style-bp-font-family.js +1 -1
  326. package/rules/jet/oj-html-style-bp-font.js +1 -1
  327. package/rules/jet/oj-html-style-deprecated.js +2 -2
  328. package/rules/jet/oj-html-style.js +1 -1
  329. package/rules/jet/oj-html-stylesel.js +1 -1
  330. package/rules/jet/oj-html-tag-attr-noprefix.js +2 -2
  331. package/rules/jet/oj-html-template-index.js +2 -2
  332. package/rules/jet/oj-html-unsup-theme.js +1 -1
  333. package/rules/jet/oj-html-wctag-$props.js +1 -1
  334. package/rules/jet/oj-html-wctag-arialabelledby.js +1 -1
  335. package/rules/jet/oj-html-wctag-for.js +1 -1
  336. package/rules/jet/oj-html-wctag-id.js +2 -2
  337. package/rules/jet/oj-html-wctag-nested.js +6 -0
  338. package/rules/jet/oj-html-wctag-packprivate.js +1 -1
  339. package/rules/jet/oj-js-comp-attr-deprecated.js +2 -2
  340. package/rules/jet/oj-js-comp-meth-deprecated.js +2 -2
  341. package/rules/jet/oj-js-no-ext-final.js +1 -1
  342. package/rules/jet/oj-js-noconsole.js +1 -1
  343. package/rules/jet/oj-js-ojcomp-deprecated.js +2 -2
  344. package/rules/jet/oj-js-ojcomp-exist.js +1 -1
  345. package/rules/jet/oj-js-ojcomp-new.js +1 -1
  346. package/rules/jet/oj-js-poly-promise.js +1 -1
  347. package/rules/jet/oj-js-var-undef.js +1 -1
  348. package/rules/jet/oj-json-syntax.js +1 -1
  349. package/rules/jet/oj-ts-comp-attr-deprecated.js +2 -2
  350. package/rules/jet/oj-ts-comp-meth-deprecated.js +2 -2
  351. package/rules/jet/oj-ts-no-ext-final.js +1 -1
  352. package/rules/jet/oj-ts-noconsole.js +1 -1
  353. package/rules/jet/oj-ts-ojcomp-deprecated.js +2 -2
  354. package/rules/jet/oj-ts-ojcomp-exist.js +1 -1
  355. package/rules/jet/oj-ts-ojcomp-new.js +1 -1
  356. package/rules/jet/oj-ts-poly-promise.js +1 -1
  357. package/rules/jet/rules.json +2 -2
  358. package/schema/component-schema.json +14 -1
  359. package/src/JafCore.js +2 -2
  360. package/types/index.d.ts +122 -82
  361. package/lib/imanual.js +0 -6
  362. package/lib/xmanual.js +0 -6
  363. package/rulepacks/jetwc-lib/component-audit-utils.js +0 -6
@@ -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;
@@ -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'&&metadata.bundles){const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const errorConditions=[];for(const[bundleName,bundleContents]of Object.entries(metadata.bundles)){const historicalBundleContents=compareMetadata.hasOwnProperty('bundles')&&compareMetadata.bundles.hasOwnProperty(bundleName)?compareMetadata.bundles[bundleName]:[];const diffs=CaccHelpers.stringArrayDiff(bundleContents,historicalBundleContents);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Entries ${diffs.add.join(', ')} added to bundle ${bundleName} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Entries ${diffs.remove.join(', ')} removed from ${bundleName} 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==='pack'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const mdSemver=semver.parse(metadata.version);const compareSemver=semver.parse(compareMetadata.version);const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);const diffs=CaccHelpers.dependenciesDiff(metadata.dependencies,compareMetadata.dependencies);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Component(s) ${diffs.add.map(dep=>dep.dependency).join(', ')} added to${errorMsgContext}'${addConstraint}'`)}if(diffs.mutate.length>0){const mutationErrors=[];diffs.mutate.forEach(diff=>{switch(mutateConstraint){case VC.NEVER:mutationErrors.push(`${diff.dependency}@${diff.historicalVersion} -> ${diff.version}`);break;case VC.SEMVER:case VC.PATCH:case VC.MINOR:const dependencyVersionDiff=CaccHelpers.semanticDiff(semver,diff.version,diff.historicalVersion);if(dependencyVersionDiff>componentVersionDiff){mutationErrors.push(`${diff.dependency}@${diff.historicalVersion} -> ${diff.version}`)}break;default:if(mdSemver.major>=compareSemver.major){mutationErrors.push(`${diff.dependency}@${diff.historicalVersion} -> ${diff.version}`)}break;}});if(mutationErrors.length>0){errorConditions.push(`Pack children changes for ${metadata.name} in contradiction of ${controlRuleName} API change constraint '${mutateConstraint}':[${mutationErrors.join(', ')}]`)}}if(diffs.remove.length>0){const removeErrors=[];diffs.remove.forEach(diff=>{if(removeConstraint===VC.NEVER||mdSemver.major<=compareSemver.major){removeErrors.push(`${diff.dependency}@${diff.version}`)}else{const historicalDependencyVersion=removeControlMetadata.dependencies[diff.dependency];switch(removeConstraint){case VC.MAJOR_DEPRECATED:case VC.MAJOR_2_DEPRECATED:case VC.MAJOR_3_DEPRECATED:if(!CaccHelpers.isMarkedAsDeprecated(cacheManager,diff.dependency,historicalDependencyVersion)){removeErrors.push(`${diff.dependency}@${diff.version} not marked as deprecated in historical version: ${historicalDependencyVersion}`)}break;}}});if(removeErrors.length>0){errorConditions.push(`Pack children removal for ${metadata.name} in contradiction of ${controlRuleName} API change constraint '${removeConstraint}':[${removeErrors.join(', ')}]`)}}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'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);return recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,['properties'],addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext).join('\n')}return};function recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,compareScope,addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext){let errorConditions=[];const printScope=CaccHelpers.getPrintScope(compareScope);const diffs=CaccHelpers.apiDiff(CaccHelpers.castToScope(metadata,compareScope),CaccHelpers.castToScope(compareMetadata,compareScope));if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Properties ${printScope}${diffs.add.map(prop=>prop.name).join(', ')} added to${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return compareScope.concat([diff.name])});if(removeErrors.length>0){errorConditions.push(`Properties ${printScope}${diffs.remove.map(prop=>prop.name).join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){diffs.mutate.forEach(mutation=>{let newScope=compareScope.slice().concat([mutation.name,'properties']);const mutateErrors=recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,newScope,addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext);if(mutateErrors){errorConditions=errorConditions.concat(mutateErrors)}})}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){let errorConditions=[];if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);const mutateControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,mutateConstraint);const diffs=CaccHelpers.mapAttributesDiff(metadata.properties,compareMetadata.properties,'value');if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Property default value set for ${diffs.add.map(addition=>addition.name).join(', ')} in${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMinorMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['properties',diff.name]},'propertyValue',diff=>diff.historicalValue);if(removeErrors.length>0){errorConditions.push(`Property default value removed from ${removeErrors.map(err=>err.name).join(', ')} in${errorMsgContext}'${removeConstraint}'`)}const mutateErrors=CaccHelpers.checkConstraintMinorMajorWithDeprecation(diffs.mutate,mutateConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['properties',diff.name]},'propertyValue',diff=>diff.historicalValue);if(mutateErrors.length>0){errorConditions.push(`Property default value changed in ${mutateErrors.map(err=>err.name).join(', ')} 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 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'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);return recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,['properties'],addConstraint,removeConstraint,mutateConstraint,componentVersionDiff,cacheManager,errorMsgContext).join('\n')}return};function recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,compareScope,addConstraint,removeConstraint,mutateConstraint,componentVersionDiff,cacheManager,errorMsgContext){let errorConditions=[];const checkProps=CaccHelpers.castToScope(metadata,compareScope);const compareProps=CaccHelpers.castToScope(compareMetadata,compareScope);if(checkProps&&compareProps){for(const[propertyName,propertyDef]of Object.entries(checkProps)){if(compareProps.hasOwnProperty(propertyName)){const currentEnums=propertyDef.enumValues;const compareEnums=compareProps[propertyName].enumValues;const printScope=CaccHelpers.getPrintScope(compareScope)+propertyName;if(currentEnums&&compareEnums){const diffs=CaccHelpers.stringArrayDiff(currentEnums,compareEnums);if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Values ${diffs.add.join(', ')} added to enumValues of ${printScope} in${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return compareScope.concat([propertyName])},'propertyValue',diff=>diff);if(removeErrors.length>0){errorConditions.push(`Values ${removeErrors.join(', ')} removed from enumValues of ${printScope} in${errorMsgContext}'${removeConstraint}'`)}}else if(currentEnums||compareEnums){let errorFlag=false;switch(mutateConstraint){case VC.NEVER:errorFlag=true;break;default:if(componentVersionDiff<4){errorFlag=true}break;}if(errorFlag){const action=currentEnums?'added to':'removed from';errorConditions.push(`Enumerations ${action} ${printScope} in${errorMsgContext}'${mutateConstraint}'`)}}if(propertyDef.hasOwnProperty('properties')){const subPropertyScope=compareScope.concat([propertyName,'properties']);errorConditions=errorConditions.concat(recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,subPropertyScope,addConstraint,removeConstraint,mutateConstraint,componentVersionDiff,cacheManager,errorMsgContext))}}}}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){let errorConditions=[];if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.properties,compareMetadata.properties,'readOnly',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Property readOnly value set on ${diffs.add.map(addition=>addition.name).join(', ')} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintPatchMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Property readOnly value unset from ${diffs.remove.map(removal=>removal.name).join(', ')} 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){let errorConditions=[];if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.properties,compareMetadata.properties,'required',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Property required value set on ${diffs.add.map(addition=>addition.name).join(', ')} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintPatchMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Property required value unset from ${diffs.remove.map(removal=>removal.name).join(', ')} 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'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);const componentName=CaccHelpers.getComponentFullName(metadata);return recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,['properties'],addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext).join('\n')}return};function recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,compareScope,addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext){let errorConditions=[];const checkProps=CaccHelpers.castToScope(metadata,compareScope);const compareProps=CaccHelpers.castToScope(compareMetadata,compareScope);if(checkProps&&compareProps){for(const[propertyName,propertyDef]of Object.entries(checkProps)){if(compareProps.hasOwnProperty(propertyName)){const currentTypeDef=propertyDef.type;const compareTypeDef=compareProps[propertyName].type;const printScope=CaccHelpers.getPrintScope(compareScope)+propertyName;const diffs=CaccHelpers.typeDiff(currentTypeDef,compareTypeDef);if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Type expanded to add ${diffs.add.map(addition=>addition.type).join('|')} to ${printScope} in${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return compareScope.concat([propertyName])},'propertyType',diff=>diff.historicalType);if(removeErrors.length>0){errorConditions.push(`Type contracted to remove ${removeErrors.map(removal=>removal.historicalType).join('|')} from ${printScope} in${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){errorConditions.push(`Forbidden type change of ${diffs.mutate[0].historicalType} to ${diffs.mutate[0].type} made to ${printScope} in ${componentName}`)}if(propertyDef.hasOwnProperty('properties')){const subPropertyScope=compareScope.concat([propertyName,'properties']);errorConditions=errorConditions.concat(recurseThroughProps(controlRuleName,componentName,metadata,compareMetadata,removeControlMetadata,subPropertyScope,addConstraint,removeConstraint,componentVersionDiff,cacheManager,errorMsgContext))}}}}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){let errorConditions=[];if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.properties,compareMetadata.properties,'writeback',true);if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Property writeback value set on ${diffs.add.map(addition=>addition.name).join(', ')} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Property writeback value unset from ${diffs.remove.map(removed=>removed.name).join(', ')} 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==='resource'){const errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.stringArrayDiff(metadata.publicModules,compareMetadata.publicModules);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`publicModules ${diffs.add.join(', ')} added to${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`publicModules ${diffs.remove.join(', ')} removed from${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;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);if(metadata.hasOwnProperty('slots')&&compareMetadata.hasOwnProperty('slots')){for(const[slotName,slotDef]of Object.entries(metadata.slots)){if(compareMetadata.slots.hasOwnProperty(slotName)){const compareSlotDef=compareMetadata.slots[slotName];if(slotDef.hasOwnProperty('data')===compareSlotDef.hasOwnProperty('data')){if(slotDef.hasOwnProperty('data')){const diffs=CaccHelpers.apiDiff(slotDef.data,compareSlotDef.data);if(CaccHelpers.checkConstraintPatchMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Slot data attribute amended to include ${diffs.add.map(addition=>addition.name).join(', ')} on ${slotName} in${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['slots',slotName,'data',diff.name]});if(removeErrors.length>0){errorConditions.push(`Attributes ${removeErrors.map(removal=>removal.name).join(', ')} removed from data attribute of slot ${slotName} in${errorMsgContext}'${removeConstraint}'`)}}}else{let errorFlag=false;switch(mutateConstraint){case VC.NEVER:errorFlag=true;break;default:if(componentVersionDiff<4){errorFlag=true}break;}if(errorFlag){const errorAction=slotDef.hasOwnProperty('data')?'added':'removed';errorConditions.push(`Slot data attribute ${errorAction} for ${slotName} 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){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;if(metadata.hasOwnProperty('slots')&&compareMetadata.hasOwnProperty('slots')){for(const[slotName,slotDef]of Object.entries(metadata.slots)){if(compareMetadata.slots.hasOwnProperty(slotName)){const compareSlotDef=compareMetadata.slots[slotName];if(slotDef.hasOwnProperty('data')&&compareSlotDef.hasOwnProperty('data')){const diffs=CaccHelpers.mapAttributesDiff(slotDef.data,compareSlotDef.data,'type',false);if(CaccHelpers.checkConstraintMajor(diffs.mutate,mutateConstraint,componentVersionDiff)){errorConditions.push(`Type for data attribute(s) ${diffs.mutate.map(mut=>mut.name).join(', ')} updated for slot ${slotName} in${errorMsgContext}'${addConstraint}'`)}}}}}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('slots',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==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);if(metadata.hasOwnProperty('styleClasses')||compareMetadata.hasOwnProperty('styleClasses')){const styleClasses=CaccHelpers.flattenArrayByAttr(metadata.styleClasses,'name');const historicalStyleClasses=CaccHelpers.flattenArrayByAttr(compareMetadata.styleClasses,'name');const diffs=CaccHelpers.stringArrayDiff(styleClasses,historicalStyleClasses);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Style class(es) ${diffs.add.join(', ')} added to${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['styleClasses',`[name:${diff}]`]});if(removeErrors.length>0){errorConditions.push(`Class(es) ${removeErrors.join(', ')} removed from styleClasses of${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 removeControlMetadata=CaccHelpers.deriveConstraintMetadata(baselines,removeConstraint);if(metadata.hasOwnProperty('styleVariables')||compareMetadata.hasOwnProperty('styleVariables')){const styleVariables=CaccHelpers.flattenArrayByAttr(metadata.styleVariables,'name');const historicalStyleVariables=CaccHelpers.flattenArrayByAttr(compareMetadata.styleVariables,'name');const diffs=CaccHelpers.stringArrayDiff(styleVariables,historicalStyleVariables);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Style variable(s) ${diffs.add.join(', ')} added to${errorMsgContext}'${addConstraint}'`)}const removeErrors=CaccHelpers.checkConstraintMajorWithDeprecation(diffs.remove,removeConstraint,componentVersionDiff,cacheManager,componentName,removeControlMetadata,diff=>{return['styleVariables',`[name:${diff}]`]});if(removeErrors.length>0){errorConditions.push(`Style variable(s) ${removeErrors.join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
@@ -1,6 +1,6 @@
1
1
  /*
2
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates.
2
+ * Copyright (c) 2018, 2022, Oracle and/or its affiliates.
3
3
  * Licensed under The Universal Permissive License (UPL), Version 1.0
4
4
  * as shown at https://oss.oracle.com/licenses/upl/
5
5
  */
6
- const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-compjson-ns-reg'};ruleDef.prototype.getShortDescription=function(){return'Web component namespaces starting with \'oj-\' or \'ns-\' must be registered.'};ruleDef.prototype.getDescription=function(){return'Web components namespaces starting with prefixes \'oj-\' or \'ns-\' must be registered. A component must not use an un-registered namespace.'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){if(!context.rulePack.isRuleEnabled('oj-cca-compjson-ns-reg','JET')){if(context.suppData.obj){const meta=context.suppData.obj;const componentName=Utils.getComponentFullName(meta);if(componentName&&!context.utils.metaLib.isJetTag(componentName)&&(componentName.startsWith('oj-')||componentName.startsWith('ns-'))){const nameParts=componentName.split('-');if(nameParts.length>1){const checkNS=nameParts[0]+'-'+nameParts[1];if(!context.utils.metaLib.isNSRegistered(checkNS)){const issue=new context.Issue(`${componentName}: unregistered use of the '${nameParts[0]}' namespace`);issue.setPosition(this._getNamePos(context.suppData.ast));context.reporter.addIssue(issue,context,'major')}}}}}};ruleDef.prototype._getNamePos=function(ast){var props,name,pos,ret=null,i;if(ast&&ast.members){props=ast.members;for(i=0;i<props.length;i++){name=props[i];if(name.name==='name'){pos=name.pos;ret={line:pos.row,col:pos.col,startIndex:pos.index,endIndex:pos.index+5};break}}}return ret};module.exports=ruleDef;
6
+ const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-compjson-ns-reg'};ruleDef.prototype.getShortDescription=function(){return'Web component namespaces starting with \'oj-\' or \'ns-\' must be registered.'};ruleDef.prototype.getDescription=function(){return'Web components namespaces starting with prefixes \'oj-\' or \'ns-\' must be registered. A component must not use an un-registered namespace.'};ruleDef.prototype.register=function(context){return{startup:this._enableIfRequired,compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._enableIfRequired=function(context){if(context.rulePack.isRuleEnabled('oj-cca-compjson-ns-reg','JET')){context.rulePack.disableRule()}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const componentName=Utils.getComponentFullName(meta);if(componentName&&!context.utils.metaLib.isJetTag(componentName)&&(componentName.startsWith('oj-')||componentName.startsWith('ns-'))){const nameParts=componentName.split('-');if(nameParts.length>1){const checkNS=nameParts[0]+'-'+nameParts[1];if(!context.utils.metaLib.isNSRegistered(checkNS)){const issue=new context.Issue(`${componentName}: unregistered use of the '${nameParts[0]}' namespace`);issue.setPosition(this._getNamePos(context.suppData.ast));context.reporter.addIssue(issue,context)}}}}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){const componentName=componentInfo.fullName;if(componentName&&!context.utils.metaLib.isJetTag(componentName)&&(componentName.startsWith('oj-')||componentName.startsWith('ns-'))){const nameParts=componentName.split('-');if(nameParts.length>1){const checkNS=nameParts[0]+'-'+nameParts[1];if(!context.utils.metaLib.isNSRegistered(checkNS)){const issue=new context.Issue(`${componentName}: unregistered use of the '${nameParts[0]}' namespace`);context.reporter.addIssue(issue,context)}}}}};ruleDef.prototype._getNamePos=function(ast){var props,name,pos,ret=null,i;if(ast&&ast.members){props=ast.members;for(i=0;i<props.length;i++){name=props[i];if(name.name==='name'){pos=name.pos;ret={line:pos.row,col:pos.col,startIndex:pos.index,endIndex:pos.index+5};break}}}return ret};module.exports=ruleDef;
@@ -1,6 +1,6 @@
1
1
  /*
2
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates.
2
+ * Copyright (c) 2018, 2022, Oracle and/or its affiliates.
3
3
  * Licensed under The Universal Permissive License (UPL), Version 1.0
4
4
  * as shown at https://oss.oracle.com/licenses/upl/
5
5
  */
6
- const Utils=require('../jetwc-lib/component-audit-utils');const NetUtils=require('../../lib/NetUtils');const path=require('path');const EXCHANGEROOT='https://exchange.oraclecorp.com/api/0.2.0/components/';const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-api-baseline-changes'};ruleDef.prototype.getShortDescription=function(){return'Check components for API changes against a base version'};ruleDef.prototype.getDescription=function(){return'This audit compares the APIs exposed by components with a designated baseline version of a component in the Exchange Catalog and checks if the component APIs have changed'};ruleDef.prototype.register=function(context){return{startupRP:this._prepareBaselineData,closedownRP:this._dealWithCache,compjson:this._doAudit}};ruleDef.prototype._prepareBaselineData=function(context){let baselineConfigured=false;let baselineMetadata=[];Utils.ensureLocalCache(context);const baselineOpt=context.rulePack.getRuleOption('baseline','jetwco-component-api-baseline-changes');if(baselineOpt){const baselineHash=Utils.getObjectHashSignature(baselineOpt);const cacheIndexFile=path.join(Utils.getComponentCacheFolderName(context),`${baselineHash}.json`);let baselineIndex={};if(context.utils.fsUtils.fileExistsSync(cacheIndexFile)){baselineIndex=context.utils.fsUtils.readJsonSync(cacheIndexFile)}else{for(const[baselineComponent,baselineComponentVersion]of Object.entries(baselineOpt)){const eachComponent=this._cacheBaselineMetadataForComponent(baselineComponent,baselineComponentVersion);baselineMetadata=baselineMetadata.concat(eachComponent)}baselineMetadata.forEach(component=>{const fullName=Utils.getComponentFullName(component);baselineIndex[fullName]=component.version;if(!Utils.existsInComponentCache(context,fullName,component.version)){Utils.writeToComponentCache(context,fullName,component.version,component)}});context.utils.fsUtils.writeJsonSync(baselineIndex,cacheIndexFile)}baselineConfigured=true;if(Object.keys(baselineIndex).length>0){Utils.safeSetExtension(context,{baselineIndex:baselineIndex})}}return baselineConfigured};ruleDef.prototype._cacheBaselineMetadataForComponent=function(componentName,componentVersion){let componentMetaArray=[];try{const netUtils=new NetUtils;const componentMetaResp=netUtils.loadUrl(`${EXCHANGEROOT}${componentName}/versions/${componentVersion}`);if(componentMetaResp.statusCode=200&&componentMetaResp.body){const componentResponseMeta=JSON.parse(componentMetaResp.body);const componentMeta=componentResponseMeta.component;if(componentMeta){const compType=componentMeta.type?componentMeta.type:'composite';if(compType==='pack'){const dependents=componentMeta.dependencies;if(dependents){for(const[packComponent,packComponentVersion]of Object.entries(dependents)){const eachPackMember=this._cacheBaselineMetadataForComponent(packComponent,packComponentVersion);componentMetaArray=componentMetaArray.concat(eachPackMember)}}}componentMetaArray.push(componentMeta)}}}catch(e){console.log(JSON.stringify(e))};return componentMetaArray};ruleDef.prototype._dealWithCache=function(context){const shouldClearCache=context.rulePack.getRuleOption('clearCache','jetwco-component-api-baseline-changes');if(shouldClearCache){Utils.removeLocalCache(context)}};ruleDef.prototype._doAudit=function(context){const componentMeta=context.suppData.obj;if(componentMeta){const baselineIndex=context.rulePack.getExtension().baselineIndex;const componentType=Utils.getComponentType(componentMeta);const fullName=Utils.getComponentFullName(componentMeta);const componentVersion=componentMeta.version;const baselineVersion=baselineIndex[fullName];if(baselineVersion){const semver=context.utils.semVerUtils;const baselineComponentMeta=Utils.readFromComponentCache(context,fullName,baselineVersion);try{switch(componentType){case'pack':this._conductCheck(this._packContentsDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._packBundlesDiff,componentMeta,baselineComponentMeta);break;case'composite':this._conductCheck(this._detectJetVersionDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectMethodDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectEventDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectSlotDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDynamicSlotDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectPropertyDiff,componentMeta,baselineComponentMeta);break;case'vbcs-pattern':this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);break;case'resource':this._conductCheck(this._detectJetVersionDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectPublicModulesDiff,componentMeta,baselineComponentMeta);break;}}catch(auditDetail){const issue=new context.Issue(`API change for ${fullName}@${componentVersion} detected in comparison with baseline version ${baselineVersion}. Indication: ${auditDetail}`);context.reporter.addIssue(issue,context,'blocker')}}}};ruleDef.prototype._conductCheck=function(checkCallback,semver,config,existingConfig){const result=checkCallback.call(this,semver,config,existingConfig);if(result){throw result}};ruleDef.prototype._detectJetVersionDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const componentJetVersion=config.jetVersion?config.jetVersion:'0.0.0';const existingJetVersion=existingConfig.jetVersion?existingConfig.jetVersion:'0.0.0';if(componentJetVersion!==existingJetVersion){if(existingJetVersion==='0.0.0'||componentJetVersion==='0.0.0'){explanation='JET version range has been added or removed'}else{const minVersion=semver.minVersion(componentJetVersion);const minExistingVersion=semver.minVersion(existingJetVersion);if(semver.major(minVersion)>semver.major(minExistingVersion)){explanation='minimum major JET version required has increased'}else if(semver.minor(minVersion)>semver.minor(minExistingVersion)){explanation='minimum minor JET version required has increased'}}}return explanation};ruleDef.prototype._packContentsDiff=function(config,existingConfig){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(!config.dependencies.hasOwnProperty(key)){explanation=`Pack component ${key} has been removed`;break}}}return explanation};ruleDef.prototype._packBundlesDiff=function(config,existingConfig){let explanation;const configBundles=config.bundles?Object.keys(config.bundles):[];const existingBundles=existingConfig.bundles?Object.keys(existingConfig.bundles):[];for(let i=0;i<existingBundles.length;i++){const key=existingBundles[i];if(!config.bundles.hasOwnProperty(key)){explanation=`Pack bundle '${key}' has been removed`;break}else{const configContents=config.bundles[key];const existingContents=existingConfig.bundles[key];for(let i=0;i<existingContents.length;i++){const module=existingContents[i];if(!configContents.includes(module)){explanation=`Pack bundle '${key}' entry '${module}' removed`;break}}}}return explanation};ruleDef.prototype._detectPublicModulesDiff=function(config,existingConfig){let explanation;const configPM=config.publicModules?config.publicModules:[];const existingPM=existingConfig.publicModules?existingConfig.publicModules:[];for(let i=0;i<existingPM.length;i++){const module=existingPM[i];if(!configPM.includes(module)){explanation=`Public Module entry '${module}' has been removed`;break}}return explanation};ruleDef.prototype._detectDependencyDiff=function(semver,config,existingConfig){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>existingDeps.length){explanation='More dependencies are declared by component'}else{if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(config.dependencies.hasOwnProperty(key)){const newDepVersion=semver.minVersion(config.dependencies[key]);const existingDepVersion=semver.minVersion(existingConfig.dependencies[key]);if(semver.major(newDepVersion)!==semver.major(existingDepVersion)){explanation='Different major version of dependency '+key;break}if(semver.minor(newDepVersion)!==semver.minor(existingDepVersion)){explanation='Different minor version of dependency '+key;break}}else{explanation=`Dependency ${key} has been removed`;break}}}}return explanation};ruleDef.prototype._detectMethodDiff=function(config,existingConfig){let explanation;const configMethods=config.methods?Object.keys(config.methods):[];const existingMethods=existingConfig.methods?Object.keys(existingConfig.methods):[];for(let i=0;i<existingMethods.length;i++){const key=existingMethods[i];if(config.methods.hasOwnProperty(key)){const configMethodParams=config.methods[key].params?config.methods[key].params:[];const existingMethodParams=existingConfig.methods[key].params?existingConfig.methods[key].params:[];for(let j=0;j<existingMethodParams.length;j++){if(j>=configMethodParams.length){explanation=`Existing method '${key}' has fewer parameters`;break}else{if(!this._compareType(configMethodParams[j],existingMethodParams[j])){explanation=`Method '${key}' parameter number:${j+1} has a changed type`;break}}}if(!explanation&&configMethodParams.length>existingMethodParams.length){explanation=`Existing method '${key}' has additional parameters`;break}}else{explanation=`Existing method '${key}' has been removed`;break}}return explanation};ruleDef.prototype._detectPropertyDiff=function(config,existingConfig){let explanation;const configProps=config.properties?Object.keys(config.properties):[];const existingProps=existingConfig.properties?Object.keys(existingConfig.properties):[];explanation=this._compareProperties(config.properties,existingConfig.properties);if(!explanation){const addedRequiredProps=configProps.filter(addedProp=>!existingProps.includes(addedProp)&&config[addedProp].required);if(addedRequiredProps.length>0){explanation=`Required property(ies) added: ${addedRequiredProps.join(',')}`}}return explanation};ruleDef.prototype._detectEventDiff=function(config,existingConfig){let explanation;const configEvents=config.events?Object.keys(config.events):[];const existingEvents=existingConfig.events?Object.keys(existingConfig.events):[];for(let i=0;i<existingEvents.length;i++){const key=existingEvents[i];if(config.events.hasOwnProperty(key)){const configEventDetail=config.events[key].detail?config.events[key].detail:{};const existingEventDetail=existingConfig.events[key].detail?existingConfig.events[key].detail:{};const detailKeys=Object.keys(configEventDetail);const existingDetailKeys=Object.keys(existingEventDetail);for(let j=0;j<existingDetailKeys.length;j++){const detailKey=existingDetailKeys[j];if(j>=detailKeys.length||!configEventDetail.hasOwnProperty(detailKey)){explanation=`Event '${key}' has missing entries in the detail payload`;break}else{if(!this._compareType(configEventDetail[detailKey],existingEventDetail[detailKey])){explanation=`Event '${key}' detail attribute '${detailKey}' has a changed type`;break}}}if(!explanation&&config.events[key].bubbles!==existingConfig.events[key].bubbles){explanation=`Event '${key}' has a changed bubbling state`;break}if(!explanation&&config.events[key].cancelable!==existingConfig.events[key].cancelable){explanation=`Event '${key}' has changed cancelable state`;break}}else{explanation=`Event '${key}' has been removed`;break}}return explanation};ruleDef.prototype._detectSlotDiff=function(config,existingConfig){return this._detectTypedSlotDiff('slots',config,existingConfig)};ruleDef.prototype._detectDynamicSlotDiff=function(config,existingConfig){return this._detectTypedSlotDiff('dynamicSlots',config,existingConfig)};ruleDef.prototype._detectTypedSlotDiff=function(slotType,config,existingConfig){let explanation;const configSlots=config[slotType]?Object.keys(config[slotType]):[];const existingSlots=existingConfig[slotType]?Object.keys(existingConfig[slotType]):[];for(let i=0;i<existingSlots.length;i++){const key=existingSlots[i];if(config[slotType].hasOwnProperty(key)){const configSlotData=config[slotType][key].data?config[slotType][key].data:{};const existingSlotData=existingConfig[slotType][key].data?existingConfig[slotType][key].data:{};const dataKeys=Object.keys(configSlotData);const existingDataKeys=Object.keys(existingSlotData);for(let j=0;j<existingDataKeys.length;j++){const dataKey=existingDataKeys[j];if(j>=dataKeys.length||!configSlotData.hasOwnProperty(dataKey)){explanation=`Template slot '${key}' - '${dataKey}' has been removed from data definition`;break}else{if(!this._compareType(configSlotData[dataKey],existingSlotData[dataKey])){explanation=`Template slot '${key}' data attribute '${dataKey}' has a changed type`;break}}}}else{explanation=`Slot '${key}' has been removed`;break}}return explanation};ruleDef.prototype._compareType=function(newTyped,existingTyped){let matches=true;const newType=newTyped&&newTyped.type?newTyped.type:null;const existingType=existingTyped&&existingTyped.type?existingTyped.type:null;if(newType!==existingType){if(newType.includes('|')){const newTypeOptions=newType?newType.split('|'):[];const existingTypeOptions=existingType?existingType.split('|'):[];matches=existingTypeOptions.every(checkType=>newTypeOptions.includes(checkType))}else{matches=false}}return matches};ruleDef.prototype._compareProperties=function(newProps,oldProps,path){let explanation;const configProps=newProps?Object.keys(newProps):[];const existingProps=oldProps?Object.keys(oldProps):[];for(let i=0;i<existingProps.length;i++){const key=existingProps[i];if(newProps.hasOwnProperty(key)){const newProperty=newProps[key];const oldProperty=oldProps[key];if(!this._compareType(newProperty,oldProperty)){explanation=`Property type change for '${path?path:''}${key}'`;break}if(oldProperty.hasOwnProperty('enumValues')){const newOptions=newProperty.hasOwnProperty('enumValues')?newProperty.enumValues:[];if(!oldProperty.enumValues.every(checkOption=>newOptions.includes(checkOption))){explanation=`Enumeration value option removed from property '${path?path:''}${key}'`;break}}else if(newProperty.hasOwnProperty('enumValues')){explanation=`Property '${path?path:''}${key}' is now constrained by an enumeration`;break}if(!path){if(oldProperty.writeback&&!newProperty.writeback){explanation=`Property '${key}' is no longer writeback enabled`;break}if(!oldProperty.required&&newProperty.required){explanation=`Property '${key}' has been made required`;break}const oldROState=oldProperty.hasOwnProperty('readOnly')?oldProperty.readOnly:false;const newROState=newProperty.hasOwnProperty('readOnly')?newProperty.readOnly:false;if(oldROState!==newROState){explanation=`Property '${key}' readOnly state has changed`;break}const oldDefault=oldProperty.hasOwnProperty('value')?JSON.stringify(oldProperty.value):'';const newDefault=newProperty.hasOwnProperty('value')?JSON.stringify(newProperty.value):'';if(oldDefault!==newDefault){explanation=`Property '${key}' default value has changed`;break}}if(newProperty.hasOwnProperty('properties')||oldProperty.hasOwnProperty('properties')){const newSubProps=newProperty.properties?newProperty.properties:{};const oldSubProps=oldProperty.properties?oldProperty.properties:{};const propPath=path?path+key+'.':key+'.';explanation=this._compareProperties(newSubProps,oldSubProps,propPath);if(explanation){break}}}else{explanation=`Property '${path?path:''}${key}' has been removed`;break}}return explanation};module.exports=ruleDef;
6
+ const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const AuditComponentCacheManager=require('../jetwc-lib/jetwcutils-auditComponentCacheManager');const NetUtils=require('../../lib/NetUtils');const CommonImpl=require('../jetwc-lib/jetwcutils-commonListenerImpls');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-api-baseline-changes'};ruleDef.prototype.getShortDescription=function(){return'Check components for API changes against a base version'};ruleDef.prototype.getDescription=function(){return'This audit compares the APIs exposed by components with a designated baseline version of a component in the Exchange Catalog and checks if the component APIs have changed'};ruleDef.prototype.register=function(context){return{startaudit:this._auditPrep,closedownRP:this._dealWithCache,compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._auditPrep=function(context){let baselineConfigured=false;let baselineMetadata=[];this.exchangeURL=CommonImpl.checkForExchangeConfiguration(context);if(this.exchangeURL){this.acCache=new AuditComponentCacheManager(context,this.getName());if(this.acCache.isBaselineIndexAvailable()){const exchangeRoot=this.exchangeURL;let baselineIndex=this.acCache.readComponentCacheIndexFile();if(Object.entries(baselineIndex).length===0){const baselineConfiguration=this.acCache.getBaselineOpts();let exchangeReadError=false;for(const[baselineComponent,baselineComponentVersion]of Object.entries(baselineConfiguration)){const eachComponentInfo=this._cacheBaselineMetadataForComponent(context,baselineComponent,baselineComponentVersion,exchangeRoot);if(!eachComponentInfo.inError){baselineMetadata=baselineMetadata.concat(eachComponentInfo.metadata)}else{exchangeReadError=true}}if(!exchangeReadError){baselineMetadata.forEach(component=>{const fullName=Utils.getComponentFullName(component);baselineIndex[fullName]=component.version;if(!this.acCache.existsInComponentCache(fullName,component.version)){this.acCache.writeToComponentCache(fullName,component.version,component)}});this.acCache.writeComponentCacheIndexFile(baselineIndex)}}if(Object.entries(baselineIndex).length>0){baselineConfigured=true;if(Object.keys(baselineIndex).length>0){Utils.safeSetExtension(context,{baselineIndex:baselineIndex})}}}}};ruleDef.prototype._cacheBaselineMetadataForComponent=function(auditContext,componentName,componentVersion,exchangeUrl){const msg=auditContext.utils.msgLib;let componentMetaArray=[];let inErrorCondition=false;try{let componentMeta;if(this.acCache.existsInComponentCache(componentName,componentVersion)){componentMeta=this.acCache.readFromComponentCache(componentName,componentVersion)}else{const netUtils=new NetUtils;const componentMetaResp=netUtils.loadUrl(`${exchangeUrl}/components/${componentName}/versions/${componentVersion}`);if(componentMetaResp.statusCode===200&&componentMetaResp.body){const componentResponseMeta=JSON.parse(componentMetaResp.body);componentMeta=componentResponseMeta.component}else{const issue=new auditContext.Issue(`The exchangeURL value specified for the rule ${auditContext.ruleName} is incorrect: ${exchangeUrl}`);issue.setMsgKey('jetwco-component-api-baseline-changes_2');auditContext.reporter.addIssue(issue,auditContext,'critical');inErrorCondition=true}}if(!inErrorCondition&&componentMeta){const compType=componentMeta.type?componentMeta.type:'composite';if(compType==='pack'){const dependents=componentMeta.dependencies;if(dependents){for(const[packComponent,packComponentVersion]of Object.entries(dependents)){const eachPackMemberInfo=this._cacheBaselineMetadataForComponent(auditContext,packComponent,packComponentVersion,exchangeUrl);if(!eachPackMemberInfo.inError){componentMetaArray=componentMetaArray.concat(eachPackMemberInfo.metadata)}else{inErrorCondition=true}}}}componentMetaArray.push(componentMeta)}}catch(e){msg.error(`Exchange read error ${JSON.stringify(e)}`);const issue=new auditContext.Issue(`The exchangeURL value specified for the rule ${auditContext.ruleName} is incorrect: ${exchangeUrl}`);issue.setMsgKey('jetwco-component-api-baseline-changes_2');auditContext.reporter.addIssue(issue,context,'critical');inErrorCondition=true};return{inError:inErrorCondition,metadata:componentMetaArray}};ruleDef.prototype._dealWithCache=function(context){const shouldClearCache=context.rulePack.getRuleOption('clearCache',this.getName());if(shouldClearCache&&this.acCache){this.acCache.removeLocalCache()}};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._baselineCheck(context,fullName,componentType,meta)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let remappedDependencies;if(componentInfo.dependencies){remappedDependencies=componentInfo.dependencies.reduce((asMap,entry)=>{asMap[entry.name]=entry.range;return asMap},{})}const meta={version:componentInfo.version,jetVersion:componentInfo.jetVersion,properties:componentInfo.properties,methods:componentInfo.methods,events:componentInfo.events,sots:componentInfo.slots,dependencies:remappedDependencies};this._baselineCheck(context,componentInfo.fullName,componentInfo.type,meta)}};ruleDef.prototype._baselineCheck=function(context,fullName,componentType,componentMeta){const baselineIndex=context.rulePack.getExtension().baselineIndex;if(componentMeta&&baselineIndex){const componentVersion=componentMeta.version;const baselineVersion=baselineIndex[fullName];if(baselineVersion){const semver=context.utils.semVerUtils;const baselineComponentMeta=this.acCache.readFromComponentCache(fullName,baselineVersion);try{switch(componentType){case'pack':this._conductCheck(this._packContentsDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._packBundlesDiff,componentMeta,baselineComponentMeta);break;case'composite':this._conductCheck(this._detectJetVersionDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectMethodDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectEventDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectSlotDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDynamicSlotDiff,componentMeta,baselineComponentMeta);this._conductCheck(this._detectPropertyDiff,componentMeta,baselineComponentMeta);break;case'vbcs-pattern':this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);break;case'resource':this._conductCheck(this._detectJetVersionDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectDependencyDiff,semver,componentMeta,baselineComponentMeta);this._conductCheck(this._detectPublicModulesDiff,componentMeta,baselineComponentMeta);break;}}catch(auditDetail){const issue=new context.Issue(`API change for ${fullName}@${componentVersion} detected in comparison with baseline version ${baselineVersion}. Indication: ${auditDetail}`);issue.setMsgKey('jetwco-component-api-baseline-changes_1');context.reporter.addIssue(issue,context)}}}};ruleDef.prototype._conductCheck=function(checkCallback,semver,config,existingConfig){const result=checkCallback.call(this,semver,config,existingConfig);if(result){throw result}};ruleDef.prototype._detectJetVersionDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const componentJetVersion=config.jetVersion?config.jetVersion:'0.0.0';const existingJetVersion=existingConfig.jetVersion?existingConfig.jetVersion:'0.0.0';if(componentJetVersion!==existingJetVersion){if(existingJetVersion==='0.0.0'||componentJetVersion==='0.0.0'){explanation='JET version range has been added or removed'}else{const minVersion=semver.minVersion(componentJetVersion);const minExistingVersion=semver.minVersion(existingJetVersion);if(semver.major(minVersion)>semver.major(minExistingVersion)){explanation='minimum major JET version required has increased'}else if(semver.minor(minVersion)>semver.minor(minExistingVersion)){explanation='minimum minor JET version required has increased'}}}return explanation};ruleDef.prototype._packContentsDiff=function(config,existingConfig){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(!config.dependencies.hasOwnProperty(key)){explanation=`Pack component ${key} has been removed`;break}}}return explanation};ruleDef.prototype._packBundlesDiff=function(config,existingConfig){let explanation;const configBundles=config.bundles?Object.keys(config.bundles):[];const existingBundles=existingConfig.bundles?Object.keys(existingConfig.bundles):[];for(let i=0;i<existingBundles.length;i++){const key=existingBundles[i];if(!config.bundles.hasOwnProperty(key)){explanation=`Pack bundle '${key}' has been removed`;break}else{const configContents=config.bundles[key];const existingContents=existingConfig.bundles[key];for(let i=0;i<existingContents.length;i++){const module=existingContents[i];if(!configContents.includes(module)){explanation=`Pack bundle '${key}' entry '${module}' removed`;break}}}}return explanation};ruleDef.prototype._detectPublicModulesDiff=function(config,existingConfig){let explanation;const configPM=config.publicModules?config.publicModules:[];const existingPM=existingConfig.publicModules?existingConfig.publicModules:[];for(let i=0;i<existingPM.length;i++){const module=existingPM[i];if(!configPM.includes(module)){explanation=`Public Module entry '${module}' has been removed`;break}}return explanation};ruleDef.prototype._detectDependencyDiff=function(semver,config,existingConfig){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>existingDeps.length){explanation='More dependencies are declared by component'}else{if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(config.dependencies.hasOwnProperty(key)){const newDepVersion=semver.minVersion(config.dependencies[key]);const existingDepVersion=semver.minVersion(existingConfig.dependencies[key]);if(semver.major(newDepVersion)!==semver.major(existingDepVersion)){explanation='Different major version of dependency '+key;break}if(semver.minor(newDepVersion)!==semver.minor(existingDepVersion)){explanation='Different minor version of dependency '+key;break}}else{explanation=`Dependency ${key} has been removed`;break}}}}return explanation};ruleDef.prototype._detectMethodDiff=function(config,existingConfig){let explanation;const configMethods=config.methods?Object.keys(config.methods):[];const existingMethods=existingConfig.methods?Object.keys(existingConfig.methods):[];for(let i=0;i<existingMethods.length;i++){const key=existingMethods[i];if(config.methods.hasOwnProperty(key)){const configMethodParams=config.methods[key].params?config.methods[key].params:[];const existingMethodParams=existingConfig.methods[key].params?existingConfig.methods[key].params:[];for(let j=0;j<existingMethodParams.length;j++){if(j>=configMethodParams.length){explanation=`Existing method '${key}' has fewer parameters`;break}else{if(!this._compareType(configMethodParams[j],existingMethodParams[j])){explanation=`Method '${key}' parameter number:${j+1} has a changed type`;break}}}if(!explanation&&configMethodParams.length>existingMethodParams.length){explanation=`Existing method '${key}' has additional parameters`;break}}else{explanation=`Existing method '${key}' has been removed`;break}}return explanation};ruleDef.prototype._detectPropertyDiff=function(config,existingConfig){let explanation;const configProps=config.properties?Object.keys(config.properties):[];const existingProps=existingConfig.properties?Object.keys(existingConfig.properties):[];explanation=this._compareProperties(config.properties,existingConfig.properties);if(!explanation){const addedRequiredProps=configProps.filter(addedProp=>!existingProps.includes(addedProp)&&config[addedProp]&&config[addedProp].required);if(addedRequiredProps.length>0){explanation=`Required property(ies) added: ${addedRequiredProps.join(',')}`}}return explanation};ruleDef.prototype._detectEventDiff=function(config,existingConfig){let explanation;const configEvents=config.events?Object.keys(config.events):[];const existingEvents=existingConfig.events?Object.keys(existingConfig.events):[];for(let i=0;i<existingEvents.length;i++){const key=existingEvents[i];if(config.events.hasOwnProperty(key)){const configEventDetail=config.events[key].detail?config.events[key].detail:{};const existingEventDetail=existingConfig.events[key].detail?existingConfig.events[key].detail:{};const detailKeys=Object.keys(configEventDetail);const existingDetailKeys=Object.keys(existingEventDetail);for(let j=0;j<existingDetailKeys.length;j++){const detailKey=existingDetailKeys[j];if(j>=detailKeys.length||!configEventDetail.hasOwnProperty(detailKey)){explanation=`Event '${key}' has missing entries in the detail payload`;break}else{if(!this._compareType(configEventDetail[detailKey],existingEventDetail[detailKey])){explanation=`Event '${key}' detail attribute '${detailKey}' has a changed type`;break}}}if(!explanation&&config.events[key].bubbles!==existingConfig.events[key].bubbles){explanation=`Event '${key}' has a changed bubbling state`;break}if(!explanation&&config.events[key].cancelable!==existingConfig.events[key].cancelable){explanation=`Event '${key}' has changed cancelable state`;break}}else{explanation=`Event '${key}' has been removed`;break}}return explanation};ruleDef.prototype._detectSlotDiff=function(config,existingConfig){return this._detectTypedSlotDiff('slots',config,existingConfig)};ruleDef.prototype._detectDynamicSlotDiff=function(config,existingConfig){return this._detectTypedSlotDiff('dynamicSlots',config,existingConfig)};ruleDef.prototype._detectTypedSlotDiff=function(slotType,config,existingConfig){let explanation;const configSlots=config[slotType]?Object.keys(config[slotType]):[];const existingSlots=existingConfig[slotType]?Object.keys(existingConfig[slotType]):[];for(let i=0;i<existingSlots.length;i++){const key=existingSlots[i];if(config[slotType].hasOwnProperty(key)){const configSlotData=config[slotType][key].data?config[slotType][key].data:{};const existingSlotData=existingConfig[slotType][key].data?existingConfig[slotType][key].data:{};const dataKeys=Object.keys(configSlotData);const existingDataKeys=Object.keys(existingSlotData);for(let j=0;j<existingDataKeys.length;j++){const dataKey=existingDataKeys[j];if(j>=dataKeys.length||!configSlotData.hasOwnProperty(dataKey)){explanation=`Template slot '${key}' - '${dataKey}' has been removed from data definition`;break}else{if(!this._compareType(configSlotData[dataKey],existingSlotData[dataKey])){explanation=`Template slot '${key}' data attribute '${dataKey}' has a changed type`;break}}}}else{explanation=`Slot '${key}' has been removed`;break}}return explanation};ruleDef.prototype._compareType=function(newTyped,existingTyped){let matches=true;const newType=newTyped&&newTyped.type?newTyped.type:null;const existingType=existingTyped&&existingTyped.type?existingTyped.type:null;if(newType!==existingType){if(newType.includes('|')){const newTypeOptions=newType?newType.split('|'):[];const existingTypeOptions=existingType?existingType.split('|'):[];matches=existingTypeOptions.every(checkType=>newTypeOptions.includes(checkType))}else{matches=false}}return matches};ruleDef.prototype._compareProperties=function(newProps,oldProps,path){let explanation;const configProps=newProps?Object.keys(newProps):[];const existingProps=oldProps?Object.keys(oldProps):[];for(let i=0;i<existingProps.length;i++){const key=existingProps[i];if(newProps.hasOwnProperty(key)){const newProperty=newProps[key];const oldProperty=oldProps[key];if(!this._compareType(newProperty,oldProperty)){explanation=`Property type change for '${path?path:''}${key}'`;break}if(oldProperty.hasOwnProperty('enumValues')){const newOptions=newProperty.hasOwnProperty('enumValues')?newProperty.enumValues:[];if(!oldProperty.enumValues.every(checkOption=>newOptions.includes(checkOption))){explanation=`Enumeration value option removed from property '${path?path:''}${key}'`;break}}else if(newProperty.hasOwnProperty('enumValues')){explanation=`Property '${path?path:''}${key}' is now constrained by an enumeration`;break}if(!path){if(oldProperty.writeback&&!newProperty.writeback){explanation=`Property '${key}' is no longer writeback enabled`;break}if(!oldProperty.required&&newProperty.required){explanation=`Property '${key}' has been made required`;break}const oldROState=oldProperty.hasOwnProperty('readOnly')?oldProperty.readOnly:false;const newROState=newProperty.hasOwnProperty('readOnly')?newProperty.readOnly:false;if(oldROState!==newROState){explanation=`Property '${key}' readOnly state has changed`;break}const oldDefault=oldProperty.hasOwnProperty('value')?JSON.stringify(oldProperty.value):'';const newDefault=newProperty.hasOwnProperty('value')?JSON.stringify(newProperty.value):'';if(oldDefault!==newDefault){explanation=`Property '${key}' default value has changed`;break}}if(newProperty.hasOwnProperty('properties')||oldProperty.hasOwnProperty('properties')){const newSubProps=newProperty.properties?newProperty.properties:{};const oldSubProps=oldProperty.properties?oldProperty.properties:{};const propPath=path?path+key+'.':key+'.';explanation=this._compareProperties(newSubProps,oldSubProps,propPath);if(explanation){break}}}else{explanation=`Property '${path?path:''}${key}' has been removed`;break}}return explanation};module.exports=ruleDef;
@@ -1,6 +1,6 @@
1
1
  /*
2
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates.
2
+ * Copyright (c) 2018, 2022, Oracle and/or its affiliates.
3
3
  * Licensed under The Universal Permissive License (UPL), Version 1.0
4
4
  * as shown at https://oss.oracle.com/licenses/upl/
5
5
  */
6
- const Utils=require('../jetwc-lib/component-audit-utils');const NetUtils=require('../../lib/NetUtils');const EXCHANGEROOT='https://exchange.oraclecorp.com/api/0.2.0/components/';const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-api-changes'};ruleDef.prototype.getShortDescription=function(){return'Verify that any API changes are compatible with the version number change'};ruleDef.prototype.getDescription=function(){return'This audit compares the metadata of the previous version of a component in the Exchange Catalog and verifies that any API changes are matched with an appropriate version number change according to semver rules'};ruleDef.prototype.register=function(context){return{startupRP:this._prepareCache,closedownRP:this._dealWithCache,compjson:this._doAudit}};ruleDef.prototype._prepareCache=function(context){Utils.ensureLocalCache(context)};ruleDef.prototype._dealWithCache=function(context){const shouldClearCache=context.rulePack.getRuleOption('clearCache','jetwco-component-api-changes');if(shouldClearCache){Utils.removeLocalCache(context)}};ruleDef.prototype._doAudit=function(context,arg1){if(context.suppData.obj){const componentDef=context.suppData.obj;const fullName=componentDef.pack?`${componentDef.pack}-${componentDef.name}`:componentDef.name;const semver=context.utils.semVerUtils;let newVersion,latestMatchVersion;try{const netUtils=new NetUtils;const existingVersionsResp=netUtils.loadUrl(`${EXCHANGEROOT}${fullName}/versions`);if(existingVersionsResp.statusCode=200&&existingVersionsResp.body){const existingVersions=JSON.parse(existingVersionsResp.body);if(existingVersions.items&&existingVersions.items.length>0){newVersion=componentDef.version;let minorVersionUpdated=false;latestMatchVersion=this._findMostAppropriateComparitor(existingVersions,newVersion,semver);if(latestMatchVersion){if(this._isAPICheckNeeded(semver,newVersion,latestMatchVersion)){minorVersionUpdated=this._isEffectiveMinor(semver,newVersion,latestMatchVersion);let existingDef;if(Utils.existsInComponentCache(context,fullName,latestMatchVersion)){existingDef=Utils.readFromComponentCache(context,fullName,latestMatchVersion)}else{const uploadedResp=netUtils.loadUrl(`${EXCHANGEROOT}${fullName}/versions/${latestMatchVersion}`);if(uploadedResp.statusCode=200&&uploadedResp.body){existingDef=JSON.parse(uploadedResp.body).component;Utils.writeToComponentCache(context,fullName,latestMatchVersion,existingDef)}}if(existingDef){try{this._conductCheck(this._detectJetVersionDiff,semver,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectDependencyDiff,semver,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectMethodDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectPropertyDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectEventDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectSlotDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectDynamicSlotDiff,componentDef,existingDef,minorVersionUpdated)}catch(auditDetail){const issue=new context.Issue(`API change for ${fullName}@${newVersion} (compared with @${latestMatchVersion}) is not matched by appropriate version number update. Indication: ${auditDetail}`);context.reporter.addIssue(issue,context,'blocker')}}else{console.error(`Unable to obtain metadata for ${fullName}@${latestMatchVersion}`)}}else{}}}}}catch(e){console.error(JSON.stringify(e))};}};ruleDef.prototype._findMostAppropriateComparitor=function(existingVersions,newVersion,semver){const versions=existingVersions.items.reverse();let closestMatch,firstMatch,closestReleaseMatch;for(let i=0;i<versions.length;i++){if(semver.gte(newVersion,versions[i])){closestMatch=versions[i];if(!firstMatch){firstMatch=closestMatch}if(!this._isPreRelease(semver,closestMatch)||semver.major(closestMatch)===0){closestReleaseMatch=closestMatch;break}else{continue}}}return closestReleaseMatch?closestReleaseMatch:firstMatch};ruleDef.prototype._isPreRelease=function(semver,version){return Array.isArray(semver.prerelease(version))};ruleDef.prototype._isAPICheckNeeded=function(semver,newVersion,existingVersion){let doCheck=true;if(semver.major(newVersion)>semver.major(existingVersion)||semver.major(newVersion)===0&&semver.minor(newVersion)>semver.minor(existingVersion)){doCheck=false}return doCheck};ruleDef.prototype._isEffectiveMinor=function(semver,newVersion,existingVersion){let classAsMinor=false;if(semver.minor(newVersion)>semver.minor(existingVersion)||semver.major(newVersion)===0&&semver.patch(newVersion)>semver.patch(existingVersion)){classAsMinor=true}return classAsMinor};ruleDef.prototype._conductCheck=function(checkCallback,semver,config,existingConfig,claimedMinorDiff){const result=checkCallback.call(this,semver,config,existingConfig,claimedMinorDiff);if(result){throw result}};ruleDef.prototype._detectJetVersionDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const componentJetVersion=config.jetVersion?config.jetVersion:'0.0.0';const existingJetVersion=existingConfig.jetVersion?existingConfig.jetVersion:'0.0.0';if(componentJetVersion!==existingJetVersion){if(existingJetVersion==='0.0.0'||componentJetVersion==='0.0.0'){explanation='JET version range has been added or removed'}else{const minVersion=semver.minVersion(componentJetVersion);const minExistingVersion=semver.minVersion(existingJetVersion);if(semver.major(minVersion)>semver.major(minExistingVersion)){explanation='minimum major JET version required has increased'}else if(!claimedMinorDiff){if(semver.minor(minVersion)>semver.minor(minExistingVersion)){explanation='minimum minor JET version required has increased'}}}}return explanation};ruleDef.prototype._detectDependencyDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>existingDeps.length){explanation='more dependencies are declared'}else{if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(config.dependencies.hasOwnProperty(key)){const newDepVersion=semver.minVersion(config.dependencies[key]);const existingDepVersion=semver.minVersion(existingConfig.dependencies[key]);if(semver.major(newDepVersion)!==semver.major(existingDepVersion)){explanation='different major version of dependency '+key;break}if(!claimedMinorDiff){if(semver.minor(newDepVersion)!==semver.minor(existingDepVersion)){explanation='different minor version of dependency '+key;break}}}else{if(!claimedMinorDiff){explanation=`dependency ${key} has been removed`}break}}}}return explanation};ruleDef.prototype._detectMethodDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configMethods=config.methods?Object.keys(config.methods):[];const existingMethods=existingConfig.methods?Object.keys(existingConfig.methods):[];if(configMethods.length>=existingMethods.length){if(claimedMinorDiff){if(!existingMethods.every(checkName=>configMethods.includes(checkName))){explanation='existing method removed'}}else if(configMethods.length!==existingMethods.length){explanation='different number of methods declared'}}else{if(configMethods.length===0&&existingMethods.length>0){explanation='existing method(s) removed'}}if(!explanation){for(let i=0;i<existingMethods.length;i++){const key=existingMethods[i];if(config.methods.hasOwnProperty(key)){const configMethodParams=config.methods[key].params?config.methods[key].params:[];const existingMethodParams=existingConfig.methods[key].params?existingConfig.methods[key].params:[];for(let j=0;j<existingMethodParams.length;j++){if(j>=configMethodParams.length){explanation=`existing method '${key}' has fewer parameters`;break}else{if(!this._compareType(configMethodParams[j],existingMethodParams[j],claimedMinorDiff)){explanation=`method '${key}' parameter number:${j+1} has a changed type`;break}}}if(!explanation&&configMethodParams.length>existingMethodParams.length&&!claimedMinorDiff){explanation=`existing method '${key}' has additional parameters`;break}}else{explanation=`existing method '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._detectPropertyDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configProps=config.properties?Object.keys(config.properties):[];const existingProps=existingConfig.properties?Object.keys(existingConfig.properties):[];if(configProps.length>=existingProps.length){if(claimedMinorDiff){if(!existingProps.every(checkName=>configProps.includes(checkName))){explanation='existing property removed'}}else if(configProps.length!==existingProps.length){explanation='different number of properties declared'}}else{if(configProps.length===0&&existingProps.length>0){explanation='existing properties removed'}}if(!explanation){explanation=this._compareProperties(config.properties,existingConfig.properties,claimedMinorDiff)}return explanation};ruleDef.prototype._detectEventDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configEvents=config.events?Object.keys(config.events):[];const existingEvents=existingConfig.events?Object.keys(existingConfig.events):[];if(configEvents.length>=existingEvents.length){if(claimedMinorDiff){if(!existingEvents.every(checkName=>configEvents.includes(checkName))){explanation='existing event removed'}}else if(configEvents.length!==existingEvents.length){explanation='different number of events declared'}}else{if(configEvents.length===0&&existingEvents.length>0){explanation='existing event(s) removed'}}if(!explanation){for(let i=0;i<existingEvents.length;i++){const key=existingEvents[i];if(config.events.hasOwnProperty(key)){const configEventDetail=config.events[key].detail?config.events[key].detail:{};const existingEventDetail=existingConfig.events[key].detail?existingConfig.events[key].detail:{};const detailKeys=Object.keys(configEventDetail);const existingDetailKeys=Object.keys(existingEventDetail);for(let j=0;j<existingDetailKeys.length;j++){const detailKey=existingDetailKeys[j];if(j>=detailKeys.length||!configEventDetail.hasOwnProperty(detailKey)){explanation=`existing event '${key}' has missing entries in the detail payload`;break}else{if(!this._compareType(configEventDetail[detailKey],existingEventDetail[detailKey],claimedMinorDiff)){explanation=`event '${key}' detail attribute '${detailKey}' has a changed type`;break}}}if(!explanation&&detailKeys.length>existingDetailKeys.length&&!claimedMinorDiff){explanation=`existing event '${key}' has additional entries in the detail payload`;break}if(!explanation&&config.events[key].bubbles!==existingConfig.events[key].bubbles){explanation=`existing event '${key}' has changed bubbling state`;break}if(!explanation&&config.events[key].cancelable!==existingConfig.events[key].cancelable){explanation=`existing event '${key}' has changed cancelable state`;break}}else{explanation=`existing event '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._detectSlotDiff=function(config,existingConfig,claimedMinorDiff){return this._detectTypedSlotDiff('slots',config,existingConfig,claimedMinorDiff)};ruleDef.prototype._detectDynamicSlotDiff=function(config,existingConfig,claimedMinorDiff){return this._detectTypedSlotDiff('dynamicSlots',config,existingConfig,claimedMinorDiff)};ruleDef.prototype._detectTypedSlotDiff=function(slotType,config,existingConfig,claimedMinorDiff){let explanation;const configSlots=config[slotType]?Object.keys(config[slotType]):[];const existingSlots=existingConfig[slotType]?Object.keys(existingConfig[slotType]):[];if(configSlots.length>=existingSlots.length){if(claimedMinorDiff){if(!existingSlots.every(checkName=>configSlots.includes(checkName))){explanation='existing slot removed'}}else if(configSlots.length!==existingSlots.length){explanation='different number of slots declared'}}else{if(configSlots.length===0&&existingSlots.length>0){explanation='existing slot(s) removed'}}if(!explanation){for(let i=0;i<existingSlots.length;i++){const key=existingSlots[i];if(config[slotType].hasOwnProperty(key)){const configSlotData=config[slotType][key].data?config[slotType][key].data:{};const existingSlotData=existingConfig[slotType][key].data?existingConfig[slotType][key].data:{};const dataKeys=Object.keys(configSlotData);const existingDataKeys=Object.keys(existingSlotData);for(let j=0;j<existingDataKeys.length;j++){const dataKey=existingDataKeys[j];if(j>=dataKeys.length||!configSlotData.hasOwnProperty(dataKey)){explanation=`existing slot '${key}' has missing entries in the data payload`;break}else{if(!this._compareType(configSlotData[dataKey],existingSlotData[dataKey],claimedMinorDiff)){explanation=`slot '${key}' data attribute '${dataKey}' has a changed type`;break}}}if(!explanation&&dataKeys.length>existingDataKeys.length&&!claimedMinorDiff){explanation=`existing slot '${key}' has additional entries in the data payload`;break}}else{explanation=`existing slot '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._compareType=function(newTyped,existingTyped,claimedMinorDiff){let matches=true;const newType=newTyped&&newTyped.type?newTyped.type:null;const existingType=existingTyped&&existingTyped.type?existingTyped.type:null;if(newType!==existingType){if(claimedMinorDiff){const newTypeOptions=newType?newType.split('|'):[];const existingTypeOptions=existingType?existingType.split('|'):[];matches=existingTypeOptions.every(checkType=>newTypeOptions.includes(checkType))}else{matches=false}}return matches};ruleDef.prototype._compareProperties=function(newProps,oldProps,claimedMinorDiff,path){let explanation;const configProps=newProps?Object.keys(newProps):[];const existingProps=oldProps?Object.keys(oldProps):[];for(let i=0;i<existingProps.length;i++){const key=existingProps[i];if(newProps.hasOwnProperty(key)){const newProperty=newProps[key];const oldProperty=oldProps[key];if(!this._compareType(newProperty,oldProperty,claimedMinorDiff)){explanation=`type change for property ${path?path:''}${key}`;break}if(oldProperty.hasOwnProperty('enumValues')){const newOptions=newProperty.hasOwnProperty('enumValues')?newProperty.enumValues:[];if(!oldProperty.enumValues.every(checkOption=>newOptions.includes(checkOption))){explanation=`Enumeration value option removed from property '${path?path:''}${key}'`;break}}else if(newProperty.hasOwnProperty('enumValues')){explanation=`Property '${path?path:''}${key}' is now constrained by an enumeration`;break}if(!path){if(oldProperty.writeback&&!newProperty.writeback){explanation=`property ${key} is no longer writeback enabled`;break}if(!oldProperty.required&&newProperty.required){explanation=`property ${key} has been made required`;break}if(!oldProperty.required&&newProperty.required){explanation=`Property '${key}' has been made required`;break}const oldROState=oldProperty.hasOwnProperty('readOnly')?oldProperty.readOnly:false;const newROState=newProperty.hasOwnProperty('readOnly')?newProperty.readOnly:false;if(oldROState!==newROState){explanation=`Property '${key}' readOnly state has changed`;break}}if(newProperty.hasOwnProperty('properties')||oldProperty.hasOwnProperty('properties')){const newSubProps=newProperty.properties?newProperty.properties:{};const oldSubProps=oldProperty.properties?oldProperty.properties:{};const propPath=path?path+key+'.':key+'.';explanation=this._compareProperties(newSubProps,oldSubProps,claimedMinorDiff,propPath);if(explanation){break}}}else{explanation=`property ${path?path:''}${key} has been removed`;break}}if(!explanation){if(!claimedMinorDiff&&configProps.length>existingProps.length){explanation=`property added ${path?'as sub-property of '+path:''}`}}return explanation};module.exports=ruleDef;
6
+ const AuditComponentCacheManager=require('../jetwc-lib/jetwcutils-auditComponentCacheManager');const NetUtils=require('../../lib/NetUtils');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const CommonImpl=require('../jetwc-lib/jetwcutils-commonListenerImpls');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-api-changes'};ruleDef.prototype.getShortDescription=function(){return'Verify that any API changes are compatible with the version number change'};ruleDef.prototype.getDescription=function(){return'This audit compares the metadata of the previous version of a component in the Exchange Catalog and verifies that any API changes are matched with an appropriate version number change according to semver rules'};ruleDef.prototype.register=function(context){return{startaudit:this._auditPrep,closedownRP:this._dealWithCache,compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._auditPrep=function(context){this.exchangeURL=CommonImpl.checkForExchangeConfiguration(context);if(this.exchangeURL){this.acCache=new AuditComponentCacheManager(context,this.getName())}else{const issue=new context.Issue(`Invalid or Missing exchangeURL value specified for the rule ${context.ruleName}, rule execution is disabled`);issue.setMsgKey(`${context.ruleName}_2`);issue.setSeverity('critical');context.reporter.addIssue(issue,context)}};ruleDef.prototype._dealWithCache=function(context){const shouldClearCache=context.rulePack.getRuleOption('clearCache',this.getName());if(shouldClearCache&&this.acCache){this.acCache.removeLocalCache()}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);this._checkAPIs(context,fullName,meta)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let remappedDependencies;if(componentInfo.dependencies){remappedDependencies=componentInfo.dependencies.reduce((asMap,entry)=>{asMap[entry.name]=entry.range;return asMap},{})}const meta={version:componentInfo.version,jetVersion:componentInfo.jetVersion,properties:componentInfo.properties,methods:componentInfo.methods,events:componentInfo.events,sots:componentInfo.slots,dependencies:remappedDependencies};this._checkAPIs(context,componentInfo.fullName,meta)}};ruleDef.prototype._checkAPIs=function(context,fullName,componentDef){const{msgLib,semVerUtils}=context.utils;let newVersion,latestMatchVersion;try{const netUtils=new NetUtils;const existingVersionsResp=netUtils.loadUrl(`${this.exchangeURL}components/${fullName}/versions`);if(existingVersionsResp.statusCode===200&&existingVersionsResp.body){const existingVersions=JSON.parse(existingVersionsResp.body);if(existingVersions.items&&existingVersions.items.length>0){newVersion=componentDef.version;let minorVersionUpdated=false;latestMatchVersion=this._findMostAppropriateComparitor(existingVersions,newVersion,semVerUtils);if(latestMatchVersion){if(this._isAPICheckNeeded(semVerUtils,newVersion,latestMatchVersion)){minorVersionUpdated=this._isEffectiveMinor(semVerUtils,newVersion,latestMatchVersion);let existingDef;if(this.acCache.existsInComponentCache(fullName,latestMatchVersion)){existingDef=this.acCache.readFromComponentCache(fullName,latestMatchVersion)}else{const uploadedResp=netUtils.loadUrl(`${this.exchangeURL}components/${fullName}/versions/${latestMatchVersion}`);if(uploadedResp.statusCode=200&&uploadedResp.body){existingDef=JSON.parse(uploadedResp.body).component;this.acCache.writeToComponentCache(fullName,latestMatchVersion,existingDef)}}if(existingDef){try{this._conductCheck(this._detectJetVersionDiff,semVerUtils,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectDependencyDiff,semVerUtils,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectMethodDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectPropertyDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectEventDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectSlotDiff,componentDef,existingDef,minorVersionUpdated);this._conductCheck(this._detectDynamicSlotDiff,componentDef,existingDef,minorVersionUpdated)}catch(auditDetail){const issue=new context.Issue(`API change for ${fullName}@${newVersion} (compared with @${latestMatchVersion}) is not matched by appropriate version number update. Indication: ${auditDetail}`);issue.setMsgKey('jetwco-component-api-changes_1');context.reporter.addIssue(issue,context)}}else{msgLib.error(`Unable to obtain metadata for ${fullName}@${latestMatchVersion}`)}}else{}}}}else if(existingVersionsResp.statusCode===404||existingVersionsResp.eCode==='ENOTFOUND'){msgLib.info(`The component ${fullName} does not exist in the Exchange and so cannot be API verified against older versions. It will be skipped`)}}catch(e){msgLib.error(JSON.stringify(e))};};ruleDef.prototype._findMostAppropriateComparitor=function(existingVersions,newVersion,semver){const versions=existingVersions.items.reverse();let closestMatch,firstMatch,closestReleaseMatch;for(let i=0;i<versions.length;i++){if(semver.gte(newVersion,versions[i])){closestMatch=versions[i];if(!firstMatch){firstMatch=closestMatch}if(!this._isPreRelease(semver,closestMatch)||semver.major(closestMatch)===0){closestReleaseMatch=closestMatch;break}else{continue}}}return closestReleaseMatch?closestReleaseMatch:firstMatch};ruleDef.prototype._isPreRelease=function(semver,version){return Array.isArray(semver.prerelease(version))};ruleDef.prototype._isAPICheckNeeded=function(semver,newVersion,existingVersion){let doCheck=true;if(semver.major(newVersion)>semver.major(existingVersion)||semver.major(newVersion)===0&&semver.minor(newVersion)>semver.minor(existingVersion)){doCheck=false}return doCheck};ruleDef.prototype._isEffectiveMinor=function(semver,newVersion,existingVersion){let classAsMinor=false;if(semver.minor(newVersion)>semver.minor(existingVersion)||semver.major(newVersion)===0&&semver.patch(newVersion)>semver.patch(existingVersion)){classAsMinor=true}return classAsMinor};ruleDef.prototype._conductCheck=function(checkCallback,semver,config,existingConfig,claimedMinorDiff){const result=checkCallback.call(this,semver,config,existingConfig,claimedMinorDiff);if(result){throw result}};ruleDef.prototype._detectJetVersionDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const componentJetVersion=config.jetVersion?config.jetVersion:'0.0.0';const existingJetVersion=existingConfig.jetVersion?existingConfig.jetVersion:'0.0.0';if(componentJetVersion!==existingJetVersion){if(existingJetVersion==='0.0.0'||componentJetVersion==='0.0.0'){explanation='JET version range has been added or removed'}else{const minVersion=semver.minVersion(componentJetVersion);const minExistingVersion=semver.minVersion(existingJetVersion);if(semver.major(minVersion)>semver.major(minExistingVersion)){explanation='minimum major JET version required has increased'}else if(!claimedMinorDiff){if(semver.minor(minVersion)>semver.minor(minExistingVersion)){explanation='minimum minor JET version required has increased'}}}}return explanation};ruleDef.prototype._detectDependencyDiff=function(semver,config,existingConfig,claimedMinorDiff){let explanation;const configDeps=config.dependencies?Object.keys(config.dependencies):[];const existingDeps=existingConfig.dependencies?Object.keys(existingConfig.dependencies):[];if(configDeps.length>existingDeps.length){explanation='more dependencies are declared'}else{if(configDeps.length>0){for(let i=0;i<existingDeps.length;i++){const key=existingDeps[i];if(config.dependencies.hasOwnProperty(key)){const newDepVersion=semver.minVersion(config.dependencies[key]);const existingDepVersion=semver.minVersion(existingConfig.dependencies[key]);if(semver.major(newDepVersion)!==semver.major(existingDepVersion)){explanation='different major version of dependency '+key;break}if(!claimedMinorDiff){if(semver.minor(newDepVersion)!==semver.minor(existingDepVersion)){explanation='different minor version of dependency '+key;break}}}else{if(!claimedMinorDiff){explanation=`dependency ${key} has been removed`}break}}}}return explanation};ruleDef.prototype._detectMethodDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configMethods=config.methods?Object.keys(config.methods):[];const existingMethods=existingConfig.methods?Object.keys(existingConfig.methods):[];if(configMethods.length>=existingMethods.length){if(claimedMinorDiff){if(!existingMethods.every(checkName=>configMethods.includes(checkName))){explanation='existing method removed'}}else if(configMethods.length!==existingMethods.length){explanation='different number of methods declared'}}else{if(configMethods.length===0&&existingMethods.length>0){explanation='existing method(s) removed'}}if(!explanation){for(let i=0;i<existingMethods.length;i++){const key=existingMethods[i];if(config.methods.hasOwnProperty(key)){const configMethodParams=config.methods[key].params?config.methods[key].params:[];const existingMethodParams=existingConfig.methods[key].params?existingConfig.methods[key].params:[];for(let j=0;j<existingMethodParams.length;j++){if(j>=configMethodParams.length){explanation=`existing method '${key}' has fewer parameters`;break}else{if(!this._compareType(configMethodParams[j],existingMethodParams[j],claimedMinorDiff)){explanation=`method '${key}' parameter number:${j+1} has a changed type`;break}}}if(!explanation&&configMethodParams.length>existingMethodParams.length&&!claimedMinorDiff){explanation=`existing method '${key}' has additional parameters`;break}}else{explanation=`existing method '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._detectPropertyDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configProps=config.properties?Object.keys(config.properties):[];const existingProps=existingConfig.properties?Object.keys(existingConfig.properties):[];if(configProps.length>=existingProps.length){if(claimedMinorDiff){if(!existingProps.every(checkName=>configProps.includes(checkName))){explanation='existing property removed'}}else if(configProps.length!==existingProps.length){explanation='different number of properties declared'}}else{if(configProps.length===0&&existingProps.length>0){explanation='existing properties removed'}}if(!explanation){explanation=this._compareProperties(config.properties,existingConfig.properties,claimedMinorDiff)}return explanation};ruleDef.prototype._detectEventDiff=function(config,existingConfig,claimedMinorDiff){let explanation;const configEvents=config.events?Object.keys(config.events):[];const existingEvents=existingConfig.events?Object.keys(existingConfig.events):[];if(configEvents.length>=existingEvents.length){if(claimedMinorDiff){if(!existingEvents.every(checkName=>configEvents.includes(checkName))){explanation='existing event removed'}}else if(configEvents.length!==existingEvents.length){explanation='different number of events declared'}}else{if(configEvents.length===0&&existingEvents.length>0){explanation='existing event(s) removed'}}if(!explanation){for(let i=0;i<existingEvents.length;i++){const key=existingEvents[i];if(config.events.hasOwnProperty(key)){const configEventDetail=config.events[key].detail?config.events[key].detail:{};const existingEventDetail=existingConfig.events[key].detail?existingConfig.events[key].detail:{};const detailKeys=Object.keys(configEventDetail);const existingDetailKeys=Object.keys(existingEventDetail);for(let j=0;j<existingDetailKeys.length;j++){const detailKey=existingDetailKeys[j];if(j>=detailKeys.length||!configEventDetail.hasOwnProperty(detailKey)){explanation=`existing event '${key}' has missing entries in the detail payload`;break}else{if(!this._compareType(configEventDetail[detailKey],existingEventDetail[detailKey],claimedMinorDiff)){explanation=`event '${key}' detail attribute '${detailKey}' has a changed type`;break}}}if(!explanation&&detailKeys.length>existingDetailKeys.length&&!claimedMinorDiff){explanation=`existing event '${key}' has additional entries in the detail payload`;break}if(!explanation&&config.events[key].bubbles!==existingConfig.events[key].bubbles){explanation=`existing event '${key}' has changed bubbling state`;break}if(!explanation&&config.events[key].cancelable!==existingConfig.events[key].cancelable){explanation=`existing event '${key}' has changed cancelable state`;break}}else{explanation=`existing event '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._detectSlotDiff=function(config,existingConfig,claimedMinorDiff){return this._detectTypedSlotDiff('slots',config,existingConfig,claimedMinorDiff)};ruleDef.prototype._detectDynamicSlotDiff=function(config,existingConfig,claimedMinorDiff){return this._detectTypedSlotDiff('dynamicSlots',config,existingConfig,claimedMinorDiff)};ruleDef.prototype._detectTypedSlotDiff=function(slotType,config,existingConfig,claimedMinorDiff){let explanation;const configSlots=config[slotType]?Object.keys(config[slotType]):[];const existingSlots=existingConfig[slotType]?Object.keys(existingConfig[slotType]):[];if(configSlots.length>=existingSlots.length){if(claimedMinorDiff){if(!existingSlots.every(checkName=>configSlots.includes(checkName))){explanation='existing slot removed'}}else if(configSlots.length!==existingSlots.length){explanation='different number of slots declared'}}else{if(configSlots.length===0&&existingSlots.length>0){explanation='existing slot(s) removed'}}if(!explanation){for(let i=0;i<existingSlots.length;i++){const key=existingSlots[i];if(config[slotType].hasOwnProperty(key)){const configSlotData=config[slotType][key].data?config[slotType][key].data:{};const existingSlotData=existingConfig[slotType][key].data?existingConfig[slotType][key].data:{};const dataKeys=Object.keys(configSlotData);const existingDataKeys=Object.keys(existingSlotData);for(let j=0;j<existingDataKeys.length;j++){const dataKey=existingDataKeys[j];if(j>=dataKeys.length||!configSlotData.hasOwnProperty(dataKey)){explanation=`existing slot '${key}' has missing entries in the data payload`;break}else{if(!this._compareType(configSlotData[dataKey],existingSlotData[dataKey],claimedMinorDiff)){explanation=`slot '${key}' data attribute '${dataKey}' has a changed type`;break}}}if(!explanation&&dataKeys.length>existingDataKeys.length&&!claimedMinorDiff){explanation=`existing slot '${key}' has additional entries in the data payload`;break}}else{explanation=`existing slot '${key}' has been removed`;break}}}return explanation};ruleDef.prototype._compareType=function(newTyped,existingTyped,claimedMinorDiff){let matches=true;const newType=newTyped&&newTyped.type?newTyped.type:null;const existingType=existingTyped&&existingTyped.type?existingTyped.type:null;if(newType!==existingType){if(claimedMinorDiff){const newTypeOptions=newType?newType.split('|'):[];const existingTypeOptions=existingType?existingType.split('|'):[];matches=existingTypeOptions.every(checkType=>newTypeOptions.includes(checkType))}else{matches=false}}return matches};ruleDef.prototype._compareProperties=function(newProps,oldProps,claimedMinorDiff,path){let explanation;const configProps=newProps?Object.keys(newProps):[];const existingProps=oldProps?Object.keys(oldProps):[];for(let i=0;i<existingProps.length;i++){const key=existingProps[i];if(newProps.hasOwnProperty(key)){const newProperty=newProps[key];const oldProperty=oldProps[key];if(!this._compareType(newProperty,oldProperty,claimedMinorDiff)){explanation=`type change for property ${path?path:''}${key}`;break}if(oldProperty.hasOwnProperty('enumValues')){const newOptions=newProperty.hasOwnProperty('enumValues')?newProperty.enumValues:[];if(!oldProperty.enumValues.every(checkOption=>newOptions.includes(checkOption))){explanation=`Enumeration value option removed from property '${path?path:''}${key}'`;break}}else if(newProperty.hasOwnProperty('enumValues')){explanation=`Property '${path?path:''}${key}' is now constrained by an enumeration`;break}if(!path){if(oldProperty.writeback&&!newProperty.writeback){explanation=`property ${key} is no longer writeback enabled`;break}if(!oldProperty.required&&newProperty.required){explanation=`property ${key} has been made required`;break}if(!oldProperty.required&&newProperty.required){explanation=`Property '${key}' has been made required`;break}const oldROState=oldProperty.hasOwnProperty('readOnly')?oldProperty.readOnly:false;const newROState=newProperty.hasOwnProperty('readOnly')?newProperty.readOnly:false;if(oldROState!==newROState){explanation=`Property '${key}' readOnly state has changed`;break}}if(newProperty.hasOwnProperty('properties')||oldProperty.hasOwnProperty('properties')){const newSubProps=newProperty.properties?newProperty.properties:{};const oldSubProps=oldProperty.properties?oldProperty.properties:{};const propPath=path?path+key+'.':key+'.';explanation=this._compareProperties(newSubProps,oldSubProps,claimedMinorDiff,propPath);if(explanation){break}}}else{explanation=`property ${path?path:''}${key} has been removed`;break}}if(!explanation){if(!claimedMinorDiff&&configProps.length>existingProps.length){explanation=`property added ${path?'as sub-property of '+path:''}`}}return explanation};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 AuditComponentCacheManager=require('../jetwc-lib/jetwcutils-auditComponentCacheManager');const NetUtils=require('../../lib/NetUtils');const CommonImpl=require('../jetwc-lib/jetwcutils-commonListenerImpls');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');const jetVer=require('./jetwco-cacc-jetVer');const packContent=require('./jetwco-cacc-packContent');const packBundle=require('./jetwco-cacc-packBundle');const packBundleContent=require('./jetwco-cacc-packBundleContent');const dependencies=require('./jetwco-cacc-dependencies');const properties=require('./jetwco-cacc-properties');const propertyDefault=require('./jetwco-cacc-propertyDefault');const propertyRequired=require('./jetwco-cacc-propertyRequired');const propertyReadOnly=require('./jetwco-cacc-propertyReadOnly');const propertyWriteback=require('./jetwco-cacc-propertyWriteback');const propertyType=require('./jetwco-cacc-propertyType');const propertyEnumeration=require('./jetwco-cacc-propertyEnumeration');const methods=require('./jetwco-cacc-methods');const methodParams=require('./jetwco-cacc-methodParams');const methodParamTypes=require('./jetwco-cacc-methodParamTypes');const methodReturnType=require('./jetwco-cacc-methodReturnType');const events=require('./jetwco-cacc-events');const eventPayload=require('./jetwco-cacc-eventPayload');const eventBubbles=require('./jetwco-cacc-eventBubbles');const eventCancelable=require('./jetwco-cacc-eventCancelable');const slots=require('./jetwco-cacc-slots');const slotDataVariable=require('./jetwco-cacc-slotDataVariable');const slotDataVariableType=require('./jetwco-cacc-slotDataVariableType');const dynamicSlots=require('./jetwco-cacc-dynamicSlots');const styleVariables=require('./jetwco-cacc-styleVariables');const styleClasses=require('./jetwco-cacc-styleClasses');const publicModules=require('./jetwco-cacc-publicModules');const CONTROL_PROFILE={jetVer:{callback:jetVer,add:VC.MAJOR,remove:VC.MAJOR,mutate:VC.MAJOR,description:'Validate the JET Version compatibility range'},packContent:{callback:packContent,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.SEMVER,description:'Validate the member components of a JET Pack'},packBundle:{callback:packBundle,add:VC.MINOR,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the list of bundles defined by a JET Pack'},packBundleContent:{callback:packBundleContent,add:VC.MAJOR,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the entries of each bundle defined by a JET Pack'},dependencies:{callback:dependencies,add:VC.MAJOR,remove:VC.MINOR,mutate:VC.SEMVER,description:'Validate the dependencies of a component'},properties:{callback:properties,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the properties of a component'},propertyDefault:{callback:propertyDefault,add:VC.PATCH,remove:VC.MAJOR_DEPRECATED,mutate:VC.MAJOR_DEPRECATED,description:'Validate the defaults assigned to properties of a component'},propertyRequired:{callback:propertyRequired,add:VC.MAJOR,remove:VC.PATCH,mutate:VC.NEVER,description:'Validate the required states of a components properties'},propertyReadOnly:{callback:propertyReadOnly,add:VC.MAJOR,remove:VC.PATCH,mutate:VC.NEVER,description:'Validate the read-only states of a components properties'},propertyWriteback:{callback:propertyWriteback,add:VC.PATCH,remove:VC.NEVER,mutate:VC.NEVER,description:'Validate the writeback states of a components properties'},propertyType:{callback:propertyType,add:VC.PATCH,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the assigned types of a components properties'},propertyEnumeration:{callback:propertyEnumeration,add:VC.PATCH,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.MAJOR,description:'Validate the enumValues of a components properties'},methods:{callback:methods,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of methods exposed by the component'},methodParams:{callback:methodParams,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of parameters passed to methods exposed by the component'},methodParamTypes:{callback:methodParamTypes,add:VC.PATCH,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of parameters passed to methods exposed by the component'},methodReturnType:{callback:methodReturnType,add:VC.PATCH,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the return type of the methods exposed by the component'},events:{callback:events,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of events exposed by the component'},eventPayload:{callback:eventPayload,add:VC.MINOR,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the event detail of events exposed by the component'},eventBubbles:{callback:eventBubbles,add:VC.MINOR,remove:VC.NEVER,mutate:VC.NEVER,description:'Validate the event bubbles flag'},eventCancelable:{callback:eventCancelable,add:VC.MINOR,remove:VC.NEVER,mutate:VC.NEVER,description:'Validate the event cancelable flag'},slots:{callback:slots,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of slots exposed by the component'},slotDataVariable:{callback:slotDataVariable,add:VC.PATCH,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of attributes in a slot data attribute exposed by the component'},slotDataVariableType:{callback:slotDataVariableType,add:VC.NEVER,remove:VC.NEVER,mutate:VC.NEVER,description:'Validate the type assigned to each attributes in a slot data attribute exposed by the component'},dynamicSlots:{callback:dynamicSlots,add:VC.MINOR,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the presence of the dynamicSlots marker on the component'},styleVariables:{callback:styleVariables,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of styleVariables supported by the component'},styleClasses:{callback:styleClasses,add:VC.MINOR,remove:VC.MAJOR_2_DEPRECATED,mutate:VC.NEVER,description:'Validate the list of styleClasses supported by the component'},publicModules:{callback:publicModules,add:VC.MINOR,remove:VC.MAJOR,mutate:VC.NEVER,description:'Validate the list of publicModules exposed by a resource component'}};const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-api-controlled-changes'};ruleDef.prototype.getShortDescription=function(){return'Check components for API changes based on a configurable rule-set'};ruleDef.prototype.getDescription=function(){return'This audit compares the APIs exposed by components with older versions in the Exchange Catalog according to a set of rules which determine when given changes, such as the removal of deprecated properties can be made'};ruleDef.prototype.register=function(context){return{startaudit:this._auditPrep,closedownRP:this._dealWithCache,compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._auditPrep=function(context){this.exchangeURL=CommonImpl.checkForExchangeConfiguration(context);if(this.exchangeURL){this.acCache=new AuditComponentCacheManager(context,this.getName(),this.exchangeURL);this.componentExceptions=context.rulePack.getRuleOption('exceptions');const ipr=context.rulePack.getRuleOption('includePreReleases');if(ipr&&ipr===true){this.productionOnly=false}else{this.productionOnly=true}const ruleOverrides=context.rulePack.getRuleOption('controls');this.controlRules={};if(Object.keys(ruleOverrides).length>0){for(const[controlRule,controlRuleDef]of Object.entries(CONTROL_PROFILE)){this.controlRules[controlRule]={...controlRuleDef};if(ruleOverrides.hasOwnProperty(controlRule)){for(const[verb,override]of Object.entries(ruleOverrides[controlRule])){this.controlRules[controlRule][verb]=override}}}}else{this.controlRules={...CONTROL_PROFILE}}const activeControls=context.rulePack.getRuleOption('applyConditions');if(activeControls&&Array.isArray(activeControls)){Object.keys(this.controlRules).forEach(controlRule=>{if(!activeControls.includes(controlRule)){delete this.controlRules[controlRule]}})}this.requiredCheckVersions=CaccHelpers.calcRequiredVersionMatrix(this.controlRules)}else{const issue=new context.Issue(`Invalid or Missing exchangeURL value specified for the rule ${context.ruleName}, rule execution is disabled`);issue.setMsgKey(`${context.ruleName}_2`);issue.setSeverity('critical');context.reporter.addIssue(issue,context)}};ruleDef.prototype._dealWithCache=function(context){const shouldClearCache=context.rulePack.getRuleOption('clearCache',this.getName());if(shouldClearCache&&this.acCache){this.acCache.removeLocalCache()}};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._conductChecks(context,fullName,componentType,meta)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){const meta={...componentInfo};if(componentInfo.dependencies){meta.dependencies=componentInfo.dependencies.reduce((asMap,entry)=>{asMap[entry.name]=entry.range;return asMap},{})}this._conductChecks(context,componentInfo.fullName,componentInfo.type,meta)}};ruleDef.prototype._conductChecks=function(context,fullName,componentType,componentMeta){const{msgLib,semVerUtils}=context.utils;const baselines=this._grabRequiredVersions(context,fullName,componentMeta.version,this.requiredCheckVersions,this.productionOnly);if(baselines&&baselines.latest.version){const compareMetadata=CaccHelpers.deriveConstraintMetadata(baselines);const componentVersionDiff=CaccHelpers.semanticDiff(semVerUtils,componentMeta.version,compareMetadata.version);try{for(const[controlRuleName,controlRuleDef]of Object.entries(this.controlRules)){if(!this._isExemptFromCheck(fullName,controlRuleName)){msgLib.info(`${context.ruleName}(${controlRuleName}): ${controlRuleDef.description}`);const errorMsgContext=CaccHelpers.getStdErrorContext(fullName,controlRuleName);this._executeCheck(controlRuleName,controlRuleDef,semVerUtils,this.acCache,componentMeta,compareMetadata,componentVersionDiff,baselines,componentType,fullName,errorMsgContext)}}}catch(auditDetail){const issue=new context.Issue(`API change for ${fullName}@${componentMeta.version}: ${auditDetail}`);issue.setMsgKey(`${context.ruleName}_1`);context.reporter.addIssue(issue,context)}}};ruleDef.prototype._grabRequiredVersions=function(context,fullName,versionUnderTest,requiredVersions,productionVersionsOnly){const{msgLib,semVerUtils}=context.utils;const checkVersions={'never':{isNeeded:true,version:null,metadata:null},'latest':{isNeeded:true,version:null,metadata:null},'patch':{isNeeded:requiredVersions.patch,version:null,metadata:null},'minor':{isNeeded:requiredVersions.minor,version:null,metadata:null},'major':{isNeeded:requiredVersions.major,version:null,metadata:null},'major+':{isNeeded:requiredVersions.major,version:null,metadata:null},'major2+':{isNeeded:requiredVersions.major2,version:null,metadata:null},'major3+':{isNeeded:requiredVersions.major3,version:null,metadata:null}};try{const versionsToCache=new Set;const netUtils=new NetUtils;const existingVersionsResp=netUtils.loadUrl(`${this.exchangeURL}components/${fullName}/versions`);if(existingVersionsResp.statusCode===200&&existingVersionsResp.body){const existingVersions=JSON.parse(existingVersionsResp.body);if(existingVersions.items&&existingVersions.items.length>0){const{major:vutMajor,minor:vutMinor,patch:vutPatch,prerelease:vutPreRel,version:vutVersion}=semVerUtils.parse(versionUnderTest);let historicalVersions;if(productionVersionsOnly){historicalVersions=existingVersions.items.reverse().filter(versionString=>{const{prerelease}=semVerUtils.parse(versionString);return prerelease.length===0})}else{historicalVersions=existingVersions.items.reverse()}const majorSequence=this._getOffsetMajorVersions(semVerUtils,historicalVersions,vutMajor);for(let i=0;i<historicalVersions.length;i++){const{major:hvMajor,minor:hvMinor,patch:hvPatch,prerelease:hvPreRel,version:hvVersion}=semVerUtils.parse(historicalVersions[i]);if(semVerUtils.lt(hvVersion,vutVersion)){if(!checkVersions.latest.version){checkVersions.latest.version=hvVersion;versionsToCache.add(hvVersion)}if(checkVersions.patch.isNeeded&&!checkVersions.patch.version){checkVersions.patch.version=hvVersion;versionsToCache.add(hvVersion)}if(checkVersions.minor.isNeeded&&!checkVersions.minor.version){if(hvMinor<vutMinor||hvMajor<vutMajor){checkVersions.minor.version=hvVersion;versionsToCache.add(hvVersion)}}if(checkVersions.major.isNeeded&&!checkVersions.major.version){if(majorSequence[1]&&hvMajor===majorSequence[1]){checkVersions.major.version=hvVersion;checkVersions['major+'].version=hvVersion;versionsToCache.add(hvVersion)}}if(checkVersions['major2+'].isNeeded&&!checkVersions['major2+'].version){if(majorSequence[2]&&hvMajor===majorSequence[2]){checkVersions['major2+'].version=hvVersion;versionsToCache.add(hvVersion)}}if(checkVersions['major3+'].isNeeded&&!checkVersions['major3+'].version){if(majorSequence[3]&&hvMajor===majorSequence[3]){checkVersions['major3+'].version=hvVersion;versionsToCache.add(hvVersion);break}}}}versionsToCache.forEach(requiredVersion=>{const cachedDef=this.acCache.getComponentMetadata(fullName,requiredVersion);if(cachedDef){for(const[controlValue,settings]of Object.entries(checkVersions)){if(settings.isNeeded&&settings.version===requiredVersion){checkVersions[controlValue].metadata=cachedDef}}}})}}else if(existingVersionsResp.statusCode===404||existingVersionsResp.eCode==='ENOTFOUND'){msgLib.info(`The component ${fullName} does not exist in the Exchange and so cannot be API verified against older versions. It will be skipped`);if(!this.componentExceptions){this.componentExceptions={}}this.componentExceptions[fullName]=['*'];return}}catch(e){msgLib.error(`${context.ruleName}:\n${JSON.stringify(e)}`)};return checkVersions};ruleDef.prototype._getOffsetMajorVersions=function(semVerUtils,versions,baseMajorVersion){const majors=[baseMajorVersion];let lastMajor=baseMajorVersion;versions.forEach(stringVersion=>{const{major:parsedMajor}=semVerUtils.parse(stringVersion);if(parsedMajor<lastMajor){lastMajor=parsedMajor;majors.push(parsedMajor)}});return majors};ruleDef.prototype._executeCheck=function(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){const result=controlRuleDef.callback.call(this,controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext);if(result){throw result}};ruleDef.prototype._isExemptFromCheck=function(fullName,controlRuleName){let exempt=false;if(this.componentExceptions&&this.componentExceptions.hasOwnProperty(fullName)){if(this.componentExceptions[fullName].includes('*')||this.componentExceptions[fullName].includes(controlRuleName)){exempt=true}}return exempt};module.exports=ruleDef;
@@ -1,6 +1,6 @@
1
1
  /*
2
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates.
2
+ * Copyright (c) 2018, 2022, Oracle and/or its affiliates.
3
3
  * Licensed under The Universal Permissive License (UPL), Version 1.0
4
4
  * as shown at https://oss.oracle.com/licenses/upl/
5
5
  */
6
- const Utils=require('../jetwc-lib/component-audit-utils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-cdn'};ruleDef.prototype.getShortDescription=function(){return'Checks to see if relevant components have a CDN location defined'};ruleDef.prototype.getDescription=function(){return'This rule flags any reference or pack components that do not have a CDN path defined'};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 componentType=Utils.getComponentType(meta);const componentName=meta.name;switch(componentType){case'pack':case'reference':if(!meta.paths||!meta.paths.cdn||!meta.paths.cdn.hasOwnProperty('min')&&!meta.paths.cdn.hasOwnProperty('debug')){issue=new context.Issue(`${componentType} component ${componentName} does not have a CDN location defined`);context.reporter.addIssue(issue,context,'major')}break;default:break;}}};module.exports=ruleDef;
6
+ const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-component-cdn'};ruleDef.prototype.getShortDescription=function(){return'Checks to see if relevant components have a CDN location defined'};ruleDef.prototype.getDescription=function(){return'This rule flags any reference or pack components that do not have a CDN path defined'};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 componentType=Utils.getComponentType(meta);const componentName=meta.name;switch(componentType){case'pack':case'reference':if(!meta.paths||!meta.paths.cdn||!meta.paths.cdn.hasOwnProperty('min')&&!meta.paths.cdn.hasOwnProperty('debug')){issue=new context.Issue(`${componentType} component ${componentName} does not have a CDN location defined`);context.reporter.addIssue(issue,context)}break;default:break;}}};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 SENTENCE_PATTERN=/^([A-Z])/gm;const FORBIDDEN=[/spectra[\s\.,]/gmi,/vb[\s\.,]/gmi,/fa[\s\.,]/gmi];const INTERNAL_URLS=[/http(s?):\/\/(\w)*.(\w){2,}.oracle.com/gmi,/http(s?):\/\/(\w)*.oraclecorp.com/gmi];SCOPE_MAP={property:'properties',propertyEditorValues:'properties',slot:'slots',method:'methods',event:'events'};const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-description-standards'};ruleDef.prototype.getShortDescription=function(){return'Verifies the description attributes of a component meet the documented standards'};ruleDef.prototype.getDescription=function(){return'Internal Oracle standards for description dictate the use of sentence case with normal punctuation, but no trailing period on the final sentence. This audit does a basic scan for this.'};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);if(componentType==='composite'){this._checkDescriptions(context,fullName,meta)}}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._checkDescriptions(context,componentInfo.fullName,componentInfo)}};ruleDef.prototype._checkDescriptions=function(context,fullName,metadata){if(metadata){this._checkInScope(context,fullName,metadata.description);if(metadata.properties){const flattenedProps=Utils.flattenComponentProperties(metadata,'description');flattenedProps.forEach(prop=>{this._checkInScope(context,fullName,prop.value,'property',prop.key)});const flattenedPEV=Utils.flattenComponentProperties(metadata,'propertyEditorValues');flattenedPEV.forEach(prop=>{if(prop.value){for([pevKey,pevDef]of Object.entries(prop.value)){this._checkInScope(context,fullName,pevDef.description,'propertyEditorValues',prop.key,pevKey)}}})}if(metadata.events){for(const[key,value]of Object.entries(metadata.events)){this._checkInScope(context,fullName,value.description,'event',key)}}if(metadata.methods){for(const[key,value]of Object.entries(metadata.methods)){if(!['setProperty','getProperty','setProperties'].includes(key)){this._checkInScope(context,fullName,value.description,'method',key)}}}if(metadata.slots){for(const[key,value]of Object.entries(metadata.slots)){this._checkInScope(context,fullName,value.description,'slot',key)}}}};ruleDef.prototype._checkInScope=function(context,fullName,checkDescription,scopeType,scope,scopeDetail){const ignore=Utils.shouldIgnoreCheck(context,context.ruleName,fullName,scopeType?SCOPE_MAP[scopeType]:null,scope);let description=new String(checkDescription);if(!ignore&&description&&description.length>0){if(description.endsWith('.')){const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}description does not meet the Oracle standards. Indication: trailing full stop / period is not required`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}description=description.replace('e.g.','');const endSent=/\.[^A-Z^a-z]/;const sentences=description.split(endSent);sentences.forEach(sentence=>{const cleaned=sentence.trim();if(cleaned&&cleaned.length>0){const ucMatches=cleaned.match(SENTENCE_PATTERN);if(!ucMatches){const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}description does not meet the Oracle standards. Indication: sentences must begin with a capital letter`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}}});FORBIDDEN.forEach(pattern=>{if(description.match(pattern)){const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}description does not meet the Oracle standards. Indication: forbidden term '${pattern.toString().substring(1,pattern.toString().length-11)}'`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'blocker')}});INTERNAL_URLS.forEach(pattern=>{const detectedUrls=description.match(pattern);if(detectedUrls){detectedUrls.forEach(url=>{const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}description does not meet the Oracle standards. Indication: internal URL '${url}'`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context,'blocker')})}})}};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 DN_PATTERN=/^([A-Z][a-z0-9\-]*\s?)(([A-Z][a-z0-9\-]*\s?)|([0-9]*\s?))*[^\.]/gm;const FORBIDDEN=[/spectra[\s\.,]/gmi,/vb[\s\.,]/gmi,/fa[\s\.,]/gmi];SCOPE_MAP={property:'properties',propertyEditorValues:'properties',slot:'slots',method:'methods',event:'events'};const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-displayname-standards'};ruleDef.prototype.getShortDescription=function(){return'Verifies the displayName attributes of a component meet the documented standards'};ruleDef.prototype.getDescription=function(){return'Internal Oracle standards for displayName dictate the use of init-capped words and no punctuation. This audit does a basic scan for this.'};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);if(componentType==='composite'){this._checkDisplayNames(context,fullName,meta)}}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._checkDisplayNames(context,componentInfo.fullName,componentInfo)}};ruleDef.prototype._checkDisplayNames=function(context,fullName,metadata){if(metadata){this._checkInScope(context,fullName,metadata.displayName);if(metadata.properties){const flattenedProps=Utils.flattenComponentProperties(metadata,'displayName');flattenedProps.forEach(prop=>{this._checkInScope(context,fullName,prop.value,'property',prop.key)});const flattenedPEV=Utils.flattenComponentProperties(metadata,'propertyEditorValues');flattenedPEV.forEach(prop=>{if(prop.value){for([pevKey,pevDef]of Object.entries(prop.value)){this._checkInScope(context,fullName,pevDef.displayName,'propertyEditorValues',prop.key,pevKey)}}})}if(metadata.events){for(const[key,value]of Object.entries(metadata.events)){this._checkInScope(context,fullName,value.displayName,'event',key)}}if(metadata.methods){for(const[key,value]of Object.entries(metadata.methods)){this._checkInScope(context,fullName,value.displayName,'method',key)}}if(metadata.slots){for(const[key,value]of Object.entries(metadata.slots)){this._checkInScope(context,fullName,value.displayName,'slot',key)}}}};ruleDef.prototype._checkInScope=function(context,fullName,displayName,scopeType,scope,scopeDetail){const ignore=Utils.shouldIgnoreCheck(context,context.ruleName,fullName,scopeType?SCOPE_MAP[scopeType]:null,scope);if(!ignore&&displayName&&displayName.length>0){const matches=displayName.match(DN_PATTERN);if(!matches||matches[0]!==displayName){const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}displayName does not meet the Oracle standards of init-caps and no punctuation`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}FORBIDDEN.forEach(pattern=>{if(displayName.match(pattern)){const issue=new context.Issue(`Component ${fullName} ${scopeType?scopeType+' > '+scope+' ':''}${scopeDetail?'('+scopeDetail+') ':''}displayName contains a forbidden term '${pattern.toString().substring(1,pattern.toString().length-11)}'`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'blocker')}})}};module.exports=ruleDef;