diff --git a/lib/resourceFactory.js b/lib/resourceFactory.js index 42dba16a..14c3611a 100644 --- a/lib/resourceFactory.js +++ b/lib/resourceFactory.js @@ -2,6 +2,7 @@ const path = require("path"); const FsAdapter = require("./adapters/FileSystem"); const MemAdapter = require("./adapters/Memory"); const ReaderCollection = require("./ReaderCollection"); +const ReaderCollectionPrioritized = require("./ReaderCollectionPrioritized"); const DuplexCollection = require("./DuplexCollection"); const Resource = require("./Resource"); @@ -28,14 +29,21 @@ const resourceFactory = { * @param {boolean} [parameters.useNamespaces=false] Use project namespaces as path prefixes * @returns {Object} Object containing source and dependencies resource readers */ - createCollectionsForTree(tree, {useNamespaces=false} = {}) { + createCollectionsForTree(tree, {useNamespaces=false, virtualReaders={}} = {}) { + // TODO: virtualReaders is private API. The virtual reader of a project should be stored on the + // project itself. This requires projects to become objects independent from the dependency tree. + // Also see: https://github.com/SAP/ui5-project/issues/122 + const dependencyCollection = []; const dependencyPathIndex = {}; + const virtualReaderIndex = {}; const sourceResourceLocators = []; function processDependencies(project) { if (project.resources && project.resources.pathMappings) { + const fsReaders = []; for (let virBasePath in project.resources.pathMappings) { + // Create an fs reader for every path mapping if (project.resources.pathMappings.hasOwnProperty(virBasePath)) { const fsPath = project.resources.pathMappings[virBasePath]; const fsBasePath = path.join(project.path, fsPath); @@ -51,9 +59,23 @@ const resourceFactory = { } dependencyPathIndex[key] = true; - dependencyCollection.push(resourceFactory.createAdapter({fsBasePath, virBasePath, project})); + const fsReader = resourceFactory.createAdapter({fsBasePath, virBasePath, project}); + fsReaders.push(fsReader); } } + + if (!virtualReaderIndex[project.metadata.name] && virtualReaders[project.metadata.name]) { + // Mix-in virtual reader of dependency if available and not already added + virtualReaderIndex[project.metadata.name] = true; + const virtualReader = virtualReaders[project.metadata.name]; + const readerCollection = new ReaderCollectionPrioritized({ + name: `fs & vir reader collection for project ${project.metadata.name}`, + readers: [virtualReader, ...fsReaders] + }); + dependencyCollection.push(readerCollection); + } else { + dependencyCollection.push(...fsReaders); + } } project.dependencies.forEach(function(depProject) {