@@ -158,8 +158,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
158
158
let resolved = manifestHint ;
159
159
if ( ! manifestHint ) {
160
160
log . error ( `no manifest information in dependencies for ${ libName } ` ) ;
161
- resolvedCache . set ( libName , resolved ) ;
162
- return resolved ;
161
+ resolvedCache . set ( libName , { } ) ;
162
+ return { } ;
163
163
}
164
164
const keys = Object . keys ( manifestHint ) ;
165
165
keys . forEach ( ( childLibName ) => {
@@ -173,6 +173,56 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
173
173
return resolved ;
174
174
} ;
175
175
176
+ /**
177
+ * Sorts the keys of a given object
178
+ *
179
+ * @param {object } obj the object
180
+ * @returns {{} }
181
+ */
182
+ const sortObjectKeys = ( obj ) => {
183
+ const sortedObject = { } ;
184
+ const keys = Object . keys ( obj ) ;
185
+ keys . sort ( ) ;
186
+ keys . forEach ( ( key ) => {
187
+ sortedObject [ key ] = obj [ key ] ;
188
+ } ) ;
189
+ return sortedObject ;
190
+ } ;
191
+
192
+ const addManifestHints = ( result , libs ) => {
193
+ if ( Object . keys ( libs ) . length ) {
194
+ const sortedLibs = sortObjectKeys ( libs ) ;
195
+ result . manifestHints = {
196
+ dependencies : {
197
+ libs : sortedLibs
198
+ }
199
+ } ;
200
+ }
201
+ } ;
202
+
203
+ const processLibraryInfo = async ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) => {
204
+ const manifestInfo = await processManifest ( libraryInfo . mainManifest ) ;
205
+ dependencyInfoMap . set ( libraryInfo . name , manifestInfo . libs ) ;
206
+ const embeds = manifestInfo . embeds ;
207
+ // filter
208
+ const embeddedPaths = embeds . map ( ( embed ) => {
209
+ return getManifestPath ( libraryInfo . mainManifest . getPath ( ) , embed ) ;
210
+ } ) ;
211
+ const relevantManifests = libraryInfo . manifestResources . filter ( ( manifestResource ) => {
212
+ return embeddedPaths . includes ( manifestResource . getPath ( ) ) ;
213
+ } ) ;
214
+
215
+ // get all embedded manifests
216
+ const embeddedManifestPromises = relevantManifests . map ( async ( relevantManifest ) => {
217
+ const result = await processManifest ( relevantManifest ) ;
218
+ dependencyInfoMap . set ( result . id , result . libs ) ;
219
+ embeddedInfoMap . set ( result . id , {
220
+ library : libraryInfo . name
221
+ } ) ;
222
+ } ) ;
223
+
224
+ await Promise . all ( embeddedManifestPromises ) ;
225
+ } ;
176
226
177
227
/**
178
228
* Creates sap-ui-version.json.
@@ -183,7 +233,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
183
233
* @param {object } parameters.options Options
184
234
* @param {string } parameters.options.rootProjectName Name of the root project
185
235
* @param {string } parameters.options.rootProjectVersion Version of the root project
186
- * @param {LibraryInfo[] } parameters.options.libraryInfos Array of objects representing libraries, e.g. <code>{name: "library.xy", version: "1.0.0", manifests: module:@ui 5/fs.Resource[]}</code>
236
+ * @param {LibraryInfo[] } parameters.options.libraryInfos Array of objects representing libraries,
237
+ * e.g. <code>{name: "library.xy", version: "1.0.0", manifests: module:@ui 5/fs.Resource[]}</code>
187
238
* @returns {Promise<module:@ui5/fs.Resource[]> } Promise resolving with an array containing the versioninfo resource
188
239
*/
189
240
@@ -197,11 +248,13 @@ module.exports = async function({options}) {
197
248
const components = { } ;
198
249
/**
199
250
* @example
200
- * "sap.ui.integration": {
201
- * sap.chart: {
202
- * lazy: true
203
- * },
204
- * sap.f: { },
251
+ * {
252
+ * "sap.ui.integration": {
253
+ * "sap.chart": {
254
+ * "lazy": true
255
+ * },
256
+ * "sap.f": { },
257
+ * }
205
258
* }
206
259
*
207
260
* @type {Map<string, DependencyInfos> }
@@ -211,29 +264,7 @@ module.exports = async function({options}) {
211
264
212
265
// gather all manifestHints
213
266
const librariesPromises = options . libraryInfos . map ( ( libraryInfo ) => {
214
- // TODO use proper async await!
215
- return processManifest ( libraryInfo . mainManifest ) . then ( ( manifestHint ) => {
216
- dependencyInfoMap . set ( libraryInfo . name , manifestHint . libs ) ;
217
- return manifestHint . embeds ;
218
- } ) . then ( ( embeds ) => {
219
- // filter
220
- const embeddedPaths = embeds . map ( ( embed ) => {
221
- return getManifestPath ( libraryInfo . mainManifest . getPath ( ) , embed ) ;
222
- } ) ;
223
- const relevantManifests = libraryInfo . manifestResources . filter ( ( manifestResource ) => {
224
- return embeddedPaths . includes ( manifestResource . getPath ( ) ) ;
225
- } ) ;
226
-
227
- // get all embedded manifests
228
- return Promise . all ( relevantManifests . map ( ( relevantManifest ) => {
229
- return processManifest ( relevantManifest ) . then ( ( result ) => {
230
- dependencyInfoMap . set ( result . id , result . libs ) ;
231
- embeddedInfoMap . set ( result . id , {
232
- library : libraryInfo . name
233
- } ) ;
234
- } ) ;
235
- } ) ) ;
236
- } ) ;
267
+ return processLibraryInfo ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) ;
237
268
} ) ;
238
269
239
270
await Promise . all ( librariesPromises ) ;
@@ -251,28 +282,17 @@ module.exports = async function({options}) {
251
282
} ;
252
283
253
284
const libs = dependencyInfoMap . get ( libraryInfo . name ) ;
254
- if ( Object . keys ( libs ) . length ) {
255
- result . manifestHints = {
256
- dependencies : {
257
- libs : libs
258
- }
259
- } ;
260
- }
285
+ addManifestHints ( result , libs ) ;
261
286
return result ;
262
287
} ) ;
263
288
264
- // TODO sort!
289
+ // sort keys
265
290
embeddedInfoMap . forEach ( ( embeddedInfo , libName ) => {
266
291
components [ libName ] = embeddedInfo ;
267
292
const libs = dependencyInfoMap . get ( libName ) ;
268
- if ( libs && Object . keys ( libs ) . length ) {
269
- components [ libName ] . manifestHints = {
270
- dependencies : {
271
- libs : libs
272
- }
273
- } ;
274
- }
293
+ addManifestHints ( components [ libName ] , libs ) ;
275
294
} ) ;
295
+ const sortedComponents = sortObjectKeys ( components ) ;
276
296
277
297
// sort libraries alphabetically
278
298
libraries . sort ( ( a , b ) => {
@@ -286,7 +306,7 @@ module.exports = async function({options}) {
286
306
scmRevision : "" , // TODO: insert current application scm revision here
287
307
// gav: "", // TODO: insert current application id + version here
288
308
libraries,
289
- components
309
+ components : sortedComponents
290
310
} ;
291
311
292
312
return [ resourceFactory . createResource ( {
0 commit comments