@@ -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,8 +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 {Array } parameters.options.libraryInfos Array of objects representing libraries,
187
- * e.g. <code>{name: "library.xy", version: "1.0.0"}</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>
188
238
* @returns {Promise<module:@ui5/fs.Resource[]> } Promise resolving with an array containing the versioninfo resource
189
239
*/
190
240
@@ -198,11 +248,13 @@ module.exports = async function({options}) {
198
248
const components = { } ;
199
249
/**
200
250
* @example
201
- * "sap.ui.integration": {
202
- * sap.chart: {
203
- * lazy: true
204
- * },
205
- * sap.f: { },
251
+ * {
252
+ * "sap.ui.integration": {
253
+ * "sap.chart": {
254
+ * "lazy": true
255
+ * },
256
+ * "sap.f": { },
257
+ * }
206
258
* }
207
259
*
208
260
* @type {Map<string, DependencyInfos> }
@@ -212,29 +264,7 @@ module.exports = async function({options}) {
212
264
213
265
// gather all manifestHints
214
266
const librariesPromises = options . libraryInfos . map ( ( libraryInfo ) => {
215
- // TODO use proper async await!
216
- return processManifest ( libraryInfo . mainManifest ) . then ( ( manifestHint ) => {
217
- dependencyInfoMap . set ( libraryInfo . name , manifestHint . libs ) ;
218
- return manifestHint . embeds ;
219
- } ) . then ( ( embeds ) => {
220
- // filter
221
- const embeddedPaths = embeds . map ( ( embed ) => {
222
- return getManifestPath ( libraryInfo . mainManifest . getPath ( ) , embed ) ;
223
- } ) ;
224
- const relevantManifests = libraryInfo . manifestResources . filter ( ( manifestResource ) => {
225
- return embeddedPaths . includes ( manifestResource . getPath ( ) ) ;
226
- } ) ;
227
-
228
- // get all embedded manifests
229
- return Promise . all ( relevantManifests . map ( ( relevantManifest ) => {
230
- return processManifest ( relevantManifest ) . then ( ( result ) => {
231
- dependencyInfoMap . set ( result . id , result . libs ) ;
232
- embeddedInfoMap . set ( result . id , {
233
- library : libraryInfo . name
234
- } ) ;
235
- } ) ;
236
- } ) ) ;
237
- } ) ;
267
+ return processLibraryInfo ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) ;
238
268
} ) ;
239
269
240
270
await Promise . all ( librariesPromises ) ;
@@ -252,28 +282,17 @@ module.exports = async function({options}) {
252
282
} ;
253
283
254
284
const libs = dependencyInfoMap . get ( libraryInfo . name ) ;
255
- if ( Object . keys ( libs ) . length ) {
256
- result . manifestHints = {
257
- dependencies : {
258
- libs : libs
259
- }
260
- } ;
261
- }
285
+ addManifestHints ( result , libs ) ;
262
286
return result ;
263
287
} ) ;
264
288
265
- // TODO sort!
289
+ // sort keys
266
290
embeddedInfoMap . forEach ( ( embeddedInfo , libName ) => {
267
291
components [ libName ] = embeddedInfo ;
268
292
const libs = dependencyInfoMap . get ( libName ) ;
269
- if ( libs && Object . keys ( libs ) . length ) {
270
- components [ libName ] . manifestHints = {
271
- dependencies : {
272
- libs : libs
273
- }
274
- } ;
275
- }
293
+ addManifestHints ( components [ libName ] , libs ) ;
276
294
} ) ;
295
+ const sortedComponents = sortObjectKeys ( components ) ;
277
296
278
297
// sort libraries alphabetically
279
298
libraries . sort ( ( a , b ) => {
@@ -287,7 +306,7 @@ module.exports = async function({options}) {
287
306
scmRevision : "" , // TODO: insert current application scm revision here
288
307
// gav: "", // TODO: insert current application id + version here
289
308
libraries,
290
- components
309
+ components : sortedComponents
291
310
} ;
292
311
293
312
return [ resourceFactory . createResource ( {
0 commit comments