Skip to content

Commit 1c2f667

Browse files
authored
[ui5-builder][FIX] JSModuleAnalyzer: Fix detection of bundle name (#705)
JIRA: CPOUI5FOUNDATION-485
1 parent 0c79f52 commit 1c2f667

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

packages/builder/lib/lbt/analyzer/JSModuleAnalyzer.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ class JSModuleAnalyzer {
301301
*/
302302
let bIsUi5Module = false;
303303

304+
// Module name via @ui5-bundle comment in first line. Overrides all other main module candidates.
305+
let firstLineBundleName;
306+
304307
// first analyze the whole AST...
305308
visit(ast, false);
306309

@@ -314,7 +317,12 @@ class JSModuleAnalyzer {
314317
log.verbose(`bundle include directive ${subModule}`);
315318
} else if ( comment.value.startsWith("@ui5-bundle ") ) {
316319
const bundleName = comment.value.slice("@ui5-bundle ".length);
317-
setMainModuleInfo(bundleName, null);
320+
if (comment.start === 0) {
321+
// Remember the name from the first line to use it as final name
322+
firstLineBundleName = bundleName;
323+
} else {
324+
setMainModuleInfo(bundleName, null);
325+
}
318326
log.verbose(`bundle name directive ${bundleName}`);
319327
} else {
320328
log.warn(`unrecognized bundle directive ${comment.value}`);
@@ -324,7 +332,10 @@ class JSModuleAnalyzer {
324332
}
325333

326334
// ...and finally take conclusions about the file's content
327-
if ( !mainModuleFound ) {
335+
if ( firstLineBundleName ) {
336+
// If the first line has a bundle name, use it and override all other found names
337+
info.name = firstLineBundleName;
338+
} else if ( !mainModuleFound ) {
328339
// if there's exactly one module definition in this file but it didn't
329340
// immediately qualify as main module, make it now the main module
330341
if ( candidateName != null && nModuleDeclarations == 1 ) {

packages/builder/test/lib/lbt/analyzer/JSModuleAnalyzer.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,3 +684,78 @@ jQuery.sap.registerPreloadedModules({
684684
t.deepEqual(info.subModules, ["foo/bar.js"],
685685
"submodule from jQuery.sap.registerPreloadedModules");
686686
});
687+
688+
test("Module that contains jQuery.sap.declare should be derived as subModule", (t) => {
689+
const content = `
690+
sap.ui.define([], function() {
691+
jQuery.sap.declare("foo.bar");
692+
});
693+
`;
694+
const info = analyzeString(content, "modules/module-with-jquery-sap-declare.js");
695+
t.is(info.name, "modules/module-with-jquery-sap-declare.js");
696+
t.is(info.rawModule, false);
697+
t.is(info.format, "ui5-declare"); // FIXME: Format should actually be ui5-define
698+
t.is(info.requiresTopLevelScope, false);
699+
t.deepEqual(info.subModules, ["foo/bar.js"],
700+
"jQuery.sap.declare subModule should be detected");
701+
t.deepEqual(info.dependencies, ["jquery.sap.global.js"], "Implicit dependency");
702+
});
703+
704+
test("Bundle that contains jQuery.sap.declare (sap.ui.predefine) should not be derived as module name", (t) => {
705+
const content = `//@ui5-bundle test1/library-preload.js
706+
sap.ui.predefine("test1/module1", [], function() {
707+
jQuery.sap.declare("foo.bar");
708+
});
709+
`;
710+
const info = analyzeString(content, "modules/bundle-with-jquery-sap-declare.js");
711+
t.is(info.name, "test1/library-preload.js", "Module name should be taken from @ui5-bundle comment");
712+
t.is(info.rawModule, false);
713+
t.is(info.format, "ui5-declare"); // FIXME: Format should actually be ui5-define
714+
t.is(info.requiresTopLevelScope, false);
715+
// Note: foo/bar.js is not listed as the predefine body is not analyzed
716+
t.deepEqual(info.subModules, ["test1/module1.js"],
717+
"subModule via sap.ui.predefine should be detected");
718+
t.deepEqual(info.dependencies, ["jquery.sap.global.js"], "Implicit dependency");
719+
});
720+
721+
test("Bundle that contains jQuery.sap.declare (sap.ui.require.preload) should not be derived as module name", (t) => {
722+
const content = `//@ui5-bundle test1/library-preload.js
723+
sap.ui.require.preload({
724+
"test1/module1.js": function() {
725+
sap.ui.define([], function() {
726+
jQuery.sap.declare("foo.bar");
727+
});
728+
}
729+
});
730+
731+
`;
732+
const info = analyzeString(content, "modules/bundle-with-jquery-sap-declare.js");
733+
t.is(info.name, "test1/library-preload.js", "Module name should be taken from @ui5-bundle comment");
734+
t.is(info.rawModule, false);
735+
t.is(info.format, "ui5-define");
736+
t.is(info.requiresTopLevelScope, false);
737+
// Note: foo/bar.js is not listed as the sap.ui.define body is not analyzed
738+
t.deepEqual(info.subModules, ["test1/module1.js"],
739+
"subModule via sap.ui.predefine should be detected");
740+
t.deepEqual(info.dependencies, ["ui5loader-autoconfig.js"], "Implicit dependency");
741+
});
742+
743+
test("@ui5-bundle comment: Multiple comments", (t) => {
744+
const content = `//@ui5-bundle test/bundle1.js
745+
//@ui5-bundle test/bundle2.js
746+
`;
747+
const info = analyzeString(content, "modules/ui5-bundle-comments.js");
748+
t.is(info.name, "test/bundle1.js", "Comment from first line should be used");
749+
t.deepEqual(info.subModules, []);
750+
t.deepEqual(info.dependencies, []);
751+
});
752+
753+
test("@ui5-bundle comment: Multiple comments (Not in first line)", (t) => {
754+
const content = `console.log('Foo');
755+
//@ui5-bundle test/bundle1.js
756+
//@ui5-bundle test/bundle2.js
757+
`;
758+
t.throws(() => analyzeString(content, "modules/ui5-bundle-comments.js"), {
759+
message: "conflicting main modules found (unnamed + named)"
760+
});
761+
});

0 commit comments

Comments
 (0)