@@ -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