@oracle/oraclejet-audit 10.1.0 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/jaf-amd.js +12 -4
- package/jaf.js +6 -1
- package/jafapi.js +6 -1
- package/lib/AST.js +6 -1
- package/lib/AST_Ts.js +6 -1
- package/lib/AstJson.js +6 -1
- package/lib/AstMd.js +6 -0
- package/lib/AstNodeTypes.js +6 -1
- package/lib/Comments.js +6 -1
- package/lib/ComponentSvcs.js +5 -0
- package/lib/Components.js +6 -1
- package/lib/Config.js +6 -1
- package/lib/ConfigLib.js +6 -1
- package/lib/CssLib.js +5 -0
- package/lib/CssUtils.js +5 -0
- package/lib/DomUtils.js +6 -1
- package/lib/FileIndex.js +5 -0
- package/lib/FileSet.js +5 -0
- package/lib/FsUtils.js +6 -1
- package/lib/Histo.js +6 -0
- package/lib/HtmlTree.js +6 -1
- package/lib/HtmlUtils.js +5 -0
- package/lib/Issue.js +6 -1
- package/lib/JafEvents.js +5 -0
- package/lib/JafLib.js +6 -1
- package/lib/Json.js +6 -0
- package/lib/JsonLoader.js +6 -1
- package/lib/Md.js +6 -0
- package/lib/MetaLib.js +6 -1
- package/lib/NetUtils.js +5 -0
- package/lib/NodeTypes.js +5 -0
- package/lib/Parser.js +6 -1
- package/lib/RegTypes.js +6 -1
- package/lib/Registry.js +6 -1
- package/lib/Reporter.js +6 -1
- package/lib/RuleContext.js +5 -0
- package/lib/RulePack.js +5 -0
- package/lib/RuleSet.js +6 -1
- package/lib/Rules.js +6 -1
- package/lib/Scope.js +6 -1
- package/lib/SemVer.js +5 -0
- package/lib/Server.js +5 -0
- package/lib/SevLib.js +5 -0
- package/lib/Severity.js +6 -1
- package/lib/Stats.js +6 -0
- package/lib/Ts.js +6 -1
- package/lib/Utils.js +6 -1
- package/lib/Watch.js +5 -0
- package/lib/Writer.js +5 -0
- package/lib/ZipUtils.js +5 -0
- package/lib/api.js +6 -0
- package/lib/builtinpacks.js +6 -0
- package/lib/cliStats.js +6 -0
- package/lib/clone.js +6 -1
- package/lib/cmdline.js +6 -1
- package/lib/colors.js +6 -1
- package/lib/defaults.js +6 -0
- package/lib/deflist.js +6 -0
- package/lib/dislist.js +6 -0
- package/lib/exportRules.js +6 -0
- package/lib/extends.js +6 -0
- package/lib/filetypes.js +6 -0
- package/lib/grouplist.js +6 -0
- package/lib/groups.js +6 -0
- package/lib/help.js +6 -1
- package/lib/jetver.js +6 -1
- package/lib/macros.js +6 -0
- package/lib/manual.js +6 -1
- package/lib/metaLoader.js +5 -0
- package/lib/metahist.js +5 -0
- package/lib/msgidLoader.js +6 -1
- package/lib/ns.js +6 -1
- package/lib/nslist.js +5 -0
- package/lib/outFormat.js +6 -0
- package/lib/outfile.js +5 -0
- package/lib/ruleLoader.js +5 -0
- package/lib/scaffold.js +6 -1
- package/lib/scaffoldRule.js +6 -1
- package/lib/schema.js +6 -1
- package/lib/scopewalker.js +6 -0
- package/lib/spinner.js +6 -1
- package/lib/spinnernoop.js +5 -0
- package/lib/tabs.js +5 -0
- package/libext/expparser.js +6 -1
- package/meta/11.0.0/jetauditmeta.js +9 -0
- package/meta/11.1.0/jetauditmeta.js +9 -0
- package/meta/12.0.0/jetauditmeta.js +9 -0
- package/meta/metaverlist.json +1 -1
- package/package.json +72 -69
- package/rulepacks/csp/csp-html-script-unsafe-inline.js +5 -0
- package/rulepacks/csp/csp-html-style-unsafe-inline.js +5 -0
- package/rulepacks/csp/csp-html-unsafe-expr.js +5 -0
- package/rulepacks/csp/csp-js-script-unsafe-eval.js +6 -1
- package/rulepacks/csp/csp-js-style-unsafe-inline.js +5 -0
- package/rulepacks/csp/csp-ts-script-unsafe-eval.js +6 -0
- package/rulepacks/csp/csp-ts-style-unsafe-inline.js +6 -0
- package/rulepacks/csp/msgid.json +6 -1
- package/rulepacks/csp/rules.json +6 -1
- package/rulepacks/jetwc/jetwc-absolute-jetversion.js +6 -1
- package/rulepacks/jetwc/jetwc-aria-redefinition.js +6 -1
- package/rulepacks/jetwc/jetwc-bootstrap.js +6 -1
- package/rulepacks/jetwc/jetwc-compjson-bp-ar.js +6 -1
- package/rulepacks/jetwc/jetwc-compjson-bp-obj.js +6 -1
- package/rulepacks/jetwc/jetwc-component-dependencies.js +6 -1
- package/rulepacks/jetwc/jetwc-component-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-component-foldername.js +6 -1
- package/rulepacks/jetwc/jetwc-component-location.js +6 -1
- package/rulepacks/jetwc/jetwc-component-type.js +6 -1
- package/rulepacks/jetwc/jetwc-css-oj-complete.js +6 -0
- package/rulepacks/jetwc/jetwc-data-property-prefix.js +6 -1
- package/rulepacks/jetwc/jetwc-deprecated-lifecycle.js +6 -1
- package/rulepacks/jetwc/jetwc-disabled-property.js +6 -1
- package/rulepacks/jetwc/jetwc-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-dynamic-slot-context.js +6 -1
- package/rulepacks/jetwc/jetwc-dynamic-slots-naming.js +6 -1
- package/rulepacks/jetwc/jetwc-event-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-events.js +6 -1
- package/rulepacks/jetwc/jetwc-jet-version.js +6 -1
- package/rulepacks/jetwc/jetwc-loader-file.js +6 -1
- package/rulepacks/jetwc/jetwc-markdown-link.js +6 -0
- package/rulepacks/jetwc/jetwc-method-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-methods.js +6 -1
- package/rulepacks/jetwc/jetwc-namespace.js +6 -1
- package/rulepacks/jetwc/jetwc-nested-defaults.js +6 -1
- package/rulepacks/jetwc/jetwc-nls-languages.js +6 -1
- package/rulepacks/jetwc/jetwc-nls-root.js +6 -1
- package/rulepacks/jetwc/jetwc-oj-register.js +6 -1
- package/rulepacks/jetwc/jetwc-ojcss.js +6 -1
- package/rulepacks/jetwc/jetwc-pack-children.js +6 -1
- package/rulepacks/jetwc/jetwc-packable-components.js +6 -1
- package/rulepacks/jetwc/jetwc-prerelease-dependencies.js +6 -1
- package/rulepacks/jetwc/jetwc-prerelease-pattern.js +6 -1
- package/rulepacks/jetwc/jetwc-prerelease-version.js +6 -1
- package/rulepacks/jetwc/jetwc-property-changed.js +6 -1
- package/rulepacks/jetwc/jetwc-property-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-property-nesting.js +6 -1
- package/rulepacks/jetwc/jetwc-public-modules.js +6 -1
- package/rulepacks/jetwc/jetwc-register-css.js +6 -1
- package/rulepacks/jetwc/jetwc-register-with-promises.js +6 -1
- package/rulepacks/jetwc/jetwc-require-paths.js +6 -1
- package/rulepacks/jetwc/jetwc-required-subproperty.js +6 -0
- package/rulepacks/jetwc/jetwc-reserved-property.js +6 -1
- package/rulepacks/jetwc/jetwc-schema.js +6 -1
- package/rulepacks/jetwc/jetwc-semantic-version.js +6 -1
- package/rulepacks/jetwc/jetwc-slot-displayname.js +6 -1
- package/rulepacks/jetwc/jetwc-slots.js +6 -1
- package/rulepacks/jetwc/jetwc-standard-files.js +6 -1
- package/rulepacks/jetwc/jetwc-subproperty-writeback.js +6 -0
- package/rulepacks/jetwc/jetwc-template-slots.js +6 -1
- package/rulepacks/jetwc/jetwc-unused-events.js +6 -1
- package/rulepacks/jetwc/jetwc-unused-slots.js +6 -1
- package/rulepacks/jetwc/jetwc-vb-category.js +6 -1
- package/rulepacks/jetwc/jetwc-vb-icon.js +6 -1
- package/rulepacks/jetwc/jetwc-vcomponent-jetversion.js +6 -0
- package/rulepacks/jetwc/jetwc-vcomponent-loader.js +6 -0
- package/rulepacks/jetwc/jetwc-vcomponent-version.js +6 -0
- package/rulepacks/jetwc/jetwc-version-openrange.js +6 -1
- package/rulepacks/jetwc/jetwc-writeback-required.js +6 -1
- package/rulepacks/jetwc/msgid.json +6 -0
- package/rulepacks/jetwc/rules.json +6 -1
- package/rulepacks/jetwc-lib/jetwcutils-auditComponentCacheManager.js +6 -0
- package/rulepacks/jetwc-lib/jetwcutils-commonListenerImpls.js +6 -0
- package/rulepacks/jetwc-lib/jetwcutils-componentAuditUtils.js +6 -0
- package/rulepacks/jetwc-lib/jetwcutils-componentFinder.js +6 -0
- package/rulepacks/jetwc-lib/jetwcutils-preCompiler.js +6 -0
- package/rulepacks/jetwc-lib/jetwcutils-tsxUtils.js +6 -0
- package/rulepacks/jetwco/jetwco-bootstrap.js +6 -1
- package/rulepacks/jetwco/jetwco-cacc-auditConstraints.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-dependencies.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-dynamicSlots.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-eventBubbles.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-eventCancelable.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-eventPayload.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-events.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-helpers.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-jetVer.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-methodParamTypes.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-methodParams.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-methodReturnType.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-methods.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-packBundle.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-packBundleContent.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-packContent.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-properties.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyDefault.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyEnumeration.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyReadOnly.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyRequired.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyType.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-propertyWriteback.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-publicModules.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-slotDataVariable.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-slotDataVariableType.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-slots.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-styleClasses.js +6 -0
- package/rulepacks/jetwco/jetwco-cacc-styleVariables.js +6 -0
- package/rulepacks/jetwco/jetwco-compjson-ns-reg.js +6 -1
- package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +6 -0
- package/rulepacks/jetwco/jetwco-component-api-changes.js +6 -1
- package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +6 -0
- package/rulepacks/jetwco/jetwco-component-cdn.js +6 -1
- package/rulepacks/jetwco/jetwco-description-standards.js +6 -0
- package/rulepacks/jetwco/jetwco-displayname-standards.js +6 -0
- package/rulepacks/jetwco/jetwco-exchange-version-check.js +6 -1
- package/rulepacks/jetwco/jetwco-license-info.js +6 -1
- package/rulepacks/jetwco/jetwco-prerelease-cdn.js +6 -1
- package/rulepacks/jetwco/jetwco-thirdparty-ba.js +6 -1
- package/rulepacks/jetwco/msgid.json +6 -0
- package/rulepacks/jetwco/rules.json +6 -1
- package/rulepacks/spoc/msgid.json +5 -0
- package/rulepacks/spoc/rules.json +5 -0
- package/rulepacks/spoc/spoc-dom-manip-inv-tag.js +5 -0
- package/rulepacks/spoc/spoc-dom-manip-tag-pos.js +5 -0
- package/rulepacks/spoc/spoc-dom-manip.js +5 -0
- package/{tests/rules/oj-js-diagnose/js_FAIL_1.js → rulepacks/wdt/msgid.json} +3 -9
- package/rulepacks/wdt/rules.json +6 -0
- package/rulepacks/wdt/wd-driver-sleep.js +6 -0
- package/rulepacks/wdt/wd-xpath.js +6 -0
- package/rules/jaf/jaf-css-diagnose.js +5 -0
- package/rules/jaf/jaf-html-diagnose.js +5 -0
- package/rules/jaf/jaf-init-schema.js +5 -0
- package/rules/jaf/jaf-js-diagnose.js +5 -0
- package/rules/jaf/jaf-ts-diagnose.js +6 -0
- package/rules/jaf/msgid.json +6 -1
- package/rules/jaf/rules.json +6 -1
- package/rules/jet/helpers/acc-aria-label.js +6 -1
- package/rules/jet/helpers/bp-checkPropType.js +5 -0
- package/rules/jet/helpers/cssHelper.js +6 -1
- package/rules/jet/helpers/extractStylesFromClass.js +6 -1
- package/rules/jet/helpers/has-slot-name.js +6 -1
- package/rules/jet/helpers/has-slot.js +5 -0
- package/rules/jet/helpers/json-prop-pos.js +5 -0
- package/rules/jet/helpers/json-propname-pos.js +5 -0
- package/rules/jet/helpers/style-selector.js +6 -1
- package/rules/jet/helpers/valid-attr.js +5 -0
- package/rules/jet/helpers/vartrack.js +5 -0
- package/rules/jet/jet-css-ojselector.js +5 -0
- package/rules/jet/msgid.json +6 -1
- package/rules/jet/oj-acc-aria-labelledby.js +5 -0
- package/rules/jet/oj-acc-aria-prop.js +6 -1
- package/rules/jet/oj-acc-avatar-aria-role.js +6 -1
- package/rules/jet/oj-acc-combobox-aria-label.js +6 -1
- package/rules/jet/oj-acc-film-strip-aria-label.js +6 -1
- package/rules/jet/oj-acc-input-aria-label.js +6 -1
- package/rules/jet/oj-acc-select-aria-label.js +6 -1
- package/rules/jet/oj-cca-compjson-bp-ar.js +5 -0
- package/rules/jet/oj-cca-compjson-bp-dsplyname.js +5 -0
- package/rules/jet/oj-cca-compjson-bp-jetver.js +5 -0
- package/rules/jet/oj-cca-compjson-bp-obj.js +5 -0
- package/rules/jet/oj-cca-compjson-ns-reg.js +5 -0
- package/rules/jet/oj-css-bp-border-color.js +5 -0
- package/rules/jet/oj-css-bp-dir-flow.js +6 -1
- package/rules/jet/oj-css-bp-float.js +5 -0
- package/rules/jet/oj-css-bp-textalign.js +5 -0
- package/rules/jet/oj-css-style-abs-units.js +6 -1
- package/rules/jet/oj-css-style-bp-color.js +5 -0
- package/rules/jet/oj-css-style-bp-display.js +6 -1
- package/rules/jet/oj-css-style-bp-font-family.js +6 -1
- package/rules/jet/oj-css-style-bp-font.js +5 -0
- package/rules/jet/oj-css-style-deprecated.js +6 -1
- package/rules/jet/oj-css-style-override.js +6 -1
- package/rules/jet/oj-css-var-override.js +5 -0
- package/rules/jet/oj-form-maxcols.js +6 -1
- package/rules/jet/oj-html-5-attr-obs.js +5 -0
- package/rules/jet/oj-html-5-tag-obs.js +5 -0
- package/rules/jet/oj-html-alta-deprecated.js +6 -0
- package/rules/jet/oj-html-attr-$unique.js +5 -0
- package/rules/jet/oj-html-attr-2def.js +5 -0
- package/rules/jet/oj-html-attr-json.js +6 -1
- package/rules/jet/oj-html-attr-prefix-expr.js +6 -1
- package/rules/jet/oj-html-attr-prefix-ro.js +5 -0
- package/rules/jet/oj-html-attr-req.js +5 -0
- package/rules/jet/oj-html-bindforeach-data.js +6 -1
- package/rules/jet/oj-html-bindif-test.js +6 -1
- package/rules/jet/oj-html-binding-attr.js +6 -1
- package/rules/jet/oj-html-cca-count.js +5 -0
- package/rules/jet/oj-html-cca-tagname.js +6 -1
- package/rules/jet/oj-html-cdn.js +5 -0
- package/rules/jet/oj-html-combo-converter.js +5 -0
- package/rules/jet/oj-html-cspexpr.js +6 -1
- package/rules/jet/oj-html-databind-all.js +5 -0
- package/rules/jet/oj-html-dlg-title.js +6 -1
- package/rules/jet/oj-html-file-pick-accept.js +6 -1
- package/rules/jet/oj-html-form-bindif.js +6 -1
- package/rules/jet/oj-html-form-layout-maxcols.js +6 -1
- package/rules/jet/oj-html-form-noflex.js +5 -0
- package/rules/jet/oj-html-input-isodate.js +6 -0
- package/rules/jet/oj-html-invalid-doctype.js +6 -1
- package/rules/jet/oj-html-jq-databind.js +6 -1
- package/rules/jet/oj-html-ko-comment.js +5 -0
- package/rules/jet/oj-html-ko-databind.js +6 -1
- package/rules/jet/oj-html-label-for-prefix.js +5 -0
- package/rules/jet/oj-html-missing-doctype.js +6 -1
- package/rules/jet/oj-html-msgs-cat-text.js +6 -0
- package/rules/jet/oj-html-no-style-tag.js +6 -0
- package/rules/jet/oj-html-notag-style.js +6 -0
- package/rules/jet/oj-html-oj-lib.js +5 -0
- package/rules/jet/oj-html-ojattr-520.js +6 -1
- package/rules/jet/oj-html-ojattr-deprecated.js +6 -1
- package/rules/jet/oj-html-ojattr-enum-deprecated.js +6 -1
- package/rules/jet/oj-html-ojattr-evt-syntax.js +6 -1
- package/rules/jet/oj-html-ojattr-value.js +6 -1
- package/rules/jet/oj-html-ojattr.js +6 -1
- package/rules/jet/oj-html-ojevent.js +6 -1
- package/rules/jet/oj-html-ojslot.js +6 -1
- package/rules/jet/oj-html-ojstyle.js +5 -0
- package/rules/jet/oj-html-ojtag-datacmd.js +6 -1
- package/rules/jet/oj-html-ojtag-datactx.js +5 -0
- package/rules/jet/oj-html-ojtag-deprecated.js +6 -1
- package/rules/jet/oj-html-ojtag-globattr-noprefix.js +6 -1
- package/rules/jet/oj-html-ojtag-id.js +5 -0
- package/rules/jet/oj-html-ojtag-nonglobattr-prefix.js +6 -1
- package/rules/jet/oj-html-ojtag-ns.js +5 -0
- package/rules/jet/oj-html-picker-attrs.js +6 -0
- package/rules/jet/oj-html-redwood-cssnovars.js +6 -0
- package/rules/jet/oj-html-redwood-cssvars.js +6 -0
- package/rules/jet/oj-html-self-close.js +5 -0
- package/rules/jet/oj-html-slot-item-minmax.js +6 -0
- package/rules/jet/oj-html-slot-name.js +6 -1
- package/rules/jet/oj-html-slot-pref-content.js +6 -0
- package/rules/jet/oj-html-style-abs-units.js +5 -0
- package/rules/jet/oj-html-style-bp-color.js +5 -0
- package/rules/jet/oj-html-style-bp-display.js +6 -1
- package/rules/jet/oj-html-style-bp-font-family.js +5 -0
- package/rules/jet/oj-html-style-bp-font.js +5 -0
- package/rules/jet/oj-html-style-deprecated.js +6 -1
- package/rules/jet/oj-html-style.js +6 -1
- package/rules/jet/oj-html-stylesel.js +6 -1
- package/rules/jet/oj-html-tag-attr-noprefix.js +6 -1
- package/rules/jet/oj-html-template-index.js +6 -1
- package/rules/jet/oj-html-unsup-theme.js +6 -1
- package/rules/jet/oj-html-wctag-$props.js +6 -1
- package/rules/jet/oj-html-wctag-arialabelledby.js +5 -0
- package/rules/jet/oj-html-wctag-for.js +5 -0
- package/rules/jet/oj-html-wctag-id.js +6 -1
- package/rules/jet/oj-html-wctag-nested.js +6 -0
- package/rules/jet/oj-html-wctag-packprivate.js +6 -0
- package/rules/jet/oj-js-comp-attr-deprecated.js +6 -1
- package/rules/jet/oj-js-comp-meth-deprecated.js +6 -1
- package/rules/jet/oj-js-no-ext-final.js +5 -0
- package/rules/jet/oj-js-noconsole.js +5 -0
- package/rules/jet/oj-js-ojcomp-deprecated.js +6 -1
- package/rules/jet/oj-js-ojcomp-exist.js +5 -0
- package/rules/jet/oj-js-ojcomp-new.js +5 -0
- package/rules/jet/oj-js-poly-promise.js +6 -1
- package/rules/jet/oj-js-var-undef.js +5 -0
- package/rules/jet/oj-json-syntax.js +5 -0
- package/rules/jet/oj-ts-comp-attr-deprecated.js +6 -1
- package/rules/jet/oj-ts-comp-meth-deprecated.js +6 -1
- package/rules/jet/oj-ts-no-ext-final.js +6 -0
- package/rules/jet/oj-ts-noconsole.js +6 -1
- package/rules/jet/oj-ts-ojcomp-deprecated.js +6 -1
- package/rules/jet/oj-ts-ojcomp-exist.js +6 -1
- package/rules/jet/oj-ts-ojcomp-new.js +6 -1
- package/rules/jet/oj-ts-poly-promise.js +6 -1
- package/rules/jet/rules.json +6 -1
- package/schema/component-schema.json +125 -2
- package/src/JafCore.js +6 -1
- package/types/index.d.ts +175 -37
- package/lib/stats.js +0 -1
- package/rulepacks/jetwc-lib/component-audit-utils.js +0 -1
- package/rules/exch/helpers/json-prop-pos.js +0 -1
- package/rules/exch/msgid.json +0 -1
- package/rules/exch/oj-cca-comp-zip-content-composite.js +0 -1
- package/rules/exch/oj-cca-comp-zip-content-pack.js +0 -1
- package/rules/exch/oj-cca-comp-zip-expand.js +0 -1
- package/rules/exch/oj-cca-compjson-evnames.js +0 -1
- package/rules/exch/oj-cca-compjson-file.js +0 -1
- package/rules/exch/oj-cca-compjson-prefix.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-compdeps.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-deps.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-jetver.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-obs.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-type.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-types.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-undef.js +0 -1
- package/rules/exch/oj-cca-compjson-prop-version.js +0 -1
- package/rules/exch/oj-cca-compjson-schema.js +0 -1
- package/rules/exch/oj-cca-zip-compjson.js +0 -1
- package/rules/exch/rules.json +0 -1
- package/rules/jet/oj-css-bp-bgcolor.js +0 -1
- package/tests/components/attr-req-test/component.json +0 -1
- package/tests/components/demo-analog-clock/component.json +0 -1
- package/tests/components/demo-analog-clock/demo-analog-clock-viewModel.js +0 -1
- package/tests/components/demo-analog-clock/extension/demo/js/viewModels/demo.js +0 -1
- package/tests/components/demo-analog-clock/loader.js +0 -1
- package/tests/components/demo-card/component.json +0 -1
- package/tests/components/demo-chart-orientation-control/component.json +0 -1
- package/tests/components/demo-chart-stack-control/component.json +0 -1
- package/tests/components/made-up/component.json +0 -1
- package/tests/components/oj-made-up/component.json +0 -1
- package/tests/components/sp-activity-item/component.json +0 -1
- package/tests/config/config_base.json +0 -1
- package/tests/golden/10.0.0/golden_base.json +0 -1
- package/tests/golden/8.1.0/golden_base.json +0 -1
- package/tests/golden/9.0.0/golden_base.json +0 -1
- package/tests/rulepacks/hooks/hook-rpext.js +0 -1
- package/tests/rulepacks/hooks/hook-start-close-rulepack.js +0 -1
- package/tests/rulepacks/hooks/rule-rpext.js +0 -1
- package/tests/rulepacks/hooks/rules.json +0 -1
- package/tests/rulepacks/tags/proc_directive.js +0 -1
- package/tests/rulepacks/tags/rules.json +0 -1
- package/tests/rulepacks/tags/tag-count-setup.js +0 -1
- package/tests/rulepacks/tags/tag-count.js +0 -1
- package/tests/rules/bugs/JET-4770_PASS_1.html +0 -9
- package/tests/rules/comments/com_FAIL_1.js +0 -57
- package/tests/rules/comments/com_FAIL_2.js +0 -96
- package/tests/rules/comments/com_PASS_1.js +0 -42
- package/tests/rules/comments/com_PASS_2.js +0 -63
- package/tests/rules/comments/com_PASS_3.js +0 -40
- package/tests/rules/comments/com_PASS_4.js +0 -36
- package/tests/rules/comments/com_PASS_5.js +0 -19
- package/tests/rules/csp/html-script-unsafe-inline/FAIL_1.html +0 -11
- package/tests/rules/csp/html-script-unsafe-inline/FAIL_2.html +0 -8
- package/tests/rules/csp/html-script-unsafe-inline/PASS_1.html +0 -8
- package/tests/rules/csp/html-script-unsafe-inline/PASS_2.html +0 -8
- package/tests/rules/csp/html-script-unsafe-inline/PASS_3.html +0 -8
- package/tests/rules/csp/html-style-unsafe-inline/FAIL_1.html +0 -11
- package/tests/rules/csp/html-style-unsafe-inline/PASS_1.html +0 -11
- package/tests/rules/csp/html-unsafe-expr/FAIL_1.html +0 -14
- package/tests/rules/csp/html-unsafe-expr/PASS_1.html +0 -23
- package/tests/rules/csp/js-script-unsafe-eval/FAIL_1.js +0 -17
- package/tests/rules/csp/js-script-unsafe-eval/FAIL_2.js +0 -40
- package/tests/rules/csp/js-script-unsafe-eval/FAIL_3.js +0 -22
- package/tests/rules/csp/js-script-unsafe-eval/PASS_1.js +0 -20
- package/tests/rules/csp/js-script-unsafe-eval/PASS_2.js +0 -44
- package/tests/rules/csp/js-script-unsafe-eval/PASS_3.js +0 -16
- package/tests/rules/csp/js-style-unsafe-inline/FAIL_1.js +0 -25
- package/tests/rules/csp/js-style-unsafe-inline/PASS.js +0 -22
- package/tests/rules/demo/noself_FAIL_1.js +0 -101
- package/tests/rules/import/import_FAIL_1.js +0 -11
- package/tests/rules/import/import_PASS_1.js +0 -10
- package/tests/rules/jet-composites/demo-buttonset-enum/component.json +0 -57
- package/tests/rules/jet-composites/demo-buttonset-enum/loader.js +0 -19
- package/tests/rules/jet-composites/demo-buttonset-enum/view.html +0 -48
- package/tests/rules/jet-composites/demo-card/component.json +0 -28
- package/tests/rules/jet-composites/demo-card/loader.js +0 -16
- package/tests/rules/jet-composites/demo-card/view.html +0 -30
- package/tests/rules/jet-composites/demo-card/viewModel.js +0 -46
- package/tests/rules/jet-composites/demo-card/view_PASS_1.html +0 -21
- package/tests/rules/jet-composites/demo-contact-form/component.json +0 -23
- package/tests/rules/jet-composites/demo-contact-form/loader.js +0 -16
- package/tests/rules/jet-composites/demo-contact-form/view.html +0 -9
- package/tests/rules/jet-composites/demo-grocery-list/component.json +0 -18
- package/tests/rules/jet-composites/demo-grocery-list/loader.js +0 -19
- package/tests/rules/jet-composites/demo-grocery-list/view.html +0 -22
- package/tests/rules/jet-composites/demo-grocery-list/viewModel.js +0 -48
- package/tests/rules/jet-composites/dummy-component-1/component.json +0 -82
- package/tests/rules/jet-composites/dummy-component-2/component.json +0 -72
- package/tests/rules/jet-composites/foo-my-cca/component.json +0 -14
- package/tests/rules/jet-composites/foo-unsup-theme/component.json +0 -29
- package/tests/rules/jet-composites/header/component.json +0 -12
- package/tests/rules/jet-composites/oj-cgbu-omc/attribute-selection/component.json +0 -154
- package/tests/rules/jet-composites/oj-cgbu-omc/component.json +0 -11
- package/tests/rules/jet-composites/oj-cgbu-omc/reference/component.json +0 -185
- package/tests/rules/jet-composites/oj-cgbu-omc/wctag_props_FAIL_1.html +0 -34
- package/tests/rules/jet-composites/oj-enum-depr/component.json +0 -69
- package/tests/rules/jet-composites/oj-html-wctag-id/id_FAIL_1.html +0 -10
- package/tests/rules/jet-composites/oj-html-wctag-id/id_PASS_1.html +0 -6
- package/tests/rules/misc/oj.js +0 -12
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_FAIL_1.html +0 -23
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_FAIL_2.html +0 -22
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_1.html +0 -23
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_2.html +0 -22
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_3.html +0 -22
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_4.html +0 -22
- package/tests/rules/oj-acc-aria-labelledby/aria_labelledby_PASS_5.html +0 -22
- package/tests/rules/oj-acc-aria-prop/aria_prop_FAIL_1.html +0 -22
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_FAIL_1.html +0 -20
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_1.html +0 -23
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_2.html +0 -24
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_3.html +0 -21
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_4.html +0 -22
- package/tests/rules/oj-acc-avatar-aria-role/aria_avatar_role_PASS_5.html +0 -22
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_FAIL_1.html +0 -20
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_FAIL_2.html +0 -21
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_many_PASS_1.html +0 -20
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_FAIL_1.html +0 -21
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_FAIL_2.html +0 -22
- package/tests/rules/oj-acc-combobox-aria-label/aria_combo_one_PASS_1.html +0 -22
- package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_FAIL_1.html +0 -18
- package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_FAIL_2.html +0 -18
- package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_1.html +0 -18
- package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_2.html +0 -19
- package/tests/rules/oj-acc-film-strip-aria-label/aria_filmstrip_PASS_3.html +0 -22
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_FAIL_1.html +0 -21
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_FAIL_2.html +0 -22
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_1.html +0 -16
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_2.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_PASS_3.html +0 -26
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_FAIL_1.html +0 -19
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_FAIL_2.html +0 -20
- package/tests/rules/oj-acc-input-aria-label/oj_input_date_time_PASS_1.html +0 -19
- package/tests/rules/oj-acc-input-aria-label/oj_input_number_FAIL_1.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_number_FAIL_2.html +0 -18
- package/tests/rules/oj-acc-input-aria-label/oj_input_number_PASS_1.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_password_FAIL_1.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_password_FAIL_2.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_password_PASS_1.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_text_3_PASS_1.html +0 -20
- package/tests/rules/oj-acc-input-aria-label/oj_input_text_FAIL_1.html +0 -20
- package/tests/rules/oj-acc-input-aria-label/oj_input_text_FAIL_2.html +0 -21
- package/tests/rules/oj-acc-input-aria-label/oj_input_text_PASS_2.html +0 -62
- package/tests/rules/oj-acc-input-aria-label/oj_input_text_nolabel_PASS_2.html +0 -17
- package/tests/rules/oj-acc-input-aria-label/oj_input_time_FAIL_1.html +0 -19
- package/tests/rules/oj-acc-input-aria-label/oj_input_time_FAIL_2.html +0 -20
- package/tests/rules/oj-acc-input-aria-label/oj_input_time_PASS_1.html +0 -19
- package/tests/rules/oj-acc-select-aria-label/aria_selectmany_FAIL_1.html +0 -19
- package/tests/rules/oj-acc-select-aria-label/aria_selectmany_FAIL_2.html +0 -20
- package/tests/rules/oj-acc-select-aria-label/aria_selectmany_PASS_1.html +0 -19
- package/tests/rules/oj-acc-select-aria-label/aria_selectone_FAIL_1.html +0 -20
- package/tests/rules/oj-acc-select-aria-label/aria_selectone_FAIL_2.html +0 -21
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_1.zip +0 -1
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_2.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_3.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_4.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_5.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_6.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_7.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_FAIL_8.zip +0 -0
- package/tests/rules/oj-cca-comp-zip/zip_PASS_1.zip +0 -0
- package/tests/rules/oj-cca-ns-reg/oj-cca-ns-FAIL_1/component.json +0 -19
- package/tests/rules/oj-cca-ns-reg/oj-cca-ns-PASS_1/component.json +0 -19
- package/tests/rules/oj-cgbu-omc_tests/html_ojevent_FAIL_1.html +0 -15
- package/tests/rules/oj-cgbu-omc_tests/html_ojevent_PASS_1.html +0 -17
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_1/component.json +0 -16
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_10/component.json +0 -103
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_11/component.json +0 -24
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_12/component.json +0 -17
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_13/component.json +0 -17
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_14/component.json +0 -40
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_15/component.json +0 -24
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_16/component.json +0 -44
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_17/component.json +0 -8
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_18/component.json +0 -8
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_19/component.json +0 -8
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_2/component.json +0 -15
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_20/component.json +0 -18
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_21/component.json +0 -16
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_22/component.json +0 -19
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_3/component.json +0 -15
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_4/component.json +0 -16
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_5/component.json +0 -16
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_6/component.json +0 -18
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_7/component.json +0 -15
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_8/component.json +0 -15
- package/tests/rules/oj-compjson-syntax/ojcomp-FAIL_9/component.json +0 -52
- package/tests/rules/oj-compjson-syntax/ojcomp-PASS_1/component.json +0 -17
- package/tests/rules/oj-compjson-syntax/ojcomp-PASS_2/component.json +0 -88
- package/tests/rules/oj-compjson-syntax/ojcomp-PASS_3/component.json +0 -19
- package/tests/rules/oj-css-bp-dir-flow/dirflow_FAIL_1.html +0 -22
- package/tests/rules/oj-css-bp-dir-flow/dirflow_FAIL_2.html +0 -22
- package/tests/rules/oj-css-diagnose/css_FAIL_1.html +0 -14
- package/tests/rules/oj-css-diagnose/css_PASS_1.html +0 -14
- package/tests/rules/oj-css-var-override/varovr_FAIL_1.html +0 -8
- package/tests/rules/oj-html-5-attr-depr/attrdepr_FAIL_1.html +0 -16
- package/tests/rules/oj-html-5-attr-depr/attrdepr_PASS_1.html +0 -16
- package/tests/rules/oj-html-5-tag-depr/tagdepr_FAIL_1.html +0 -9
- package/tests/rules/oj-html-attr/attr_FAIL_1.html +0 -27
- package/tests/rules/oj-html-attr-$unique/attr_$unique1_FAIL_1.html +0 -19
- package/tests/rules/oj-html-attr-$unique/attr_$unique_FAIL_2.html +0 -25
- package/tests/rules/oj-html-attr-2def/attr2def_FAIL_1.html +0 -10
- package/tests/rules/oj-html-attr-2def/attr2def_PASS_1.html +0 -10
- package/tests/rules/oj-html-attr-json/attr-json_FAIL_1.html +0 -20
- package/tests/rules/oj-html-attr-json/attr-json_FAIL_2.html +0 -20
- package/tests/rules/oj-html-attr-json/attr-json_FAIL_3.html +0 -20
- package/tests/rules/oj-html-attr-json/attr-json_PASS_1.html +0 -20
- package/tests/rules/oj-html-attr-json/attr-json_PASS_2.html +0 -20
- package/tests/rules/oj-html-attr-json/attr-json_PASS_3.html +0 -8
- package/tests/rules/oj-html-attr-prefix-expr/attrprefixexpr_FAIL_1.html +0 -10
- package/tests/rules/oj-html-attr-prefix-expr/attrprefixexpr_PASS_1.html +0 -10
- package/tests/rules/oj-html-attr-prefix-ro/attrprefixro_FAIL_1.html +0 -10
- package/tests/rules/oj-html-attr-prefix-ro/attrprefixro_PASS_1.html +0 -10
- package/tests/rules/oj-html-attr-req/attrreq_FAIL_1.html +0 -17
- package/tests/rules/oj-html-attr-req/attrreq_FAIL_2.html +0 -13
- package/tests/rules/oj-html-attr-req/attrreq_FAIL_3.html +0 -8
- package/tests/rules/oj-html-attr-req/attrreq_FAIL_4.html +0 -13
- package/tests/rules/oj-html-attr-req/attrreq_FAIL_5.html +0 -17
- package/tests/rules/oj-html-attr-req/attrreq_PASS_1.html +0 -24
- package/tests/rules/oj-html-attr-req/attrreq_PASS_2.html +0 -24
- package/tests/rules/oj-html-attr-req/attrreq_PASS_3.html +0 -10
- package/tests/rules/oj-html-attr-req/attrreq_PASS_4.html +0 -11
- package/tests/rules/oj-html-bindforeach-data/bindforeach_data_FAIL_1.html +0 -19
- package/tests/rules/oj-html-bindforeach-data/bindforeach_data_PASS_1.html +0 -10
- package/tests/rules/oj-html-bindif-test/bindif_test_FAIL_1.html +0 -22
- package/tests/rules/oj-html-bindif-test/bindif_test_PASS_1.html +0 -11
- package/tests/rules/oj-html-binding-attr/binding-foreach_FAIL_2.html +0 -28
- package/tests/rules/oj-html-binding-attr/binding-if_FAIL_1.html +0 -23
- package/tests/rules/oj-html-binding-attr/binding-if_PASS_1.html +0 -23
- package/tests/rules/oj-html-cca-count/cca-count_FAIL_1.html +0 -119
- package/tests/rules/oj-html-cca-tagname/ccatag_FAIL_1.html +0 -7
- package/tests/rules/oj-html-cca-tagname/ccatag_PASS_1.html +0 -7
- package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_1.html +0 -8
- package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_2.html +0 -8
- package/tests/rules/oj-html-cca-tagname/tag_ns_FAIL_3.html +0 -8
- package/tests/rules/oj-html-cca-tagname/tag_ns_PASS_1.html +0 -10
- package/tests/rules/oj-html-cdn/html_cdn_FAIL_1.html +0 -18
- package/tests/rules/oj-html-cspexpr/cspexpr_FAIL_1.html +0 -14
- package/tests/rules/oj-html-cspexpr/cspexpr_FAIL_2.html +0 -10
- package/tests/rules/oj-html-cspexpr/cspexpr_PASS_1.html +0 -23
- package/tests/rules/oj-html-cspexpr/cspexpr_PASS_2.html +0 -10
- package/tests/rules/oj-html-cspexpr/cspexpr_PASS_3.html +0 -13
- package/tests/rules/oj-html-dlg-title/dlgtitle_FAIL_1.html +0 -12
- package/tests/rules/oj-html-dlg-title/dlgtitle_PASS_1.html +0 -12
- package/tests/rules/oj-html-form-noflex/noflex_FAIL_1.html +0 -10
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_1.html +0 -20
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_2.html +0 -13
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_3.html +0 -16
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_FAIL_4.html +0 -13
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_1.html +0 -6
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_2.html +0 -7
- package/tests/rules/oj-html-invalid-doctype/doctype_invalid_PASS_3.html +0 -7
- package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_1.html +0 -37
- package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_2.html +0 -34
- package/tests/rules/oj-html-jq-databind/jq-databind_FAIL_3.html +0 -27
- package/tests/rules/oj-html-jq-databind/jq-databind_PASS_1.html +0 -30
- package/tests/rules/oj-html-ko-comment/ko-comment_FAIL_1.html +0 -47
- package/tests/rules/oj-html-ko-comment/ko-comment_FAIL_2.html +0 -36
- package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_1.html +0 -24
- package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_2.html +0 -36
- package/tests/rules/oj-html-ko-databind/ko-databind_FAIL_3.html +0 -29
- package/tests/rules/oj-html-label-for-prefix/for_FAIL_1.html +0 -8
- package/tests/rules/oj-html-label-for-prefix/for_PASS_1.html +0 -8
- package/tests/rules/oj-html-missing-doctype/doctype_missing_FAIL_1.html +0 -12
- package/tests/rules/oj-html-missing-doctype/doctype_missing_FAIL_2.html +0 -11
- package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_1.html +0 -14
- package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_2.html +0 -5
- package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_3.html +0 -12
- package/tests/rules/oj-html-missing-doctype/doctype_missing_PASS_5.html +0 -6
- package/tests/rules/oj-html-nonvoid-close/close_FAIL_1.html +0 -28
- package/tests/rules/oj-html-nonvoid-close/close_FAIL_2.html +0 -14
- package/tests/rules/oj-html-nonvoid-close/close_FAIL_3.html +0 -13
- package/tests/rules/oj-html-nonvoid-close/close_FAIL_5.html +0 -28
- package/tests/rules/oj-html-nonvoid-close/close_FAIL_6.html +0 -28
- package/tests/rules/oj-html-nonvoid-close/close_PASS_1.html +0 -7
- package/tests/rules/oj-html-oj-lib/oj_lib_FAIL_1.html +0 -15
- package/tests/rules/oj-html-ojattr/ojattr_PASS_1.html +0 -8
- package/tests/rules/oj-html-ojattr/ojattr_PASS_2.html +0 -10
- package/tests/rules/oj-html-ojattr/ojattr_PASS_3.html +0 -7
- package/tests/rules/oj-html-ojattr/ojattr_PASS_4.html +0 -7
- package/tests/rules/oj-html-ojattr-deprecated/ojattr-dep_FAIL1.html +0 -156
- package/tests/rules/oj-html-ojattr-enum-deprecated/enum_FAIL_1.html +0 -19
- package/tests/rules/oj-html-ojattr-enum-deprecated/enum_FAIL_2.html +0 -20
- package/tests/rules/oj-html-ojattr-enum-deprecated/enum_PASS_1.html +0 -25
- package/tests/rules/oj-html-ojattr-evt-syntax/evt-attr-syntax_FAIL_1.html +0 -6
- package/tests/rules/oj-html-ojattr-evt-syntax/evt-attr-syntax_PASS_1.html +0 -6
- package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_1.html +0 -26
- package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_2.html +0 -26
- package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_3.html +0 -8
- package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_4.html +0 -8
- package/tests/rules/oj-html-ojattr-value/attr-value_FAIL_5.html +0 -8
- package/tests/rules/oj-html-ojattr-value/attr-value_PASS_1.html +0 -26
- package/tests/rules/oj-html-ojattr-value/attr-value_PASS_2.html +0 -8
- package/tests/rules/oj-html-ojattr-value/attr-value_PASS_3.html +0 -7
- package/tests/rules/oj-html-ojattr-value/attr-value_PASS_6.html +0 -7
- package/tests/rules/oj-html-ojattr-value/attr-value_PASS_7.html +0 -10
- package/tests/rules/oj-html-ojattr-value/attr_value_PASS_4.html +0 -7
- package/tests/rules/oj-html-ojattr-value/attr_value_PASS_5.html +0 -9
- package/tests/rules/oj-html-ojslot/ojslot_FAIL_1.html +0 -11
- package/tests/rules/oj-html-ojslot/ojslot_PASS_1.html +0 -12
- package/tests/rules/oj-html-ojstyle/style_FAIL_1.html +0 -103
- package/tests/rules/oj-html-ojstyle/style_PASS_2.html +0 -7
- package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_1.html +0 -10
- package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_2.html +0 -18
- package/tests/rules/oj-html-ojtag-datacmd/datacmd_FAIL_3.html +0 -10
- package/tests/rules/oj-html-ojtag-datacmd/datacmd_PASS_1.html +0 -28
- package/tests/rules/oj-html-ojtag-datacmd/datacmd_PASS_2.html +0 -15
- package/tests/rules/oj-html-ojtag-datactx/datactx_FAIL_1.html +0 -14
- package/tests/rules/oj-html-ojtag-datactx/datactx_PASS_1.html +0 -14
- package/tests/rules/oj-html-ojtag-globattr-noprefix/globattr-noprefix_FAIL_1.html +0 -36
- package/tests/rules/oj-html-ojtag-nonglobattr-prefix/nonglobattr-prefix_FAIL_1.html +0 -26
- package/tests/rules/oj-html-slot-name/slot_name.FAIL_1.html +0 -24
- package/tests/rules/oj-html-slot-name/slot_name.FAIL_2.html +0 -46
- package/tests/rules/oj-html-slot-name/slot_name.FAIL_3.html +0 -10
- package/tests/rules/oj-html-slot-name/slot_name.PASS_1.html +0 -24
- package/tests/rules/oj-html-slot-name/slot_name.PASS_2.html +0 -39
- package/tests/rules/oj-html-slot-name/slot_name.PASS_3.html +0 -10
- package/tests/rules/oj-html-slot-name/slot_name_PASS_4.html +0 -16
- package/tests/rules/oj-html-slot-name/slot_name_PASS_5.html +0 -11
- package/tests/rules/oj-html-slot-name/slot_name_PASS_6.html +0 -14
- package/tests/rules/oj-html-slot-name/slot_name_PASS_7.html +0 -10
- package/tests/rules/oj-html-style/style_FAIL_1.html +0 -7
- package/tests/rules/oj-html-style/style_PASS_1.html +0 -12
- package/tests/rules/oj-html-style/style_PASS_2.html +0 -7
- package/tests/rules/oj-html-style-bp-color/color-FAIL_1.html +0 -17
- package/tests/rules/oj-html-style-bp-color/color-FAIL_2.html +0 -15
- package/tests/rules/oj-html-style-bp-color/color-FAIL_3.html +0 -7
- package/tests/rules/oj-html-style-bp-color/color-PASS_1.html +0 -7
- package/tests/rules/oj-html-style-bp-font-family/fam_FAIL_1.html +0 -23
- package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_FAIL_1.html +0 -15
- package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_FAIL_2.html +0 -9
- package/tests/rules/oj-html-tag-attr-noprefix/attr-noprefix_PASS_1.html +0 -9
- package/tests/rules/oj-html-unsup-theme/unsup_FAIL_1.html +0 -8
- package/tests/rules/oj-html-wctag-for/for_FAIL_1.html +0 -8
- package/tests/rules/oj-html-wctag-for/for_PASS_1.html +0 -8
- package/tests/rules/oj-js-comp-attr-deprecated/attr-del_FAIL_1.js +0 -20
- package/tests/rules/oj-js-comp-attr-deprecated/attr-dep_FAIL_1.js +0 -20
- package/tests/rules/oj-js-comp-meth-deprecated/meth-del_FAIL_1.js +0 -20
- package/tests/rules/oj-js-comp-meth-deprecated/meth-dep_FAIL_1.js +0 -20
- package/tests/rules/oj-js-define-promise/def-prom_FAIL_1.js +0 -16
- package/tests/rules/oj-js-define-promise/def-prom_FAIL_2.js +0 -16
- package/tests/rules/oj-js-diagnose/es6_PASS_1.js +0 -24
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_1.js +0 -30
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_2.js +0 -23
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_3.js +0 -22
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_4.js +0 -20
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_5.js +0 -24
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_6.js +0 -30
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_7.js +0 -15
- package/tests/rules/oj-js-no-ext-final/noextfinal_FAIL_8.js +0 -16
- package/tests/rules/oj-js-no-ext-final/noextfinal_PASS_1.js +0 -17
- package/tests/rules/oj-js-no-ext-final/noextfinal_PASS_2.js +0 -17
- package/tests/rules/oj-js-noconsole/nocons_FAIL_1.js +0 -11
- package/tests/rules/oj-js-ojcomp-deprecated/jscomp_FAIL_1.js +0 -27
- package/tests/rules/oj-json-syntax/json_FAIL_1.json +0 -8
- package/tests/rules/oj-json-syntax/json_FAIL_2.json +0 -12
- package/tests/rules/oj-json-syntax/json_PASS_1.json +0 -25
- package/tests/rules/oj-json-syntax/json_PASS_2.json +0 -12
- package/tests/rules/oj-json-syntax/json_PASS_3.json +0 -14
- package/tests/rules/ojcompjson/attrreq_FAIL_1/component.json +0 -69
- package/tests/rules/pack-compjson/audit-pack/component-1/component-1-view.html +0 -6
- package/tests/rules/pack-compjson/audit-pack/component-1/component-1-viewModel.js +0 -56
- package/tests/rules/pack-compjson/audit-pack/component-1/component.json +0 -13
- package/tests/rules/pack-compjson/audit-pack/component-1/loader.js +0 -20
- package/tests/rules/pack-compjson/audit-pack/component-1/resources/nls/component-1-strings.js +0 -18
- package/tests/rules/pack-compjson/audit-pack/component-2/component-2-view.html +0 -5
- package/tests/rules/pack-compjson/audit-pack/component-2/component-2-viewModel.js +0 -56
- package/tests/rules/pack-compjson/audit-pack/component-2/component.json +0 -13
- package/tests/rules/pack-compjson/audit-pack/component-2/loader.js +0 -20
- package/tests/rules/pack-compjson/audit-pack/component-2/resources/nls/component-1-strings.js +0 -18
- package/tests/rules/pack-compjson/audit-pack/component.json +0 -12
- package/tests/rules/pack-compjson/audit-singleton-1/audit-singleton-1-view.html +0 -5
- package/tests/rules/pack-compjson/audit-singleton-1/audit-singleton-1-viewModel.js +0 -56
- package/tests/rules/pack-compjson/audit-singleton-1/component.json +0 -20
- package/tests/rules/pack-compjson/audit-singleton-1/loader.js +0 -20
- package/tests/rules/pack-compjson/audit-singleton-1/resources/nls/audit-singleton-1-strings.js +0 -18
- package/tests/rules/pack-compjson/audit-singleton-2/audit-singleton-2-view.html +0 -8
- package/tests/rules/pack-compjson/audit-singleton-2/audit-singleton-2-viewModel.js +0 -56
- package/tests/rules/pack-compjson/audit-singleton-2/component.json +0 -15
- package/tests/rules/pack-compjson/audit-singleton-2/loader.js +0 -20
- package/tests/rules/pack-compjson/audit-singleton-2/resources/nls/audit-singleton-2-strings.js +0 -18
- package/tests/rules/parse-html/proc_instr.html +0 -9
- package/tests/rules/spoc-dom-manip/dom-manip_FAIL_1.js +0 -113
- package/tests/rules/spoc-dom-manip/dom-manip_FAIL_2.js +0 -151
- package/tests/rules/spoc-dom-manip/dom-manip_PASS_1.js +0 -149
- package/tests/rules/spoc-dom-manip/dom-manip_PASS_2.js +0 -147
- package/tests/rules/spoc-dom-manip/dom-manip_PASS_3.js +0 -147
- package/tests/rules/spoc-dom-manip/dom-manip_PASS_4.js +0 -20
- package/tests/rules/spoc-dom-manip/dom-manip_PASS_5.js +0 -246
- package/tests/rules/tab-tests/tab-test_FAIL_1.html +0 -37
- package/tests/rules/tab-tests/tab-test_FAIL_2.html +0 -8
- package/tests/rules/webcomptests/jet-composites/oj-html-wctag-$props/prop_PASS_1.html +0 -8
- package/tests/rules/webcomptests/jet-composites/oj-html-wctag-$props/prop_PASS_2.html +0 -8
- package/tests/rules/webcomptests/jet-composites/oj-html-wctag-for/for_FAIL_1.html +0 -8
- package/tests/rules/webcomptests/jet-composites/oj-html-wctag-for/for_PASS_1.html +0 -8
- package/tests/src/JetTest.js +0 -1
- package/tests/src/server.js +0 -1
- package/tests/test.js +0 -1
|
@@ -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 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'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;
|
|
@@ -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 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 +1,6 @@
|
|
|
1
|
-
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{compjson:this._doAudit}};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);const uploadedResp=netUtils.loadUrl(`${EXCHANGEROOT}${fullName}/versions/${latestMatchVersion}`);if(uploadedResp.statusCode=200&&uploadedResp.body){const existingDef=JSON.parse(uploadedResp.body).component;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}`,'0011');context.reporter.addIssue(issue,context,'blocker')}}}else{}}}}}catch(e){console.log(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(!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(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;
|
|
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 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 +1,6 @@
|
|
|
1
|
-
|
|
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 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;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
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 NetUtils=require('../../lib/NetUtils');const CommonImpl=require('../jetwc-lib/jetwcutils-commonListenerImpls');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-exchange-version-check'};ruleDef.prototype.getShortDescription=function(){return'Verify version is not already in Exchange'};ruleDef.prototype.getDescription=function(){return'This audit checks that the version specified for this component does not already exist in Exchange. This may not actually be an error, hence this informational only.'};ruleDef.prototype.register=function(context){return{startaudit:this._checkForExchangeConfiguration,compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._checkForExchangeConfiguration=function(context){this.exchangeURL=CommonImpl.checkForExchangeConfiguration(context);if(!this.exchangeURL){const issue=new context.Issue(`Invalid or Missing exchangeURL value specified for the rule ${context.ruleName}, rule execution is disabled`);issue.setMsgKey(`${context.ruleName}_3`);issue.setSeverity('critical');context.reporter.addIssue(issue,context)}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const componentDef=context.suppData.obj;const fullName=Utils.getComponentFullName(componentDef);this._checkForExchangeVersion(context,fullName,componentDef.version)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._checkForExchangeVersion(context,componentInfo.fullName,componentInfo.version)}};ruleDef.prototype._checkForExchangeVersion=function(context,fullName,newVersion){const semver=context.utils.semVerUtils;const msg=context.utils.msgLib;try{const netUtils=new NetUtils;const existingVersionsResp=netUtils.loadUrl(`${this.exchangeURL}components/${fullName}/versions`);const responseCode=existingVersionsResp.statusCode;if(responseCode===200&&existingVersionsResp.body){const existingVersions=JSON.parse(existingVersionsResp.body);if(existingVersions.items&&existingVersions.items.length>0){let latestMatchVersion,nextProjectedVersion;const versions=existingVersions.items.reverse();for(let i=0;i<versions.length;i++){if(semver.gte(newVersion,versions[i])){latestMatchVersion=versions[i];if(i>0){nextProjectedVersion=versions[i-1]}break}}if(latestMatchVersion){if(latestMatchVersion===newVersion){const sameissue=new context.Issue(`The version number defined for ${fullName} (${newVersion}) already exists in Exchange`);sameissue.setMsgKey('jetwco-exchange-version-check_1');context.reporter.addIssue(sameissue,context)}else if(nextProjectedVersion){const futureissue=new context.Issue(`The version number defined for ${fullName} (${newVersion}) is lower than existing versions in Exchange`);futureissue.setMsgKey('jetwco-exchange-version-check_2');context.reporter.addIssue(futureissue,context)}}}}else if(responseCode===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){msg.error(JSON.stringify(e))};};module.exports=ruleDef;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const path=require('path');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-license-info'};ruleDef.prototype.getShortDescription=function(){return'Validate Licence Information'};ruleDef.prototype.getDescription=function(){return'This rule is checks that a license file (LICENSE.txt) and third party license (THIRD_PARTY_LICENSE.txt) file is present if required'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){const msg=context.utils.msgLib;const componentMetadata=context.suppData.obj;const rulePackState=context.rulePack.getExtension();if(componentMetadata){let issue;let licenseFound=false;let licenseCandidate='LICENSE.txt';const compRootFiles=context.utils.fsUtils.readDir(path.dirname(context.filepath));for(let i=0;i<compRootFiles.length;i++){const rootEntry=compRootFiles[i];if(rootEntry.isFile&&rootEntry.name===licenseCandidate){licenseFound=true;break}}if(!licenseFound){issue=new context.Issue(`Component is missing license information file in root, 'LICENSE.txt' is expected (case sensitive)`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}let thirdPartyScan=false;if(componentMetadata.type&&componentMetadata.type==='reference'){thirdPartyScan=true}else{if(componentMetadata.dependencies){if(rulePackState.allReferenceComponents){Object.keys(componentMetadata.dependencies).forEach(dependency=>{if(rulePackState.allReferenceComponents.has(dependency)){thirdPartyScan=true}})}else{msg.error('JETWC: Unable to scan for reference component dependencies - JETWC-BOOTSTRAP was not run')}}}if(thirdPartyScan){licenseFound=false;licenseCandidate='THIRD_PARTY_LICENSE.txt';for(let i=0;i<compRootFiles.length;i++){const rootEntry=compRootFiles[i];if(rootEntry.isFile&&rootEntry.name===licenseCandidate){licenseFound=true;break}}if(!licenseFound){issue=new context.Issue(`Component with third party dependencies is missing 3rd party license information file in root, 'THIRD_PARTY_LICENSE.txt' is expected (case sensitive)`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}}}};module.exports=ruleDef;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
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 ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-prerelease-cdn'};ruleDef.prototype.getShortDescription=function(){return'Validates use of the production CDN'};ruleDef.prototype.getDescription=function(){return'This rule checks any CDN definitions to ensure that they point to assets on the production Oracle CDN, not the staging site or other sites'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit}};ruleDef.prototype._doAudit=function(context){const productionCDN=context.rulePack.getRuleOptions().cdnRoot.toLowerCase();if(context.suppData.obj){let issue;const meta=context.suppData.obj;const componentType=Utils.getComponentType(meta);const componentName=meta.name;if(meta.paths&&meta.paths.cdn){if(meta.paths.cdn.min&&!meta.paths.cdn.min.toLowerCase().startsWith(productionCDN)||meta.paths.cdn.debug&&!meta.paths.cdn.debug.toLowerCase().startsWith(productionCDN)){issue=new context.Issue(`${componentType} component '${componentName}' does not use the correct CDN (${productionCDN})`);context.reporter.addIssue(issue,context)}}}};module.exports=ruleDef;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-thirdparty-ba'};ruleDef.prototype.getShortDescription=function(){return'Validate Business Approvals'};ruleDef.prototype.getDescription=function(){return'This rule is applied to reference component and any components that depend on reference components to ensure that the PLS Business Approval number is recorded'};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 componentType=Utils.getComponentType(meta);this._checkBA(context,componentType,meta.dependencies,meta.extension)}};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},{})}this._checkBA(context,componentInfo.type,remappedDependencies,componentInfo.extension)}};ruleDef.prototype._checkBA=function(context,componentType,dependenciesMetadata,extensionMetadata){const referenceComponents=context.rulePack.getExtension().allReferenceComponents;if(componentType==='reference'){if(!(extensionMetadata&&extensionMetadata.oracle&&extensionMetadata.oracle.businessApprovals)){issue=new context.Issue(`Reference component is missing PLS Business Approval Information`);issue.setMsgKey('jetwco-thirdparty-ba_4');context.reporter.addIssue(issue,context)}}if(referenceComponents){let issue;if(dependenciesMetadata){Object.keys(dependenciesMetadata).forEach(dependency=>{if(referenceComponents.has(dependency)){const referencedLibs=referenceComponents.get(dependency);if(referencedLibs&&Object.keys(referencedLibs).length>0){if(!(extensionMetadata&&extensionMetadata.oracle&&extensionMetadata.oracle.businessApprovals)){issue=new context.Issue(`Component is missing PLS Business Approval Information relating to the reference '${dependency}'`);issue.setMsgKey('jetwco-thirdparty-ba_1');context.reporter.addIssue(issue,context)}else{Object.keys(referencedLibs).forEach(lib=>{if(!extensionMetadata.oracle.businessApprovals.hasOwnProperty(lib)){issue=new context.Issue(`Component is missing PLS Business Approval Information relating to '${lib}' from '${dependency}'`);issue.setMsgKey('jetwco-thirdparty-ba_2');context.reporter.addIssue(issue,context)}else{if(extensionMetadata.oracle.businessApprovals[lib]!==referencedLibs[lib]){issue=new context.Issue(`Component PLS Business Approval Information relating to '${lib}' from '${dependency}' does not match`);issue.setMsgKey('jetwco-thirdparty-ba_2');context.reporter.addIssue(issue,context)}}})}}else{issue=new context.Issue(`Reference component dependency '${dependency}' does not have supplied PLS Business Approval Information`);issue.setMsgKey('jetwco-thirdparty-ba_3');context.reporter.addIssue(issue,context)}}})}}};module.exports=ruleDef;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
{"jetwco-component-cdn":"0001","jetwco-license-info_1":"0002","jetwco-license-info_2":"0003","jetwco-prerelease-cdn":"0004","jetwco-thirdparty-ba_1":"0005","jetwco-thirdparty-ba_2":"0006","jetwco-thirdparty-ba_3":"0007","jetwco-thirdparty-ba_4":"0008","jetwco-exchange-version-check_1":"0009","jetwco-exchange-version-check_2":"0010","jetwco-exchange-version-check_3":"0014","jetwco-component-api-changes_1":"0011","jetwco-component-api-changes_2":"0015","jetwco-compjson-ns-reg":"0012","jetwco-component-api-baseline-changes_1":"0013","jetwco-component-api-baseline-changes_2":"0016","jetwco-displayname-standards_1":"0020","jetwco-displayname-standards_2":"0021","jetwco-description-standards_1":"0030","jetwco-description-standards_2":"0031","jetwco-description-standards_3":"0032","jetwco-component-api-controlled-changes_1":"0040","jetwco-component-api-controlled-changes_2":"0041"}
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
{"title":"Oracle Internal Audit Rules for JET Custom Component Authors","prefix":"JETWCO","version":"1.12.1","rules":{"jetwco-bootstrap":{"group":"jetwco-do-not-disable","enabled":true,"severity":"info","debug":false,"diagnosticFile":"jetwco-diagnostics","componentRoot":"jet-composites","auditBuildOutput":false,"testMode":false,"$required":true},"jetwco-component-cdn":{"group":"jetwco-pre-release","severity":"major","filetype":["json"]},"jetwco-prerelease-cdn":{"group":"jetwco-pre-release","enabled":true,"cdnRoot":"https://static.oracle.com/cdn/","severity":"blocker","filetype":["json"]},"jetwco-thirdparty-ba":{"group":"jetwco-pre-release","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwco-license-info":{"group":"jetwco-pre-release","enabled":true,"severity":"blocker","filetype":["json","tsx"]},"jetwco-exchange-version-check":{"group":"jetwco-api","enabled":false,"severity":"info","filetype":["json","tsx"]},"jetwco-component-api-changes":{"group":"jetwco-api","enabled":false,"severity":"blocker","filetype":["json","tsx"],"clearCache":false},"jetwco-compjson-ns-reg":{"group":"jetwco-api","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwco-component-api-baseline-changes":{"group":"jetwco-api","enabled":false,"severity":"blocker","filetype":["json","tsx"],"baseline":{},"clearCache":false},"jetwco-displayname-standards":{"group":"jetwco-doc","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwco-description-standards":{"group":"jetwco-doc","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwco-component-api-controlled-changes":{"group":"jetwco-api","enabled":false,"severity":"blocker","filetype":["json","tsx"],"clearCache":false,"controls":{}}}}
|
|
@@ -1 +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
|
+
*/
|
|
1
6
|
{"spoc-dom-manip":"0010","spoc-dom-manip-inv-tag":"0020","spoc-dom-manip-tag-pos":"0030"}
|
|
@@ -1 +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
|
+
*/
|
|
1
6
|
{"title":"Security Point of Contact Rule Pack","prefix":"SPOC","version":"1.2.0","rules":{"spoc-dom-manip":{"severity":"blocker","filetype":"js","group":"spoc","status":"ready","settings":{"new":{"show":true,"showGetters":false},"existing":{"showUpdate":false,"showXSS":false,"showRandom":false,"showOkUntagged":false}}},"spoc-dom-manip-inv-tag":{"severity":"blocker","filetype":"js","group":"spoc","status":"ready"},"spoc-dom-manip-tag-pos":{"severity":"blocker","filetype":"js","group":"spoc","status":"ready"}}}
|
|
@@ -1 +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
|
+
*/
|
|
1
6
|
const RULE_NAME="spoc-dom-manip-inv-tag";const TAG_OK="@HTMLUpdateOK";const TAG_REVIEW="@HTMLUpdateReview";const TAG_XSS_FALSE_POSITIVE="@XSSFalsePositive";const TAG_RANDOM="@RandomNumberOK";const TAG_OK_LC="@htmlupdateok";const TAG_REVIEW_LC="@htmlupdatereview";const TAG_XSS_FALSE_POSITIVE_LC="@xssfalsepositive";const TAG_RANDOM_LC="@randomnumberok";const REGEX=/@HTML/gi;const REGEX2=/@XSS/gi;const REGEX3=/@Rand/gi;function Rule(){};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return"Finds all uses of SPOC tags with incorrect case"};Rule.prototype.getDescription=function(){return"Finds all uses of SPOC tags '@HTMLUpdateOK', '@HTMLUpdateReview', '@XSSFalsePositive' and '@RandomNumberOK' with incorrect case"};Rule.prototype.register=function(){return{"file":_scan}};function _scan(context){var data=context.data,tag,lcTag,s,issue,result,indices=[],i,x;REGEX.lastIndex=0;while(result=REGEX.exec(data)){indices.push(result.index)}REGEX2.lastIndex=0;while(result=REGEX2.exec(data)){indices.push(result.index)}REGEX3.lastIndex=0;while(result=REGEX3.exec(data)){indices.push(result.index)}for(i=0;i<indices.length;i++){x=indices[i];tag=_getTag(context,data,x);lcTag=tag.toLowerCase();if(lcTag.startsWith(TAG_OK_LC)||lcTag.startsWith(TAG_REVIEW_LC)||lcTag.startsWith(TAG_XSS_FALSE_POSITIVE_LC)||lcTag.startsWith(TAG_RANDOM_LC)){s=lcTag.substring(lcTag.length-1);if(s!=="k"&&s!=="w"&&s!=="e"){issue=new context.Issue("Remove trailing extraneous character(s) from '"+tag+"'");_updatePosition(context,issue,data,x,x+tag.length);context.reporter.addIssue(issue,context);continue}}else{issue=new context.Issue("Invalid security tag - '"+tag+"'");_updatePosition(context,issue,data,x,x+tag.length);context.reporter.addIssue(issue,context);continue}if(tag!==TAG_OK&&tag!==TAG_REVIEW&&tag!==TAG_XSS_FALSE_POSITIVE&&tag!==TAG_RANDOM&&!lcTag.startsWith(TAG_REVIEW_LC)){issue=new context.Issue("Invalid security tag case - '"+tag+"' - should be "+(lcTag.includes("review")?TAG_REVIEW:lcTag.includes("xss")?TAG_XSS_FALSE_POSITIVE:lcTag.includes("random")?TAG_RANDOM:TAG_OK));_updatePosition(context,issue,data,x,x+tag.length);context.reporter.addIssue(issue,context)}}};function _getTag(context,data,x){var i=context.utils.utils.getIndexToWhitespace(data,x);return data.substring(x,i)};function _updatePosition(context,issue,data,indexStart,indexEnd){var rowcol=context.utils.utils.getRowColFromIndex(data,indexStart);issue.setPosition(rowcol.row,rowcol.col,indexStart,indexEnd)};module.exports=Rule;
|
|
@@ -1 +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
|
+
*/
|
|
1
6
|
const RULE_NAME="spoc-dom-manip-tag-pos";const PROP_NAMES=[".innerHTML",".outerHTML"];const FUNC_NAMES=[".html",".prepend",".prependTo",".before",".after",".insertBefore",".insertAfter",".append",".appendTo",".wrap",".wrapAll",".wrapInner",".replaceAll",".replaceWith",".write",".writeln",".attr",".setAttribute",".cookie","eval","Function","setTimeout","setInterval","random","script","createElement",".appendChild","XMLHttpRequest","ActiveXObject"];const REGEX=/@HTML/gi;const REGEX2=/@XSS/gi;const REGEX3=/@Rand/gi;function Rule(){};Rule.prototype.getName=function(){return RULE_NAME};Rule.prototype.getShortDescription=function(){return"Finds all SPOC tags with invalid placement"};Rule.prototype.getDescription=function(){return"Finds all declarations of SPOC tags '@HTMLUpdateOK' and '@XSS_FALSE_POSITIVE' on lines that do not containg DOM manipulation properties or functions."};Rule.prototype.register=function(){return{"file":_scan}};function _scan(context){var data=context.data,tag,line,hit,issue,result,indices=[],i,j,x;REGEX.lastIndex=0;while(result=REGEX.exec(data)){indices.push(result.index)}REGEX2.lastIndex=0;while(result=REGEX2.exec(data)){indices.push(result.index)}REGEX3.lastIndex=0;while(result=REGEX3.exec(data)){indices.push(result.index)}for(i=0;i<indices.length;i++){x=indices[i];tag=_getTag(context,data,x);line=_getLineStart(context,data,x);hit=false;for(j=0;j<FUNC_NAMES.length;j++){if(line.includes(FUNC_NAMES[j])){hit=true;break}}if(!hit){for(j=0;j<PROP_NAMES.length;j++){if(line.includes(PROP_NAMES[j])){hit=true;break}}}if(tag.toLowerCase().includes("review")){issue=new context.Issue("obsolete tag '@HTMLUpdateReview' - remove");_updatePosition(context,issue,data,x,x+tag.length);context.reporter.addIssue(issue,context)}else if(!hit){issue=new context.Issue("Incorrect placement of '"+tag+"'");_updatePosition(context,issue,data,x,x+tag.length);context.reporter.addIssue(issue,context)}}};function _getTag(context,data,x){var i=context.utils.utils.getIndexToWhitespace(data,x);return data.substring(x,i)};function _getLineStart(context,data,x){var i,ret=null;for(i=x;i>=0;i--){if(data.charAt(i)==="\n"){ret=data.substring(i,x);break}}return ret};function _updatePosition(context,issue,data,indexStart,indexEnd){var rowcol=context.utils.utils.getRowColFromIndex(data,indexStart);issue.setPosition(rowcol.row,rowcol.col,indexStart,indexEnd)};module.exports=Rule;
|