@@ -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,8 +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  {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> 
188238 * @returns  {Promise<module:@ui5/fs.Resource[]> } Promise resolving with an array containing the versioninfo resource 
189239 */ 
190240
@@ -198,11 +248,13 @@ module.exports = async function({options}) {
198248	const  components  =  { } ; 
199249	/** 
200250	 * @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+ 	 *  } 
206258	 * } 
207259	 * 
208260	 * @type  {Map<string, DependencyInfos> } 
@@ -212,29 +264,7 @@ module.exports = async function({options}) {
212264
213265	// gather all manifestHints 
214266	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 ) ; 
238268	} ) ; 
239269
240270	await  Promise . all ( librariesPromises ) ; 
@@ -252,28 +282,17 @@ module.exports = async function({options}) {
252282		} ; 
253283
254284		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 ) ; 
262286		return  result ; 
263287	} ) ; 
264288
265- 	// TODO  sort!  
289+ 	// sort keys  
266290	embeddedInfoMap . forEach ( ( embeddedInfo ,  libName )  =>  { 
267291		components [ libName ]  =  embeddedInfo ; 
268292		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 ) ; 
276294	} ) ; 
295+ 	const  sortedComponents  =  sortObjectKeys ( components ) ; 
277296
278297	// sort libraries alphabetically 
279298	libraries . sort ( ( a ,  b )  =>  { 
@@ -287,7 +306,7 @@ module.exports = async function({options}) {
287306		scmRevision : "" ,  // TODO: insert current application scm revision here 
288307		// gav: "", // TODO: insert current application id + version here 
289308		libraries, 
290- 		components
309+ 		components :  sortedComponents 
291310	} ; 
292311
293312	return  [ resourceFactory . createResource ( { 
0 commit comments