Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Enable modern preload bundles without dependencies #739

Merged
merged 5 commits into from
Apr 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 6 additions & 48 deletions lib/lbt/bundle/Builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,38 +40,6 @@ function isEmptyBundle(resolvedBundle) {
return resolvedBundle.sections.every((section) => section.modules.length === 0);
}

const UI5BundleFormat = {
beforePreloads(section) {
let str = `jQuery.sap.registerPreloadedModules({\n`;
if ( section.name ) {
str += `"name":"${section.name}",\n`;
}
str += `"version":"2.0",\n`;
str += `"modules":{\n`;
return str;
},

afterPreloads(section) {
return `}});\n`;
},

beforeBundleInfo() {
return `"unsupported"; /* 'bundleInfo' section mode not supported (requires ui5loader)\n`;
},

afterBundleInfo() {
return "*/\n";
},

requireSync(moduleName) {
return `sap.ui.requireSync("${ModuleName.toRequireJSName(moduleName)}");\n`;
},

shouldDecorate(resolvedModule) {
return resolvedModule.executes(UI5ClientConstants.MODULE__JQUERY_SAP_GLOBAL);
}
};

const EVOBundleFormat = {
beforePreloads(section) {
return `sap.ui.require.preload({\n`;
Expand Down Expand Up @@ -115,7 +83,6 @@ class BundleBuilder {
}

async createBundle(module, options) {
await this._prepare();
if ( options.numberOfParts > 1 ) {
const bundleInfos = [];
const submodules = await this.splitter.run( module, options );
Expand All @@ -128,17 +95,6 @@ class BundleBuilder {
}
}

_prepare() {
return Promise.all([
// check whether the resource pool contains debug and optimized sources
this.pool.findResource( ModuleName.getDebugName(UI5ClientConstants.MODULE__JQUERY_SAP_GLOBAL) ).
then( () => this.optimizedSources = true, () => this.optimizedSources = false ),
// check whether EVO modules are available. If so, use EVO APIs, else use old UI5 APIs.
this.pool.findResource(UI5ClientConstants.EVO_MARKER_RESOURCE).
then( () => this.targetBundleFormat = EVOBundleFormat, () => this.targetBundleFormat = UI5BundleFormat )
]);
}

async _createBundle(module, options) {
const resolvedModule = await this.resolver.resolve(module);
if ( options.skipIfEmpty && isEmptyBundle(resolvedModule) ) {
Expand All @@ -153,11 +109,13 @@ class BundleBuilder {
this.options.sourceMap = true;
}

// when decorateBootstrapModule is set to false, we don't write the optimized flag
// and don't write the try catch wrapper
// Since UI5 Tooling 3.0: Always use modern API
this.targetBundleFormat = EVOBundleFormat;

// when decorateBootstrapModule is false,
// we don't write the optimized flag and don't write the try catch wrapper
this.shouldDecorate = this.options.decorateBootstrapModule &&
(((this.optimizedSources && !this.options.debugMode) || this.optimize) &&
this.targetBundleFormat.shouldDecorate(resolvedModule));
this.targetBundleFormat.shouldDecorate(resolvedModule);
// TODO is the following condition ok or should the availability of jquery.sap.global.js be configurable?
this.jqglobalAvailable = !resolvedModule.containsGlobal;
this.openModule(resolvedModule.name);
Expand Down
4 changes: 2 additions & 2 deletions lib/processors/bundlers/moduleBundler.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@ const log = require("@ui5/logger").getLogger("builder:processors:bundlers:module
* @typedef {object} ModuleBundleOptions
* @property {boolean} [optimize=true] Whether the module bundle gets minified
* @property {boolean} [sourceMap=true] Whether to generate a source map file for the bundle
* @property {boolean} [decorateBootstrapModule=false] If set to 'false', the module won't be decorated
* @property {boolean} [decorateBootstrapModule=false] If set to 'false', bootable bundles won't be decorated
* with an optimization marker
* @property {boolean} [addTryCatchRestartWrapper=false] Whether to wrap bootable module bundles with
* @property {boolean} [addTryCatchRestartWrapper=false] Whether to wrap bootable bundles with
* a try/catch to filter out "Restart" errors
* @property {boolean} [usePredefineCalls=false] If set to 'true', sap.ui.predefine is used for UI5 modules
* @property {number} [numberOfParts=1] The number of parts the module bundle should be splitted
Expand Down
17 changes: 5 additions & 12 deletions lib/tasks/bundlers/generateComponentPreload.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const path = require("path");
const moduleBundler = require("../../processors/bundlers/moduleBundler");
const log = require("@ui5/logger").getLogger("builder:tasks:bundlers:generateComponentPreload");
const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized;
const {negateFilters} = require("../../lbt/resources/ResourceFilterList");

/**
Expand All @@ -11,7 +10,6 @@ const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
* @alias module:@ui5/builder.tasks.generateComponentPreload
* @param {object} parameters Parameters
* @param {module:@ui5/fs.DuplexCollection} parameters.workspace DuplexCollection to read and write files
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
* @param {module:@ui5/builder.tasks.TaskUtil|object} [parameters.taskUtil] TaskUtil
* @param {object} parameters.options Options
* @param {string} parameters.options.projectName Project name
Expand All @@ -26,29 +24,24 @@ const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
*/
module.exports = function({
workspace, dependencies, taskUtil, options: {projectName, paths, namespaces, excludes = []}
workspace, taskUtil, options: {projectName, paths, namespaces, excludes = []}
}) {
let combo = new ReaderCollectionPrioritized({
name: `generateComponentPreload - prioritize workspace over dependencies: ${projectName}`,
readers: [workspace, dependencies]
});

let nonDbgWorkspace = workspace;
if (taskUtil) {
combo = combo.filter(function(resource) {
nonDbgWorkspace = workspace.filter(function(resource) {
// Remove any debug variants
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.IsDebugVariant);
});
}

// TODO 3.0: Limit to workspace resources?
return combo.byGlob("/resources/**/*.{js,json,xml,html,properties,library,js.map}")
return nonDbgWorkspace.byGlob("/resources/**/*.{js,json,xml,html,properties,library,js.map}")
.then(async (resources) => {
let allNamespaces = [];
if (paths) {
allNamespaces = await Promise.all(paths.map(async (componentPath) => {
const globPath = "/resources/" + componentPath;
log.verbose(`Globbing for Components directories with configured path ${globPath}...`);
const components = await combo.byGlob(globPath); // TODO 3.0: Limit to workspace resources?
const components = await nonDbgWorkspace.byGlob(globPath);
return components.map((component) => {
const compDir = path.dirname(component.getPath()).replace(/^\/resources\//i, "");
log.verbose(`Found component namespace ${compDir}`);
Expand Down
19 changes: 5 additions & 14 deletions lib/tasks/bundlers/generateLibraryPreload.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
const log = require("@ui5/logger").getLogger("builder:tasks:bundlers:generateLibraryPreload");
const moduleBundler = require("../../processors/bundlers/moduleBundler");
const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized;
const {negateFilters} = require("../../lbt/resources/ResourceFilterList");
const createModuleNameMapping = require("./utils/createModuleNameMapping");

Expand Down Expand Up @@ -266,7 +265,6 @@ function getSapUiCoreBunDef(name, filters, preload) {
* @alias module:@ui5/builder.tasks.generateLibraryPreload
* @param {object} parameters Parameters
* @param {module:@ui5/fs.DuplexCollection} parameters.workspace DuplexCollection to read and write files
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
* @param {module:@ui5/builder.tasks.TaskUtil|object} [parameters.taskUtil] TaskUtil
* @param {string[]} [parameters.options.excludes=[]] List of modules declared as glob patterns (resource name patterns)
* that should be excluded from the library-preload.js bundle.
Expand All @@ -278,20 +276,16 @@ function getSapUiCoreBunDef(name, filters, preload) {
* @param {string} parameters.options.projectName Project name
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
*/
module.exports = function({workspace, dependencies, taskUtil, options: {projectName, excludes = []}}) {
let combo = new ReaderCollectionPrioritized({
name: `libraryBundler - prioritize workspace over dependencies: ${projectName}`,
readers: [workspace, dependencies]
});

module.exports = function({workspace, taskUtil, options: {projectName, excludes = []}}) {
let nonDbgWorkspace = workspace;
if (taskUtil) {
combo = combo.filter(function(resource) {
nonDbgWorkspace = workspace.filter(function(resource) {
// Remove any debug variants
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.IsDebugVariant);
});
}

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

let p = Promise.resolve();
Expand All @@ -314,10 +308,7 @@ module.exports = function({workspace, dependencies, taskUtil, options: {projectN
let unoptimizedModuleNameMapping;
let unoptimizedResources = resources;
if (taskUtil) {
unoptimizedResources = await new ReaderCollectionPrioritized({
name: `libraryBundler - prioritize workspace over dependencies: ${projectName}`,
readers: [workspace, dependencies]
}).filter(function(resource) {
unoptimizedResources = await workspace.filter(function(resource) {
// Remove any non-debug variants
return !taskUtil.getTag(resource, taskUtil.STANDARD_TAGS.HasDebugVariant);
}).byGlob("/**/*.{js,json,xml,html,properties,library,js.map}");
Expand Down
2 changes: 0 additions & 2 deletions lib/types/application/ApplicationBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ class ApplicationBuilder extends AbstractBuilder {
this.addTask("generateComponentPreload", async () => {
return getTask("generateComponentPreload").task({
workspace: resourceCollections.workspace,
dependencies: resourceCollections.dependencies,
taskUtil,
options: {
projectName: project.metadata.name,
Expand All @@ -108,7 +107,6 @@ class ApplicationBuilder extends AbstractBuilder {
this.addTask("generateComponentPreload", async () => {
return getTask("generateComponentPreload").task({
workspace: resourceCollections.workspace,
dependencies: resourceCollections.dependencies,
taskUtil,
options: {
projectName: project.metadata.name,
Expand Down
2 changes: 0 additions & 2 deletions lib/types/library/LibraryBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ class LibraryBuilder extends AbstractBuilder {
this.addTask("generateComponentPreload", async () => {
return getTask("generateComponentPreload").task({
workspace: resourceCollections.workspace,
dependencies: resourceCollections.dependencies,
taskUtil,
options: {
projectName: project.metadata.name,
Expand All @@ -152,7 +151,6 @@ class LibraryBuilder extends AbstractBuilder {
this.addTask("generateLibraryPreload", async () => {
return getTask("generateLibraryPreload").task({
workspace: resourceCollections.workspace,
dependencies: resourceCollections.dependencies,
taskUtil,
options: {
projectName: project.metadata.name,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 2 additions & 4 deletions test/expected/build/application.g/dest/Component-preload.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading