@oracle/oraclejet-audit 11.1.3 → 12.1.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 +6 -6
- package/jaf.js +2 -2
- package/jafapi.js +2 -2
- package/lib/AST.js +1 -1
- package/lib/AST_Ts.js +2 -2
- package/lib/AstJson.js +1 -1
- package/lib/AstMd.js +6 -0
- package/lib/AstNodeTypes.js +2 -2
- package/lib/Comments.js +1 -1
- package/lib/ComponentSvcs.js +1 -1
- package/lib/Components.js +2 -2
- package/lib/Config.js +2 -2
- package/lib/ConfigLib.js +2 -2
- package/lib/CssLib.js +1 -1
- package/lib/CssUtils.js +1 -1
- package/lib/DomUtils.js +2 -2
- package/lib/FileIndex.js +1 -1
- package/lib/FileSet.js +1 -1
- package/lib/FsUtils.js +2 -2
- package/lib/Histo.js +2 -2
- package/lib/HtmlTree.js +2 -2
- package/lib/HtmlUtils.js +1 -1
- package/lib/Issue.js +2 -2
- package/lib/JafEvents.js +1 -1
- package/lib/JafLib.js +2 -2
- package/lib/Json.js +2 -2
- package/lib/JsonLoader.js +2 -2
- package/lib/Md.js +6 -0
- package/lib/MetaLib.js +2 -2
- package/lib/NetUtils.js +1 -1
- package/lib/NodeTypes.js +1 -1
- package/lib/Parser.js +2 -2
- package/lib/RegTypes.js +2 -2
- package/lib/Registry.js +2 -2
- package/lib/Reporter.js +2 -2
- package/lib/RuleContext.js +1 -1
- package/lib/RulePack.js +1 -1
- package/lib/RuleSet.js +2 -2
- package/lib/Rules.js +2 -2
- package/lib/Scope.js +2 -2
- package/lib/SemVer.js +1 -1
- package/lib/Server.js +1 -1
- package/lib/SevLib.js +1 -1
- package/lib/Severity.js +1 -1
- package/lib/Stats.js +1 -1
- package/lib/Ts.js +2 -2
- package/lib/Utils.js +2 -2
- package/lib/Watch.js +1 -1
- package/lib/Writer.js +1 -1
- package/lib/ZipUtils.js +1 -1
- package/lib/api.js +2 -2
- package/lib/builtinpacks.js +6 -0
- package/lib/cliStats.js +2 -2
- package/lib/clone.js +2 -2
- package/lib/cmdline.js +2 -2
- package/lib/colors.js +2 -2
- package/lib/defaults.js +6 -0
- package/lib/deflist.js +6 -0
- package/lib/dislist.js +6 -0
- package/lib/exportRules.js +1 -1
- package/lib/extends.js +2 -2
- package/lib/filetypes.js +2 -2
- package/lib/grouplist.js +6 -0
- package/lib/groups.js +2 -2
- package/lib/help.js +2 -2
- package/lib/jetver.js +2 -2
- package/lib/macros.js +1 -1
- package/lib/manual.js +6 -0
- package/lib/metaLoader.js +1 -1
- package/lib/metahist.js +1 -1
- package/lib/msgidLoader.js +1 -1
- package/lib/ns.js +2 -2
- package/lib/nslist.js +1 -1
- package/lib/outFormat.js +1 -1
- package/lib/outfile.js +1 -1
- package/lib/ruleLoader.js +1 -1
- package/lib/scaffold.js +2 -2
- package/lib/scaffoldRule.js +2 -2
- package/lib/schema.js +2 -2
- package/lib/scopewalker.js +2 -2
- package/lib/spinner.js +2 -2
- package/lib/spinnernoop.js +1 -1
- package/lib/tabs.js +1 -1
- package/libext/expparser.js +1 -1
- package/meta/11.1.0/jetauditmeta.js +1 -1
- package/meta/12.0.0/jetauditmeta.js +9 -0
- package/meta/12.1.0/jetauditmeta.js +9 -0
- package/meta/metaverlist.json +1 -1
- package/package.json +72 -68
- package/rulepacks/csp/csp-html-script-unsafe-inline.js +1 -1
- package/rulepacks/csp/csp-html-style-unsafe-inline.js +1 -1
- package/rulepacks/csp/csp-html-unsafe-expr.js +1 -1
- package/rulepacks/csp/csp-js-script-unsafe-eval.js +1 -1
- package/rulepacks/csp/csp-js-style-unsafe-inline.js +1 -1
- package/rulepacks/csp/csp-ts-script-unsafe-eval.js +1 -1
- package/rulepacks/csp/csp-ts-style-unsafe-inline.js +1 -1
- package/rulepacks/csp/msgid.json +1 -1
- package/rulepacks/csp/rules.json +1 -1
- package/rulepacks/jetwc/jetwc-absolute-jetversion.js +2 -2
- package/rulepacks/jetwc/jetwc-aria-redefinition.js +2 -2
- package/rulepacks/jetwc/jetwc-bootstrap.js +2 -2
- package/rulepacks/jetwc/jetwc-compjson-bp-ar.js +2 -2
- package/rulepacks/jetwc/jetwc-compjson-bp-obj.js +2 -2
- package/rulepacks/jetwc/jetwc-component-dependencies.js +2 -2
- package/rulepacks/jetwc/jetwc-component-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-component-foldername.js +2 -2
- package/rulepacks/jetwc/jetwc-component-location.js +2 -2
- package/rulepacks/jetwc/jetwc-component-type.js +2 -2
- package/rulepacks/jetwc/jetwc-css-oj-complete.js +6 -0
- package/rulepacks/jetwc/jetwc-data-property-prefix.js +2 -2
- package/rulepacks/jetwc/jetwc-deprecated-lifecycle.js +2 -2
- package/rulepacks/jetwc/jetwc-disabled-property.js +2 -2
- package/rulepacks/jetwc/jetwc-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-dynamic-slot-context.js +2 -2
- package/rulepacks/jetwc/jetwc-dynamic-slots-naming.js +2 -2
- package/rulepacks/jetwc/jetwc-event-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-events.js +2 -2
- package/rulepacks/jetwc/jetwc-jet-version.js +2 -2
- package/rulepacks/jetwc/jetwc-loader-file.js +2 -2
- package/rulepacks/jetwc/jetwc-markdown-link.js +6 -0
- package/rulepacks/jetwc/jetwc-method-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-methods.js +2 -2
- package/rulepacks/jetwc/jetwc-namespace.js +2 -2
- package/rulepacks/jetwc/jetwc-nested-defaults.js +2 -2
- package/rulepacks/jetwc/jetwc-nls-languages.js +2 -2
- package/rulepacks/jetwc/jetwc-nls-root.js +2 -2
- package/rulepacks/jetwc/jetwc-oj-register.js +2 -2
- package/rulepacks/jetwc/jetwc-ojcss.js +2 -2
- package/rulepacks/jetwc/jetwc-pack-children.js +2 -2
- package/rulepacks/jetwc/jetwc-packable-components.js +2 -2
- package/rulepacks/jetwc/jetwc-prerelease-dependencies.js +2 -2
- package/rulepacks/jetwc/jetwc-prerelease-pattern.js +2 -2
- package/rulepacks/jetwc/jetwc-prerelease-version.js +2 -2
- package/rulepacks/jetwc/jetwc-property-changed.js +2 -2
- package/rulepacks/jetwc/jetwc-property-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-property-nesting.js +2 -2
- package/rulepacks/jetwc/jetwc-public-modules.js +2 -2
- package/rulepacks/jetwc/jetwc-register-css.js +2 -2
- package/rulepacks/jetwc/jetwc-register-with-promises.js +2 -2
- package/rulepacks/jetwc/jetwc-require-paths.js +2 -2
- package/rulepacks/jetwc/jetwc-required-subproperty.js +2 -2
- package/rulepacks/jetwc/jetwc-reserved-property.js +2 -2
- package/rulepacks/jetwc/jetwc-schema.js +2 -2
- package/rulepacks/jetwc/jetwc-semantic-version.js +2 -2
- package/rulepacks/jetwc/jetwc-slot-displayname.js +2 -2
- package/rulepacks/jetwc/jetwc-slots.js +2 -2
- package/rulepacks/jetwc/jetwc-standard-files.js +2 -2
- package/rulepacks/jetwc/jetwc-subproperty-writeback.js +2 -2
- package/rulepacks/jetwc/jetwc-template-slots.js +2 -2
- package/rulepacks/jetwc/jetwc-unused-events.js +2 -2
- package/rulepacks/jetwc/jetwc-unused-slots.js +2 -2
- package/rulepacks/jetwc/jetwc-vb-category.js +2 -2
- package/rulepacks/jetwc/jetwc-vb-icon.js +2 -2
- 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 +2 -2
- package/rulepacks/jetwc/jetwc-writeback-required.js +2 -2
- package/rulepacks/jetwc/msgid.json +2 -2
- package/rulepacks/jetwc/rules.json +2 -2
- 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 +2 -2
- 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 +2 -2
- package/rulepacks/jetwco/jetwco-component-api-baseline-changes.js +2 -2
- package/rulepacks/jetwco/jetwco-component-api-changes.js +2 -2
- package/rulepacks/jetwco/jetwco-component-api-controlled-changes.js +6 -0
- package/rulepacks/jetwco/jetwco-component-cdn.js +2 -2
- 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 +2 -2
- package/rulepacks/jetwco/jetwco-license-info.js +2 -2
- package/rulepacks/jetwco/jetwco-prerelease-cdn.js +2 -2
- package/rulepacks/jetwco/jetwco-thirdparty-ba.js +2 -2
- package/rulepacks/jetwco/msgid.json +2 -2
- package/rulepacks/jetwco/rules.json +2 -2
- package/rulepacks/spoc/msgid.json +1 -1
- package/rulepacks/spoc/rules.json +1 -1
- package/rulepacks/spoc/spoc-dom-manip-inv-tag.js +1 -1
- package/rulepacks/spoc/spoc-dom-manip-tag-pos.js +1 -1
- package/rulepacks/spoc/spoc-dom-manip.js +1 -1
- package/rulepacks/wdt/msgid.json +6 -0
- 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 +1 -1
- package/rules/jaf/jaf-html-diagnose.js +1 -1
- package/rules/jaf/jaf-init-schema.js +1 -1
- package/rules/jaf/jaf-js-diagnose.js +1 -1
- package/rules/jaf/jaf-ts-diagnose.js +1 -1
- package/rules/jaf/jaf-ts-walk.js +6 -0
- package/rules/jaf/msgid.json +2 -2
- package/rules/jaf/rules.json +2 -2
- package/rules/jet/helpers/acc-aria-label.js +1 -1
- package/rules/jet/helpers/bp-checkPropType.js +1 -1
- package/rules/jet/helpers/cssHelper.js +1 -1
- package/rules/jet/helpers/extractStylesFromClass.js +1 -1
- package/rules/jet/helpers/has-slot-name.js +2 -2
- package/rules/jet/helpers/has-slot.js +1 -1
- package/rules/jet/helpers/json-prop-pos.js +1 -1
- package/rules/jet/helpers/json-propname-pos.js +1 -1
- package/rules/jet/helpers/style-selector.js +1 -1
- package/rules/jet/helpers/valid-attr.js +1 -1
- package/rules/jet/helpers/vartrack.js +1 -1
- package/rules/jet/jet-css-ojselector.js +1 -1
- package/rules/jet/msgid.json +2 -2
- package/rules/jet/oj-acc-aria-labelledby.js +1 -1
- package/rules/jet/oj-acc-aria-prop.js +2 -2
- package/rules/jet/oj-acc-avatar-aria-role.js +2 -2
- package/rules/jet/oj-acc-combobox-aria-label.js +2 -2
- package/rules/jet/oj-acc-film-strip-aria-label.js +2 -2
- package/rules/jet/oj-acc-input-aria-label.js +2 -2
- package/rules/jet/oj-acc-select-aria-label.js +2 -2
- package/rules/jet/oj-cca-compjson-bp-ar.js +1 -1
- package/rules/jet/oj-cca-compjson-bp-dsplyname.js +1 -1
- package/rules/jet/oj-cca-compjson-bp-jetver.js +1 -1
- package/rules/jet/oj-cca-compjson-bp-obj.js +1 -1
- package/rules/jet/oj-cca-compjson-ns-reg.js +1 -1
- package/rules/jet/oj-css-bp-border-color.js +1 -1
- package/rules/jet/oj-css-bp-dir-flow.js +1 -1
- package/rules/jet/oj-css-bp-float.js +1 -1
- package/rules/jet/oj-css-bp-textalign.js +1 -1
- package/rules/jet/oj-css-style-abs-units.js +2 -2
- package/rules/jet/oj-css-style-bp-color.js +1 -1
- package/rules/jet/oj-css-style-bp-display.js +1 -1
- package/rules/jet/oj-css-style-bp-font-family.js +1 -1
- package/rules/jet/oj-css-style-bp-font.js +1 -1
- package/rules/jet/oj-css-style-deprecated.js +1 -1
- package/rules/jet/oj-css-style-override.js +2 -2
- package/rules/jet/oj-css-var-override.js +1 -1
- package/rules/jet/oj-form-maxcols.js +2 -2
- package/rules/jet/oj-html-5-attr-obs.js +1 -1
- package/rules/jet/oj-html-5-tag-obs.js +1 -1
- package/rules/jet/oj-html-alta-deprecated.js +6 -0
- package/rules/jet/oj-html-attr-$unique.js +1 -1
- package/rules/jet/oj-html-attr-2def.js +1 -1
- package/rules/jet/oj-html-attr-json.js +1 -1
- package/rules/jet/oj-html-attr-prefix-expr.js +1 -1
- package/rules/jet/oj-html-attr-prefix-ro.js +1 -1
- package/rules/jet/oj-html-attr-req.js +1 -1
- package/rules/jet/oj-html-bindforeach-data.js +2 -2
- package/rules/jet/oj-html-bindif-test.js +2 -2
- package/rules/jet/oj-html-binding-attr.js +2 -2
- package/rules/jet/oj-html-cca-count.js +1 -1
- package/rules/jet/oj-html-cca-tagname.js +2 -2
- package/rules/jet/oj-html-cdn.js +1 -1
- package/rules/jet/oj-html-combo-converter.js +1 -1
- package/rules/jet/oj-html-cspexpr.js +1 -1
- package/rules/jet/oj-html-databind-all.js +1 -1
- package/rules/jet/oj-html-dlg-title.js +2 -2
- package/rules/jet/oj-html-file-pick-accept.js +2 -2
- package/rules/jet/oj-html-form-bindif.js +1 -1
- package/rules/jet/oj-html-form-layout-maxcols.js +2 -2
- package/rules/jet/oj-html-form-noflex.js +1 -1
- package/rules/jet/oj-html-input-isodate.js +2 -2
- package/rules/jet/oj-html-invalid-doctype.js +2 -2
- package/rules/jet/oj-html-jq-databind.js +2 -2
- package/rules/jet/oj-html-ko-comment.js +1 -1
- package/rules/jet/oj-html-ko-databind.js +2 -2
- package/rules/jet/oj-html-label-for-prefix.js +1 -1
- package/rules/jet/oj-html-missing-doctype.js +1 -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 +1 -1
- package/rules/jet/oj-html-ojattr-520.js +1 -1
- package/rules/jet/oj-html-ojattr-deprecated.js +2 -2
- package/rules/jet/oj-html-ojattr-enum-deprecated.js +2 -2
- package/rules/jet/oj-html-ojattr-evt-syntax.js +2 -2
- package/rules/jet/oj-html-ojattr-value.js +1 -1
- package/rules/jet/oj-html-ojattr.js +2 -2
- package/rules/jet/oj-html-ojevent.js +2 -2
- package/rules/jet/oj-html-ojslot.js +2 -2
- package/rules/jet/oj-html-ojstyle.js +1 -1
- package/rules/jet/oj-html-ojtag-datacmd.js +2 -2
- package/rules/jet/oj-html-ojtag-datactx.js +1 -1
- package/rules/jet/oj-html-ojtag-deprecated.js +2 -2
- package/rules/jet/oj-html-ojtag-globattr-noprefix.js +2 -2
- package/rules/jet/oj-html-ojtag-id.js +1 -1
- package/rules/jet/oj-html-ojtag-nonglobattr-prefix.js +2 -2
- package/rules/jet/oj-html-ojtag-ns.js +1 -1
- package/rules/jet/oj-html-picker-attrs.js +2 -2
- package/rules/jet/oj-html-redwood-cssnovars.js +1 -1
- package/rules/jet/oj-html-redwood-cssvars.js +1 -1
- package/rules/jet/oj-html-self-close.js +1 -1
- package/rules/jet/oj-html-slot-item-minmax.js +1 -1
- package/rules/jet/oj-html-slot-name.js +2 -2
- package/rules/jet/oj-html-slot-pref-content.js +2 -2
- package/rules/jet/oj-html-style-abs-units.js +1 -1
- package/rules/jet/oj-html-style-bp-color.js +1 -1
- package/rules/jet/oj-html-style-bp-display.js +1 -1
- package/rules/jet/oj-html-style-bp-font-family.js +1 -1
- package/rules/jet/oj-html-style-bp-font.js +1 -1
- package/rules/jet/oj-html-style-deprecated.js +2 -2
- package/rules/jet/oj-html-style.js +1 -1
- package/rules/jet/oj-html-stylesel.js +1 -1
- package/rules/jet/oj-html-tag-attr-noprefix.js +2 -2
- package/rules/jet/oj-html-template-index.js +2 -2
- package/rules/jet/oj-html-unsup-theme.js +1 -1
- package/rules/jet/oj-html-wctag-$props.js +1 -1
- package/rules/jet/oj-html-wctag-arialabelledby.js +1 -1
- package/rules/jet/oj-html-wctag-for.js +1 -1
- package/rules/jet/oj-html-wctag-id.js +2 -2
- package/rules/jet/oj-html-wctag-nested.js +6 -0
- package/rules/jet/oj-html-wctag-packprivate.js +1 -1
- package/rules/jet/oj-js-comp-attr-deprecated.js +2 -2
- package/rules/jet/oj-js-comp-meth-deprecated.js +2 -2
- package/rules/jet/oj-js-no-ext-final.js +1 -1
- package/rules/jet/oj-js-noconsole.js +1 -1
- package/rules/jet/oj-js-ojcomp-deprecated.js +2 -2
- package/rules/jet/oj-js-ojcomp-exist.js +1 -1
- package/rules/jet/oj-js-ojcomp-new.js +1 -1
- package/rules/jet/oj-js-poly-promise.js +1 -1
- package/rules/jet/oj-js-var-undef.js +1 -1
- package/rules/jet/oj-json-syntax.js +1 -1
- package/rules/jet/oj-ts-comp-attr-deprecated.js +2 -2
- package/rules/jet/oj-ts-comp-meth-deprecated.js +2 -2
- package/rules/jet/oj-ts-no-ext-final.js +1 -1
- package/rules/jet/oj-ts-noconsole.js +1 -1
- package/rules/jet/oj-ts-ojcomp-deprecated.js +2 -2
- package/rules/jet/oj-ts-ojcomp-exist.js +1 -1
- package/rules/jet/oj-ts-ojcomp-new.js +1 -1
- package/rules/jet/oj-ts-poly-promise.js +1 -1
- package/rules/jet/rules.json +2 -2
- package/schema/component-schema.json +4 -1
- package/src/JafCore.js +2 -2
- package/types/index.d.ts +122 -82
- package/lib/imanual.js +0 -6
- package/lib/xmanual.js +0 -6
- package/rulepacks/jetwc-lib/component-audit-utils.js +0 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require("path");const Utils=require("../jetwc-lib/
|
|
6
|
+
const path=require("path");const Utils=require("../jetwc-lib/jetwcutils-componentAuditUtils");const ruleDef=function(){};ruleDef.prototype.getName=function(){return"jetwc-template-slots"};ruleDef.prototype.getShortDescription=function(){return"Verify template slots are named correctly"};ruleDef.prototype.getDescription=function(){return"This rule checks that any template slots used have the correct naming convention and have an associated data parameter"};ruleDef.prototype.register=function(context){return{"<oj-bind-template-slot>":this._doAudit}};ruleDef.prototype._doAudit=function(context){let issue;const DomUtils=context.utils.DomUtils;const componentName=Utils.matchComponentPath(context,path.dirname(context.filepath));if(componentName){const slotName=context.tagNode.attribs.name;const usesExpression=slotName&&DomUtils.isExpression(slotName);if(slotName&&!slotName.endsWith("Template")&&!usesExpression){issue=new context.Issue(`Template slot '${slotName}' for component ${componentName} does not follow the recommended naming pattern (should use a Template suffix)`);issue.setMsgKey(context.ruleName+"_1");context.reporter.addIssue(issue,context,"minor")}if(!usesExpression){const data=context.tagNode.attribs.data;const componentSlots=Utils.componentInfo(context,componentName).slots;if(!componentSlots||slotName&&!componentSlots.hasOwnProperty(slotName)||!slotName&&!componentSlots.hasOwnProperty("")){issue=new context.Issue(`Template slot '${slotName?slotName:"default"}' for component ${componentName} has not been declared in the component metadata`);issue.setMsgKey(context.ruleName+"_2");context.reporter.addIssue(issue,context)}else{const slotDetail=componentSlots[slotName?slotName:""];if(!slotDetail.data){issue=new context.Issue(`Template slot '${slotName?slotName:"default"}' for component ${componentName} has not been declared with a data attribute in the component metadata`);issue.setMsgKey(context.ruleName+"_3");context.reporter.addIssue(issue,context,"minor")}else{if(!data){issue=new context.Issue(`Template slot '${slotName?slotName:"default"}' for component ${componentName} has not been bound into the page with any data context`);issue.setMsgKey(context.ruleName+"_4");context.reporter.addIssue(issue,context)}else if(!DomUtils.isExpression(data)){issue=new context.Issue(`Template slot '${slotName?slotName:"default"}' for component ${componentName} has been bound into the page with an invalid data context - should be an expression`);issue.setMsgKey(context.ruleName+"_5");context.reporter.addIssue(issue,context)}}}}}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require("path");const Utils=require("../jetwc-lib/
|
|
6
|
+
const path=require("path");const Utils=require("../jetwc-lib/jetwcutils-componentAuditUtils");const ruleDef=function(){};ruleDef.prototype.getName=function(){return"jetwc-unused-events"};ruleDef.prototype.getShortDescription=function(){return"Verify that all declared events are actually used"};ruleDef.prototype.getDescription=function(){return"This rule checks that any events declared in the metadata are then actually raised in the associated viewModel"};ruleDef.prototype.register=function(context){return{CallExpression:this._flagEventUse,closedownRP:this._doAudit}};ruleDef.prototype._flagEventUse=function(context,node){const NT=context.utils.AstUtils.getNodeTypes();if(node.callee.type===NT.MEMBER_EXPR&&node.callee.property.type===NT.IDENTIFIER&&node.callee.property.name==="dispatchEvent"){if(node.arguments[0].type===NT.CALL_EXPR||node.arguments[0].type===NT.NEW_EXPR){if(node.arguments[0].callee.name==="CustomEvent"){const eventNameNode=node.arguments[0].arguments[0];if(eventNameNode.type===NT.LITERAL){const eventName=eventNameNode.value;const componentName=Utils.matchComponentPath(context,path.dirname(context.filepath));this._markEventUsed(context,componentName,eventName)}}}}};ruleDef.prototype._doAudit=function(context){if(context.rulePack.getExtension()){const eventUsage=context.rulePack.getExtension().eventUsage;if(eventUsage){eventUsage.forEach(function(value,key){if(!value){const idParts=key.split(":");const componentName=idParts[0];const eventName=idParts[1];if(!Utils.shouldIgnoreCheck(context,"jetwc-unused-events",componentName,"events",eventName)){const issue=new context.Issue(`Event '${eventName}' for component ${componentName} does not appear to be raised`);context.reporter.addIssue(issue,context)}}})}}};ruleDef.prototype._markEventUsed=function(context,componentName,eventName){const msg=context.utils.msgLib;if(componentName){let eventUsage=context.rulePack.getExtension().eventUsage;const eventKey=`${componentName}:${eventName}`;if(!eventUsage){eventUsage=new Map;context.rulePack.getExtension().eventUsage=eventUsage}if(!eventUsage.has(eventKey)){const eventComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(eventComponentDef){if(eventComponentDef.hasOwnProperty("events")){Object.keys(eventComponentDef.events).forEach(event=>{eventUsage.set(`${componentName}:${event}`,false)})}}else{msg.error(`JETWC Error (jetwc-unused-events): component ${componentName} missing from allComponents map`)}}if(eventUsage.has(eventKey)){eventUsage.set(eventKey,true)}}else{msg.msg(`JETWC Warning (jetwc-unused-events): component event ${eventName} cannot be mapped to a component due to missing viewModel mapping`)}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require("path");const Utils=require("../jetwc-lib/
|
|
6
|
+
const path=require("path");const Utils=require("../jetwc-lib/jetwcutils-componentAuditUtils");const ruleDef=function(){};ruleDef.prototype.getName=function(){return"jetwc-unused-slots"};ruleDef.prototype.getShortDescription=function(){return"Verify that all declared slots are actually used"};ruleDef.prototype.getDescription=function(){return"This rule checks that any slots declared in the metadata are then actually used via an oj-bind-* in the associated html"};ruleDef.prototype.register=function(context){return{"<oj-bind-template-slot>":this._flagSlotUse,"<oj-bind-slot>":this._flagSlotUse,closedownRP:this._doAudit}};ruleDef.prototype._flagSlotUse=function(context){const slotName=context.tagNode.attribs.name?context.tagNode.attribs.name:"__default__";if(slotName&&!context.utils.DomUtils.isExpression(slotName)){const componentName=Utils.matchComponentPath(context,path.dirname(context.filepath));if(componentName){this._markSlotUsed(context,componentName,slotName)}}};ruleDef.prototype._doAudit=function(context){if(context.rulePack.getExtension()){const slotUsage=context.rulePack.getExtension().slotUsage;if(slotUsage){slotUsage.forEach(function(value,key){if(!value){const idParts=key.split(":");const componentName=idParts[0];const slotName=idParts[1];if(!Utils.shouldIgnoreCheck(context,"jetwc-unused-slots",componentName,"slots",slotName)){const issue=new context.Issue(`Slot '${slotName?slotName:"default"}' for component ${componentName} does not appear to be bound to the UI`);context.reporter.addIssue(issue,context)}}})}}};ruleDef.prototype._markSlotUsed=function(context,componentName,slotName){let slotUsage=context.rulePack.getExtension().slotUsage;const slotKey=`${componentName}:${slotName}`;if(!slotUsage){slotUsage=new Map;context.rulePack.getExtension().slotUsage=slotUsage}if(!slotUsage.has(slotKey)){const slotComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(slotComponentDef.hasOwnProperty("slots")){Object.keys(slotComponentDef.slots).forEach(slot=>{slotUsage.set(`${componentName}:${slot?slot:"__default__"}`,false)})}}if(slotUsage.has(slotKey)){slotUsage.set(slotKey,true)}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const Utils=require('../jetwc-lib/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-category'};ruleDef.prototype.getShortDescription=function(){return'Verify the category specified '};ruleDef.prototype.getDescription=function(){return'This rule is configured with your preferred Visual Builder component palette category'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);let category;if(meta.extension&&meta.extension.catalog){category=meta.extension.catalog.category}this._checkCategory(context,fullName,componentType,category)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let category;if(componentInfo.extension&&componentInfo.extension.catalog){category=componentInfo.extension.catalog.category}this._checkCategory(context,componentInfo.fullName,componentInfo.type,category,true)}};ruleDef.prototype._checkCategory=function(context,fullName,componentType,category,isVComponent){let issue;const ruleOptions=context.rulePack.getRuleOptions();if(ruleOptions.categories&&ruleOptions.categories.length>0){switch(componentType){case'composite':case'vbcs-pattern':if(category){if(ruleOptions.categories.filter(cat=>cat===category).length===0){issue=new context.Issue(`Component ${fullName} (${isVComponent?'vcomponent':componentType}) has an unexpected palette category set of '${category}'`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}}else{issue=new context.Issue(`Component ${fullName} (${isVComponent?'vcomponent':componentType}) does not have a palette category set`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}break;default:break;}}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require('path');const Utils=require('../jetwc-lib/
|
|
6
|
+
const path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vb-icon'};ruleDef.prototype.getShortDescription=function(){return'Verify components have icons for Visual Builder'};ruleDef.prototype.getDescription=function(){return'This rule checks that the correct icon variants are supplied for the visual builder component palette'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);const componentType=Utils.getComponentType(meta);this._checkIcon(context,fullName,componentType,meta.icon)}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._checkIcon(context,componentInfo.fullName,componentInfo.type,componentInfo.icon)}};ruleDef.prototype._checkIcon=function(context,fullName,componentType,iconDef){let issue;const inRedwood=context.utils.jafLib.getConfig().getTheme().toLowerCase()==='redwood';switch(componentType){case'composite':case'vbcs-pattern':case'vbcs-action':if(!iconDef){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'info')}else{if(!iconDef.iconPath){issue=new context.Issue(`Component ${fullName} does not have a base Visual Builder icon assigned via iconPath`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'iconPath',iconDef.iconPath,fullName)}if(inRedwood){if(iconDef.hoverIconPath){this._checkIconLocationAndFormat(context,'hoverIconPath',iconDef.hoverIconPath,fullName)}if(iconDef.iconPath&&iconDef.hoverIconPath&&iconDef.iconPath!==iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} should use the same icon for the base and hover state in the Visual Builder Redwood component palette`);issue.setMsgKey(context.ruleName+'_9');context.reporter.addIssue(issue,context,'info')}}else{if(!iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} does not have a Visual Builder icon assigned for hover (hoverIconPath)`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context,'info')}else{this._checkIconLocationAndFormat(context,'hoverIconPath',iconDef.hoverIconPath,fullName)}if(iconDef.iconPath&&iconDef.hoverIconPath&&iconDef.iconPath===iconDef.hoverIconPath){issue=new context.Issue(`Component ${fullName} uses identical icons for the base and hover state in the Visual Builder component palette`);issue.setMsgKey(context.ruleName+'_4');context.reporter.addIssue(issue,context,'info')}}}break;case'vbcs-template':if(!iconDef||!iconDef.iconPath){issue=new context.Issue(`Template ${fullName} does not have a Visual Builder icon assigned`);issue.setMsgKey(context.ruleName+'_8');context.reporter.addIssue(issue,context,'info')}break;}};ruleDef.prototype._checkIconLocationAndFormat=function(context,use,iconFile,componentName){const pathSegs=iconFile.split('/');if(pathSegs[0]!=='extension'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should be located under the /extension folder`);issue.setMsgKey(context.ruleName+'_5');context.reporter.addIssue(issue,context,'info')}if(path.extname(iconFile).toLowerCase()!=='.svg'){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} should ideally be in SVG format`);issue.setMsgKey(context.ruleName+'_6');context.reporter.addIssue(issue,context,'info')}if(context.rulePack.getExtension().allComponents.has(componentName)){const componentRoot=context.rulePack.getExtension().allComponents.get(componentName).rootFolder;if(!context.utils.fsUtils.fileExists(path.join(componentRoot,iconFile))){issue=new context.Issue(`Design time ${use} icon ${iconFile} for component ${componentName} does not exist or is outside of the component distribution`);issue.setMsgKey(context.ruleName+'_7');context.reporter.addIssue(issue,context)}}};module.exports=ruleDef;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-jetversion'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent .tsx file includes the supported JET version'};ruleDef.prototype.getDescription=function(){return'This rule checks that a vcomponent either directly, or indirectly provides the jetVersion metadata needed to indicate the support range'};ruleDef.prototype.register=function(context){return{startaudit:this._checkForApplicability,Program:this._doVComponentAudit}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){let checkVersion=componentInfo.jetVersion;if(!context.utils.semVerUtils.isValidRange(checkVersion)){if(componentInfo.inferredJetVersion){issue=new context.Issue(`Component ${componentInfo.fullName} inherits a JET version dependency from its pack that is using an invalid format (${checkVersion})`)}else{issue=new context.Issue(`Component ${componentInfo.fullName} defines a JET version dependency using an invalid format (${checkVersion})`)}issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}else{if(componentInfo.inferredJetVersion){issue=new context.Issue(`Component ${componentInfo.fullName} is using an inferred / defaulted JET version range`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'info')}}}};module.exports=ruleDef;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const{nodeModuleNameResolver}=require('typescript');const{nextTick}=require('process');let NT;const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-loader'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent has the required loader'};ruleDef.prototype.getDescription=function(){return'This rule checks that a VComponent is correctly matched with a loader.ts and that the class being exported matches the VComponent implementation'};ruleDef.prototype.register=function(context){NT=context.tsNodeTypes;return{startaudit:this._checkForApplicability,[NT.EXPORT_NAMED_DECL]:this._matchLoaderToComponents,closedownRP:this._checkForMissingLoaders}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._matchLoaderToComponents=function(context){if(context.filepath.endsWith('/loader.ts')){const loaderRoot=Utils.toNativePath(context.filepath.substring(0,context.filepath.lastIndexOf('/')));let issue;if(context.node.exportKind==='value'&&context.node.source&&context.node.source.type===NT.LITERAL){const relativeSource=Utils.toNativePath(context.node.source.value);const absoluteSource=Utils.toJAFPath(path.join(loaderRoot,`${relativeSource}.tsx`));const componentInfo=TsxUtils.matchToVComponentImpl(context,absoluteSource);if(componentInfo){componentInfo.viewModel.loaderMatch=true;const exportedClass=componentInfo.viewModel.className;if(exportedClass&&context.node.specifiers){context.node.specifiers.forEach(specifier=>{if(specifier.exported.type===NT.IDENTIFIER&&specifier.exported.name===exportedClass){componentInfo.viewModel.loaderCorrectExport=true}})}if(exportedClass&&!componentInfo.viewModel.loaderCorrectExport){const issue=new context.Issue(`The loader for component ${componentInfo.fullName} does not re-export the expected class name of ${exportedClass}`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context,'blocker')}}}}};ruleDef.prototype._checkForMissingLoaders=function(context){const allVComponents=[...context.rulePack.getExtension().allComponents].map(pair=>pair[1]).filter(componentInfo=>componentInfo.vcomponent&&!componentInfo.viewModel.loaderMatch);allVComponents.forEach(componentInfo=>{const issue=new context.Issue(`Component ${componentInfo.fullName} does not have a matching loader.ts. All VComponents must be re-exported by a loader.`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)})};module.exports=ruleDef;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const path=require('path');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-vcomponent-version'};ruleDef.prototype.getShortDescription=function(){return'Verify that a VComponent .tsx file defines a version number for the component'};ruleDef.prototype.getDescription=function(){return'This rule checks that a vcomponent either directly, or indirectly provides the version metadata needed for managing dependencies'};ruleDef.prototype.register=function(context){return{startaudit:this._checkForApplicability,Program:this._doVComponentAudit}};ruleDef.prototype._checkForApplicability=function(context){if(!context.rulePack.getExtension().precompiled){context.rulePack.disableRule()}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);let issue;if(componentInfo){if(componentInfo.version){if(!context.utils.semVerUtils.isValid(componentInfo.version)){if(componentInfo.pack&&componentInfo.inferredVersion){issue=new context.Issue(`Component ${componentInfo.fullName} inherits an invalid version number format (${componentInfo.version}) from its pack definition`)}else{issue=new context.Issue(`Component ${componentInfo.fullName} defines a version number using an invalid format (${componentInfo.version})`)}issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}else if(componentInfo.pack&&componentInfo.inferredVersion){issue=new context.Issue(`Component ${componentInfo.fullName} is inheriting a version number from its pack`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context,'info')}}else{issue=new context.Issue(`Component ${componentInfo?componentInfo.fullName:context.filepath.split('/').reverse()[0]} does not define a version number`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context)}}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const Utils=require('../jetwc-lib/
|
|
6
|
+
const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const TsxUtils=require('../jetwc-lib/jetwcutils-tsxUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-version-openrange'};ruleDef.prototype.getShortDescription=function(){return'Verify that any version ranges for dependencies have an upper bound'};ruleDef.prototype.getDescription=function(){return'This rule checks that the component is not promising to support all future JET versions or unknown future versions of dependent components'};ruleDef.prototype.register=function(context){return{compjson:this._doAudit,Program:this._doVComponentAudit}};ruleDef.prototype._doAudit=function(context){if(context.suppData.obj){let issue;const meta=context.suppData.obj;const fullName=Utils.getComponentFullName(meta);this._verifyJetVersion(context,fullName,meta.jetVersion);if(meta.dependencies){const deps=Object.keys(meta.dependencies);deps.forEach(dependency=>{const checkVersion=meta.dependencies[dependency];this._verifyDependencyVersion(context,fullName,dependency,checkVersion)})}}};ruleDef.prototype._doVComponentAudit=function(context){const componentInfo=TsxUtils.matchToVComponentImpl(context,context.filepath);if(componentInfo){this._verifyJetVersion(context,componentInfo.fullName,componentInfo.jetVersion);if(componentInfo.dependencies){componentInfo.dependencies.forEach(dependency=>{this._verifyDependencyVersion(context,componentInfo.fullName,dependency.name,dependency.range)})}}};ruleDef.prototype._hasNoUpper=function(auditContext,rangeString){let noUpper=false;if(rangeString){if(!auditContext.utils.semVerUtils.isValid(rangeString)&&auditContext.utils.semVerUtils.isValidRange(rangeString)){noUpper=auditContext.utils.semVerUtils.satisfiesRange('99999.0.0',rangeString)}}return noUpper};ruleDef.prototype._verifyJetVersion=function(auditContext,fullName,jetVersion){if(this._hasNoUpper(auditContext,jetVersion)){issue=new auditContext.Issue(`Component ${fullName} specifies a JET Range that has no upper limit '${jetVersion}'`);issue.setMsgKey(auditContext.ruleName+'_1');auditContext.reporter.addIssue(issue,auditContext)}};ruleDef.prototype._verifyDependencyVersion=function(auditContext,fullName,dependency,checkVersion){if(this._hasNoUpper(auditContext,checkVersion)){issue=new auditContext.Issue(`Component ${fullName} specifies a dependency range for ${dependency} that has no upper limit '${checkVersion}'`);issue.setMsgKey(auditContext.ruleName+'_2');auditContext.reporter.addIssue(issue,auditContext)}};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require('path');const Utils=require('../jetwc-lib/
|
|
6
|
+
const path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwc-writeback-required'};ruleDef.prototype.getShortDescription=function(){return'Verifies that properties are marked with writeback if needed'};ruleDef.prototype.getDescription=function(){return'This rule attempts to match up calls to the setProperty() api, or direct assignments to this.properties, with the properties being addressed and then verifies that they are set to writeback:true. (The properties object should not be used as a private cache for component state)'};ruleDef.prototype.register=function(context){return{CallExpression:this._doAuditOnSetProperty,AssignmentExpression:this._doAuditOnPropertyAssignment,attrexpr:this._doAuditOnPropertyHTMLRef}};ruleDef.prototype._doAuditOnSetProperty=function(context,node){let issue;const NT=context.utils.AstUtils.getNodeTypes();const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.callee.property&&node.callee.property.type===NT.IDENTIFIER&&node.callee.property.name==='setProperty'){let isStyle=false;if(node.callee.object&&node.callee.object.property&&node.callee.object.property.type===NT.IDENTIFIER&&node.callee.object.property.name==='style'){isStyle=true}let compRef=false;if(node.callee.object&&node.callee.object.object&&node.callee.object.property&&node.callee.object.property.type===NT.IDENTIFIER){if(node.callee.object.object.type===NT.THIS_EXPR||node.callee.object.object.type===NT.IDENTIFIER&&node.callee.object.object.name==='self'){compRef=true}}if(!isStyle&&compRef&&node.arguments&&node.arguments.length===2){if(node.arguments[0].type=NT.LITERAL&&node.arguments[0].value){let potentialProperty=node.arguments[0].value;if(potentialProperty.includes('.')){potentialProperty=potentialProperty.split('.')[0]}const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(potentialProperty)){if(!componentInfo.properties[potentialProperty].hasOwnProperty('writeback')||!componentInfo.properties[potentialProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' makes a call to setProperty() for the property ${potentialProperty} but this is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_1');context.reporter.addIssue(issue,context,'blocker')}}else{this._reportUndclProp(context,withinComponent,potentialProperty)}}}}};ruleDef.prototype._doAuditOnPropertyAssignment=function(context,node){let issue;const NT=context.utils.AstUtils.getNodeTypes();const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent&&node.left.type===NT.MEMBER_EXPR&&node.left.object.type===NT.MEMBER_EXPR&&node.left.object.property.name==='properties'){const setProperty=this._isContextProperties(context,node);if(setProperty){const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(setProperty)){if(!componentInfo.properties[setProperty].hasOwnProperty('writeback')||!componentInfo.properties[setProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns a value to the property ${setProperty} but this is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_2');context.reporter.addIssue(issue,context)}}else{this._reportUndclProp(context,withinComponent,setProperty)}}}};ruleDef.prototype._doAuditOnPropertyHTMLRef=function(context,attribName,attribValue,rawAttribValue){let issue;const withinComponent=Utils.matchComponentPath(context,path.dirname(context.filepath));if(withinComponent){const parser=/^(?:\{\{\$props\.|\{\{\$properties\.)(.*)(?:\}\})$/;if(attribValue.match(parser)){const expressionParts=attribValue.split(parser);const checkProperty=expressionParts[1];const componentInfo=Utils.componentInfo(context,withinComponent);if(componentInfo.properties&&componentInfo.properties.hasOwnProperty(checkProperty)){if(!componentInfo.properties[checkProperty].hasOwnProperty('writeback')||!componentInfo.properties[checkProperty].writeback){issue=new context.Issue(`Component '${withinComponent}' assigns the property '${checkProperty}' using a read-write binding to the <${context.tag}> attribute '${attribName}', however, the property is not marked as writeback in the metadata`);issue.setMsgKey(context.ruleName+'_3');context.reporter.addIssue(issue,context)}}else{this._reportUndclProp(context,withinComponent,checkProperty)}}}};ruleDef.prototype._reportUndclProp=function(context,component,property){issue=new context.Issue(`Component '${component}' makes a call to setProperty() or cached context.properties for an undeclared property ${property}`);issue.setMsgKey(context.ruleName+'_4');context.reporter.addIssue(issue,context,'blocker')};ruleDef.prototype._isContextProperties=function(context,node){let assignedProperty;let assignmentChain=Utils.decomposeAssignment(context,node);const assignmentRoot=assignmentChain.pop();const assignmentSecondary=assignmentChain.pop();if(assignmentRoot==='this'||assignmentRoot==='<parameter>'&&assignmentSecondary==='context'){assignedProperty=assignmentChain[0]}return assignedProperty};module.exports=ruleDef;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
{"jetwc-component-foldername":"0010","jetwc-component-location_1":"0011","jetwc-component-location_2":"0012","jetwc-pack-children_1":"0013","jetwc-pack-children_2":"0014","jetwc-pack-children_3":"0015","jetwc-pack-children_4":"0016","jetwc-packable-components_1":"0017","jetwc-packable-components_2":"0018","jetwc-packable-components_3":"0019","jetwc-component-dependencies_1":"0021","jetwc-component-dependencies_2":"0022","jetwc-component-dependencies_3":"0023","jetwc-component-dependencies_4":"0024","jetwc-component-dependencies_5":"0025","jetwc-prerelease-version":"0026","jetwc-prerelease-dependencies":"0027","jetwc-namespace":"0029","jetwc-vb-category_1":"0030","jetwc-vb-category_2":"0031","jetwc-jet-version_1":"0033","jetwc-jet-version_2":"0034","jetwc-absolute-jetversion":"0035","jetwc-semantic-version":"0040","jetwc-standard-files":"0041","jetwc-loader-file_1":"
|
|
6
|
+
{"jetwc-component-foldername":"0010","jetwc-component-location_1":"0011","jetwc-component-location_2":"0012","jetwc-pack-children_1":"0013","jetwc-pack-children_2":"0014","jetwc-pack-children_3":"0015","jetwc-pack-children_4":"0016","jetwc-packable-components_1":"0017","jetwc-packable-components_2":"0018","jetwc-packable-components_3":"0019","jetwc-component-dependencies_1":"0021","jetwc-component-dependencies_2":"0022","jetwc-component-dependencies_3":"0023","jetwc-component-dependencies_4":"0024","jetwc-component-dependencies_5":"0025","jetwc-prerelease-version":"0026","jetwc-prerelease-dependencies":"0027","jetwc-namespace":"0029","jetwc-vb-category_1":"0030","jetwc-vb-category_2":"0031","jetwc-jet-version_1":"0033","jetwc-jet-version_2":"0034","jetwc-absolute-jetversion":"0035","jetwc-semantic-version":"0040","jetwc-standard-files":"0041","jetwc-loader-file_1":"0044","jetwc-loader-file_2":"0045","jetwc-loader-file_3":"0046","jetwc-loader-file_4":"0047","jetwc-version-openrange_1":"0048","jetwc-version-openrange_2":"0049","jetwc-displayname_1":"0050","jetwc-displayname_2":"0051","jetwc-nls-root":"0052","jetwc-require-paths":"0053","jetwc-vb-icon_1":"0054","jetwc-vb-icon_2":"0055","jetwc-vb-icon_3":"0056","jetwc-vb-icon_4":"0057","jetwc-vb-icon_5":"0058","jetwc-vb-icon_6":"0059","jetwc-vb-icon_7":"0060","jetwc-vb-icon_8":"0061","jetwc-template-slots_1":"0062","jetwc-template-slots_2":"0063","jetwc-template-slots_3":"0064","jetwc-template-slots_4":"0065","jetwc-template-slots_5":"0066","jetwc-slots_1":"0067","jetwc-slots_2":"0068","jetwc-events_1":"0069","jetwc-events_2":"0070","jetwc-property-nesting":"0071","jetwc-nls-languages_1":"0072","jetwc-nls-languages_2":"0073","jetwc-nls-languages_3":"0074","jetwc-nls-languages_4":"0075","jetwc-event-displayname":"0076","jetwc-methods_1":"0077","jetwc-methods_2":"0078","jetwc-property-changed":"0079","jetwc-writeback-required_1":"0080","jetwc-writeback-required_2":"0081","jetwc-writeback-required_3":"0082","jetwc-writeback-required_4":"0083","jetwc-oj-register":"0084","jetwc-register-with-promises":"0085","jetwc-register-css":"0086","jetwc-deprecated-lifecycle":"0087","jetwc-aria-redefinition":"0088","jetwc-public-modules_1":"0089","jetwc-public-modules_2":"0090","jetwc-disabled-property":"0091","jetwc-reserved-property":"0092","jetwc-prerelease-pattern":"0093","jetwc-ojcss":"0094","jetwc-vb-icon_9":"0095","jetwc-component-location_3":"0096","jetwc-dynamic-slot-context":"0097","jetwc-dynamic-slots-naming":"0098","jetwc-unused-slots":"0099","jetwc-unused-events":"0100","jetwc-compjson-bp-obj":"0101","jetwc-compjson-bp-ar":"0102","jetwc-method-displayname":"0103","jetwc-slot-displayname":"0104","jetwc-component-displayname":"0105","jetwc-property-displayname":"0106","jetwc-data-property-prefix":"0107","jetwc-schema":"0108","jetwc-component-type":"0109","jetwc-subproperty-writeback":"0111","jetwc-nested-defaults":"0112","jetwc-required-subproperty":"0113","jetwc-vcomponent-jetversion_1":"0120","jetwc-vcomponent-jetversion_2":"0121","jetwc-vcomponent-version_1":"0130","jetwc-vcomponent-version_2":"0131","jetwc-vcomponent-version_3":"0132","jetwc-vcomponent-loader_1":"0140","jetwc-vcomponent-loader_2":"0141","jetwc-markdown-link_1":"0150","jetwc-markdown-link_2":"0151","jetwc-css-oj-complete":"0160"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
{"title":"Extended Audit Rules for JET Custom Component Authors","prefix":"JETWC","version":"1.
|
|
6
|
+
{"title":"Extended Audit Rules for JET Custom Component Authors","prefix":"JETWC","version":"1.17.0","rules":{"jetwc-bootstrap":{"group":"jetwc-do-not-disable","enabled":true,"severity":"info","debug":false,"diagnosticFile":"jetwc-diagnostics","componentRoot":"jet-composites","auditBuildOutput":false,"testMode":false,"$required":true,"filetype":["tsx"]},"jetwc-component-foldername":{"group":"jetwc-structure","severity":"blocker","filetype":["json","tsx"]},"jetwc-component-location":{"group":"jetwc-structure","severity":"blocker","filetype":["json","tsx"]},"jetwc-pack-children":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json"]},"jetwc-packable-components":{"group":"jetwc-structure","severity":"blocker","filetype":["json"]},"jetwc-component-dependencies":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json","tsx"]},"jetwc-prerelease-version":{"group":"jetwc-pre-release","severity":"info","filetype":["json","tsx"]},"jetwc-prerelease-dependencies":{"group":"jetwc-pre-release","severity":"info","filetype":["json","tsx"]},"jetwc-namespace":{"group":"jetwc-api","enabled":false,"namespaces":[],"severity":"blocker","filetype":["json","tsx"]},"jetwc-vb-category":{"group":"jetwc-vb","enabled":false,"categories":[],"severity":"minor","filetype":["json","tsx"]},"jetwc-jet-version":{"group":"jetwc-pre-release","enabled":false,"versionMatch":"upperLimit","severity":"blocker","filetype":["json","tsx"]},"jetwc-absolute-jetversion":{"group":"jetwc-dependencies","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-semantic-version":{"group":"jetwc-dependencies","severity":"blocker","filetype":["json","tsx"]},"jetwc-standard-files":{"group":"jetwc-structure","enabled":true,"files":["README.md","CHANGELOG.md"],"severity":"info","filetype":["json","tsx"]},"jetwc-loader-file":{"group":["jetwc-structure","jet-js"],"enabled":true,"severity":"critical","filetype":["json","js","ts","tsx"]},"jetwc-version-openrange":{"group":"jetwc-dependencies","severity":"major","filetype":["json","tsx"]},"jetwc-displayname":{"group":"jetwc-vb","enabled":true,"limits":{"component":{"length":30,"words":4},"property":{"length":30,"words":4},"event":{"length":30,"words":4},"slot":{"length":30,"words":4},"template":{"length":40,"words":8}},"severity":"info","filetype":["json","tsx"]},"jetwc-nls-root":{"group":"jetwc-nls","enabled":true,"severity":"info","filetype":["js","ts","tsx"]},"jetwc-require-paths":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","standardPaths":["require","exports","ojs","knockout","hammerjs","persist","jquery","vb","preact"],"filetype":["js","ts","tsx"]},"jetwc-vb-icon":{"group":"jetwc-vb","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwc-template-slots":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html","tsx"]},"jetwc-slots":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html","tsx"]},"jetwc-events":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts","tsx"]},"jetwc-property-nesting":{"group":"jetwc-api","enabled":true,"depth":3,"severity":"minor","filetype":["json","tsx"]},"jetwc-nls-languages":{"group":"jetwc-nls","enabled":false,"locales":[],"strict":false,"severity":"major","filetype":["js","ts"]},"jetwc-event-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-nested-defaults":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json","tsx"]},"jetwc-methods":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-property-changed":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-writeback-required":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-oj-register":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-register-with-promises":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-register-css":{"group":"jetwc-deprecations","enabled":true,"severity":"minor","filetype":["js","ts"]},"jetwc-deprecated-lifecycle":{"group":"jetwc-deprecations","enabled":true,"severity":"major","filetype":["js","ts"]},"jetwc-aria-redefinition":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-public-modules":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json"]},"jetwc-disabled-property":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-reserved-property":{"group":"jetwc-api","enabled":true,"severity":"major","reserved":["slot","key","ref","children"],"filetype":["json","tsx"]},"jetwc-prerelease-pattern":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-ojcss":{"group":"jetwc-theming","enabled":true,"severity":"minor","filetype":["js","ts","tsx"]},"jetwc-dynamic-slot-context":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["json"]},"jetwc-dynamic-slots-naming":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-unused-slots":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["html"]},"jetwc-unused-events":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["js","ts"]},"jetwc-compjson-bp-obj":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-compjson-bp-ar":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-component-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-method-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-property-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-slot-displayname":{"group":"jetwc-vb","enabled":true,"severity":"info","filetype":["json","tsx"]},"jetwc-data-property-prefix":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json","tsx"]},"jetwc-schema":{"group":"jetwc-api","enabled":true,"severity":"blocker","filetype":["json"]},"jetwc-component-type":{"group":"jetwc-api","enabled":true,"severity":"info","filetype":["json"]},"jetwc-subproperty-writeback":{"group":"jetwc-api","enabled":true,"severity":"major","filetype":["html"]},"jetwc-required-subproperty":{"group":"jetwc-api","enabled":true,"severity":"minor","filetype":["json"]},"jetwc-vcomponent-jetversion":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","filetype":["tsx"]},"jetwc-vcomponent-version":{"group":"jetwc-dependencies","enabled":true,"severity":"blocker","filetype":["tsx"]},"jetwc-vcomponent-loader":{"group":"jetwc-structure","enabled":true,"severity":"blocker","filetype":["ts"]},"jetwc-markdown-link":{"group":"jetwc-doc","enabled":true,"severity":"minor","filetype":["md"]},"jetwc-css-oj-complete":{"group":"jetwc-css","enabled":true,"severity":"major","filetype":["css"]}}}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const path=require('path');const NetUtils=require('../../lib/NetUtils');const AuditComponentCacheManager=function(context,ruleName,exchangeURL){const msg=context.utils.msgLib;this.cacheFolder=`jaftmp@-${context.rulePack.getPrefix()}`;this.fsUtils=context.utils.fsUtils;this.exchangeURL=exchangeURL;this.ruleName=ruleName;this._ensureLocalCache();this.baselineOpts=context.rulePack.getRuleOption('baseline',ruleName);if(this.baselineOpts&&Object.entries(this.baselineOpts).length>0){this.baselineIndexFileName=path.join(this.cacheFolder,`${this._getObjectHashSignature(this.baselineOpts)}.json`)}else{this.baselineIndexFileName=null}};AuditComponentCacheManager.prototype.isBaselineIndexAvailable=function(){return this.baselineIndexFileName!==null};AuditComponentCacheManager.prototype.getBaselineOpts=function(){return this.baselineOpts};AuditComponentCacheManager.prototype.readComponentCacheIndexFile=function(){if(this.baselineIndexFileName){if(this.fsUtils.fileExistsSync(this.baselineIndexFileName)){return this.fsUtils.readJsonSync(this.baselineIndexFileName)}else{return{}}}else{return}};AuditComponentCacheManager.prototype.writeComponentCacheIndexFile=function(index){if(this.baselineIndexFileName){this.fsUtils.writeJsonSync(index,this.baselineIndexFileName)}};AuditComponentCacheManager.prototype.removeLocalCache=function(){if(this.fsUtils.pathExistsSync(this.cacheFolder)){this.fsUtils.deleteFolderSync(this.cacheFolder,true)}};AuditComponentCacheManager.prototype.generateComponentCachePath=function(component,componentVersion){const mungedVersion=componentVersion.replace(/\./g,'-');return path.join(this.cacheFolder,`${component}@${mungedVersion}-component.json`)};AuditComponentCacheManager.prototype.existsInComponentCache=function(component,componentVersion){const cacheFile=this.generateComponentCachePath(component,componentVersion);return this.fsUtils.fileExistsSync(cacheFile)};AuditComponentCacheManager.prototype.writeToComponentCache=function(component,componentVersion,metadata){if(metadata){const cacheFile=this.generateComponentCachePath(component,componentVersion);this.fsUtils.writeJsonSync(metadata,cacheFile)}};AuditComponentCacheManager.prototype.readFromComponentCache=function(component,componentVersion){const cacheFile=this.generateComponentCachePath(component,componentVersion);return this.fsUtils.readJsonSync(cacheFile)};AuditComponentCacheManager.prototype.getComponentMetadata=function(component,componentVersion){if(this.existsInComponentCache(component,componentVersion)){return this.readFromComponentCache(component,componentVersion)}else{try{const netUtils=new NetUtils;const getResp=netUtils.loadUrl(`${this.exchangeURL}components/${component}/versions/${componentVersion}`);if(getResp.statusCode=200&&getResp.body){const cachedDef=JSON.parse(getResp.body).component;this.writeToComponentCache(component,componentVersion,cachedDef);return cachedDef}else{this.msg.error(`The exchange component ${component}@${componentVersion} needed by the rule ${this.ruleName} cannot be retrieved, ensure it is public`)}}catch(e){this.msg.error(`Unable to read component ${component}@${componentVersion} for rule ${this.ruleName}:\n${JSON.stringify(e)}`)};}return};AuditComponentCacheManager.prototype._ensureLocalCache=function(){if(!this.fsUtils.pathExistsSync(this.cacheFolder)){this.fsUtils.createFolderSync(this.cacheFolder)}};AuditComponentCacheManager.prototype._getObjectHashSignature=function(sourceObject){const sourceAsStringArray=Array.from(JSON.stringify(sourceObject));return sourceAsStringArray.reduce((hash,c)=>Math.imul(31,hash)+c.charCodeAt(0)|0,0)};module.exports=AuditComponentCacheManager;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const NetUtils=require('../../lib/NetUtils');const EXCHANGE_URL_OPTION='exchangeURL';function checkForExchangeConfiguration(auditContext){const{msgLib}=auditContext.utils;let exchangeURL;if(auditContext.rulePack.getRuleOptions()){exchangeURL=auditContext.rulePack.getRuleOptions()[EXCHANGE_URL_OPTION]}if((!exchangeURL||exchangeURL.length===0)&&auditContext.rulePack.getExtension()){exchangeURL=auditContext.rulePack.getExtension()[EXCHANGE_URL_OPTION]}if(exchangeURL&&exchangeURL.length>0){exchangeURL=exchangeURL.endsWith('/')?exchangeURL:`${exchangeURL}/`;const netUtils=new NetUtils;const statusResp=netUtils.loadUrl(`${exchangeURL}status`);if(statusResp.statusCode===200){return exchangeURL}else{msgLib.error(`The supplied ${EXCHANGE_URL_OPTION} value '${this.exchangeURL}' for the rule ${auditContext.ruleName} does not appear to be valid, the rule will be disabled`);auditContext.rulePack.disableRule();return}}else{msgLib.error(`The ${EXCHANGE_URL_OPTION} configuration option has not been defined for rule ${auditContext.ruleName}, the rule will be disabled`);auditContext.rulePack.disableRule();return}}module.exports={checkForExchangeConfiguration};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const path=require('path');const Utils=function(){this.rootPoint=this.toJAFPath(path.resolve('.')).length+1;this.isWindows=path.sep!=='/';this.noJSWarnDone=false};Utils.prototype.getKeyPathInfoForRulepack=function(context,auditBase){const paths={isBuiltOutput:false,componentRootFolder:null,exchangeCacheFolder:null,generalSourceRoot:'src',jsSource:null,tsSource:null,base:null};let jetConfig=context.ojetConfig;if(!jetConfig&&auditBase){const remoteConfig=path.join(auditBase,'oraclejetconfig.json');if(context.utils.fsUtils.pathExistsSync(remoteConfig)){jetConfig=context.utils.fsUtils.readJsonSync(remoteConfig)}}let jsDir='js';let tsDir='ts';paths.isBuiltOutput=context.rulePack.getRuleOptions().auditBuildOutput;paths.base=path.resolve(auditBase);if(jetConfig){jsDir=jetConfig.paths.source.javascript||'js';tsDir=jetConfig.paths.source.typescript||'ts';paths.exchangeCacheFolder=jetConfig.paths.source.exchangeComponents||'jet_components';paths.componentRootFolder=jetConfig.paths.source.components||'jet-composites';if(!paths.isBuiltOutput){paths.generalSourceRoot=jetConfig.paths.source.common||'src'}else{paths.generalSourceRoot=jetConfig.paths.staging.web||'web'}}paths.jsSource=this.toJAFPath(path.join(paths.generalSourceRoot,jsDir));if(!paths.isBuiltOutput){paths.tsSource=this.toJAFPath(path.join(paths.generalSourceRoot,tsDir))}return paths};Utils.prototype.matchComponentPath=function(context,checkPathBase,recursion){let checkPath=this.toJAFPath(checkPathBase);let componentMatch;if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allAuditableFilePaths')){if(context.rulePack.getExtension().allAuditableFilePaths.has(checkPath)){const x=context.rulePack.getExtension().allAuditableFilePaths;componentMatch=context.rulePack.getExtension().allAuditableFilePaths.get(checkPath)}else if(checkPath.includes(context.rulePack.getExtension().componentHome)){if(context.rulePack.getExtension().auditableComponentPaths.has(checkPath)){componentMatch=context.rulePack.getExtension().auditableComponentPaths.get(checkPath)}else{const parentPath=path.resolve(checkPathBase,'..'+path.sep);componentMatch=this.matchComponentPath(context,parentPath,true)}if(!recursion){context.rulePack.getExtension().allAuditableFilePaths.set(checkPath,componentMatch)}}else{context.rulePack.getExtension().allAuditableFilePaths.set(checkPath)}}else{this.reportMissingBootstrapInfo(context,'allAuditableFilePaths')}return componentMatch};Utils.prototype.reportMissingBootstrapInfo=function(context,checkTopic){const msg=context.utils.msgLib;const extnContext=context.rulePack.getExtension();if(!extnContext||!extnContext.bootStrap){const bootstrapRule=context.rulePack.getPrefix().toLowerCase()+'-bootstrap';if(context.rulePack.isRuleDisabled(bootstrapRule)){msg.error(`You must enable the ${bootstrapRule} rule to run in order to carry out a full component set audit`)}else{msg.error(`Apparent bootstrap error, no information cached for ${checkTopic}`)}context.rulePack.setExtension({...extnContext,bootStrap:true})}};Utils.prototype.componentInfo=function(context,componentName){if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allComponents')){return context.rulePack.getExtension().allComponents.get(componentName)}else{this.reportMissingBootstrapInfo(context,'allComponents')}return};Utils.prototype.getComponentFullName=function(metadata){return metadata.pack?`${metadata.pack}-${metadata.name}`:metadata.name};Utils.prototype.getComponentType=function(metadata){return metadata.type?metadata.type:'composite'};Utils.prototype.flattenComponentProperties=function(metaDef,valueAttribute,parentPath){let flattenedProps=[];if(metaDef.hasOwnProperty('properties')){const propArray=Object.keys(metaDef.properties);propArray.forEach(propertyName=>{let key;if(!parentPath){key=propertyName}else{key=parentPath+'.'+propertyName}flattenedProps.push({key:key,value:metaDef.properties[propertyName][valueAttribute]});const subPropsArray=this.flattenComponentProperties(metaDef.properties[propertyName],valueAttribute,key);flattenedProps=flattenedProps.concat(subPropsArray)})}return flattenedProps};Utils.prototype.setupFileMethodMapping=function(context,node){const NT=context.utils.AstUtils.getNodeTypes();const fileName=context.filepath;const withinComponent=this.matchComponentPath(context,path.dirname(fileName));if(withinComponent){if(node.parent&&node.parent.type===NT.ASSIGNMENT_EXPR&&node.parent.operator==='='){if(node.parent.left&&node.parent.left.property&&node.parent.left.property.type==NT.IDENTIFIER&&node.parent.left.property.name){const methodDef={name:node.parent.left.property.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}else if(node.parent&&node.parent.type===NT.METH_DEF&&node.parent.kind==='method'){if(node.parent.key&&node.parent.key.name){const methodDef={name:node.parent.key.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}else if(node.parent&&node.parent.type===NT.CLASS_PROP){if(node.parent.key&&node.parent.key.name){const methodDef={name:node.parent.key.name,parameters:node.params?node.params.length:0};this.cacheFileMethod(context,fileName,methodDef)}}}};Utils.prototype.setupFileMethodMappingFromMethodDefintion=function(context,node){const NT=context.utils.AstUtils.getNodeTypes();const fileName=context.filepath;const withinComponent=this.matchComponentPath(context,path.dirname(fileName));if(withinComponent){const methodDef={parameters:0};if(node.key&&node.key.type===NT.IDENTIFIER){methodDef.name=node.key.name;if(node.value&&node.value.type===NT.FUNC_EXPR&&node.value.params){methodDef.parameters=node.value.params.length}}if(methodDef.name){this.cacheFileMethod(context,fileName,methodDef)}}};Utils.prototype.cacheFileMethod=function(context,filePath,methodDef){if(!context.rulePack.getExtension().allDefinedFileMethods){context.rulePack.getExtension().allDefinedFileMethods=new Map}if(!context.rulePack.getExtension().allDefinedFileMethods.has(filePath)){context.rulePack.getExtension().allDefinedFileMethods.set(filePath,{methods:new Map})}if(!context.rulePack.getExtension().allDefinedFileMethods.get(filePath).methods.has(methodDef.name)){context.rulePack.getExtension().allDefinedFileMethods.get(filePath).methods.set(methodDef.name,methodDef)}};Utils.prototype.deriveViewModels=function(context,node){const fileName=context.filepath;if(context.rulePack.getExtension()&&context.rulePack.getExtension().hasOwnProperty('allComponents')){const withinComponent=this.matchComponentPath(context,path.dirname(fileName));const componentInfo=context.rulePack.getExtension().allComponents.get(withinComponent);if(withinComponent&&componentInfo&&componentInfo.type==='composite'&&!componentInfo.viewModel.resolved){const targetLoaderExt=componentInfo.language==='tsx'?'.ts':`.${componentInfo.language}`;if(path.basename(fileName,targetLoaderExt)==='loader'){switch(componentInfo.language){case'js':case'ts':const registerInfo=this.getLoaderRegisterInfo(context,node);if(registerInfo){const vmRelativeFilePath=this._mapVMToImpl(context,node,registerInfo.viewModel,componentInfo.language==='ts');if(vmRelativeFilePath){const fullVMPath=this._expandPathInContext(context,withinComponent,vmRelativeFilePath);if(fullVMPath){componentInfo.viewModel={path:this.toJAFPath(path.resolve('.',`${fullVMPath}.${componentInfo.language}`)),resolved:true,skip:false}}}}break;case'tsx':break;}}}}else{this.reportMissingBootstrapInfo(context,'allComponents')}};Utils.prototype.getLoaderRegisterInfo=function(context,node){const msg=context.utils.msgLib;const NT=context.utils.AstUtils.getNodeTypes();let registerInfo;if(node.callee.type=NT.MEMBER_EXPR&&node.callee.object&&node.arguments&&node.arguments.length>0){let isRegister=false;let oldStyle=false;switch(node.callee.object.type){case NT.IDENTIFIER:if(node.callee.object.name==='Composite'){isRegister=this._astPropertyIdentifierName(context,node.callee,'register')}break;case NT.MEMBER_EXPR:if(node.callee.property&&node.callee.property.type===NT.IDENTIFIER&&node.callee.property.name==='register'){if(this._astPropertyIdentifierName(context,node.callee.object,'Composite')){isRegister=node.callee.object.object&&node.callee.object.object.type===NT.IDENTIFIER&&node.callee.object.object.name==='oj';if(isRegister){oldStyle=true}}}break;}if(isRegister){registerInfo={oldStyle:oldStyle};const tagArg=node.arguments[0];const def=node.arguments[1];registerInfo.tag=tagArg.type===NT.LITERAL?tagArg.value:'?';if(def.type===NT.OBJ_EXPR){vmProp=def.properties.filter(prop=>prop.key.name==='viewModel');if(vmProp.length===1){switch(vmProp[0].value.type){case NT.IDENTIFIER:registerInfo.viewModel=vmProp[0].value.name;break;case NT.OBJ_EXPR:if(vmProp[0].value.properties&&vmProp[0].value.properties[0]&&vmProp[0].value.properties[0].key.name==='inline'){registerInfo.viewModel=vmProp[0].value.properties[0].value.name;registerInfo.usesPromises=true}break;case NT.MEMBER_EXPR:if(vmProp[0].value.property&&vmProp[0].value.property.type===NT.IDENTIFIER){registerInfo.viewModel=vmProp[0].value.object.name;registerInfo.transpiled=true}break;case'TSAsExpression':if(vmProp[0].value.expression&&vmProp[0].value.expression.type===NT.IDENTIFIER){registerInfo.viewModel=vmProp[0].value.expression.name}else if(vmProp[0].value.expression&&vmProp[0].value.expression.type===NT.AS_EXPR){registerInfo.viewModel=vmProp[0].value.expression.expression.name;msg.msg(`WARNING: Component loader file ${context.filepath} attempts to redefine the composite.register viewModel interface`)}break;}}const cssCheck=def.properties.filter(prop=>prop.key.name==='css');if(cssCheck.length>0){registerInfo.registerCSS=true}}}}return registerInfo};Utils.prototype._astPropertyIdentifierName=function(context,node,checkName){const NT=context.utils.AstUtils.getNodeTypes();return node&&node.property&&node.property.type===NT.IDENTIFIER&&node.property.name===checkName};Utils.prototype._mapVMToImpl=function(context,node,vmName,useImports){let vmPathDef;if(vmName){let rootNode=node;if(useImports){vmPathDef=this._getImportPath(context,rootNode,vmName)}else{vmPathDef=this._getDefineStatementPath(context,rootNode,vmName);if(!vmPathDef){vmPathDef=this._mapToRequireAssignment(context,node,vmName)}}}return vmPathDef};Utils.prototype._mapToRequireAssignment=function(context,node,vmName){const NT=context.utils.AstUtils.getNodeTypes();let requirePath;const vmDeclNode=this._locateDeclaration(context,node,vmName);if(vmDeclNode.type===NT.CALL_EXPR&&vmDeclNode.callee.type===NT.IDENTIFIER&&vmDeclNode.callee.name==='require'){if(vmDeclNode.arguments&&vmDeclNode.arguments.length===1&&vmDeclNode.arguments[0].type===NT.LITERAL){requirePath=vmDeclNode.arguments[0].value}}return requirePath};Utils.prototype._getImportPath=function(context,node,importAs){const NT=context.utils.AstUtils.getNodeTypes();const bodyNodeArray=context.utils.AstUtils.getBody();let definePath;for(let i=0;i<bodyNodeArray.length;i++){const testNode=bodyNodeArray[i];switch(testNode.type){case'ImportDeclaration':if(testNode.specifiers&&Array.isArray(testNode.specifiers)&&testNode.specifiers.length===1&&(testNode.specifiers[0].type===NT.IMPORT_DEF_SPECIFIER||testNode.specifiers[0].type===NT.IMPORT_SPECIFIER)&&testNode.specifiers[0].local&&testNode.specifiers[0].local.name===importAs){definePath=testNode.source.value}break;case'TSImportEqualsDeclaration':if(testNode.id&&testNode.id.type===NT.IDENTIFIER&&testNode.id.name===importAs&&testNode.moduleReference&&testNode.moduleReference.type===NT.EXTERN_MOD_REF&&testNode.moduleReference.expression&&testNode.moduleReference.expression.type===NT.LITERAL){definePath=testNode.moduleReference.expression.value}break;}if(definePath){;break}}return definePath};Utils.prototype._getDefineStatementPath=function(context,node,defineParam){const NT=context.utils.AstUtils.getNodeTypes();let checkNode=node.parent;let definePath;while(checkNode){if(checkNode.type===NT.CALL_EXPR&&checkNode.callee.name==='define'){definePath=context.utils.AstUtils.parseDefine(checkNode)[defineParam]}checkNode=checkNode.parent}return definePath};Utils.prototype._expandPathInContext=function(context,componentName,requirePath){let targetPath=requirePath;const parsePluginParts=requirePath.split('!');if(parsePluginParts.length>1){targetPath=parsePluginParts[1]}let pathParts=targetPath.split('/');const decodeRoot=pathParts[0];if(decodeRoot==='.'){pathParts[0]=this.rootPathForComponent(context,componentName)}else{const remotePart=this.rootPathForComponent(context,decodeRoot);if(!remotePart){pathParts=[]}else{pathParts[0]=remotePart}}return pathParts.join('/')};Utils.prototype.rootPathForComponent=function(context,componentName){if(context.rulePack.getExtension().allComponents.has(componentName)){return context.rulePack.getExtension().allComponents.get(componentName).rootFolder}};Utils.prototype.getVMMethodsForLocalComposite=function(context,component){let vmMethods;const msg=context.utils.msgLib;const opts=context.rulePack.getRuleOptions();if(component.local&&component.type==='composite'){if(!component.viewModel.skip){if(!component.viewModel.resolved&&!component.viewModel.warned){if(!opts.testMode){msg.msg(`Warning: unable to derive the correct viewModel implementation for component ${component.fullName}, either your audit run does not include .js/.ts files, or you may need to set 'extension.audit.jetwc.viewModel' in the metadata to provide a hint`)}component.viewModel.warned=true}else{const rpState=context.rulePack.getExtension();if(rpState.allDefinedFileMethods&&rpState.allDefinedFileMethods.size>0){const vmMethodDef=rpState.allDefinedFileMethods.get(component.viewModel.path);if(vmMethodDef){vmMethods=vmMethodDef.methods}}else{if(!this.noJSWarnDone){msg.msg('Error: No JavaScript / TypeScript files have been processed. You need to ensure that your audit fileset includes .js, .ts, html and .json files to enable all audits in this rule-set. Use the ojaf --dryrun command to determine what files are covered by the audit');this.noJSWarnDone=true}}}}}return vmMethods};Utils.prototype.decomposeAssignment=function(auditContext,assignmentNode){const NT=auditContext.utils.AstUtils.getNodeTypes();const breakdown=[];this._walkAssignmentNodes(auditContext,assignmentNode.left,breakdown);if(!breakdown.includes('this')){const parentAssignment=breakdown[breakdown.length-1];const initialAssignmentNode=this._locateDeclaration(auditContext,assignmentNode,parentAssignment);if(initialAssignmentNode){if(initialAssignmentNode==='<parameter>'){breakdown.push('<parameter>')}else if(initialAssignmentNode.type===NT.THIS_EXPR){breakdown.push('this')}else if(initialAssignmentNode.type===NT.IDENTIFIER){breakdown.push(initialAssignmentNode.name);const indirectAssignmentNode=this._locateDeclaration(auditContext,assignmentNode,initialAssignmentNode.name);if(indirectAssignmentNode==='<parameter>'){breakdown.push('<parameter>')}else if(indirectAssignmentNode.type===NT.THIS_EXPR){breakdown.push('this')}}}}return breakdown};Utils.prototype._walkAssignmentNodes=function(context,node,accumulator){const NT=context.utils.AstUtils.getNodeTypes();switch(node.type){case NT.MEMBER_EXPR:accumulator.push(node.property.name);if(node.object){this._walkAssignmentNodes(context,node.object,accumulator)}break;case NT.IDENTIFIER:accumulator.push(node.name);break;case NT.THIS_EXPR:accumulator.push('this');break;}};Utils.prototype._locateDeclaration=function(context,node,searchVariable){const NT=context.utils.AstUtils.getNodeTypes();let initialAssignment;let workingNode=node;while(!initialAssignment){if(workingNode.body&&workingNode.body.length>0){workingNode.body.forEach(bodyNode=>{if(bodyNode.type===NT.VAR_DECLARATION){bodyNode.declarations.forEach(declNode=>{if(declNode.id.type===NT.IDENTIFIER&&declNode.id.name===searchVariable){initialAssignment=declNode.init}})}})}else if(workingNode.params&&workingNode.params.length>0){workingNode.params.forEach(paramNode=>{if(paramNode.name===searchVariable){initialAssignment='<parameter>'}})}if(!workingNode.parent){break}else{workingNode=workingNode.parent}}return initialAssignment};Utils.prototype.extractComponentInfoFromJSONFile=function(auditContext,componentFolder,fileName,isLocal,fromPrecompile){const msg=auditContext.utils.msgLib;let componentInfo={};const mdFile=`${componentFolder}/${fileName}`;const compMetadata=auditContext.utils.fsUtils.readJsonSync(mdFile);if(compMetadata!==null){componentInfo.name=compMetadata.name;componentInfo.pack=compMetadata.pack;if(fromPrecompile&&compMetadata.pack){if(compMetadata.name.startsWith(`${compMetadata.pack}-`)){componentInfo.name=compMetadata.name.substring(compMetadata.pack.length+1)}}componentInfo.fullName=componentInfo.pack?`${componentInfo.pack}-${componentInfo.name}`:componentInfo.name;componentInfo.displayName=compMetadata.displayName;componentInfo.description=compMetadata.description;componentInfo.version=compMetadata.version;componentInfo.jetVersion=compMetadata.jetVersion;componentInfo.extension=compMetadata.extension;if(compMetadata.icon){componentInfo.icon=compMetadata.icon}componentInfo.type=compMetadata.type?compMetadata.type:'composite';componentInfo.local=isLocal;componentInfo.rootFolder=this.toJAFPath(componentFolder);componentInfo.requirePaths=new Set;switch(componentInfo.type){case'reference':if(compMetadata.extension&&compMetadata.extension.oracle&&compMetadata.extension.oracle.businessApprovals){componentInfo.ba=compMetadata.extension.oracle.businessApprovals}if(compMetadata.paths&&compMetadata.paths.name){componentInfo.requirePaths.add(compMetadata.paths.name)}else{const extractPathSegments=compMetadata.package.split('/');if(extractPathSegments.length>1){componentInfo.requirePaths.add(extractPathSegments[1])}else{componentInfo.requirePaths.add(extractPathSegments[0])}}break;case'composite':if(compMetadata.slots){componentInfo.slots=compMetadata.slots}if(compMetadata.properties){componentInfo.properties=compMetadata.properties}if(compMetadata.events){componentInfo.events=compMetadata.events}if(compMetadata.methods&&Object.keys(compMetadata.methods).length>0){componentInfo.methods=compMetadata.methods}componentInfo.viewModel={resolved:false};if(compMetadata&&compMetadata.extension&&compMetadata.extension.audit&&compMetadata.extension.audit.jetwc&&compMetadata.extension.audit.jetwc.hasOwnProperty('viewModel')){const overrideVM=compMetadata.extension.audit.jetwc.viewModel;if(overrideVM){componentInfo.viewModel={path:this.toJAFPath(path.resolve('.',componentInfo.rootFolder,overrideVM)),resolved:true,skip:false}}else{componentInfo.viewModel={skip:true}}}case'resource':componentInfo.requirePaths.add('.');if(compMetadata.pack){componentInfo.requirePaths.add(`${componentInfo.pack}/${componentInfo.name}`)}else{componentInfo.requirePaths.add(componentInfo.name)}if(compMetadata.dependencies){componentInfo.dependencies=[];Object.keys(compMetadata.dependencies).forEach(depname=>{componentInfo.dependencies.push({name:depname,range:compMetadata.dependencies[depname]})})}break;}return componentInfo}else{msg.error(`Invalid JSON in component metadata ${mdFile}, component ignored`)}return};Utils.prototype.diagnosticReplacer=function(key,value){if(value instanceof Map){return Array.from(value).map(([vKey,vValue])=>{return{[vKey]:vValue?vValue:''}})}if(value instanceof Set){return Array.from(value)}return value};Utils.prototype.toJAFPath=function(sourcePath){if(this.isWindows){return sourcePath.replace(/\\\\|\\/g,'/')}return sourcePath};Utils.prototype.toNativePath=function(sourcePath){if(this.isWindows){return sourcePath.replace(/\//g,'\\')}return sourcePath};Utils.prototype.getDirectoryName=function(filePath){return path.dirname(filePath)};Utils.prototype.shouldIgnoreCheck=function(context,auditName,componentName,scope,target){let ignore=false;const checkComponentDef=context.rulePack.getExtension().allComponents.get(componentName);if(checkComponentDef){let targetDef;if(scope&&checkComponentDef[scope]){if(target.includes('.')&&scope==='properties'){targetDef=this.getPropertyAttributeFromPath(context,componentName,target)}else{targetDef=checkComponentDef[scope][target==='__default__'?'':target]}}else{targetDef=checkComponentDef}if(targetDef&&targetDef.extension&&targetDef.extension.hasOwnProperty('audit')&&targetDef.extension.audit.hasOwnProperty('ignore')){const ignoreArray=targetDef.extension.audit.ignore;ignore=ignoreArray.includes(auditName)}}return ignore};Utils.prototype.getPropertyAttributeFromPath=function(context,componentName,targetPath,attribute){const checkComponentDef=context.rulePack.getExtension().allComponents.get(componentName);let targetDef;if(checkComponentDef&&checkComponentDef.properties){if(targetPath.includes('.')){const propPath=targetPath.split('.');targetDef=checkComponentDef.properties[propPath[0]];for(let i=1;i<propPath.length;i++){targetDef=targetDef.properties[propPath[i]]}}else{targetDef=checkComponentDef.properties[targetPath]}}if(attribute){return targetDef[attribute]}else{return targetDef}};Utils.prototype.detectComponentSourceType=function(context,componentPathRoot,isVComponent){let componentImplType;if(isVComponent){componentImplType='tsx'}else{const{fsUtils}=context.utils;if(fsUtils.fileExistsSync(`${componentPathRoot}/loader.js`)){componentImplType='js'}else if(fsUtils.fileExistsSync(path.join(componentPathRoot,'loader.ts'))){componentImplType='ts'}else{const pathSegs=componentPathRoot.toLowerCase().split('/');if(pathSegs.includes('js')){componentImplType='js'}else{componentImplType='ts'}}}return componentImplType};Utils.prototype.safeSetExtension=function(context,extnValue){let existingContext=context.rulePack.getExtension();if(!existingContext){existingContext={}}const newContext={...existingContext,...extnValue};context.rulePack.setExtension(newContext)};Utils.prototype.disableRulePack=function(context){const rulesInPack=context.rulePack.getEnabledRuleList();rulesInPack.forEach(rule=>{context.rulePack.disableRule(rule)})};module.exports=new Utils;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const path=require('path');const Utils=require('./jetwcutils-componentAuditUtils');const tsxUtils=require('./jetwcutils-tsxUtils');const ComponentFinder=function(){this.runOnce=false};ComponentFinder.prototype.findAllComponents=function(auditContext,projectPathInfo,componentRoots,precompileCache){const msg=auditContext.utils.msgLib;let masterComponentList=[];if(!this.runOnce||auditContext.rulePack.getRuleOptions().testMode){if(projectPathInfo.exchangeCacheFolder){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.exchangeCacheFolder),false,false,auditContext,null,null))}if(componentRoots&&componentRoots.length>0){componentRoots.forEach(root=>{let target=root;if(auditContext.utils.fsUtils.getFileTypeSync(target)==='f'){target=path.dirname(root);msg.msg(`Warning: Incorrectly defined "components" array entry in JAF configuration file. Entries should list folders only not explicit file names.\n Bad entry: "${root}"\nAudit will process the "${target}" folder instead.\n`)}masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(target,true,projectPathInfo.isBuiltOutput,auditContext,null,precompileCache))})}else{if(projectPathInfo.componentRootFolder){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.jsSource,projectPathInfo.componentRootFolder),true,projectPathInfo.isBuiltOutput,auditContext,null,precompileCache));if(projectPathInfo.tsSource){masterComponentList=masterComponentList.concat(this._discoverComponentsFromRoot(path.join(projectPathInfo.base,projectPathInfo.tsSource,projectPathInfo.componentRootFolder),true,false,auditContext,null,precompileCache))}}}this.runOnce=true;this.masterComponentList=masterComponentList}return this.masterComponentList};ComponentFinder.prototype._discoverComponentsFromRoot=function(rootDir,isLocal,builtOutput,auditContext,parentPack,precompileCache){const msg=auditContext.utils.msgLib;let componentArray=[];if(auditContext.utils.fsUtils.pathExistsSync(rootDir)){const compFileStructure=auditContext.utils.fsUtils.readDir(rootDir);compFileStructure.forEach(l1file=>{let componentInfo;if(!l1file.isFile&&l1file.files.length>0){l1file.files.forEach(l2file=>{if(!builtOutput){if(l2file.isFile&&l2file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name),'component.json',isLocal,false);componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._discoverComponentsFromRoot(Utils.toJAFPath(path.join(rootDir,l1file.name)),isLocal,false,auditContext,componentInfo.name,precompileCache);componentArray=componentArray.concat(packMembers)}}else if(l2file.isFile&&path.extname(l2file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,path.join(rootDir,l1file.name),l2file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}}else{if(!l2file.isFile&&l2file.files.length>0){l2file.files.forEach(l3file=>{if(l3file.isFile&&l3file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,path.join(rootDir,l1file.name,l2file.name),'component.json',isLocal,false);if(!componentInfo.pack){componentArray.push(componentInfo);if(componentInfo.type==='pack'){const packMembers=this._discoverComponentsFromRoot(Utils.toJAFPath(path.join(rootDir,l1file.name,l2file.name)),isLocal,false,auditContext,componentInfo.name,precompileCache);componentArray=componentArray.concat(packMembers)}}}else if(l3file.isFile&&path.extname(l3file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,path.join(rootDir,l1file.name,l2file.name),l3file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}})}}})}else{if(l1file.isFile&&l1file.name==='component.json'){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,rootDir,'component.json',isLocal,false);if(componentInfo.type!=='pack'||componentInfo.name!==parentPack){componentArray.push(componentInfo)}}else if(l1file.isFile&&path.extname(l1file.name)==='.tsx'&&precompileCache){componentInfo=tsxUtils.extractComponentInfoFromTSXFile(auditContext,rootDir,l1file.name,isLocal,precompileCache);if(componentInfo){componentArray.push(componentInfo)}}}})}return componentArray};module.exports=new ComponentFinder;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const path=require('path');const os=require('os');const Utils=require('./jetwcutils-componentAuditUtils');const COMPILER_OPTIONS={experimentalDecorators:true,failOnTypeErrors:true,jsx:'react',jsxFactory:'h',module:'commonjs',moduleResolution:'node',noEmitOnError:false,stripInternal:true,target:'es6'};const JAF_TEMP='jaf';const WORKING_ROOT_FOLDER='jetwc-temp';const OUTPUT_FOLDER='precompiled';const JSON_FOLDER='precompiled-json';const PreCompiler=function(){this.workingRootFolder=Utils.toJAFPath(path.join(os.tmpdir(),JAF_TEMP,WORKING_ROOT_FOLDER));this.runOnce=false};PreCompiler.prototype.getPrecompileCacheIfNeeded=function(auditContext,auditBase,tsSource,componentRootFolder){const{msgLib}=auditContext.utils;let precompileCache;if(!this.runOnce||auditContext.rulePack.getRuleOptions().testMode){if(auditContext.rulePack.getRuleOptions().hasOwnProperty('precompileCache')&&auditContext.rulePack.getRuleOptions().testMode){msgLib.info(`Test mode, bypassing Typescript compilation...`);precompileCache=Utils.toJAFPath(path.join(auditBase,auditContext.rulePack.getRuleOptions().precompileCache))}else{let tsConfigPath;if(auditContext.rulePack.getRuleOptions().hasOwnProperty('tsConfig')){tsConfigPath=auditContext.rulePack.getRuleOptions().tsConfig}else{tsConfigPath=path.join(auditBase,'tsconfig.json')}precompileCache=this._transformVComponents(auditContext,tsConfigPath,auditBase,tsSource,componentRootFolder)}this.runOnce=true;this.precompileCache=precompileCache}return this.precompileCache};PreCompiler.prototype._transformVComponents=function(auditContext,tsConfigPath,auditBase,sourceBase,componentBase){const{fsUtils,msgLib}=auditContext.utils;const normalizedTsConfigPath=Utils.toJAFPath(tsConfigPath);const normalizedAuditBase=Utils.toJAFPath(auditBase);const normalizedSourceBase=Utils.toJAFPath(sourceBase);if(fsUtils.fileExistsSync(normalizedTsConfigPath)){const outputFolder=fsUtils.getUniqueFileNameSync('_XXXXXX');const compiledOutputFolder=`${this.workingRootFolder}/js${outputFolder}`;const compiledJSONFolder=`${this.workingRootFolder}/json${outputFolder}`;const allTsConfig=fsUtils.readJsonSync(tsConfigPath,true,error=>msgLib.error(`Typescript configuration file ${tsConfigPath} cannot be read, unable to process VComponents.\nError: ${error}`));if(allTsConfig){msgLib.msg(`builtinJetWcRules: Typescript detected, compiling project...`);allTsConfig.compilerOptions.paths[`${componentBase}/*`]=[`${auditBase}/${sourceBase}/${componentBase}/*`];const sourceBaseRoot=sourceBase.includes('/')?sourceBase.split('/')[0]:sourceBase;Object.entries(allTsConfig.compilerOptions.paths).forEach(([pathKey,pathValues])=>{const remapped=pathValues.map(mappedPath=>{return this._remapPath(mappedPath,sourceBaseRoot,auditBase)});allTsConfig.compilerOptions.paths[pathKey]=remapped});allTsConfig.compilerOptions.typeRoots=allTsConfig.compilerOptions.typeRoots.map(typeroot=>this._remapPath(typeroot,sourceBaseRoot,auditBase));if(allTsConfig.compilerOptions.hasOwnProperty('types')){allTsConfig.compilerOptions.types=allTsConfig.compilerOptions.types.map(type=>this._remapPath(type,sourceBaseRoot,auditBase))}allTsConfig.compilerOptions.rootDir=auditBase;allTsConfig.compilerOptions.outDir=compiledOutputFolder;if(!fsUtils.pathExistsSync(this.workingRootFolder)){fsUtils.createFolderSync(this.workingRootFolder)}else{fsUtils.deleteFolderSync(this.workingRootFolder,false)}msgLib.debug(`builtinJetWcRules: Typescript compiled into ${this.workingRootFolder}`);const customTsc=`${auditBase}/node_modules/@oracle/oraclejet/dist/custom-tsc`;const nodeJetPackage=path.join(auditBase,'node_modules','@oracle','oraclejet','package.json');if(fsUtils.pathExistsSync(customTsc)&&fsUtils.pathExistsSync(nodeJetPackage)){const packageJson=fsUtils.readJsonSync(nodeJetPackage);let jetVerString;if(packageJson){jetVerString=packageJson.version}const CustomTypescriptCompiler=require(customTsc);const readFrom=`${auditBase}/${sourceBase}`;const files=this._discoverCompilableFiles(auditContext,readFrom,readFrom);const buildOptions={debug:false,dtDir:compiledJSONFolder,version:'',jetVersion:'',templatePath:path.join(customTsc,'templates'),tsBuiltDir:compiledOutputFolder,mainEntryFile:'loader.d.ts',typesDir:compiledOutputFolder};const compileOptionsPre12={files,compilerOptions:allTsConfig.compilerOptions,buildOptions:buildOptions};const compileOptions1201={tsconfigJson:{compilerOptions:allTsConfig.compilerOptions,files},buildOptions:buildOptions};let compileOptions;if(jetVerString){if(auditContext.utils.semVerUtils.gt(jetVerString,'12.0.0')){compileOptions=compileOptions1201}else{compileOptions=compileOptionsPre12}}if(compileOptions){try{const{errors}=CustomTypescriptCompiler.compile(compileOptions);if(errors.length){msgLib.error('Errors during Typescript pre-compilation of VComponents');errors.forEach(error=>{if(error.hasOwnProperty('message')){msgLib.error(error.message);msgLib.error(error.stack)}else{msgLib.error(JSON.stringify(error))}})}else{msgLib.info(`builtinJetWcRules: Typescript compilation successful...`);return compiledJSONFolder}}catch(uncaughtFromCompile){msgLib.error('Uncaught error during Typescript pre-compilation of VComponents');msgLib.error(uncaughtFromCompile.stack)}}else{msgLib.error('Unable to run VComponent pre-compilation, cannot detect JET custom compiler version')}}else{msgLib.error('Unable to run VComponent pre-compilation as the required packages are not available. Run "ojet restore" or "npm install" to correct this.')}}}else{msgLib.info(`Typescript configuration file ${tsConfigPath} not found, pre-compilation will be skipped`)}return};PreCompiler.prototype._discoverCompilableFiles=function(auditContext,root,pathPrefix){const{fsUtils,msgLib}=auditContext.utils;const allSources=fsUtils.readDirSync(root);return this._extractCompilables(fsUtils,allSources,'').map(sourceFile=>`${pathPrefix}/${sourceFile}`)};PreCompiler.prototype._extractCompilables=function(fsUtils,sources,folder){return sources.reduce((compilables,candidate)=>{if(candidate.isFile&&(candidate.name.endsWith('.ts')||candidate.name.endsWith('.tsx'))){compilables.push(`${folder}/${candidate.name}`)}else if(candidate.files){compilables=compilables.concat(this._extractCompilables(fsUtils,candidate.files,`${folder}/${candidate.name}`,true))}return compilables},new Array)};PreCompiler.prototype._remapPath=function(definedPath,sourceFolder,auditBase){let newPath=definedPath;const segs=definedPath.split('/');if(segs[0]==='.'){segs.shift()}switch(segs[0]){case'node_modules':case sourceFolder:newPath=`${auditBase}/${segs.join('/')}`;break;}return newPath};module.exports=new PreCompiler;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const Utils=require('./jetwcutils-componentAuditUtils');const path=require('path');const TsxUtils=function(){};TsxUtils.prototype.extractComponentInfoFromTSXFile=function(auditContext,componentFolder,fileName,isLocal,precompileCache){const{msgLib,fsUtils}=auditContext.utils;const packRegEx=/@ojmetadata[\s]*pack[\s]*[\"|'](?<pack>[a-zA-Z\-0-9]*)[\"|']/mg;const versionRegEx=/@ojmetadata[\s]*version[\s]*[\"|'](?<version>[\.0-9\-a-zA-Z]*)[\"|']/mg;const jetVersionRegEx=/@ojmetadata[\s]*jetVersion[\s]*[\"|'](?<version>[\.0-9\-a-zA-Z^~><=]*)[\"|']/mg;const componentClassRexEx=/^[\s]*export[\s]*class[\s]*(?<className>[a-zA-Z\-0-9_]*)[\s]*extends[\s]*(?<superClass>[a-zA-Z\-0-9_]*)/mg;const loaderRegEx=/@ojmetadata[\s]*jetVersion [\"|'](?<version>[\.0-9\-a-zA-Z^~><=]*)[\"|']/mg;let componentInfo={};const tsxFile=path.join(componentFolder,fileName);const fileAsStr=auditContext.utils.fsUtils.readFileSync(tsxFile);const fullName=this.getVComponentElementName(fileAsStr);const componentName=this.getVComponentComponentName(fileAsStr);let fullNameMetadata=false;if(precompileCache){let mdSource=null;if(fullName){msgLib.debug(`Processing tsx and metadata for ${fullName}`);mdSource=`${precompileCache}/${fullName}.json`;if(!fsUtils.fileExistsSync(mdSource)){mdSource=`${precompileCache}/${componentName}.json`;if(!componentName||!fsUtils.fileExistsSync(mdSource)){mdSource=null}}else{fullNameMetadata=true}}if(mdSource!==null){componentInfo=Utils.extractComponentInfoFromJSONFile(auditContext,precompileCache,`${fullNameMetadata?fullName:componentName}.json`,isLocal,true);componentInfo.rootFolder=Utils.toJAFPath(componentFolder);componentInfo.compiledMetadata=mdSource;componentInfo.vcomponent=true;componentInfo.viewModel={resolved:true,path:Utils.toJAFPath(tsxFile)};if(!componentName){componentInfo.inferredName=true}if(componentInfo.pack){const matchPack=packRegEx.exec(fileAsStr);if(!matchPack||!matchPack.groups.pack){componentInfo.inferredPack=true}}const matchVer=versionRegEx.exec(fileAsStr);if(!matchVer||!matchVer.groups.version){componentInfo.inferredVersion=true}const matchJetVer=jetVersionRegEx.exec(fileAsStr);if(!matchJetVer||!matchJetVer.groups.version){componentInfo.inferredJetVersion=true}let implClass;while((classDef=componentClassRexEx.exec(fileAsStr))!==null){if(classDef.groups.superClass==='Component'){implClass=classDef.groups.className}}if(implClass){componentInfo.viewModel.className=implClass}else{msgLib.info(`WARNING: Unable to determine VComponent class-name for ${fullName}`)}return componentInfo}else{return}}else{if(fullName){msgLib.error(`Unable to audit VComponent ${fullName}, pre-compiled metadata is not available`)}return}};TsxUtils.prototype.getVComponentElementName=function(sourceCode){const elementRegEx=/@customElement\s*\(\s*[\"|'](?<fullName>[a-zA-Z\-0-9]*)[\"|']\s*\)/mg;const matchElement=elementRegEx.exec(sourceCode);if(matchElement&&matchElement.groups&&matchElement.groups.fullName){return matchElement.groups.fullName}else{return}};TsxUtils.prototype.getVComponentComponentName=function(sourceCode){const nameRegEx=/@ojmetadata[\s]*name [\"|'](?<componentName>[a-zA-Z\-0-9]*)[\"|']/mg;const matchElement=nameRegEx.exec(sourceCode);if(matchElement&&matchElement.groups&&matchElement.groups.componentName){return matchElement.groups.componentName}else{return}};TsxUtils.prototype.matchToVComponentImpl=function(auditContext,testFileName){let componentInfo;let fileNameCanonical=Utils.toJAFPath(testFileName);if(fileNameCanonical.endsWith('.tsx')){const componentMatch=Utils.matchComponentPath(auditContext,fileNameCanonical);if(componentMatch){const testPossibleComponentInfo=Utils.componentInfo(auditContext,componentMatch);if(testPossibleComponentInfo.viewModel&&fileNameCanonical===testPossibleComponentInfo.viewModel.path){componentInfo=testPossibleComponentInfo}}}return componentInfo};module.exports=new TsxUtils;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c) 2018,
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
3
|
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
4
|
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
5
|
*/
|
|
6
|
-
const path=require('path');const Utils=require('../jetwc-lib/
|
|
6
|
+
const path=require('path');const Utils=require('../jetwc-lib/jetwcutils-componentAuditUtils');const componentFinder=require('../jetwc-lib/jetwcutils-componentFinder');const preCompiler=require('../jetwc-lib/jetwcutils-preCompiler');const ruleDef=function(){};ruleDef.prototype.getName=function(){return'jetwco-bootstrap'};ruleDef.prototype.getShortDescription=function(){return'Bootstrap processing for the JETWCO rulset'};ruleDef.prototype.getDescription=function(){return'This rule is for internal use by the ruleset and should not be disabled'};ruleDef.prototype.register=function(context){this.componentRoots=context.config.components;this.auditBase=context.config.base;this.typeScriptCompile=context.config.typescript&&context.config.typescript.compile;return{startupRP:this._getAllVisibleComponents,closedownRP:this._reportDiagnostics}};ruleDef.prototype._getAllVisibleComponents=function(context){const{msgLib}=context.utils;msgLib.info(`builtinJetWcOracleRules (${context.rulePack.getPackInfo().prefix}): ${context.rulePack.getPackInfo().version}`);const projectPathInfo=Utils.getKeyPathInfoForRulepack(context,this.auditBase);const componentRootFolder=context.rulePack.getRuleOptions().componentRoot||projectPathInfo.componentRootFolder;const exchangeURL=context.rulePack.getRuleOptions().exchangeURL;let precompileCache;if(this.typeScriptCompile){precompileCache=preCompiler.getPrecompileCacheIfNeeded(context,this.auditBase,projectPathInfo.tsSource,projectPathInfo.componentRootFolder)}const masterComponentList=componentFinder.findAllComponents(context,projectPathInfo,this.componentRoots,precompileCache);if(masterComponentList&&masterComponentList.length>0){const allComponentsMap=masterComponentList.reduce((wmap,component)=>{if(!projectPathInfo.isBuiltOutput||projectPathInfo.isBuiltOutput&&!wmap.has(component.fullName)){wmap.set(component.fullName,component)}return wmap},new Map);const referenceComponents=new Map;const componentPaths=new Map;allComponentsMap.forEach(component=>{component.language=Utils.detectComponentSourceType(context,component.rootFolder);switch(component.type){case'reference':referenceComponents.set(component.fullName,component.ba);break;case'composite':case'resource':if(component.local){if(component.dependencies){Object.values(component.dependencies).forEach(dependencyName=>{if(allComponentsMap.has(dependencyName)){const proxyPaths=allComponentsMap.get(dependencyName).requirePaths;proxyPaths.forEach(path=>{component.requirePaths.add(path)})}})}componentPaths.set(component.rootFolder,component.fullName)}break;}});context.rulePack.setExtension({rulepackVersion:context.rulePack.getPackInfo().version,bootStrap:true,exchangeURL:exchangeURL,platform:Utils.isWindows?'Windows':'Unix-like',precompiled:this.typeScriptCompile,componentHome:`/${componentRootFolder}/`,auditBuildOutput:projectPathInfo.isBuiltOutput,discoveredPaths:projectPathInfo,componentRoots:this.componentRoots,allReferenceComponents:referenceComponents,allComponents:allComponentsMap,auditableComponentPaths:componentPaths,allAuditableFilePaths:new Map})}else{msgLib.error(`No components have been discovered from the JAF configuration for the ${context.rulePack.getPackInfo().prefix} ruleset to process. You will need to configure the "components" array to point at your component root folder`);Utils.disableRulePack(context)}};ruleDef.prototype._reportDiagnostics=function(context){const msg=context.utils.msgLib;const opts=context.rulePack.getRuleOptions();const diagnostics=context.rulePack.getExtension();if(!opts.testMode){let foundVMMapping=0;let candidateLocal=0;if(diagnostics&&diagnostics.allComponents&&diagnostics.allComponents.length>0){diagnostics.allComponents.forEach((component,compName)=>{if(component.local&&component.type==='composite'){candidateLocal++;if(component.viewModel&&component.viewModel.resolved){foundVMMapping++}}});if(foundVMMapping!==candidateLocal){msgLib.error(`Error: Audit was only able to map ${foundVMMapping} out of ${candidateLocal} components to their viewModels. Some audits will be unable to operate.`)}}}if(opts.debug&&opts.diagnosticFile&&diagnostics){msgLib.msg(`Writing JETWCO diagnostics to ${opts.diagnosticFile}.json`);const dFile=Utils.toJAFPath(path.join(path.resolve('.'),opts.diagnosticFile+'.json'));context.utils.fsUtils.writeJsonSync(diagnostics,dFile,{spaces:2,replacer:Utils.diagnosticReplacer})}};module.exports=ruleDef;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
module.exports.NEVER="never";module.exports.LATEST="latest";module.exports.SEMVER="semver";module.exports.PATCH="patch";module.exports.MINOR="minor";module.exports.MAJOR="major";module.exports.MAJOR_DEPRECATED="major+";module.exports.MAJOR_2_DEPRECATED="major2+";module.exports.MAJOR_3_DEPRECATED="major3+";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorConditions=[];if(['composite','resource','vbcs-pattern'].includes(componentType)){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;const diffs=CaccHelpers.dependenciesDiff(metadata.dependencies,compareMetadata.dependencies);if(CaccHelpers.checkConstraintMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Dependencies ${diffs.add.map(dep=>dep.dependency).join(', ')} added to${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMinorMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Dependencies ${diffs.remove.map(dep=>dep.dependency).join(', ')} removed from${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){diffs.mutate.forEach(mutation=>{const mutationVersionDiff=CaccHelpers.semanticDiff(semver,mutation.version,mutation.historicalVersion);switch(mutateConstraint){case VC.NEVER:errorConditions.push(`Dependency ${mutation.dependency} version change in${errorMsgContext}'${mutateConstraint}'`);break;case VC.SEMVER:case VC.PATCH:if(mutationVersionDiff>componentVersionDiff){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;case VC.MINOR:if(componentVersionDiff<3||mutationVersionDiff>componentVersionDiff){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;default:if(componentVersionDiff<4){errorConditions.push(`Dependency ${mutation.dependency}@${mutation.historicalVersion}->${mutation.version} change in${errorMsgContext}'${mutateConstraint}'`)}break;}})}if(errorConditions.length>0){return errorConditions.join('/n')}}return};module.exports=controlCallback;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const VC=require('./jetwco-cacc-auditConstraints');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){let errorCondition;if(componentType==='composite'){const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;let flagDiff,errorState;if(metadata.hasOwnProperty('dynamicSlots')){if(!compareMetadata.hasOwnProperty('dynamicSlots')){flagDiff='added to';switch(addConstraint){case VC.NEVER:errorState=true;break;case VC.SEMVER:case VC.PATCH:case VC.MINOR:if(componentVersionDiff<3){errorState=true}break;default:if(componentVersionDiff<4){errorState=true}break;}}}else if(compareMetadata.hasOwnProperty('dynamicSlots')){flagDiff='removed from';let errorState=false;switch(removeConstraint){case VC.NEVER:errorState=true;break;default:if(componentVersionDiff<4){errorState=true}break;}}if(errorState){errorCondition=`dynamicSlots marker ${flagDiff}${errorMsgContext}'${removeConstraint}'`}}return errorCondition};module.exports=controlCallback;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.events,compareMetadata.events,'bubbles',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Event bubble flag set on ${diffs.add.map(addition=>addition.name).join(', ')} event(s) in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Event bubble flag unset on ${diffs.remove.map(removal=>removal.name).join(', ')} event(s) in${errorMsgContext}'${removeConstraint}'`)}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint}=controlRuleDef;const diffs=CaccHelpers.mapAttributesDiff(metadata.events,compareMetadata.events,'cancelable',true);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Event cancelable flag set on ${diffs.add.map(addition=>addition.name).join(', ')} event(s) in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Event cancelable flag unset on ${diffs.remove.map(removal=>removal.name).join(', ')} event(s) in${errorMsgContext}'${removeConstraint}'`)}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const VC=require('./jetwco-cacc-auditConstraints');const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){if(componentType==='composite'){let errorConditions=[];const{add:addConstraint,remove:removeConstraint,mutate:mutateConstraint}=controlRuleDef;if(metadata.hasOwnProperty('events')&&compareMetadata.hasOwnProperty('events')){for(const[eventName,eventDef]of Object.entries(metadata.events)){if(compareMetadata.events.hasOwnProperty(eventName)){const diffs=CaccHelpers.apiDiff(eventDef.detail,compareMetadata.events[eventName].detail);if(CaccHelpers.checkConstraintMinorMajor(diffs.add,addConstraint,componentVersionDiff)){errorConditions.push(`Detail attribute(s) ${diffs.add.map(addition=>addition.name).join(', ')} added to ${eventName} in${errorMsgContext}'${addConstraint}'`)}if(CaccHelpers.checkConstraintMajor(diffs.remove,removeConstraint,componentVersionDiff)){errorConditions.push(`Detail attribute(s) ${diffs.remove.map(removal=>removal.name).join(', ')} removed from ${eventName} in ${errorMsgContext}'${removeConstraint}'`)}if(diffs.mutate.length>0){diffs.mutate.forEach(mutation=>{const mdType=eventDef.detail[mutation.name].type;const historicalType=compareMetadata.events[eventName].detail[mutation.name].type;if(mdType!==historicalType){if(mutateConstraint===VC.NEVER||componentVersionDiff<4){errorConditions.push(`Detail attribute type change for ${mutation.name} in ${eventName} in${errorMsgContext}'${mutateConstraint}'`)}}})}}}}if(errorConditions.length>0){return errorConditions.join('\n')}}return};module.exports=controlCallback;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
|
|
3
|
+
* Licensed under The Universal Permissive License (UPL), Version 1.0
|
|
4
|
+
* as shown at https://oss.oracle.com/licenses/upl/
|
|
5
|
+
*/
|
|
6
|
+
const CaccHelpers=require('./jetwco-cacc-helpers');function controlCallback(controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext){return CaccHelpers.sharedMapAPICallback('events',controlRuleName,controlRuleDef,semver,cacheManager,metadata,compareMetadata,componentVersionDiff,baselines,componentType,componentName,errorMsgContext)};module.exports=controlCallback;
|