@@ -127,7 +127,7 @@ const resolveTransitiveDependencies = (libraryInfosMap) => {
127
127
class DependencyInfoObject {
128
128
/**
129
129
*
130
- * @param {string } name
130
+ * @param {string } name name of the dependency, e.g. sap.ui.documentation
131
131
* @param {boolean } lazy
132
132
*/
133
133
constructor ( name , lazy ) {
@@ -140,9 +140,11 @@ class DependencyInfo {
140
140
/**
141
141
*
142
142
* @param {DependencyInfoObject[] } libs
143
+ * @param {string } name
143
144
*/
144
- constructor ( libs ) {
145
+ constructor ( libs , name ) {
145
146
this . libs = libs ;
147
+ this . name = name ;
146
148
147
149
/**
148
150
*
@@ -158,67 +160,60 @@ class DependencyInfo {
158
160
}
159
161
160
162
isResolved ( libName ) {
161
- return this . libsResolved . some ( ( libResolved ) => {
163
+ return this . libsResolved . find ( ( libResolved ) => {
162
164
return libResolved . name === libName ;
163
165
} ) ;
164
166
}
165
167
168
+ /**
169
+ *
170
+ * @param {string } libName
171
+ * @param {boolean } lazy
172
+ * @returns {DependencyInfoObject }
173
+ */
166
174
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
+ }
169
186
}
187
+ return alreadyResolved ;
170
188
}
171
189
172
190
/**
173
191
*
174
192
* @param {Map<string,DependencyInfo> } dependencyInfoMap
193
+ * @param {boolean } [lazy]
175
194
*/
176
- resolve ( dependencyInfoMap ) {
177
- if ( ! this . wasResolved ) {
195
+ resolve ( dependencyInfoMap , lazy ) {
196
+ if ( ! this . wasResolved || lazy ) {
197
+ log . verbose ( `resolving ${ this . name } ` ) ;
178
198
this . libs . forEach ( ( depInfoObject ) => {
179
- this . addResolvedLibDependency ( depInfoObject . name , depInfoObject . lazy ) ;
199
+ const dependencyInfoObjectAdded = this . addResolvedLibDependency ( depInfoObject . name , depInfoObject . lazy ) ;
180
200
const dependencyInfo = dependencyInfoMap . get ( depInfoObject . name ) ;
181
- dependencyInfo . resolve ( dependencyInfoMap ) ;
201
+ dependencyInfo . resolve ( dependencyInfoMap , dependencyInfoObjectAdded . lazy ) ;
182
202
183
203
dependencyInfo . libsResolved . forEach ( ( resolvedLib ) => {
184
- this . addResolvedLibDependency ( resolvedLib . name , resolvedLib . lazy ) ;
204
+ this . addResolvedLibDependency ( resolvedLib . name , resolvedLib . lazy || dependencyInfoObjectAdded . lazy ) ;
185
205
} ) ;
186
206
} ) ;
187
207
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
+ }
188
213
}
189
214
}
190
215
}
191
216
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
-
222
217
223
218
/**
224
219
* Sorts the keys of a given object
@@ -239,13 +234,13 @@ const sortObjectKeys = (obj) => {
239
234
/**
240
235
*
241
236
* @param {object } result
242
- * @param {DependencyInfo } libs
237
+ * @param {DependencyInfo } dependencyInfo
243
238
*/
244
- const addManifestHints = ( result , libs ) => {
245
- if ( libs . libs . length ) {
239
+ const addManifestHints = ( result , dependencyInfo ) => {
240
+ if ( dependencyInfo && dependencyInfo . libs . length ) {
246
241
// const sortedLibs = sortObjectKeys(libs.libs);
247
242
const libsObject = { } ;
248
- libs . libs . forEach ( ( sortedLib ) => {
243
+ dependencyInfo . libsResolved . forEach ( ( sortedLib ) => {
249
244
libsObject [ sortedLib . name ] = { } ;
250
245
if ( sortedLib . lazy ) {
251
246
libsObject [ sortedLib . name ] . lazy = true ;
@@ -267,10 +262,14 @@ const convertToDependencyInfoObjects = (libs) => {
267
262
} ;
268
263
269
264
const processLibraryInfo = async ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) => {
265
+ if ( ! libraryInfo . mainManifest ) {
266
+ log . error ( `library manifest not found for ${ libraryInfo . name } ` ) ;
267
+ return ;
268
+ }
270
269
const manifestInfo = await processManifest ( libraryInfo . mainManifest ) ;
271
270
// gather shallow library information
272
271
const dependencyInfoObjects = convertToDependencyInfoObjects ( manifestInfo . libs ) ;
273
- dependencyInfoMap . set ( libraryInfo . name , new DependencyInfo ( dependencyInfoObjects ) ) ;
272
+ dependencyInfoMap . set ( libraryInfo . name , new DependencyInfo ( dependencyInfoObjects , libraryInfo . name ) ) ;
274
273
const embeds = manifestInfo . embeds ; // sdk
275
274
// filter
276
275
const embeddedPaths = embeds . map ( ( embed ) => {
@@ -285,7 +284,7 @@ const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMa
285
284
const embeddedManifestPromises = relevantManifests . map ( async ( relevantManifest ) => {
286
285
const result = await processManifest ( relevantManifest ) ;
287
286
const dependencyInfoObjects = convertToDependencyInfoObjects ( result . libs ) ;
288
- dependencyInfoMap . set ( result . id , new DependencyInfo ( dependencyInfoObjects ) ) ;
287
+ dependencyInfoMap . set ( result . id , new DependencyInfo ( dependencyInfoObjects , result . id ) ) ;
289
288
embeddedInfoMap . set ( result . id , {
290
289
library : libraryInfo . name
291
290
} ) ;
@@ -382,9 +381,11 @@ module.exports = async function({options}) {
382
381
buildTimestamp : buildTimestamp ,
383
382
scmRevision : "" , // TODO: insert current application scm revision here
384
383
// gav: "", // TODO: insert current application id + version here
385
- libraries,
386
- components : sortedComponents
384
+ libraries
387
385
} ;
386
+ if ( Object . keys ( sortedComponents ) . length ) {
387
+ versionJson . components = sortedComponents ;
388
+ }
388
389
389
390
return [ resourceFactory . createResource ( {
390
391
path : "/resources/sap-ui-version.json" ,
0 commit comments