Skip to content

Commit 62a8e5b

Browse files
committed
JSModuleAnalyzer: Conditional handling of LogicalExpression
1 parent 8842249 commit 62a8e5b

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

lib/lbt/analyzer/JSModuleAnalyzer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ const EnrichedVisitorKeys = (function() {
116116
ImportSpecifier: [], // imported, local
117117
Literal: [],
118118
LabeledStatement: [],
119-
LogicalExpression: [],
119+
LogicalExpression: ["right"],
120120
MemberExpression: [],
121121
MetaProperty: toBeDone(["meta", "property"]),
122122
MethodDefinition: [],

test/fixtures/lbt/modules/es6-syntax.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ sap.ui.define([
7878

7979
};
8080

81-
// TODO: This is not detected as a conditional dependency -> Currently, these kind of logical operators are not analyzed
82-
// m1 ?? sap.ui.require(['conditional/module11']);
83-
// m1 && sap.ui.require(['conditional/module11']);
84-
// m1 || sap.ui.require(['conditional/module11']);
81+
m1 ?? sap.ui.require(['conditional/module11']);
8582

8683
// ObjectPattern as Id
8784
const {module11, module12} = {

test/lib/lbt/analyzer/JSModuleAnalyzer.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ test("ES6 Syntax", async (t) => {
496496
const expected = [
497497
"conditional/module1.js",
498498
"conditional/module10.js",
499-
// "conditional/module11.js", // TODO: see es6-syntax.js
499+
"conditional/module11.js",
500500
"conditional/module2.js",
501501
"conditional/module3.js",
502502
"conditional/module4.js",
@@ -674,6 +674,47 @@ test("ChainExpression", (t) => {
674674
`ui5 module`);
675675
});
676676

677+
test("LogicalExpression", (t) => {
678+
const content = `
679+
sap.ui.define(['require', 'static/module1'], (require, module1) => {
680+
module1 && sap.ui.require(['conditional/module2']);
681+
module1 || sap.ui.requireSync('conditional/module3');
682+
module1 ?? jQuery.sap.require('conditional.module4');
683+
!module1 && require(['conditional/module5']);
684+
685+
sap.ui.require(['static/module2']) && module1;
686+
sap.ui.requireSync('static/module3') || module1;
687+
jQuery.sap.require('static.module4') ?? module1;
688+
require(['static/module5']) && module1;
689+
});`;
690+
const info = analyzeString(content, "modules/LogicalExpression.js");
691+
692+
const expected = [
693+
"conditional/module2.js",
694+
"conditional/module3.js",
695+
"conditional/module4.js",
696+
"conditional/module5.js",
697+
"jquery.sap.global.js",
698+
"static/module1.js",
699+
"static/module2.js",
700+
"static/module3.js",
701+
"static/module4.js",
702+
"static/module5.js",
703+
];
704+
const actual = info.dependencies.sort();
705+
t.deepEqual(actual, expected, "module dependencies should match");
706+
expected.forEach((dep) => {
707+
t.is(info.isConditionalDependency(dep), /^conditional\//.test(dep),
708+
`only dependencies to 'conditional/*' modules should be conditional (${dep})`);
709+
t.is(info.isImplicitDependency(dep), !/^(?:conditional|static)\//.test(dep),
710+
`all dependencies other than 'conditional/*' and 'static/*' should be implicit (${dep})`);
711+
});
712+
t.false(info.dynamicDependencies,
713+
`no use of dynamic dependencies should have been detected`);
714+
t.false(info.rawModule,
715+
`ui5 module`);
716+
});
717+
677718
test("Dynamic import (declare/require)", async (t) => {
678719
const info = await analyze("modules/declare_dynamic_require.js");
679720
t.true(info.dynamicDependencies,

0 commit comments

Comments
 (0)