Skip to content

Commit 7b22ed6

Browse files
authored
[ui5-builder][FEATURE] Enable modern preload bundles without dependencies (#739)
1 parent a9241f8 commit 7b22ed6

File tree

50 files changed

+176
-334
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+176
-334
lines changed

packages/builder/lib/lbt/bundle/Builder.js

Lines changed: 6 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -40,38 +40,6 @@ function isEmptyBundle(resolvedBundle) {
4040
return resolvedBundle.sections.every((section) => section.modules.length === 0);
4141
}
4242

43-
const UI5BundleFormat = {
44-
beforePreloads(section) {
45-
let str = `jQuery.sap.registerPreloadedModules({\n`;
46-
if ( section.name ) {
47-
str += `"name":"${section.name}",\n`;
48-
}
49-
str += `"version":"2.0",\n`;
50-
str += `"modules":{\n`;
51-
return str;
52-
},
53-
54-
afterPreloads(section) {
55-
return `}});\n`;
56-
},
57-
58-
beforeBundleInfo() {
59-
return `"unsupported"; /* 'bundleInfo' section mode not supported (requires ui5loader)\n`;
60-
},
61-
62-
afterBundleInfo() {
63-
return "*/\n";
64-
},
65-
66-
requireSync(moduleName) {
67-
return `sap.ui.requireSync("${ModuleName.toRequireJSName(moduleName)}");\n`;
68-
},
69-
70-
shouldDecorate(resolvedModule) {
71-
return resolvedModule.executes(UI5ClientConstants.MODULE__JQUERY_SAP_GLOBAL);
72-
}
73-
};
74-
7543
const EVOBundleFormat = {
7644
beforePreloads(section) {
7745
return `sap.ui.require.preload({\n`;
@@ -115,7 +83,6 @@ class BundleBuilder {
11583
}
11684

11785
async createBundle(module, options) {
118-
await this._prepare();
11986
if ( options.numberOfParts > 1 ) {
12087
const bundleInfos = [];
12188
const submodules = await this.splitter.run( module, options );
@@ -128,17 +95,6 @@ class BundleBuilder {
12895
}
12996
}
13097

131-
_prepare() {
132-
return Promise.all([
133-
// check whether the resource pool contains debug and optimized sources
134-
this.pool.findResource( ModuleName.getDebugName(UI5ClientConstants.MODULE__JQUERY_SAP_GLOBAL) ).
135-
then( () => this.optimizedSources = true, () => this.optimizedSources = false ),
136-
// check whether EVO modules are available. If so, use EVO APIs, else use old UI5 APIs.
137-
this.pool.findResource(UI5ClientConstants.EVO_MARKER_RESOURCE).
138-
then( () => this.targetBundleFormat = EVOBundleFormat, () => this.targetBundleFormat = UI5BundleFormat )
139-
]);
140-
}
141-
14298
async _createBundle(module, options) {
14399
const resolvedModule = await this.resolver.resolve(module);
144100
if ( options.skipIfEmpty && isEmptyBundle(resolvedModule) ) {
@@ -153,11 +109,13 @@ class BundleBuilder {
153109
this.options.sourceMap = true;
154110
}
155111

156-
// when decorateBootstrapModule is set to false, we don't write the optimized flag
157-
// and don't write the try catch wrapper
112+
// Since UI5 Tooling 3.0: Always use modern API
113+
this.targetBundleFormat = EVOBundleFormat;
114+
115+
// when decorateBootstrapModule is false,
116+
// we don't write the optimized flag and don't write the try catch wrapper
158117
this.shouldDecorate = this.options.decorateBootstrapModule &&
159-
(((this.optimizedSources && !this.options.debugMode) || this.optimize) &&
160-
this.targetBundleFormat.shouldDecorate(resolvedModule));
118+
this.targetBundleFormat.shouldDecorate(resolvedModule);
161119
// TODO is the following condition ok or should the availability of jquery.sap.global.js be configurable?
162120
this.jqglobalAvailable = !resolvedModule.containsGlobal;
163121
this.openModule(resolvedModule.name);

packages/builder/lib/processors/bundlers/moduleBundler.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ const log = require("@ui5/logger").getLogger("builder:processors:bundlers:module
9191
* @typedef {object} ModuleBundleOptions
9292
* @property {boolean} [optimize=true] Whether the module bundle gets minified
9393
* @property {boolean} [sourceMap=true] Whether to generate a source map file for the bundle
94-
* @property {boolean} [decorateBootstrapModule=false] If set to 'false', the module won't be decorated
94+
* @property {boolean} [decorateBootstrapModule=false] If set to 'false', bootable bundles won't be decorated
9595
* with an optimization marker
96-
* @property {boolean} [addTryCatchRestartWrapper=false] Whether to wrap bootable module bundles with
96+
* @property {boolean} [addTryCatchRestartWrapper=false] Whether to wrap bootable bundles with
9797
* a try/catch to filter out "Restart" errors
9898
* @property {boolean} [usePredefineCalls=false] If set to 'true', sap.ui.predefine is used for UI5 modules
9999
* @property {number} [numberOfParts=1] The number of parts the module bundle should be splitted

packages/builder/lib/tasks/bundlers/generateComponentPreload.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
const path = require("path");
22
const moduleBundler = require("../../processors/bundlers/moduleBundler");
33
const log = require("@ui5/logger").getLogger("builder:tasks:bundlers:generateComponentPreload");
4-
const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized;
54
const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
65

76
/**
@@ -11,7 +10,6 @@ const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
1110
* @alias module:@ui5/builder.tasks.generateComponentPreload
1211
* @param {object} parameters Parameters
1312
* @param {module:@ui5/fs.DuplexCollection} parameters.workspace DuplexCollection to read and write files
14-
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
1513
* @param {module:@ui5/builder.tasks.TaskUtil|object} [parameters.taskUtil] TaskUtil
1614
* @param {object} parameters.options Options
1715
* @param {string} parameters.options.projectName Project name
@@ -26,29 +24,24 @@ const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
2624
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
2725
*/
2826
module.exports = function({
29-
workspace, dependencies, taskUtil, options: {projectName, paths, namespaces, excludes = []}
27+
workspace, taskUtil, options: {projectName, paths, namespaces, excludes = []}
3028
}) {
31-
let combo = new ReaderCollectionPrioritized({
32-
name: `generateComponentPreload - prioritize workspace over dependencies: ${projectName}`,
33-
readers: [workspace, dependencies]
34-
});
35-
29+
let nonDbgWorkspace = workspace;
3630
if (taskUtil) {
37-
combo = combo.filter(function(resource) {
31+
nonDbgWorkspace = workspace.filter(function(resource) {
3832
// Remove any debug variants
3933
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.IsDebugVariant);
4034
});
4135
}
4236

43-
// TODO 3.0: Limit to workspace resources?
44-
return combo.byGlob("/resources/**/*.{js,json,xml,html,properties,library,js.map}")
37+
return nonDbgWorkspace.byGlob("/resources/**/*.{js,json,xml,html,properties,library,js.map}")
4538
.then(async (resources) => {
4639
let allNamespaces = [];
4740
if (paths) {
4841
allNamespaces = await Promise.all(paths.map(async (componentPath) => {
4942
const globPath = "/resources/" + componentPath;
5043
log.verbose(`Globbing for Components directories with configured path ${globPath}...`);
51-
const components = await combo.byGlob(globPath); // TODO 3.0: Limit to workspace resources?
44+
const components = await nonDbgWorkspace.byGlob(globPath);
5245
return components.map((component) => {
5346
const compDir = path.dirname(component.getPath()).replace(/^\/resources\//i, "");
5447
log.verbose(`Found component namespace ${compDir}`);

packages/builder/lib/tasks/bundlers/generateLibraryPreload.js

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const log = require("@ui5/logger").getLogger("builder:tasks:bundlers:generateLibraryPreload");
22
const moduleBundler = require("../../processors/bundlers/moduleBundler");
3-
const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized;
43
const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
54
const createModuleNameMapping = require("./utils/createModuleNameMapping");
65

@@ -266,7 +265,6 @@ function getSapUiCoreBunDef(name, filters, preload) {
266265
* @alias module:@ui5/builder.tasks.generateLibraryPreload
267266
* @param {object} parameters Parameters
268267
* @param {module:@ui5/fs.DuplexCollection} parameters.workspace DuplexCollection to read and write files
269-
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
270268
* @param {module:@ui5/builder.tasks.TaskUtil|object} [parameters.taskUtil] TaskUtil
271269
* @param {string[]} [parameters.options.excludes=[]] List of modules declared as glob patterns (resource name patterns)
272270
* that should be excluded from the library-preload.js bundle.
@@ -278,20 +276,16 @@ function getSapUiCoreBunDef(name, filters, preload) {
278276
* @param {string} parameters.options.projectName Project name
279277
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
280278
*/
281-
module.exports = function({workspace, dependencies, taskUtil, options: {projectName, excludes = []}}) {
282-
let combo = new ReaderCollectionPrioritized({
283-
name: `libraryBundler - prioritize workspace over dependencies: ${projectName}`,
284-
readers: [workspace, dependencies]
285-
});
286-
279+
module.exports = function({workspace, taskUtil, options: {projectName, excludes = []}}) {
280+
let nonDbgWorkspace = workspace;
287281
if (taskUtil) {
288-
combo = combo.filter(function(resource) {
282+
nonDbgWorkspace = workspace.filter(function(resource) {
289283
// Remove any debug variants
290284
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.IsDebugVariant);
291285
});
292286
}
293287

294-
return combo.byGlob("/**/*.{js,json,xml,html,properties,library,js.map}").then(async (resources) => {
288+
return nonDbgWorkspace.byGlob("/**/*.{js,json,xml,html,properties,library,js.map}").then(async (resources) => {
295289
// Find all libraries and create a library-preload.js bundle
296290

297291
let p = Promise.resolve();
@@ -314,10 +308,7 @@ module.exports = function({workspace, dependencies, taskUtil, options: {projectN
314308
let unoptimizedModuleNameMapping;
315309
let unoptimizedResources = resources;
316310
if (taskUtil) {
317-
unoptimizedResources = await new ReaderCollectionPrioritized({
318-
name: `libraryBundler - prioritize workspace over dependencies: ${projectName}`,
319-
readers: [workspace, dependencies]
320-
}).filter(function(resource) {
311+
unoptimizedResources = await workspace.filter(function(resource) {
321312
// Remove any non-debug variants
322313
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.HasDebugVariant);
323314
}).byGlob("/**/*.{js,json,xml,html,properties,library,js.map}");

packages/builder/lib/types/application/ApplicationBuilder.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class ApplicationBuilder extends AbstractBuilder {
9393
this.addTask("generateComponentPreload", async () => {
9494
return getTask("generateComponentPreload").task({
9595
workspace: resourceCollections.workspace,
96-
dependencies: resourceCollections.dependencies,
9796
taskUtil,
9897
options: {
9998
projectName: project.metadata.name,
@@ -108,7 +107,6 @@ class ApplicationBuilder extends AbstractBuilder {
108107
this.addTask("generateComponentPreload", async () => {
109108
return getTask("generateComponentPreload").task({
110109
workspace: resourceCollections.workspace,
111-
dependencies: resourceCollections.dependencies,
112110
taskUtil,
113111
options: {
114112
projectName: project.metadata.name,

packages/builder/lib/types/library/LibraryBuilder.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ class LibraryBuilder extends AbstractBuilder {
137137
this.addTask("generateComponentPreload", async () => {
138138
return getTask("generateComponentPreload").task({
139139
workspace: resourceCollections.workspace,
140-
dependencies: resourceCollections.dependencies,
141140
taskUtil,
142141
options: {
143142
projectName: project.metadata.name,
@@ -152,7 +151,6 @@ class LibraryBuilder extends AbstractBuilder {
152151
this.addTask("generateLibraryPreload", async () => {
153152
return getTask("generateLibraryPreload").task({
154153
workspace: resourceCollections.workspace,
155-
dependencies: resourceCollections.dependencies,
156154
taskUtil,
157155
options: {
158156
projectName: project.metadata.name,

packages/builder/test/expected/build/application.g/cachebuster/Component-preload.js

Lines changed: 2 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/builder/test/expected/build/application.g/cachebuster/Component-preload.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/builder/test/expected/build/application.g/cachebuster_hash/Component-preload.js

Lines changed: 2 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/builder/test/expected/build/application.g/cachebuster_hash/Component-preload.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)