@@ -158,8 +158,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
158158 let resolved = manifestHint ;
159159 if ( ! manifestHint ) {
160160 log . error ( `no manifest information in dependencies for ${ libName } ` ) ;
161- resolvedCache . set ( libName , resolved ) ;
162- return resolved ;
161+ resolvedCache . set ( libName , { } ) ;
162+ return { } ;
163163 }
164164 const keys = Object . keys ( manifestHint ) ;
165165 keys . forEach ( ( childLibName ) => {
@@ -173,6 +173,56 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
173173 return resolved ;
174174} ;
175175
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+ } ;
176226
177227/**
178228 * Creates sap-ui-version.json.
@@ -183,7 +233,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
183233 * @param {object } parameters.options Options
184234 * @param {string } parameters.options.rootProjectName Name of the root project
185235 * @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>
187238 * @returns {Promise<module:@ui5/fs.Resource[]> } Promise resolving with an array containing the versioninfo resource
188239 */
189240
@@ -197,11 +248,13 @@ module.exports = async function({options}) {
197248 const components = { } ;
198249 /**
199250 * @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+ * }
205258 * }
206259 *
207260 * @type {Map<string, DependencyInfos> }
@@ -211,29 +264,7 @@ module.exports = async function({options}) {
211264
212265 // gather all manifestHints
213266 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 ) ;
237268 } ) ;
238269
239270 await Promise . all ( librariesPromises ) ;
@@ -251,28 +282,17 @@ module.exports = async function({options}) {
251282 } ;
252283
253284 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 ) ;
261286 return result ;
262287 } ) ;
263288
264- // TODO sort!
289+ // sort keys
265290 embeddedInfoMap . forEach ( ( embeddedInfo , libName ) => {
266291 components [ libName ] = embeddedInfo ;
267292 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 ) ;
275294 } ) ;
295+ const sortedComponents = sortObjectKeys ( components ) ;
276296
277297 // sort libraries alphabetically
278298 libraries . sort ( ( a , b ) => {
@@ -286,7 +306,7 @@ module.exports = async function({options}) {
286306 scmRevision : "" , // TODO: insert current application scm revision here
287307 // gav: "", // TODO: insert current application id + version here
288308 libraries,
289- components
309+ components : sortedComponents
290310 } ;
291311
292312 return [ resourceFactory . createResource ( {
0 commit comments