@@ -127,7 +127,7 @@ const resolveTransitiveDependencies = (libraryInfosMap) => {
127127class DependencyInfoObject {
128128 /**
129129 *
130- * @param {string } name
130+ * @param {string } name name of the dependency, e.g. sap.ui.documentation
131131 * @param {boolean } lazy
132132 */
133133 constructor ( name , lazy ) {
@@ -140,9 +140,11 @@ class DependencyInfo {
140140 /**
141141 *
142142 * @param {DependencyInfoObject[] } libs
143+ * @param {string } name
143144 */
144- constructor ( libs ) {
145+ constructor ( libs , name ) {
145146 this . libs = libs ;
147+ this . name = name ;
146148
147149 /**
148150 *
@@ -158,67 +160,60 @@ class DependencyInfo {
158160 }
159161
160162 isResolved ( libName ) {
161- return this . libsResolved . some ( ( libResolved ) => {
163+ return this . libsResolved . find ( ( libResolved ) => {
162164 return libResolved . name === libName ;
163165 } ) ;
164166 }
165167
168+ /**
169+ *
170+ * @param {string } libName
171+ * @param {boolean } lazy
172+ * @returns {DependencyInfoObject }
173+ */
166174 addResolvedLibDependency ( libName , lazy ) {
167- if ( ! this . isResolved ( libName ) || ! lazy ) {
168- this . libsResolved . push ( new DependencyInfoObject ( libName , lazy ) ) ;
175+ if ( log . isLevelEnabled ( "verbose" ) ) {
176+ log . verbose ( `${ this . name } add: ${ libName } ${ lazy ?" (lazy)" :"" } ` ) ;
177+ }
178+ let alreadyResolved = this . isResolved ( libName ) ;
179+ if ( ! alreadyResolved ) {
180+ alreadyResolved = new DependencyInfoObject ( libName , lazy ) ;
181+ this . libsResolved . push ( alreadyResolved ) ;
182+ } else {
183+ if ( ! alreadyResolved . lazy || ! lazy ) {
184+ delete alreadyResolved . lazy ;
185+ }
169186 }
187+ return alreadyResolved ;
170188 }
171189
172190 /**
173191 *
174192 * @param {Map<string,DependencyInfo> } dependencyInfoMap
193+ * @param {boolean } [lazy]
175194 */
176- resolve ( dependencyInfoMap ) {
177- if ( ! this . wasResolved ) {
195+ resolve ( dependencyInfoMap , lazy ) {
196+ if ( ! this . wasResolved || lazy ) {
197+ log . verbose ( `resolving ${ this . name } ` ) ;
178198 this . libs . forEach ( ( depInfoObject ) => {
179- this . addResolvedLibDependency ( depInfoObject . name , depInfoObject . lazy ) ;
199+ const dependencyInfoObjectAdded = this . addResolvedLibDependency ( depInfoObject . name , depInfoObject . lazy ) ;
180200 const dependencyInfo = dependencyInfoMap . get ( depInfoObject . name ) ;
181- dependencyInfo . resolve ( dependencyInfoMap ) ;
201+ dependencyInfo . resolve ( dependencyInfoMap , dependencyInfoObjectAdded . lazy ) ;
182202
183203 dependencyInfo . libsResolved . forEach ( ( resolvedLib ) => {
184- this . addResolvedLibDependency ( resolvedLib . name , resolvedLib . lazy ) ;
204+ this . addResolvedLibDependency ( resolvedLib . name , resolvedLib . lazy || dependencyInfoObjectAdded . lazy ) ;
185205 } ) ;
186206 } ) ;
187207 this . wasResolved = true ;
208+ if ( log . isLevelEnabled ( "verbose" ) ) {
209+ log . verbose ( `resolved ${ this . name } : ${ this . libsResolved . map ( ( lib ) => {
210+ return `${ this . name } : ${ lib . name } ${ lib . lazy ? " (lazy)" : "" } ` ;
211+ } ) . join ( ", " ) } `) ;
212+ }
188213 }
189214 }
190215}
191216
192- // TODO add childResolved to resolved
193- // TODO check cacles
194-
195-
196- // TODO lib a (lazy) --> all its dependencies must be lazy
197- // input
198- // a -> b (lazy) -> c
199- // output
200- // a -> b (lazy), c (lazy)
201-
202-
203- // a -> c, b (lazy)
204- // b -> c (lazy)
205-
206-
207- // a -> c, b (lazy)
208-
209-
210- // a -> c (lazy), b (lazy)
211- // b -> c
212-
213- // kette gewinnt lazy --> alle dependencies von einer lazy dep sind auch lazy
214- // merge gewinnt eager
215-
216-
217- // TODO put this into a classes to better structure the code
218- // TODO instead of using a "global" map, have a Dependency as a class with a name
219- // and the functionality to resolve its dependencies
220- // ManifestHints -> resolve
221-
222217
223218/**
224219 * Sorts the keys of a given object
@@ -239,13 +234,13 @@ const sortObjectKeys = (obj) => {
239234/**
240235 *
241236 * @param {object } result
242- * @param {DependencyInfo } libs
237+ * @param {DependencyInfo } dependencyInfo
243238 */
244- const addManifestHints = ( result , libs ) => {
245- if ( libs . libs . length ) {
239+ const addManifestHints = ( result , dependencyInfo ) => {
240+ if ( dependencyInfo && dependencyInfo . libs . length ) {
246241 // const sortedLibs = sortObjectKeys(libs.libs);
247242 const libsObject = { } ;
248- libs . libs . forEach ( ( sortedLib ) => {
243+ dependencyInfo . libsResolved . forEach ( ( sortedLib ) => {
249244 libsObject [ sortedLib . name ] = { } ;
250245 if ( sortedLib . lazy ) {
251246 libsObject [ sortedLib . name ] . lazy = true ;
@@ -267,10 +262,14 @@ const convertToDependencyInfoObjects = (libs) => {
267262} ;
268263
269264const processLibraryInfo = async ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) => {
265+ if ( ! libraryInfo . mainManifest ) {
266+ log . error ( `library manifest not found for ${ libraryInfo . name } ` ) ;
267+ return ;
268+ }
270269 const manifestInfo = await processManifest ( libraryInfo . mainManifest ) ;
271270 // gather shallow library information
272271 const dependencyInfoObjects = convertToDependencyInfoObjects ( manifestInfo . libs ) ;
273- dependencyInfoMap . set ( libraryInfo . name , new DependencyInfo ( dependencyInfoObjects ) ) ;
272+ dependencyInfoMap . set ( libraryInfo . name , new DependencyInfo ( dependencyInfoObjects , libraryInfo . name ) ) ;
274273 const embeds = manifestInfo . embeds ; // sdk
275274 // filter
276275 const embeddedPaths = embeds . map ( ( embed ) => {
@@ -285,7 +284,7 @@ const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMa
285284 const embeddedManifestPromises = relevantManifests . map ( async ( relevantManifest ) => {
286285 const result = await processManifest ( relevantManifest ) ;
287286 const dependencyInfoObjects = convertToDependencyInfoObjects ( result . libs ) ;
288- dependencyInfoMap . set ( result . id , new DependencyInfo ( dependencyInfoObjects ) ) ;
287+ dependencyInfoMap . set ( result . id , new DependencyInfo ( dependencyInfoObjects , result . id ) ) ;
289288 embeddedInfoMap . set ( result . id , {
290289 library : libraryInfo . name
291290 } ) ;
@@ -382,9 +381,11 @@ module.exports = async function({options}) {
382381 buildTimestamp : buildTimestamp ,
383382 scmRevision : "" , // TODO: insert current application scm revision here
384383 // gav: "", // TODO: insert current application id + version here
385- libraries,
386- components : sortedComponents
384+ libraries
387385 } ;
386+ if ( Object . keys ( sortedComponents ) . length ) {
387+ versionJson . components = sortedComponents ;
388+ }
388389
389390 return [ resourceFactory . createResource ( {
390391 path : "/resources/sap-ui-version.json" ,
0 commit comments