UNPKG

@ui5/builder

Version:
88 lines (81 loc) 3.07 kB
const path = require("path"); const moduleBundler = require("../../processors/bundlers/moduleBundler"); const ReaderCollectionPrioritized = require("@ui5/fs").ReaderCollectionPrioritized; /** * Task to for application bundling. * * @public * @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 {Object} parameters.options Options * @param {string} parameters.options.projectName Project name * @param {Array} [parameters.options.paths] Array of paths (or glob patterns) for component files * @param {Array} [parameters.options.namespaces] Array of component namespaces * @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written */ module.exports = function({workspace, dependencies, options}) { const combo = new ReaderCollectionPrioritized({ name: `generateComponentPreload - prioritize workspace over dependencies: ${options.projectName}`, readers: [workspace, dependencies] }); return combo.byGlob("/resources/**/*.{js,json,xml,html,properties,library}") .then(async (resources) => { let namespaces = []; if (options.paths) { namespaces = await Promise.all(options.paths.map(async (componentPath) => { const components = await combo.byGlob("/resources/" + componentPath); return components.map((component) => { return path.dirname(component.getPath()).replace(/^\/resources\//i, ""); }); })); } if (options.namespaces) { namespaces.push(...options.namespaces); } namespaces = Array.prototype.concat.apply([], namespaces); // As this task is often called with a single namespace, also check // for bad calls like "namespaces: [undefined]" if (!namespaces || !namespaces.length || !namespaces[0]) { throw new Error("generateComponentPreload: No component namespace(s) " + `found for project: ${options.projectName}`); } return Promise.all(namespaces.map((namespace) => { const filters = [ `${namespace}/`, `!${namespace}/test/`, `!${namespace}/*.html` ]; // Exclude other namespaces namespaces.forEach((ns) => { if (ns !== namespace && ns.indexOf(namespace) === 0) { filters.push(`!${ns}/`); } }); return moduleBundler({ resources, options: { bundleDefinition: { name: `${namespace}/Component-preload.js`, defaultFileTypes: [".js", ".fragment.xml", ".view.xml", ".properties", ".json"], sections: [ { mode: "preload", filters: filters, resolve: false, resolveConditional: false, renderer: false } ] } } }); })); }) .then((processedResources) => { return Promise.all(processedResources.map((resource) => { return workspace.write(resource[0]); })); }); };